@@ -11,7 +11,61 @@ import { MinecraftFont } from '../minecraft/fontManager'
1111// Jumpstarted by @IanSSenne (FetchBot) and refactored by @SnaveSutit to do line wrapping on JSON Text Components.
1212// THANK U IAN <3 - SnaveSutit
1313
14- function getRawText ( element : string | TextObject ) : UnicodeString {
14+ const KEYBIND_KEY_MAP : Record < string , string > = {
15+ 'key.advancements' : 'L' ,
16+ 'key.attack' : 'key.mouse.left' ,
17+ 'key.back' : 'S' ,
18+ 'key.chat' : 'T' ,
19+ 'key.command' : '/' ,
20+ 'key.drop' : 'Q' ,
21+ 'key.forward' : 'W' ,
22+ 'key.fullscreen' : 'F11' ,
23+ 'key.hotbar.1' : '1' ,
24+ 'key.hotbar.2' : '2' ,
25+ 'key.hotbar.3' : '3' ,
26+ 'key.hotbar.4' : '4' ,
27+ 'key.hotbar.5' : '5' ,
28+ 'key.hotbar.6' : '6' ,
29+ 'key.hotbar.7' : '7' ,
30+ 'key.hotbar.8' : '8' ,
31+ 'key.hotbar.9' : '9' ,
32+ 'key.inventory' : 'E' ,
33+ 'key.jump' : 'Space' ,
34+ 'key.left' : 'A' ,
35+ 'key.loadToolbarActivator' : 'X' ,
36+ 'key.pickItem' : 'key.mouse.middle' ,
37+ 'key.playerlist' : 'Tab' ,
38+ 'key.quickActions' : 'Quick Actions' ,
39+ 'key.right' : 'D' ,
40+ 'key.saveToolbarActivator' : 'G' ,
41+ 'key.screenshot' : 'F2' ,
42+ 'key.smoothCamera' : 'Toggle Cinematic Camera' ,
43+ 'key.sneak' : 'Left Shift' ,
44+ 'key.socialInteractions' : 'P' ,
45+ 'key.spectatorHotbar' : 'key.keyboard.unknown' ,
46+ 'key.spectatorOutlines' : 'key.keyboard.unknown' ,
47+ 'key.sprint' : 'Left Control' ,
48+ 'key.swapOffhand' : 'F' ,
49+ 'key.toggleGui' : 'F1' ,
50+ 'key.togglePerspective' : 'F5' ,
51+ 'key.toggleSpectatorShaderEffects' : 'F4' ,
52+ 'key.use' : 'key.mouse.right' ,
53+ }
54+
55+ async function getLangTranslation ( key : string ) : Promise < string > {
56+ const lang = await AnimatedJava . assetManager . getJSONAsset (
57+ Project . animated_java . target_minecraft_version ,
58+ 'assets/minecraft/lang/en_us.json'
59+ )
60+ return lang [ key ] ?? key
61+ }
62+
63+ async function getKeybindTranslation ( keybind : string ) : Promise < string > {
64+ const mappedKeybind = KEYBIND_KEY_MAP [ keybind ] ?? keybind
65+ return getLangTranslation ( mappedKeybind )
66+ }
67+
68+ async function getRawText ( element : string | TextObject ) : Promise < UnicodeString > {
1569 if ( typeof element === 'string' ) {
1670 return new UnicodeString ( element )
1771 }
@@ -21,7 +75,10 @@ function getRawText(element: string | TextObject): UnicodeString {
2175 return new UnicodeString ( element . text )
2276
2377 case element . translate !== undefined :
24- return new UnicodeString ( `{${ element . translate } }` )
78+ const translation = await getLangTranslation ( element . translate )
79+ return new UnicodeString (
80+ translation === element . translate ? `{${ element . translate } }` : translation
81+ )
2582
2683 case element . selector !== undefined :
2784 return new UnicodeString ( `{${ element . selector } }` )
@@ -30,7 +87,10 @@ function getRawText(element: string | TextObject): UnicodeString {
3087 return new UnicodeString ( `{${ element . score . name } :${ element . score . objective } }` )
3188
3289 case element . keybind !== undefined :
33- return new UnicodeString ( `{${ element . keybind } }` )
90+ const keybindTranslation = await getKeybindTranslation ( element . keybind )
91+ return new UnicodeString (
92+ element . keybind === keybindTranslation ? `{${ element . keybind } }` : keybindTranslation
93+ )
3494
3595 case element . nbt !== undefined :
3696 switch ( true ) {
@@ -85,7 +145,7 @@ interface Line {
85145 *
86146 * WARNING: Word width is ***not calculated*** by this function.
87147 */
88- export function parseWords ( inputElement : TextElement ) {
148+ export async function parseWords ( inputElement : TextElement ) {
89149 const stopwatch = new Stopwatch ( 'Parse Words' ) . start ( )
90150 const optimized = new TextComponent ( inputElement ) . optimized ( true )
91151 if ( ! optimized . length ) return [ ]
@@ -98,7 +158,7 @@ export function parseWords(inputElement: TextElement) {
98158 }
99159 if ( element === undefined ) return words
100160
101- let componentText = getRawText ( element )
161+ let componentText = await getRawText ( element )
102162 let span : StyleSpan = {
103163 style : TextComponent . getComponentStyle ( element ) ,
104164 start : 0 ,
@@ -160,7 +220,7 @@ export function parseWords(inputElement: TextElement) {
160220 }
161221
162222 if ( element !== undefined ) {
163- componentText = getRawText ( element )
223+ componentText = await getRawText ( element )
164224 if ( word ) {
165225 word . styles . push ( span )
166226 span = {
@@ -192,7 +252,7 @@ export function parseWords(inputElement: TextElement) {
192252export async function wrapJsonText ( jsonText : TextComponent , maxLineWidth = 200 ) {
193253 const stopwatch = new Stopwatch ( 'Wrap Json Text' ) . start ( )
194254
195- const words = parseWords ( jsonText . toJSON ( ) )
255+ const words = await parseWords ( jsonText . toJSON ( ) )
196256 const lines : Line [ ] = [ ]
197257 // FIXME - This will not work for custom fonts
198258 const font = await MinecraftFont . getById ( 'minecraft:default' )
0 commit comments