From 7ba4e45edf727d679e16538ce403d1d1ebd6b9b3 Mon Sep 17 00:00:00 2001 From: Moritz Zwerger Date: Sun, 30 Jul 2023 17:13:13 +0200 Subject: [PATCH] fix loading crash with no assets Reported-By: turtius --- .../bixilon/minosoft/gui/rendering/models/BlockModelTest.kt | 2 +- .../models/block/state/apply/SingleBlockStateApply.kt | 4 ++-- .../models/block/state/apply/WeightedBlockStateApply.kt | 3 ++- .../minosoft/gui/rendering/models/loader/BlockLoader.kt | 6 +++--- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/integration-test/kotlin/de/bixilon/minosoft/gui/rendering/models/BlockModelTest.kt b/src/integration-test/kotlin/de/bixilon/minosoft/gui/rendering/models/BlockModelTest.kt index d203ec240..2a16f8542 100644 --- a/src/integration-test/kotlin/de/bixilon/minosoft/gui/rendering/models/BlockModelTest.kt +++ b/src/integration-test/kotlin/de/bixilon/minosoft/gui/rendering/models/BlockModelTest.kt @@ -40,7 +40,7 @@ class BlockModelTest { assets.push(minosoft("models/block/named.json"), json) - return loader.block.loadBlock(minosoft("block/named")) + return loader.block.loadBlock(minosoft("block/named"))!! } fun emptyModel() { diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/models/block/state/apply/SingleBlockStateApply.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/models/block/state/apply/SingleBlockStateApply.kt index 507bdc2e4..cbf3c5469 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/models/block/state/apply/SingleBlockStateApply.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/models/block/state/apply/SingleBlockStateApply.kt @@ -198,8 +198,8 @@ data class SingleBlockStateApply( return SingleBlockStateApply(model, uvLock, x, y) } - fun deserialize(loader: BlockLoader, data: JsonObject): SingleBlockStateApply { - val model = loader.loadBlock(data["model"].toString().toResourceLocation()) + fun deserialize(loader: BlockLoader, data: JsonObject): SingleBlockStateApply? { + val model = loader.loadBlock(data["model"].toString().toResourceLocation()) ?: return null return deserialize(model, data) } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/models/block/state/apply/WeightedBlockStateApply.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/models/block/state/apply/WeightedBlockStateApply.kt index 4e17f51f9..402af58a8 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/models/block/state/apply/WeightedBlockStateApply.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/models/block/state/apply/WeightedBlockStateApply.kt @@ -53,9 +53,10 @@ data class WeightedBlockStateApply( for (entry in data) { var weight = entry["weight"]?.toInt() ?: 1 if (weight < 0) weight = 1 - val apply = SingleBlockStateApply.deserialize(loader, entry) + val apply = SingleBlockStateApply.deserialize(loader, entry) ?: continue models += WeightedApply(weight, apply) } + if(models.isEmpty()) return null return WeightedBlockStateApply(models) } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/models/loader/BlockLoader.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/models/loader/BlockLoader.kt index b5be1602d..0ef0eb69f 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/models/loader/BlockLoader.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/models/loader/BlockLoader.kt @@ -27,9 +27,9 @@ class BlockLoader(private val loader: ModelLoader) { val assets = loader.context.connection.assetsManager val version = loader.context.connection.version - fun loadBlock(name: ResourceLocation): BlockModel { + fun loadBlock(name: ResourceLocation): BlockModel? { val file = name.model("block/") - val data = assets[file].readJsonObject() + val data = assets.getOrNull(file)?.readJsonObject() ?: return null val parent = data["parent"]?.toString()?.let { loadBlock(it.toResourceLocation()) } @@ -39,7 +39,7 @@ class BlockLoader(private val loader: ModelLoader) { fun loadState(block: Block): DirectBlockModel? { val file = (if (block is CustomBlockModel) block.getModelName(version) else block.identifier)?.blockState() ?: return null - val data = assets[file].readJsonObject() + val data = assets.getOrNull(file)?.readJsonObject() ?: return null return DirectBlockModel.deserialize(this, data) }