Skip to content

Commit ec8fef8

Browse files
committed
🐛 Fix incorrect stringification of JsonText
1 parent 040b00d commit ec8fef8

File tree

5 files changed

+40
-52
lines changed

5 files changed

+40
-52
lines changed

src/systems/datapackCompiler/index.ts

Lines changed: 31 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,15 @@ import {
1111
parseDataPackPath,
1212
parseResourceLocation,
1313
} from '../../util/minecraftUtil'
14-
import { eulerFromQuaternion, roundTo, tinycolorToDecimal } from '../../util/misc'
14+
import { eulerFromQuaternion, roundTo } from '../../util/misc'
1515
import { MSLimiter } from '../../util/msLimiter'
1616
import { Variant } from '../../variants'
1717
import type { IRenderedAnimation } from '../animationRenderer'
1818
import mcbFiles from '../datapackCompiler/mcbFiles'
1919
import { IntentionalExportError } from '../exporter'
2020
import { AJMeta, PackMeta, type PackMetaFormats, SUPPORTED_MINECRAFT_VERSIONS } from '../global'
2121
import { JsonText } from '../jsonText'
22+
import { JsonTextParser } from '../jsonText/parser'
2223
import type { AnyRenderedNode, IRenderedRig } from '../rigRenderer'
2324
import {
2425
arrayToNbtFloatArray,
@@ -535,46 +536,35 @@ async function generateRootEntityPassengers(
535536
break
536537
}
537538
case 'text_display': {
538-
const color = new tinycolor(node.background_color)
539-
540539
passenger
541540
.set('id', new NbtString('minecraft:text_display'))
542-
.set('background', new NbtInt(tinycolorToDecimal(color)))
541+
.set('background', new NbtInt(JsonText.hexToInt(node.background_color)))
543542
.set('line_width', new NbtInt(node.line_width))
544543
.set('shadow', new NbtByte(node.shadow ? 1 : 0))
545544
.set('see_through', new NbtByte(node.see_through ? 1 : 0))
546545
.set('alignment', new NbtString(node.align))
547546

548-
switch (version) {
549-
case '1.20.4':
550-
case '1.20.5':
551-
case '1.21.0':
552-
case '1.21.2':
553-
case '1.21.4':
554-
passenger.set(
555-
'text',
556-
// String JSON text format
557-
new NbtString(
558-
new JsonText(node.text).toString(true, version) ??
559-
`{ "text": "Invalid Text Component", "color": "red" }`
560-
)
561-
)
562-
break
563-
case '1.21.5':
564-
passenger.set(
565-
'text',
566-
// SNBT JSON text format
567-
// Hacky workaround for deepslate not supporting MC's new escape sequences.
568-
new NbtString(
569-
'$$$' + node.type + '_' + node.storage_name + '_text_placeholder$$$'
570-
)
547+
if (!compareVersions('1.21.5', version) /* >= 1.21.5 */) {
548+
passenger.set(
549+
'text',
550+
// SNBT JSON text format
551+
// Hacky workaround for deepslate not supporting MC's new escape sequences.
552+
new NbtString(
553+
'$$$' + node.type + '_' + node.storage_name + '_text_placeholder$$$'
571554
)
572-
break
573-
default: {
574-
throw new Error(
575-
`Unsupported Minecraft version '${version}' for text display!`
555+
)
556+
} else if (!compareVersions('1.20.4', version) /* >= 1.20.4 */) {
557+
passenger.set(
558+
'text',
559+
// String JSON text format
560+
new NbtString(
561+
new JsonTextParser({ minecraftVersion: version })
562+
.parse(node.text)
563+
.toString(true, version)
576564
)
577-
}
565+
)
566+
} else {
567+
throw new Error(`Unsupported Minecraft version '${version}' for text display!`)
578568
}
579569

580570
if (node.config) {
@@ -652,12 +642,15 @@ async function generateRootEntityPassengers(
652642

653643
let result = passengers.toString()
654644

655-
for (const display of Object.values(rig.nodes).filter(n => n.type === 'text_display')) {
656-
result = result.replace(
657-
'"$$$' + display.type + '_' + display.storage_name + '_text_placeholder$$$"',
658-
new JsonText(display.text).toString(true, version) ??
659-
`{ "text": "Invalid Text Component", "color": "red" }`
660-
)
645+
if (!compareVersions('1.21.5', version) /* >= 1.21.5 */) {
646+
for (const display of Object.values(rig.nodes).filter(n => n.type === 'text_display')) {
647+
result = result.replace(
648+
'"$$$' + display.type + '_' + display.storage_name + '_text_placeholder$$$"',
649+
new JsonTextParser({ minecraftVersion: version })
650+
.parse(display.text)
651+
.toString(true, version)
652+
)
653+
}
661654
}
662655

663656
return result

src/systems/jsonText/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,7 @@ export class JsonText {
246246

247247
toString(minify = true, minecraftVersion = JsonText.defaultMinecraftVersion) {
248248
const content = minify ? this.flatten() : this.content
249-
return new JsonTextStringifier(content, minecraftVersion).stringify()
249+
return new JsonTextStringifier(minecraftVersion).stringify(content)
250250
}
251251

252252
toJSON(): TextElement {

src/systems/jsonText/parser.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ enum FEATURES {
164164
TEXT_OBJECT_INFERRED_KEYS = 1 << 15,
165165
}
166166

167-
function compareVersions(a: string, b: string): number {
167+
export function compareVersions(a: string, b: string): number {
168168
const aParts = a.split('.').map(Number)
169169
const bParts = b.split('.').map(Number)
170170
for (let i = 0; i < Math.max(aParts.length, bParts.length); i++) {

src/systems/jsonText/stringifier.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,25 +6,25 @@ import {
66
type TextElement,
77
type TextObject,
88
} from '.'
9+
import { compareVersions } from './parser'
910

1011
enum FEATURES {
1112
REQUIRE_DOUBLE_QUOTES = 1 << 0,
1213
RESOLVE_SPACE_ESCAPE_SEQUENCES = 1 << 1,
1314
}
1415

1516
export class JsonTextStringifier {
16-
enabledFeatures = FEATURES.REQUIRE_DOUBLE_QUOTES
17+
enabledFeatures = FEATURES.REQUIRE_DOUBLE_QUOTES | FEATURES.RESOLVE_SPACE_ESCAPE_SEQUENCES
1718

18-
constructor(private element: TextElement, private minecraftVersion: string) {
19-
// targetMinecraftVersion >= 1.21.5
20-
if (!compareVersions('1.21.5', this.minecraftVersion)) {
19+
constructor(private minecraftVersion: string) {
20+
if (compareVersions(this.minecraftVersion, '1.21.5') >= 0) {
2121
this.enabledFeatures &= ~FEATURES.REQUIRE_DOUBLE_QUOTES
22-
this.enabledFeatures |= FEATURES.RESOLVE_SPACE_ESCAPE_SEQUENCES
22+
this.enabledFeatures &= ~FEATURES.RESOLVE_SPACE_ESCAPE_SEQUENCES
2323
}
2424
}
2525

26-
stringify(): string {
27-
return this.stringifyTextElement(this.element)
26+
stringify(element: TextElement): string {
27+
return this.stringifyTextElement(element)
2828
}
2929

3030
/**

src/util/misc.ts

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,6 @@ export function roundToNth(n: number, x: number) {
1818
return Math.round(n * x) / x
1919
}
2020

21-
export function tinycolorToDecimal(color: InstanceType<typeof tinycolor>) {
22-
const rgba = color.toRgb()
23-
return ((rgba.a * 255) << 24) | (rgba.r << 16) | (rgba.g << 8) | rgba.b
24-
}
25-
2621
export function makeNotZero(vec: THREE.Vector3 | THREE.Euler) {
2722
if (vec.x === 0) vec.x = 0.00001
2823
if (vec.y === 0) vec.y = 0.00001

0 commit comments

Comments
 (0)