From cac7baa0265d3fc5ef2a00a8ceb3c231324bbf15 Mon Sep 17 00:00:00 2001 From: NichtStudioCode <51272202+NichtStudioCode@users.noreply.github.com> Date: Sat, 16 Nov 2024 18:36:24 +0100 Subject: [PATCH] Fix #431 --- .../builder/task/model/BlockModelContent.kt | 24 +++++++++++++++---- .../block/state/model/BackingStateConfig.kt | 1 + .../model/LeavesBackingStateConfigType.kt | 3 ++- .../state/model/NoteBackingStateConfig.kt | 2 ++ .../state/model/SidedBackingStateConfig.kt | 1 + .../state/model/TripwireBackingStateConfig.kt | 1 + 6 files changed, 26 insertions(+), 6 deletions(-) diff --git a/nova/src/main/kotlin/xyz/xenondevs/nova/resources/builder/task/model/BlockModelContent.kt b/nova/src/main/kotlin/xyz/xenondevs/nova/resources/builder/task/model/BlockModelContent.kt index eb1b1b4ee00..92e51e84e0d 100644 --- a/nova/src/main/kotlin/xyz/xenondevs/nova/resources/builder/task/model/BlockModelContent.kt +++ b/nova/src/main/kotlin/xyz/xenondevs/nova/resources/builder/task/model/BlockModelContent.kt @@ -2,6 +2,7 @@ package xyz.xenondevs.nova.resources.builder.task.model import com.google.gson.JsonObject import org.joml.Matrix4f +import xyz.xenondevs.commons.collections.associateNotNull import xyz.xenondevs.commons.collections.flatMap import xyz.xenondevs.commons.gson.fromJson import xyz.xenondevs.commons.gson.getObjectOrNull @@ -60,13 +61,27 @@ class BlockModelContent internal constructor(private val builder: ResourcePackBu if (file.exists()) { val blockStateJson = file.parseJson() as JsonObject - if (blockStateJson.has("multipart")) - throw IllegalArgumentException("Block state file $file contains multipart block states, which are not supported") + if (blockStateJson.has("multipart")) { + LOGGER.warning("Block state file $file contains multipart block states, which are not supported. " + + "Block states defined in this file will be ignored and potentially overwritten.") + return@forEach + } blockStateJson.getObjectOrNull("variants")?.entrySet() ?.forEach { (variantStr, variantOpts) -> - val properties = variantStr.split(',') - .associate { val s = it.split('='); s[0] to s[1] } + val properties = variantStr.split(',').associateNotNull { + val parts = it.split('=') + if (parts.size == 2) + parts[0] to parts[1] + else null + } + + if (properties.keys != type.properties) { + LOGGER.warning("Variant '$variantStr' in block state file $file does not specify all properties explicitly " + + "(got ${properties.keys}, expected ${type.properties}). " + + "This variant will be ignored and potentially overwritten.") + return@forEach + } val config = type.of(properties) val variant = GSON.fromJson(variantOpts)!! @@ -212,7 +227,6 @@ class BlockModelContent internal constructor(private val builder: ResourcePackBu val blockStateFile = getBlockStateFile(type) blockStateFile.createParentDirectories() obj.writeToFile(blockStateFile) - } } diff --git a/nova/src/main/kotlin/xyz/xenondevs/nova/world/block/state/model/BackingStateConfig.kt b/nova/src/main/kotlin/xyz/xenondevs/nova/world/block/state/model/BackingStateConfig.kt index 1608f3f5253..cf8ae61c8b9 100644 --- a/nova/src/main/kotlin/xyz/xenondevs/nova/world/block/state/model/BackingStateConfig.kt +++ b/nova/src/main/kotlin/xyz/xenondevs/nova/world/block/state/model/BackingStateConfig.kt @@ -33,6 +33,7 @@ internal abstract class BackingStateConfigType internal ) { abstract val blockedIds: Set + abstract val properties: Set abstract fun of(id: Int, waterlogged: Boolean = false): T abstract fun of(properties: Map): T diff --git a/nova/src/main/kotlin/xyz/xenondevs/nova/world/block/state/model/LeavesBackingStateConfigType.kt b/nova/src/main/kotlin/xyz/xenondevs/nova/world/block/state/model/LeavesBackingStateConfigType.kt index d5ebc728757..2e7180119df 100644 --- a/nova/src/main/kotlin/xyz/xenondevs/nova/world/block/state/model/LeavesBackingStateConfigType.kt +++ b/nova/src/main/kotlin/xyz/xenondevs/nova/world/block/state/model/LeavesBackingStateConfigType.kt @@ -23,6 +23,7 @@ internal abstract class LeavesBackingStateConfigType): T { return ctor( - properties["distance"]?.toInt() ?: 0, + properties["distance"]?.toInt() ?: 1, properties["persistent"]?.toBoolean() == true, properties["waterlogged"]?.toBoolean() == true ) diff --git a/nova/src/main/kotlin/xyz/xenondevs/nova/world/block/state/model/NoteBackingStateConfig.kt b/nova/src/main/kotlin/xyz/xenondevs/nova/world/block/state/model/NoteBackingStateConfig.kt index 1638c66a515..a702158e2e0 100644 --- a/nova/src/main/kotlin/xyz/xenondevs/nova/world/block/state/model/NoteBackingStateConfig.kt +++ b/nova/src/main/kotlin/xyz/xenondevs/nova/world/block/state/model/NoteBackingStateConfig.kt @@ -32,6 +32,8 @@ internal data class NoteBackingStateConfig( companion object : DynamicDefaultingBackingStateConfigType(1149, "note_block") { + override val properties = hashSetOf("instrument", "note", "powered") + fun getIdOf(instrument: Instrument, note: Int, powered: Boolean): Int { return instrument.ordinal * NOTE_BASE * POWERED_BASE + note * POWERED_BASE + powered.intValue } diff --git a/nova/src/main/kotlin/xyz/xenondevs/nova/world/block/state/model/SidedBackingStateConfig.kt b/nova/src/main/kotlin/xyz/xenondevs/nova/world/block/state/model/SidedBackingStateConfig.kt index f5cf14cc1bf..3a1e8350459 100644 --- a/nova/src/main/kotlin/xyz/xenondevs/nova/world/block/state/model/SidedBackingStateConfig.kt +++ b/nova/src/main/kotlin/xyz/xenondevs/nova/world/block/state/model/SidedBackingStateConfig.kt @@ -38,6 +38,7 @@ internal abstract class SidedBackingStateConfigType override val blockedIds = setOf(63) override val defaultStateConfig = of(63) + override val properties = hashSetOf("north", "east", "south", "west", "up", "down") final override fun of(id: Int, waterlogged: Boolean): T { if (waterlogged) diff --git a/nova/src/main/kotlin/xyz/xenondevs/nova/world/block/state/model/TripwireBackingStateConfig.kt b/nova/src/main/kotlin/xyz/xenondevs/nova/world/block/state/model/TripwireBackingStateConfig.kt index eb4443e67bb..cf3d1b110ff 100644 --- a/nova/src/main/kotlin/xyz/xenondevs/nova/world/block/state/model/TripwireBackingStateConfig.kt +++ b/nova/src/main/kotlin/xyz/xenondevs/nova/world/block/state/model/TripwireBackingStateConfig.kt @@ -52,6 +52,7 @@ internal abstract class TripwireBackingStateConfigType private constructor( ) : BackingStateConfigType(63, "tripwire") { override val blockedIds = IntArraySet((0..15).toIntArray()) + override val properties = hashSetOf("north", "east", "south", "west", "disarmed", "powered") override fun of(id: Int, waterlogged: Boolean): TripwireBackingStateConfig { if (waterlogged)