From 7b088023de1b29e87444eea88764196fbe1ac797 Mon Sep 17 00:00:00 2001 From: SnaveSutit Date: Mon, 13 Oct 2025 19:09:57 -0400 Subject: [PATCH 01/20] =?UTF-8?q?=F0=9F=90=9B=20Fix=20rotation=20validatio?= =?UTF-8?q?n=20checking=20for=20incorrect=20MC=20version?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/systems/util.ts | 7 +------ .../1.20.4/blueprints/armor_stand_1.20.4.ajblueprint | 2 +- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/src/systems/util.ts b/src/systems/util.ts index 427793ee..d48006b1 100644 --- a/src/systems/util.ts +++ b/src/systems/util.ts @@ -102,7 +102,7 @@ export function isCubeValid(cube: Cube): '1.21.6+' | 'valid' | 'invalid' { totalRotation === cube.rotation[1] || totalRotation === cube.rotation[2] - if (isSingleAxisRotation && projectTargetVersionIsAtLeast('1.21.4')) return '1.21.6+' + if (isSingleAxisRotation && projectTargetVersionIsAtLeast('1.21.6')) return '1.21.6+' const isRotationInAllowedSteps = totalRotation === -45 || @@ -116,11 +116,6 @@ export function isCubeValid(cube: Cube): '1.21.6+' | 'valid' | 'invalid' { return 'invalid' } -export function getFunctionNamespace(version: string): 'function' | 'functions' { - // If the target version is 1.21.0 or higher, use the 'function' namespace instead of 'functions' - return compareVersions(version, '1.20.10000') ? 'function' : 'functions' -} - export async function sleepForAnimationFrame() { return new Promise(resolve => requestAnimationFrame(resolve)) } diff --git a/test-packs/1.20.4/blueprints/armor_stand_1.20.4.ajblueprint b/test-packs/1.20.4/blueprints/armor_stand_1.20.4.ajblueprint index 3c1e8863..052194e3 100644 --- a/test-packs/1.20.4/blueprints/armor_stand_1.20.4.ajblueprint +++ b/test-packs/1.20.4/blueprints/armor_stand_1.20.4.ajblueprint @@ -2027,7 +2027,7 @@ "override": false, "length": 1, "snapping": 20, - "selected": true, + "selected": false, "saved": true, "path": "", "anim_time_update": "", From b70623a096ac664034e6c25b3ee6af0c8a72f003 Mon Sep 17 00:00:00 2001 From: SnaveSutit Date: Mon, 13 Oct 2025 19:24:11 -0400 Subject: [PATCH 02/20] =?UTF-8?q?=F0=9F=90=9B=20Fix=20models=20converted?= =?UTF-8?q?=20to=20Blueprints=20becoming=20unsavable?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If the default variant couldn't be found, the codec compile function would fail. I've changed the `Variant.getDefault` function to create a default variant if one does not already exist. --- .../variantKeyframePanel.svelte | 2 +- src/formats/blueprint/codec.ts | 4 ++-- src/formats/blueprint/index.ts | 7 ------- src/mods/customKeyframes.ts | 2 +- src/variants.ts | 21 +++++++++++++++---- 5 files changed, 21 insertions(+), 15 deletions(-) diff --git a/src/components/keyframePanels/variantKeyframePanel.svelte b/src/components/keyframePanels/variantKeyframePanel.svelte index 382c98cb..f4676774 100644 --- a/src/components/keyframePanels/variantKeyframePanel.svelte +++ b/src/components/keyframePanels/variantKeyframePanel.svelte @@ -11,7 +11,7 @@ let executeCondition = keyframe?.execute_condition ?? '' $: { - keyframe.variant = Variant.all.find(v => v.uuid === variantUuid) ?? Variant.getDefault() + keyframe.variant = Variant.getByUUID(variantUuid) ?? Variant.getDefault() keyframe.execute_condition = executeCondition Animator.preview() } diff --git a/src/formats/blueprint/codec.ts b/src/formats/blueprint/codec.ts index bc1dc9e1..a9b8a845 100644 --- a/src/formats/blueprint/codec.ts +++ b/src/formats/blueprint/codec.ts @@ -309,8 +309,8 @@ export const BLUEPRINT_CODEC = registerCodec( } model.variants = { - default: Variant.all.find(v => v.isDefault)!.toJSON(), - list: Variant.all.filter(v => !v.isDefault).map(v => v.toJSON()), + default: Variant.getDefault().toJSON(), + list: Variant.allExcludingDefault().map(v => v.toJSON()), } const animationOptions = { bone_names: true, absolute_paths: options.absolute_paths } diff --git a/src/formats/blueprint/index.ts b/src/formats/blueprint/index.ts index 4c882733..d15f29da 100644 --- a/src/formats/blueprint/index.ts +++ b/src/formats/blueprint/index.ts @@ -281,13 +281,6 @@ export const BLUEPRINT_FORMAT = registerModelFormat( project.pluginMode = new Valuable(project.animated_java.enable_plugin_mode) - // project.variants ??= [] - // if (Variant.all.length === 0) { - // console.warn('No variants found, creating default variant') - // new Variant('Default', true) - // } - // Variant.selectDefault() - initializeRenderBoxPreview() requestAnimationFrame(() => { diff --git a/src/mods/customKeyframes.ts b/src/mods/customKeyframes.ts index cd52a002..a4348bd5 100644 --- a/src/mods/customKeyframes.ts +++ b/src/mods/customKeyframes.ts @@ -44,7 +44,7 @@ registerConditionalPropertyOverrideMod({ const uuid = this.data_points.at(0)?.[EFFECT_ANIMATOR_CHANNELS.VARIANT] as | string | undefined - if (uuid) return Variant.all.find(v => v.uuid === uuid) + if (uuid) return Variant.getByUUID(uuid) console.error('Keyframe variant', uuid, 'not found!') }, diff --git a/src/variants.ts b/src/variants.ts index 97504b70..083d9b7f 100644 --- a/src/variants.ts +++ b/src/variants.ts @@ -93,11 +93,13 @@ export class Variant { this.textureMap = new TextureMap() this.id = Variant.all.length if (this.isDefault) { + if (Variant.hasDefault()) { + throw new Error('There can only be one default variant!') + } this.displayName = 'Default' this.name = 'default' } Variant.all.push(this) - // this.select() EVENTS.CREATE_VARIANT.publish(this) } @@ -225,12 +227,23 @@ export class Variant { } static selectDefault() { - const variant = Variant.all.find(v => v.isDefault) - if (variant) variant.select() + Variant.getDefault().select() + } + + static getByUUID(uuid: string): Variant | undefined { + return Variant.all.find(v => v.uuid === uuid) + } + + static allExcludingDefault(): Variant[] { + return Variant.all.filter(v => !v.isDefault) + } + + static hasDefault(): boolean { + return Variant.all.some(v => v.isDefault) } static getDefault(): Variant { - return Variant.all.find(v => v.isDefault) ?? Variant.all[0] + return Variant.all.find(v => v.isDefault) ?? new Variant('Default', true) } } From 4a67ccf4bc0b213bebeecefdb091b3507aa2b762 Mon Sep 17 00:00:00 2001 From: SnaveSutit Date: Mon, 13 Oct 2025 19:50:55 -0400 Subject: [PATCH 03/20] =?UTF-8?q?=F0=9F=90=9B=20Fix=20loading=20blueprints?= =?UTF-8?q?=20with=20variants=20crashing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/formats/blueprint/codec.ts | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/src/formats/blueprint/codec.ts b/src/formats/blueprint/codec.ts index a9b8a845..414dcb11 100644 --- a/src/formats/blueprint/codec.ts +++ b/src/formats/blueprint/codec.ts @@ -156,18 +156,22 @@ export const BLUEPRINT_CODEC = registerCodec( } } - if (model.variants?.default) { - Variant.fromJSON(model.variants?.default, true) - } else { - console.warn('No default Variant found, creating one named "Default"') - new Variant('Default', true) - } + if (model.variants) { + Variant.all = [] + + if (model.variants.default) { + Variant.fromJSON(model.variants?.default, true) + } else { + console.warn('No default Variant found, creating one named "Default"') + new Variant('Default', true) + } - if (model.variants?.list) { - for (const variantJSON of model.variants.list) { - Variant.fromJSON(variantJSON) + if (Array.isArray(model.variants.list)) { + for (const variantJSON of model.variants.list) { + Variant.fromJSON(variantJSON) + } + Project.variants = Variant.all } - Project.variants = Variant.all } if (model.animations) { From 67e7f5346a06aea57ade53cecbf277141bf86fc5 Mon Sep 17 00:00:00 2001 From: SnaveSutit Date: Mon, 13 Oct 2025 19:56:56 -0400 Subject: [PATCH 04/20] =?UTF-8?q?=F0=9F=90=9B=20Fix=20deleting=20text=20di?= =?UTF-8?q?splays=20throwing=20an=20error?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/outliner/textDisplay.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/outliner/textDisplay.ts b/src/outliner/textDisplay.ts index 7573a321..bb32a81f 100644 --- a/src/outliner/textDisplay.ts +++ b/src/outliner/textDisplay.ts @@ -269,6 +269,10 @@ export class TextDisplay extends ResizableOutlinerElement { text.isTextDisplayText = true const mesh = this.mesh as THREE.Mesh + if (!mesh) { + console.warn('TextDisplay mesh not found') + return + } mesh.clear() delete mesh.sprite mesh.name = this.uuid @@ -281,8 +285,6 @@ export class TextDisplay extends ResizableOutlinerElement { mesh.outline = outline mesh.add(outline) mesh.visible = this.visibility - - return text } } TextDisplay.prototype.icon = TextDisplay.icon From ab3dcc64e03e14e8e3ed50f0da51e4a14e3f838e Mon Sep 17 00:00:00 2001 From: SnaveSutit Date: Mon, 13 Oct 2025 21:14:32 -0400 Subject: [PATCH 05/20] =?UTF-8?q?=E2=9C=A8=20Improve=20block=20display=20b?= =?UTF-8?q?lock=20input=20and=20undo=20history?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vanillaBlockDisplayElementPanel.svelte | 91 +++++++------------ src/index.ts | 3 +- .../panel/vanillaBlockDisplayElement.ts | 45 ++++++++- src/mods/globalCssMod.css | 11 +++ src/outliner/vanillaBlockDisplay.ts | 51 +++++------ src/systems/minecraft/blockModelManager.ts | 26 +++++- src/util/minecraftUtil.ts | 19 ++++ 7 files changed, 153 insertions(+), 93 deletions(-) diff --git a/src/components/vanillaBlockDisplayElementPanel.svelte b/src/components/vanillaBlockDisplayElementPanel.svelte index 52cb972d..51ba46e9 100644 --- a/src/components/vanillaBlockDisplayElementPanel.svelte +++ b/src/components/vanillaBlockDisplayElementPanel.svelte @@ -1,80 +1,57 @@ -

+

{translate('panel.vanilla_block_display.title')}

-
+
- +
-
- {$error} -
+{#if $error} +
+ {$error} +
+{/if} diff --git a/src/components/displayEntityConfigDialog.svelte b/src/components/displayEntityConfigDialog.svelte new file mode 100644 index 00000000..238ea047 --- /dev/null +++ b/src/components/displayEntityConfigDialog.svelte @@ -0,0 +1,238 @@ + + + + + + + + + + +
+ +
+ + + + - - - - - - - - - - - - - - -{:else} - - - {#if $useNBT} -

- {translate('dialog.text_display_config.use_nbt.use_nbt_warning')} -

- - {:else} - - - - - - - - - - - - - - - - - - - -{:else} - - - {#if $useNBT} -

- {translate('dialog.bone_config.use_nbt.use_nbt_warning')} -

- - {:else} - - - - - - - - - - - - - - - - - - - - - - - -{:else} - - - {#if $useNBT} -

- {translate('dialog.bone_config.use_nbt.use_nbt_warning')} -

- - {:else} - - - - -