shulker box: load silver model (<4), improve model block mapping code

This commit is contained in:
Moritz Zwerger 2023-11-09 10:12:09 +01:00
parent 2ff185dcc6
commit 09acab1629
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
10 changed files with 34 additions and 28 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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<DyeColors> {
override val VALUES: Array<DyeColors> = values()
override val NAME_MAP: Map<String, DyeColors> = EnumUtil.getEnumValues(VALUES)
fun DyeColors.name(packFormat: Int) = when {
packFormat >= FLATTENING && this == LIGHT_GRAY -> "silver"
else -> name.lowercase()
}
}
}

View File

@ -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<ShulkerBoxRenderer> {
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)
}

View File

@ -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))
}
}
}

View File

@ -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 {

View File

@ -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 {