diff --git a/src/app/components/generator/SourcePanel.tsx b/src/app/components/generator/SourcePanel.tsx index 8200982d..b50de2b4 100644 --- a/src/app/components/generator/SourcePanel.tsx +++ b/src/app/components/generator/SourcePanel.tsx @@ -153,7 +153,7 @@ export function SourcePanel({ name, model, blockStates, doCopy, doDownload, doIm useEffect(() => { if (!editor.current || !retransform.current) return if (!highlighting || braceLoaded) { - editor.current.configure(indent, format) + editor.current.configure(indent, format === 'snbt' ? 'yaml' : format) retransform.current() } }, [indent, format, highlighting, braceLoaded]) diff --git a/src/app/services/Source.ts b/src/app/services/Source.ts index aca6ee79..00de8c47 100644 --- a/src/app/services/Source.ts +++ b/src/app/services/Source.ts @@ -1,3 +1,4 @@ +import { NbtByte, NbtCompound, NbtDouble, NbtInt, NbtList, NbtString, NbtTag } from 'deepslate' import yaml from 'js-yaml' import { Store } from '../Store.js' @@ -26,6 +27,10 @@ const FORMATS: Record (commentJson ?? JSON).stringify(v, null, i) + '\n', }, + snbt: { + parse: async (v) => NbtTag.fromString(v).toSimplifiedJson(), + stringify: (v, _i) => jsonToNbt(v).toPrettyString(), + }, yaml: { parse: async (v) => yaml.load(v), stringify: (v, i) => yaml.dump(v, { @@ -35,6 +40,28 @@ const FORMATS: Record [k, jsonToNbt(v)])) + ) + } + throw new Error(`Could not convert ${value} to NBT`) +} + export function stringifySource(data: unknown, format?: string, indent?: string) { return FORMATS[format ?? Store.getFormat()].stringify(data, INDENTS[indent ?? Store.getIndent()]) } diff --git a/src/locales/en.json b/src/locales/en.json index 1dfd7477..63f2eb93 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -48,6 +48,7 @@ "fields": "Fields", "follow_reference": "Follow reference", "format.json": "JSON", + "format.snbt": "SNBT", "format.yaml": "YAML", "generate_new_color": "Generate new color", "generate_new_seed": "Generate new seed",