Skip to content

Commit 25448a1

Browse files
SnaveSutitgitbutler-client
authored andcommitted
✨ Add vanilla translation string resolution
1 parent 8dc05b3 commit 25448a1

1 file changed

Lines changed: 67 additions & 7 deletions

File tree

src/systems/jsonText/wrapping.ts

Lines changed: 67 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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) {
192252
export 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

Comments
 (0)