From 09acab1629c2f84a1944a5e57070aaa7c92603d8 Mon Sep 17 00:00:00 2001 From: Moritz Zwerger Date: Thu, 9 Nov 2023 10:12:09 +0100 Subject: [PATCH] shulker box: load silver model (<4), improve model block mapping code --- .../connection/play/ConnectionTestUtil.kt | 2 +- .../bixilon/minosoft/assets/AssetsLoader.kt | 2 +- .../assets/minecraft/JarAssetsManager.kt | 2 +- ...ssetsVersion.kt => MinecraftPackFormat.kt} | 2 +- .../profiles/resources/assets/AssetsC.kt | 2 +- .../bixilon/minosoft/data/colors/DyeColors.kt | 9 ++++++++- .../storage/ShulkerBoxBlockEntity.kt | 20 +++++++------------ .../storage/shulker/ShulkerBoxRenderer.kt | 15 +++++++++----- .../rendering/models/loader/BlockLoader.kt | 4 ++-- .../gui/rendering/models/loader/ItemLoader.kt | 4 ++-- 10 files changed, 34 insertions(+), 28 deletions(-) rename src/main/java/de/bixilon/minosoft/assets/minecraft/{MinecraftAssetsVersion.kt => MinecraftPackFormat.kt} (98%) diff --git a/src/integration-test/kotlin/de/bixilon/minosoft/protocol/network/connection/play/ConnectionTestUtil.kt b/src/integration-test/kotlin/de/bixilon/minosoft/protocol/network/connection/play/ConnectionTestUtil.kt index cbfca15df..c56282d6a 100644 --- a/src/integration-test/kotlin/de/bixilon/minosoft/protocol/network/connection/play/ConnectionTestUtil.kt +++ b/src/integration-test/kotlin/de/bixilon/minosoft/protocol/network/connection/play/ConnectionTestUtil.kt @@ -17,7 +17,7 @@ import de.bixilon.kotlinglm.pow import de.bixilon.kutil.observer.DataObserver import de.bixilon.kutil.reflection.ReflectionUtil.forceSet import de.bixilon.minosoft.assets.connection.ConnectionAssetsManager -import de.bixilon.minosoft.assets.minecraft.MinecraftAssetsVersion.packFormat +import de.bixilon.minosoft.assets.minecraft.MinecraftPackFormat.packFormat import de.bixilon.minosoft.assets.properties.manager.AssetsManagerProperties import de.bixilon.minosoft.assets.properties.manager.pack.PackProperties import de.bixilon.minosoft.camera.ConnectionCamera diff --git a/src/main/java/de/bixilon/minosoft/assets/AssetsLoader.kt b/src/main/java/de/bixilon/minosoft/assets/AssetsLoader.kt index 227400d67..74c011505 100644 --- a/src/main/java/de/bixilon/minosoft/assets/AssetsLoader.kt +++ b/src/main/java/de/bixilon/minosoft/assets/AssetsLoader.kt @@ -17,7 +17,7 @@ import de.bixilon.kutil.latch.AbstractLatch import de.bixilon.minosoft.Minosoft import de.bixilon.minosoft.assets.connection.ConnectionAssetsManager import de.bixilon.minosoft.assets.minecraft.JarAssetsManager -import de.bixilon.minosoft.assets.minecraft.MinecraftAssetsVersion.packFormat +import de.bixilon.minosoft.assets.minecraft.MinecraftPackFormat.packFormat import de.bixilon.minosoft.assets.minecraft.index.IndexAssetsManager import de.bixilon.minosoft.assets.properties.manager.AssetsManagerProperties import de.bixilon.minosoft.assets.properties.manager.pack.PackProperties diff --git a/src/main/java/de/bixilon/minosoft/assets/minecraft/JarAssetsManager.kt b/src/main/java/de/bixilon/minosoft/assets/minecraft/JarAssetsManager.kt index 40ff284f5..5da45e193 100644 --- a/src/main/java/de/bixilon/minosoft/assets/minecraft/JarAssetsManager.kt +++ b/src/main/java/de/bixilon/minosoft/assets/minecraft/JarAssetsManager.kt @@ -19,7 +19,7 @@ import de.bixilon.kutil.string.StringUtil.formatPlaceholder import de.bixilon.kutil.url.URLUtil.toURL import de.bixilon.minosoft.assets.AssetsManager import de.bixilon.minosoft.assets.InvalidAssetException -import de.bixilon.minosoft.assets.minecraft.MinecraftAssetsVersion.packFormat +import de.bixilon.minosoft.assets.minecraft.MinecraftPackFormat.packFormat import de.bixilon.minosoft.assets.properties.manager.AssetsManagerProperties import de.bixilon.minosoft.assets.properties.manager.pack.PackProperties import de.bixilon.minosoft.assets.util.FileAssetsTypes diff --git a/src/main/java/de/bixilon/minosoft/assets/minecraft/MinecraftAssetsVersion.kt b/src/main/java/de/bixilon/minosoft/assets/minecraft/MinecraftPackFormat.kt similarity index 98% rename from src/main/java/de/bixilon/minosoft/assets/minecraft/MinecraftAssetsVersion.kt rename to src/main/java/de/bixilon/minosoft/assets/minecraft/MinecraftPackFormat.kt index 5e199c97c..6346bbbac 100644 --- a/src/main/java/de/bixilon/minosoft/assets/minecraft/MinecraftAssetsVersion.kt +++ b/src/main/java/de/bixilon/minosoft/assets/minecraft/MinecraftPackFormat.kt @@ -32,7 +32,7 @@ import de.bixilon.minosoft.protocol.protocol.ProtocolVersions.V_23W32A import de.bixilon.minosoft.protocol.protocol.ProtocolVersions.V_23W42A import de.bixilon.minosoft.protocol.versions.Version -object MinecraftAssetsVersion { +object MinecraftPackFormat { const val FLATTENING = 4 const val LATEST_PACK_FORMAT = 19 diff --git a/src/main/java/de/bixilon/minosoft/config/profile/profiles/resources/assets/AssetsC.kt b/src/main/java/de/bixilon/minosoft/config/profile/profiles/resources/assets/AssetsC.kt index 90ba8bcbd..13d1ae018 100644 --- a/src/main/java/de/bixilon/minosoft/config/profile/profiles/resources/assets/AssetsC.kt +++ b/src/main/java/de/bixilon/minosoft/config/profile/profiles/resources/assets/AssetsC.kt @@ -13,7 +13,7 @@ package de.bixilon.minosoft.config.profile.profiles.resources.assets -import de.bixilon.minosoft.assets.minecraft.MinecraftAssetsVersion.LATEST_PACK_FORMAT +import de.bixilon.minosoft.assets.minecraft.MinecraftPackFormat.LATEST_PACK_FORMAT import de.bixilon.minosoft.assets.minecraft.index.IndexAssetsType import de.bixilon.minosoft.config.profile.delegate.primitive.BooleanDelegate import de.bixilon.minosoft.config.profile.delegate.primitive.IntDelegate diff --git a/src/main/java/de/bixilon/minosoft/data/colors/DyeColors.kt b/src/main/java/de/bixilon/minosoft/data/colors/DyeColors.kt index 6f1b5cd2a..cf8d8c9d2 100644 --- a/src/main/java/de/bixilon/minosoft/data/colors/DyeColors.kt +++ b/src/main/java/de/bixilon/minosoft/data/colors/DyeColors.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2020-2022 Moritz Zwerger + * Copyright (C) 2020-2023 Moritz Zwerger * * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. * @@ -15,6 +15,7 @@ package de.bixilon.minosoft.data.colors import de.bixilon.kutil.enums.EnumUtil import de.bixilon.kutil.enums.ValuesEnum +import de.bixilon.minosoft.assets.minecraft.MinecraftPackFormat.FLATTENING enum class DyeColors { WHITE, @@ -38,5 +39,11 @@ enum class DyeColors { companion object : ValuesEnum { override val VALUES: Array = values() override val NAME_MAP: Map = EnumUtil.getEnumValues(VALUES) + + + fun DyeColors.name(packFormat: Int) = when { + packFormat >= FLATTENING && this == LIGHT_GRAY -> "silver" + else -> name.lowercase() + } } } diff --git a/src/main/java/de/bixilon/minosoft/data/entities/block/container/storage/ShulkerBoxBlockEntity.kt b/src/main/java/de/bixilon/minosoft/data/entities/block/container/storage/ShulkerBoxBlockEntity.kt index 5a5ad5757..cb8a1b4de 100644 --- a/src/main/java/de/bixilon/minosoft/data/entities/block/container/storage/ShulkerBoxBlockEntity.kt +++ b/src/main/java/de/bixilon/minosoft/data/entities/block/container/storage/ShulkerBoxBlockEntity.kt @@ -14,33 +14,27 @@ package de.bixilon.minosoft.data.entities.block.container.storage import de.bixilon.kotlinglm.vec3.Vec3i -import de.bixilon.minosoft.data.colors.DyeColors import de.bixilon.minosoft.data.entities.block.BlockEntityFactory import de.bixilon.minosoft.data.registries.blocks.state.BlockState +import de.bixilon.minosoft.data.registries.blocks.types.entity.storage.ShulkerBoxBlock +import de.bixilon.minosoft.data.registries.blocks.types.properties.DyedBlock import de.bixilon.minosoft.data.registries.identified.Namespaces.minecraft import de.bixilon.minosoft.data.registries.identified.ResourceLocation import de.bixilon.minosoft.gui.rendering.RenderContext import de.bixilon.minosoft.gui.rendering.chunk.entities.renderer.RenderedBlockEntity import de.bixilon.minosoft.gui.rendering.chunk.entities.renderer.storage.shulker.ShulkerBoxRenderer -import de.bixilon.minosoft.gui.rendering.skeletal.baked.BakedSkeletalModel import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection class ShulkerBoxBlockEntity(connection: PlayConnection) : StorageBlockEntity(connection), RenderedBlockEntity { override var renderer: ShulkerBoxRenderer? = null override fun createRenderer(context: RenderContext, state: BlockState, position: Vec3i, light: Int): ShulkerBoxRenderer? { - // TODO: remove that junk code - val model: BakedSkeletalModel? - val prefix = state.block.identifier.path.removeSuffix("shulker_box") - if (prefix.endsWith("_")) { - // colored - val color = DyeColors[prefix.removeSuffix("_")] - model = context.models.skeletal[ShulkerBoxRenderer.NAME_COLOR[color.ordinal]] - // TODO: light gray -> silver (<1.13) - } else { - model = context.models.skeletal[ShulkerBoxRenderer.NAME] + if (state.block !is ShulkerBoxBlock) return null + val name = when { + state.block is DyedBlock -> ShulkerBoxRenderer.NAME_COLOR[state.block.color.ordinal] + else -> ShulkerBoxRenderer.NAME } - if (model == null) return null + val model = context.models.skeletal[name] ?: return null return ShulkerBoxRenderer(this, context, state, position, model, light) } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/entities/renderer/storage/shulker/ShulkerBoxRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/entities/renderer/storage/shulker/ShulkerBoxRenderer.kt index 7af720237..2276d4637 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/entities/renderer/storage/shulker/ShulkerBoxRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/entities/renderer/storage/shulker/ShulkerBoxRenderer.kt @@ -16,10 +16,12 @@ package de.bixilon.minosoft.gui.rendering.chunk.entities.renderer.storage.shulke import de.bixilon.kotlinglm.vec3.Vec3 import de.bixilon.kotlinglm.vec3.Vec3i import de.bixilon.minosoft.data.colors.DyeColors +import de.bixilon.minosoft.data.colors.DyeColors.Companion.name import de.bixilon.minosoft.data.entities.block.container.storage.ShulkerBoxBlockEntity import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties.getFacing import de.bixilon.minosoft.data.registries.blocks.state.BlockState import de.bixilon.minosoft.data.registries.identified.Namespaces.minecraft +import de.bixilon.minosoft.data.registries.identified.ResourceLocation import de.bixilon.minosoft.data.world.positions.BlockPosition import de.bixilon.minosoft.gui.rendering.RenderContext import de.bixilon.minosoft.gui.rendering.chunk.entities.EntityRendererRegister @@ -66,7 +68,6 @@ class ShulkerBoxRenderer( private val named = minecraft("shulker") private val texture = minecraft("entity/shulker/shulker").texture() - private val colored = Array(DyeColors.VALUES.size) { minecraft("entity/shulker/shulker_${DyeColors[it].name.lowercase()}").texture() } private val ROTATIONS = arrayOf( Vec3(180, 0, 0).rad, @@ -78,13 +79,17 @@ class ShulkerBoxRenderer( ) override fun register(loader: ModelLoader) { - val texture = loader.context.textures.staticTextures.createTexture(texture) - loader.skeletal.register(NAME, TEMPLATE, override = mapOf(this.named to texture)) + load(NAME, texture, loader) for (color in DyeColors) { - val texture = loader.context.textures.staticTextures.createTexture(colored[color.ordinal]) - loader.skeletal.register(NAME_COLOR[color.ordinal], TEMPLATE, override = mapOf(this.named to texture)) + val texture = minecraft("entity/shulker/shulker_${color.name(loader.packFormat)}").texture() + load(NAME_COLOR[color.ordinal], texture, loader) } } + + private fun load(name: ResourceLocation, texture: ResourceLocation, loader: ModelLoader) { + val texture = loader.context.textures.staticTextures.createTexture(texture) + loader.skeletal.register(name, TEMPLATE, override = mapOf(this.named to texture)) + } } } 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 df9d86004..52485eee4 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 @@ -18,7 +18,7 @@ import de.bixilon.kutil.collections.iterator.async.AsyncIterator.Companion.async import de.bixilon.kutil.collections.map.LockMap import de.bixilon.kutil.latch.AbstractLatch import de.bixilon.kutil.reflection.ReflectionUtil.forceSet -import de.bixilon.minosoft.assets.minecraft.MinecraftAssetsVersion +import de.bixilon.minosoft.assets.minecraft.MinecraftPackFormat import de.bixilon.minosoft.assets.util.InputStreamUtil.readJsonObject import de.bixilon.minosoft.data.registries.blocks.types.Block import de.bixilon.minosoft.data.registries.identified.ResourceLocation @@ -94,7 +94,7 @@ class BlockLoader(private val loader: ModelLoader) { } fun fixTexturePath(name: ResourceLocation): ResourceLocation { - return ResourceLocation(name.namespace, name.path.fixPrefix(loader.packFormat, MinecraftAssetsVersion.FLATTENING, "blocks/", "block/")) + return ResourceLocation(name.namespace, name.path.fixPrefix(loader.packFormat, MinecraftPackFormat.FLATTENING, "blocks/", "block/")) } private fun ResourceLocation.blockModel(): ResourceLocation { diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/models/loader/ItemLoader.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/models/loader/ItemLoader.kt index c92d348b6..2b340a0a9 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/models/loader/ItemLoader.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/models/loader/ItemLoader.kt @@ -16,7 +16,7 @@ package de.bixilon.minosoft.gui.rendering.models.loader import de.bixilon.kutil.cast.CastUtil.nullCast import de.bixilon.kutil.latch.AbstractLatch import de.bixilon.kutil.reflection.ReflectionUtil.forceSet -import de.bixilon.minosoft.assets.minecraft.MinecraftAssetsVersion +import de.bixilon.minosoft.assets.minecraft.MinecraftPackFormat import de.bixilon.minosoft.assets.util.InputStreamUtil.readJsonObject import de.bixilon.minosoft.data.registries.identified.ResourceLocation import de.bixilon.minosoft.data.registries.item.items.Item @@ -83,7 +83,7 @@ class ItemLoader(private val loader: ModelLoader) { } fun fixTexturePath(name: ResourceLocation): ResourceLocation { - return ResourceLocation(name.namespace, name.path.fixPrefix(loader.packFormat, MinecraftAssetsVersion.FLATTENING, "items/", "item/")) + return ResourceLocation(name.namespace, name.path.fixPrefix(loader.packFormat, MinecraftPackFormat.FLATTENING, "items/", "item/")) } private fun ResourceLocation.itemModel(): ResourceLocation {