From c93a04a001b0f66b2724d46b04b6d1ed49a08d07 Mon Sep 17 00:00:00 2001 From: Linnea Gräf Date: Mon, 17 Nov 2025 19:55:02 +0100 Subject: refactor: port to mojmaps --- .../features/texturepack/CustomBlockTextures.kt | 131 +++++++++++---------- .../texturepack/CustomBlockTexturesDebugger.kt | 20 ++-- .../texturepack/CustomGlobalArmorOverrides.kt | 84 ++++++------- .../features/texturepack/CustomGlobalTextures.kt | 34 +++--- .../texturepack/CustomModelOverrideParser.kt | 16 +-- .../features/texturepack/CustomScreenLayouts.kt | 102 ++++++++-------- .../features/texturepack/CustomSkyBlockTextures.kt | 32 ++--- .../features/texturepack/CustomTextColors.kt | 32 ++--- .../features/texturepack/CustomTextReplacements.kt | 30 ++--- .../texturepack/FirmamentModelPredicate.kt | 4 +- .../features/texturepack/HeadModelChooser.kt | 60 +++++----- .../features/texturepack/PredicateModel.kt | 74 ++++++------ .../features/texturepack/StringMatcher.kt | 8 +- .../features/texturepack/TreeishTextReplacer.kt | 32 ++--- .../texturepack/predicates/AlwaysPredicate.kt | 2 +- .../texturepack/predicates/AndPredicate.kt | 4 +- .../texturepack/predicates/CastPredicate.kt | 8 +- .../texturepack/predicates/DisplayNamePredicate.kt | 2 +- .../predicates/ExtraAttributesPredicate.kt | 52 ++++---- .../predicates/GenericComponentPredicate.kt | 36 +++--- .../texturepack/predicates/ItemPredicate.kt | 18 +-- .../texturepack/predicates/LorePredicate.kt | 2 +- .../texturepack/predicates/NotPredicate.kt | 2 +- .../features/texturepack/predicates/OrPredicate.kt | 2 +- .../texturepack/predicates/PetPredicate.kt | 2 +- .../texturepack/predicates/PullingPredicate.kt | 8 +- .../texturepack/predicates/SkullPredicate.kt | 16 +-- .../custommodels/ApplyHeadModelInItemRenderer.java | 12 +- .../custommodels/BuildExtraBlockStateModels.java | 12 +- .../custommodels/CustomSkullTexturePatch.java | 20 ++-- .../InsertExtraBlockModelDependencies.java | 24 ++-- .../custommodels/ItemRenderStateExtraInfo.java | 4 +- .../mixins/custommodels/LoadExtraBlockStates.java | 22 ++-- .../mixins/custommodels/PatchArmorTexture.java | 20 ++-- .../custommodels/PatchLegacyArmorLayerSupport.java | 14 +-- .../PatchLegacyTexturePathsIntoArmorLayers.java | 14 +-- .../custommodels/ReplaceBlockBreakSoundPatch.java | 12 +- .../custommodels/ReplaceBlockHitSoundPatch.java | 30 ++--- .../ReplaceBlockRenderManagerBlockModel.java | 16 +-- .../custommodels/ReplaceFallbackBlockModel.java | 10 +- .../mixins/custommodels/ReplaceHeadModel.java | 32 ++--- .../mixins/custommodels/ReplaceItemModelPatch.java | 24 ++-- .../custommodels/ReplaceTextsInDrawContext.java | 38 +++--- .../mixins/custommodels/SupplyFakeModelPatch.java | 58 ++++----- .../screenlayouts/ExpandScreenBoundaries.java | 8 +- .../screenlayouts/MoveSignElements.java | 42 +++---- .../screenlayouts/ReplaceAnvilScreen.java | 44 +++---- .../screenlayouts/ReplaceForgingScreen.java | 4 +- .../screenlayouts/ReplaceFurnaceBackgrounds.java | 26 ++-- .../screenlayouts/ReplaceGenericBackgrounds.java | 20 ++-- .../screenlayouts/ReplacePlayerBackgrounds.java | 34 +++--- .../ReplaceTextColorInHandledScreen.java | 28 ++--- 52 files changed, 691 insertions(+), 690 deletions(-) (limited to 'src/texturePacks/java') diff --git a/src/texturePacks/java/moe/nea/firmament/features/texturepack/CustomBlockTextures.kt b/src/texturePacks/java/moe/nea/firmament/features/texturepack/CustomBlockTextures.kt index de64805..bc0f36a 100644 --- a/src/texturePacks/java/moe/nea/firmament/features/texturepack/CustomBlockTextures.kt +++ b/src/texturePacks/java/moe/nea/firmament/features/texturepack/CustomBlockTextures.kt @@ -22,28 +22,28 @@ import kotlinx.serialization.json.JsonElement import kotlinx.serialization.json.JsonPrimitive import kotlinx.serialization.serializer import kotlin.jvm.optionals.getOrNull -import net.minecraft.block.Block -import net.minecraft.block.BlockState -import net.minecraft.block.Blocks -import net.minecraft.client.render.model.Baker -import net.minecraft.client.render.model.BlockStateModel -import net.minecraft.client.render.model.BlockStatesLoader -import net.minecraft.client.render.model.ReferencedModelsCollector -import net.minecraft.client.render.model.SimpleBlockStateModel -import net.minecraft.client.render.model.json.BlockModelDefinition -import net.minecraft.client.render.model.json.ModelVariant -import net.minecraft.registry.Registries -import net.minecraft.registry.RegistryKey -import net.minecraft.registry.RegistryKeys -import net.minecraft.resource.Resource -import net.minecraft.resource.ResourceManager -import net.minecraft.resource.SinglePreparationResourceReloader -import net.minecraft.state.StateManager -import net.minecraft.util.Identifier -import net.minecraft.util.math.BlockPos -import net.minecraft.util.math.Box -import net.minecraft.util.profiler.Profiler -import net.minecraft.util.thread.AsyncHelper +import net.minecraft.world.level.block.Block +import net.minecraft.world.level.block.state.BlockState +import net.minecraft.world.level.block.Blocks +import net.minecraft.client.resources.model.ModelBaker +import net.minecraft.client.renderer.block.model.BlockStateModel +import net.minecraft.client.resources.model.BlockStateModelLoader +import net.minecraft.client.resources.model.ModelDiscovery +import net.minecraft.client.renderer.block.model.SingleVariant +import net.minecraft.client.renderer.block.model.BlockModelDefinition +import net.minecraft.client.renderer.block.model.Variant +import net.minecraft.core.registries.BuiltInRegistries +import net.minecraft.resources.ResourceKey +import net.minecraft.core.registries.Registries +import net.minecraft.server.packs.resources.Resource +import net.minecraft.server.packs.resources.ResourceManager +import net.minecraft.server.packs.resources.SimplePreparableReloadListener +import net.minecraft.world.level.block.state.StateDefinition +import net.minecraft.resources.ResourceLocation +import net.minecraft.core.BlockPos +import net.minecraft.world.phys.AABB +import net.minecraft.util.profiling.ProfilerFiller +import net.minecraft.util.thread.ParallelMapTransform import moe.nea.firmament.Firmament import moe.nea.firmament.annotations.Subscribe import moe.nea.firmament.events.EarlyResourceReloadEvent @@ -64,15 +64,15 @@ import moe.nea.firmament.util.json.SingletonSerializableList object CustomBlockTextures { @Serializable data class CustomBlockOverride( - val modes: @Serializable(SingletonSerializableList::class) List, - val area: List? = null, - val replacements: Map, + val modes: @Serializable(SingletonSerializableList::class) List, + val area: List? = null, + val replacements: Map, ) @Serializable(with = Replacement.Serializer::class) data class Replacement( - val block: Identifier, - val sound: Identifier?, + val block: ResourceLocation, + val sound: ResourceLocation?, ) { fun replace(block: BlockState): BlockStateModel? { blockStateMap?.let { return it[block] } @@ -83,7 +83,7 @@ object CustomBlockTextures { lateinit var overridingBlock: Block @Transient - val blockModelIdentifier get() = block.withPrefixedPath("block/") + val blockModelIdentifier get() = block.withPrefix("block/") /** * Guaranteed to be set after [BakedReplacements.modelBakingFuture] is complete, if [unbakedBlockStateMap] is set. @@ -92,7 +92,7 @@ object CustomBlockTextures { var blockStateMap: Map? = null @Transient - var unbakedBlockStateMap: Map? = null + var unbakedBlockStateMap: Map? = null /** * Guaranteed to be set after [BakedReplacements.modelBakingFuture] is complete. Prefer [blockStateMap] if present. @@ -113,7 +113,7 @@ object CustomBlockTextures { val jsonElement = decoder.decodeSerializableValue(delegate) if (jsonElement is JsonPrimitive) { require(jsonElement.isString) - return Replacement(Identifier.tryParse(jsonElement.content)!!, null) + return Replacement(ResourceLocation.tryParse(jsonElement.content)!!, null) } return (decoder as JsonDecoder).json.decodeFromJsonElement(DefaultSerializer, jsonElement) } @@ -126,8 +126,8 @@ object CustomBlockTextures { @Serializable data class Area( - val min: BlockPos, - val max: BlockPos, + val min: BlockPos, + val max: BlockPos, ) { @Transient val realMin = BlockPos( @@ -164,8 +164,8 @@ object CustomBlockTextures { (blockPos.z in realMin.z..realMax.z) } - fun toBox(): Box { - return Box( + fun toBox(): AABB { + return AABB( realMin.x.toDouble(), realMin.y.toDouble(), realMin.z.toDouble(), @@ -227,9 +227,10 @@ object CustomBlockTextures { currentIslandReplacements = replacements if (lastReplacements != replacements) { MC.nextTick { - MC.worldRenderer.chunks?.chunks?.forEach { + MC.worldRenderer.viewArea?.sections?.forEach { // false schedules rebuilds outside a 27 block radius to happen async - it.scheduleRebuild(false) + // nb: this sets the dirty but to true, the boolean parameter specifies the update behaviour + it.setDirty(false) } sodiumReloadTask?.run() } @@ -313,13 +314,13 @@ object CustomBlockTextures { } private fun prepare(manager: ResourceManager): BakedReplacements { - val resources = manager.findResources("overrides/blocks") { + val resources = manager.listResources("overrides/blocks") { it.namespace == "firmskyblock" && it.path.endsWith(".json") } val map = mutableMapOf>>() for ((file, resource) in resources) { val json = - Firmament.tryDecodeJsonFromStream(resource.inputStream) + Firmament.tryDecodeJsonFromStream(resource.open()) .getOrElse { ex -> logger.error("Failed to load block texture override at $file", ex) continue @@ -328,8 +329,8 @@ object CustomBlockTextures { val island = SkyBlockIsland.forMode(mode) val islandMpa = map.getOrPut(island, ::mutableMapOf) for ((blockId, replacement) in json.replacements) { - val block = MC.defaultRegistries.getOrThrow(RegistryKeys.BLOCK) - .getOptional(RegistryKey.of(RegistryKeys.BLOCK, blockId)) + val block = MC.defaultRegistries.lookupOrThrow(Registries.BLOCK) + .get(ResourceKey.create(Registries.BLOCK, blockId)) .getOrNull() if (block == null) { logger.error("Failed to load block texture override at ${file}: unknown block '$blockId'") @@ -346,25 +347,25 @@ object CustomBlockTextures { @Subscribe fun onStart(event: FinalizeResourceManagerEvent) { - event.resourceManager.registerReloader(object : - SinglePreparationResourceReloader() { - override fun prepare(manager: ResourceManager, profiler: Profiler): BakedReplacements { + event.resourceManager.registerReloadListener(object : + SimplePreparableReloadListener() { + override fun prepare(manager: ResourceManager, profiler: ProfilerFiller): BakedReplacements { return preparationFuture.join().also { it.modelBakingFuture.join() } } - override fun apply(prepared: BakedReplacements, manager: ResourceManager, profiler: Profiler?) { + override fun apply(prepared: BakedReplacements, manager: ResourceManager, profiler: ProfilerFiller?) { allLocationReplacements = prepared refreshReplacements() } }) } - fun simpleBlockModel(blockId: Identifier): SimpleBlockStateModel.Unbaked { + fun simpleBlockModel(blockId: ResourceLocation): SingleVariant.Unbaked { // TODO: does this need to be shared between resolving and baking? I think not, but it would probably be wise to do so in the future. - return SimpleBlockStateModel.Unbaked( - ModelVariant(blockId) + return SingleVariant.Unbaked( + Variant(blockId) ) } @@ -378,18 +379,18 @@ object CustomBlockTextures { } @JvmStatic - fun collectExtraModels(modelsCollector: ReferencedModelsCollector) { + fun collectExtraModels(modelsCollector: ModelDiscovery) { preparationFuture.join().collectAllReplacements() .forEach { - modelsCollector.resolve(simpleBlockModel(it.blockModelIdentifier)) + modelsCollector.addRoot(simpleBlockModel(it.blockModelIdentifier)) it.unbakedBlockStateMap?.values?.forEach { - modelsCollector.resolve(it) + modelsCollector.addRoot(it) } } } @JvmStatic - fun createBakedModels(baker: Baker, executor: Executor): CompletableFuture { + fun createBakedModels(baker: ModelBaker, executor: Executor): CompletableFuture { return preparationFuture.thenComposeAsync(Function { replacements -> val allBlockStates = CompletableFuture.allOf( *replacements.collectAllReplacements().filter { it.unbakedBlockStateMap != null }.map { @@ -403,9 +404,9 @@ object CustomBlockTextures { }.toList().toTypedArray() ) val byModel = replacements.collectAllReplacements().groupBy { it.blockModelIdentifier } - val modelBakingTask = AsyncHelper.mapValues(byModel, { blockId, replacements -> - val unbakedModel = SimpleBlockStateModel.Unbaked( - ModelVariant(blockId) + val modelBakingTask = ParallelMapTransform.schedule(byModel, { blockId, replacements -> + val unbakedModel = SingleVariant.Unbaked( + Variant(blockId) ) val baked = unbakedModel.bake(baker) replacements.forEach { @@ -422,38 +423,38 @@ object CustomBlockTextures { @JvmStatic fun collectExtraBlockStateMaps( - extra: BakedReplacements, - original: Map>, - stateManagers: Function?> + extra: BakedReplacements, + original: Map>, + stateManagers: Function?> ) { extra.collectAllReplacements().forEach { - val blockId = Registries.BLOCK.getKey(it.overridingBlock).getOrNull()?.value ?: return@forEach - val allModels = mutableListOf() + val blockId = BuiltInRegistries.BLOCK.getResourceKey(it.overridingBlock).getOrNull()?.location() ?: return@forEach + val allModels = mutableListOf() val stateManager = stateManagers.apply(blockId) ?: return@forEach - for (resource in original[BlockStatesLoader.FINDER.toResourcePath(it.block)] ?: return@forEach) { + for (resource in original[BlockStateModelLoader.BLOCKSTATE_LISTER.idToFile(it.block)] ?: return@forEach) { try { - resource.reader.use { reader -> + resource.openAsReader().use { reader -> val jsonElement = JsonParser.parseReader(reader) val blockModelDefinition = BlockModelDefinition.CODEC.parse(JsonOps.INSTANCE, jsonElement) .getOrThrow { msg: String? -> JsonParseException(msg) } allModels.add( - BlockStatesLoader.LoadedBlockStateDefinition( - resource.getPackId(), + BlockStateModelLoader.LoadedBlockModelDefinition( + resource.sourcePackId(), blockModelDefinition ) ) } } catch (exception: Exception) { ErrorUtil.softError( - "Failed to load custom blockstate definition ${it.block} from pack ${resource.packId}", + "Failed to load custom blockstate definition ${it.block} from pack ${resource.sourcePackId()}", exception ) } } try { - it.unbakedBlockStateMap = BlockStatesLoader.combine( + it.unbakedBlockStateMap = BlockStateModelLoader.loadBlockStateDefinitionStack( blockId, stateManager, allModels diff --git a/src/texturePacks/java/moe/nea/firmament/features/texturepack/CustomBlockTexturesDebugger.kt b/src/texturePacks/java/moe/nea/firmament/features/texturepack/CustomBlockTexturesDebugger.kt index 456b6fd..ba19e0f 100644 --- a/src/texturePacks/java/moe/nea/firmament/features/texturepack/CustomBlockTexturesDebugger.kt +++ b/src/texturePacks/java/moe/nea/firmament/features/texturepack/CustomBlockTexturesDebugger.kt @@ -2,11 +2,11 @@ package moe.nea.firmament.features.texturepack import com.mojang.brigadier.arguments.IntegerArgumentType import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager -import net.minecraft.block.Block -import net.minecraft.command.argument.BlockArgumentParser -import net.minecraft.command.argument.BlockStateArgumentType -import net.minecraft.util.math.Box -import net.minecraft.util.math.Vec3d +import net.minecraft.world.level.block.Block +import net.minecraft.commands.arguments.blocks.BlockStateParser +import net.minecraft.commands.arguments.blocks.BlockStateArgument +import net.minecraft.world.phys.AABB +import net.minecraft.world.phys.Vec3 import moe.nea.firmament.annotations.Subscribe import moe.nea.firmament.commands.get import moe.nea.firmament.commands.thenArgument @@ -42,10 +42,10 @@ object CustomBlockTexturesDebugger { } } - fun RenderInWorldContext.tryRenderBox(box: Box, colour: Int) { - val player = MC.player?.pos ?: Vec3d.ZERO + fun RenderInWorldContext.tryRenderBox(box: AABB, colour: Int) { + val player = MC.player?.position ?: Vec3.ZERO if (box.center.distanceTo(player) < range + maxOf( - box.lengthZ, box.lengthX, box.lengthY + box.zsize, box.xsize, box.ysize ) / 2 && !box.contains(player) ) { box(box, colour) @@ -81,9 +81,9 @@ object CustomBlockTexturesDebugger { ) } } - thenArgument("block", BlockStateArgumentType.blockState(event.commandRegistryAccess)) { block -> + thenArgument("block", BlockStateArgument.block(event.commandRegistryAccess)) { block -> thenExecute { - val block = get(block).blockState.block + val block = get(block).state.block debugMode = DebugMode.ForBlock(block) MC.sendChat( tr( diff --git a/src/texturePacks/java/moe/nea/firmament/features/texturepack/CustomGlobalArmorOverrides.kt b/src/texturePacks/java/moe/nea/firmament/features/texturepack/CustomGlobalArmorOverrides.kt index f731982..7e3c018 100644 --- a/src/texturePacks/java/moe/nea/firmament/features/texturepack/CustomGlobalArmorOverrides.kt +++ b/src/texturePacks/java/moe/nea/firmament/features/texturepack/CustomGlobalArmorOverrides.kt @@ -8,16 +8,16 @@ import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import kotlinx.serialization.Transient import kotlinx.serialization.UseSerializers -import net.minecraft.client.render.entity.equipment.EquipmentModel -import net.minecraft.component.type.EquippableComponent -import net.minecraft.entity.EquipmentSlot -import net.minecraft.item.ItemStack -import net.minecraft.item.equipment.EquipmentAssetKeys -import net.minecraft.registry.RegistryKey -import net.minecraft.resource.ResourceManager -import net.minecraft.resource.SinglePreparationResourceReloader -import net.minecraft.util.Identifier -import net.minecraft.util.profiler.Profiler +import net.minecraft.client.resources.model.EquipmentClientInfo +import net.minecraft.world.item.equipment.Equippable +import net.minecraft.world.entity.EquipmentSlot +import net.minecraft.world.item.ItemStack +import net.minecraft.world.item.equipment.EquipmentAssets +import net.minecraft.resources.ResourceKey +import net.minecraft.server.packs.resources.ResourceManager +import net.minecraft.server.packs.resources.SimplePreparableReloadListener +import net.minecraft.resources.ResourceLocation +import net.minecraft.util.profiling.ProfilerFiller import moe.nea.firmament.Firmament import moe.nea.firmament.annotations.Subscribe import moe.nea.firmament.events.FinalizeResourceManagerEvent @@ -30,14 +30,14 @@ import moe.nea.firmament.util.skyBlockId object CustomGlobalArmorOverrides { @Serializable data class ArmorOverride( - @SerialName("item_ids") + @SerialName("item_ids") val itemIds: List, - val layers: List? = null, - val model: Identifier? = null, - val overrides: List = listOf(), + val layers: List? = null, + val model: ResourceLocation? = null, + val overrides: List = listOf(), ) { @Transient - lateinit var modelIdentifier: Identifier + lateinit var modelIdentifier: ResourceLocation fun bake(manager: ResourceManager) { modelIdentifier = bakeModel(model, layers) overrides.forEach { it.bake(manager) } @@ -51,16 +51,16 @@ object CustomGlobalArmorOverrides { @Serializable data class ArmorOverrideLayer( - val tint: Boolean = false, - val identifier: Identifier, - val suffix: String = "", + val tint: Boolean = false, + val identifier: ResourceLocation, + val suffix: String = "", ) @Serializable data class ArmorOverrideOverride( - val predicate: FirmamentModelPredicate, - val layers: List? = null, - val model: Identifier? = null, + val predicate: FirmamentModelPredicate, + val layers: List? = null, + val model: ResourceLocation? = null, ) { init { require(layers != null || model != null) { "Either model or layers must be specified for armor override override" } @@ -68,18 +68,18 @@ object CustomGlobalArmorOverrides { } @Transient - lateinit var modelIdentifier: Identifier + lateinit var modelIdentifier: ResourceLocation fun bake(manager: ResourceManager) { modelIdentifier = bakeModel(model, layers) } } - private fun resolveComponent(slot: EquipmentSlot, model: Identifier): EquippableComponent { - return EquippableComponent( + private fun resolveComponent(slot: EquipmentSlot, model: ResourceLocation): Equippable { + return Equippable( slot, null, - Optional.of(RegistryKey.of(EquipmentAssetKeys.REGISTRY_KEY, model)), + Optional.of(ResourceKey.create(EquipmentAssets.ROOT_ID, model)), Optional.empty(), Optional.empty(), false, @@ -95,7 +95,7 @@ object CustomGlobalArmorOverrides { // If i figure out how to circumvent this (maybe track the origin of those copied itemstacks in some sort of variable in the itemstack to track back the original instance) i should reenable this cache. // Then also re add this to the cache clearing function val overrideCache = - WeakCache.dontMemoize>("ArmorOverrides") { stack, slot -> + WeakCache.dontMemoize>("ArmorOverrides") { stack, slot -> val id = stack.skyBlockId ?: return@dontMemoize Optional.empty() val override = overrides[id.neuItem] ?: return@dontMemoize Optional.empty() for (suboverride in override.overrides) { @@ -107,30 +107,30 @@ object CustomGlobalArmorOverrides { } var overrides: Map = mapOf() - private var bakedOverrides: MutableMap = mutableMapOf() + private var bakedOverrides: MutableMap = mutableMapOf() private val sentinelFirmRunning = AtomicInteger() - private fun bakeModel(model: Identifier?, layers: List?): Identifier { + private fun bakeModel(model: ResourceLocation?, layers: List?): ResourceLocation { require(model == null || layers == null) if (model != null) { return model } else if (layers != null) { val idNumber = sentinelFirmRunning.incrementAndGet() - val identifier = Identifier.of("firmament:sentinel/armor/$idNumber") + val identifier = ResourceLocation.parse("firmament:sentinel/armor/$idNumber") val equipmentLayers = layers.map { - EquipmentModel.Layer( + EquipmentClientInfo.Layer( it.identifier, if (it.tint) { - Optional.of(EquipmentModel.Dyeable(Optional.of(0xFFA06540.toInt()))) + Optional.of(EquipmentClientInfo.Dyeable(Optional.of(0xFFA06540.toInt()))) } else { Optional.empty() }, false ) } - bakedOverrides[identifier] = EquipmentModel( + bakedOverrides[identifier] = EquipmentClientInfo( mapOf( - EquipmentModel.LayerType.HUMANOID to equipmentLayers, - EquipmentModel.LayerType.HUMANOID_LEGGINGS to equipmentLayers, + EquipmentClientInfo.LayerType.HUMANOID to equipmentLayers, + EquipmentClientInfo.LayerType.HUMANOID_LEGGINGS to equipmentLayers, ) ) return identifier @@ -142,14 +142,14 @@ object CustomGlobalArmorOverrides { @Subscribe fun onStart(event: FinalizeResourceManagerEvent) { - event.resourceManager.registerReloader(object : - SinglePreparationResourceReloader>() { - override fun prepare(manager: ResourceManager, profiler: Profiler): Map { - val overrideFiles = manager.findResources("overrides/armor_models") { + event.resourceManager.registerReloadListener(object : + SimplePreparableReloadListener>() { + override fun prepare(manager: ResourceManager, profiler: ProfilerFiller): Map { + val overrideFiles = manager.listResources("overrides/armor_models") { it.namespace == "firmskyblock" && it.path.endsWith(".json") } val overrides = overrideFiles.mapNotNull { - Firmament.tryDecodeJsonFromStream(it.value.inputStream).getOrElse { ex -> + Firmament.tryDecodeJsonFromStream(it.value.open()).getOrElse { ex -> logger.error("Failed to load armor texture override at ${it.key}", ex) null } @@ -161,20 +161,20 @@ object CustomGlobalArmorOverrides { return associatedMap } - override fun apply(prepared: Map, manager: ResourceManager, profiler: Profiler) { + override fun apply(prepared: Map, manager: ResourceManager, profiler: ProfilerFiller) { overrides = prepared } }) } @JvmStatic - fun overrideArmor(itemStack: ItemStack, slot: EquipmentSlot): Optional { + fun overrideArmor(itemStack: ItemStack, slot: EquipmentSlot): Optional { if (!CustomSkyBlockTextures.TConfig.enableArmorOverrides) return Optional.empty() return overrideCache.invoke(itemStack, slot) } @JvmStatic - fun overrideArmorLayer(id: Identifier): EquipmentModel? { + fun overrideArmorLayer(id: ResourceLocation): EquipmentClientInfo? { if (!CustomSkyBlockTextures.TConfig.enableArmorOverrides) return null return bakedOverrides[id] } diff --git a/src/texturePacks/java/moe/nea/firmament/features/texturepack/CustomGlobalTextures.kt b/src/texturePacks/java/moe/nea/firmament/features/texturepack/CustomGlobalTextures.kt index f3903f0..60a6c06 100644 --- a/src/texturePacks/java/moe/nea/firmament/features/texturepack/CustomGlobalTextures.kt +++ b/src/texturePacks/java/moe/nea/firmament/features/texturepack/CustomGlobalTextures.kt @@ -8,11 +8,11 @@ import org.slf4j.LoggerFactory import kotlinx.serialization.Serializable import kotlinx.serialization.UseSerializers import kotlin.jvm.optionals.getOrNull -import net.minecraft.resource.ResourceManager -import net.minecraft.resource.SinglePreparationResourceReloader -import net.minecraft.text.Text -import net.minecraft.util.Identifier -import net.minecraft.util.profiler.Profiler +import net.minecraft.server.packs.resources.ResourceManager +import net.minecraft.server.packs.resources.SimplePreparableReloadListener +import net.minecraft.network.chat.Component +import net.minecraft.resources.ResourceLocation +import net.minecraft.util.profiling.ProfilerFiller import moe.nea.firmament.Firmament import moe.nea.firmament.annotations.Subscribe import moe.nea.firmament.events.CustomItemModelEvent @@ -25,16 +25,16 @@ import moe.nea.firmament.util.MC import moe.nea.firmament.util.json.SingletonSerializableList import moe.nea.firmament.util.runNull -object CustomGlobalTextures : SinglePreparationResourceReloader() { +object CustomGlobalTextures : SimplePreparableReloadListener() { class CustomGuiTextureOverride( val classes: List ) @Serializable data class GlobalItemOverride( - val screen: @Serializable(SingletonSerializableList::class) List, - val model: Identifier, - val predicate: FirmamentModelPredicate, + val screen: @Serializable(SingletonSerializableList::class) List, + val model: ResourceLocation, + val predicate: FirmamentModelPredicate, ) @Serializable @@ -49,7 +49,7 @@ object CustomGlobalTextures : SinglePreparationResourceReloader(it.value.inputStream).getOrElse { ex -> + Firmament.tryDecodeJsonFromStream(it.value.open()).getOrElse { ex -> ErrorUtil.softError("Failed to load global item override at ${it.key}", ex) null } @@ -92,13 +92,13 @@ object CustomGlobalTextures : SinglePreparationResourceReloader(guiClassResource.inputStream) + Firmament.tryDecodeJsonFromStream(guiClassResource.open()) .getOrElse { ex -> ErrorUtil.softError( "Failed to load screen filter at $key used by ${it.value.map { it.first }}", @@ -118,7 +118,7 @@ object CustomGlobalTextures : SinglePreparationResourceReloader() + val predicateParsers = mutableMapOf() fun registerPredicateParser(name: String, parser: FirmamentModelPredicateParser) { - predicateParsers[Identifier.of("firmament", name)] = parser + predicateParsers[ResourceLocation.fromNamespaceAndPath("firmament", name)] = parser } init { @@ -91,7 +91,7 @@ object CustomModelOverrideParser { parsedPredicates.add(PullingPredicate.AnyPulling) } if (!predicateName.startsWith("firmament:")) continue - val identifier = Identifier.of(predicateName) + val identifier = ResourceLocation.parse(predicateName) val parser = predicateParsers[identifier] ?: return neverPredicate val parsedPredicate = parser.parse(predicates[predicateName]) ?: return neverPredicate parsedPredicates.add(parsedPredicate) @@ -110,11 +110,11 @@ object CustomModelOverrideParser { @Subscribe fun finalizeResources(event: FinalizeResourceManagerEvent) { - ItemModelTypes.ID_MAPPER.put( + ItemModels.ID_MAPPER.put( Firmament.identifier("predicates/legacy"), PredicateModel.Unbaked.CODEC ) - ItemModelTypes.ID_MAPPER.put( + ItemModels.ID_MAPPER.put( Firmament.identifier("head_model"), HeadModelChooser.Unbaked.CODEC ) diff --git a/src/texturePacks/java/moe/nea/firmament/features/texturepack/CustomScreenLayouts.kt b/src/texturePacks/java/moe/nea/firmament/features/texturepack/CustomScreenLayouts.kt index 3554372..10bbeea 100644 --- a/src/texturePacks/java/moe/nea/firmament/features/texturepack/CustomScreenLayouts.kt +++ b/src/texturePacks/java/moe/nea/firmament/features/texturepack/CustomScreenLayouts.kt @@ -3,23 +3,23 @@ package moe.nea.firmament.features.texturepack import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import kotlinx.serialization.Transient -import net.minecraft.client.font.TextRenderer -import net.minecraft.client.gl.RenderPipelines -import net.minecraft.client.gui.DrawContext -import net.minecraft.client.gui.screen.Screen -import net.minecraft.client.gui.screen.ingame.AbstractSignEditScreen -import net.minecraft.client.gui.screen.ingame.HandledScreen -import net.minecraft.client.gui.screen.ingame.HangingSignEditScreen -import net.minecraft.client.gui.screen.ingame.SignEditScreen -import net.minecraft.client.render.RenderLayer -import net.minecraft.registry.Registries -import net.minecraft.resource.ResourceManager -import net.minecraft.resource.SinglePreparationResourceReloader -import net.minecraft.screen.ScreenHandler -import net.minecraft.screen.slot.Slot -import net.minecraft.text.Text -import net.minecraft.util.Identifier -import net.minecraft.util.profiler.Profiler +import net.minecraft.client.gui.Font +import net.minecraft.client.renderer.RenderPipelines +import net.minecraft.client.gui.GuiGraphics +import net.minecraft.client.gui.screens.Screen +import net.minecraft.client.gui.screens.inventory.AbstractSignEditScreen +import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen +import net.minecraft.client.gui.screens.inventory.HangingSignEditScreen +import net.minecraft.client.gui.screens.inventory.SignEditScreen +import net.minecraft.client.renderer.RenderType +import net.minecraft.core.registries.BuiltInRegistries +import net.minecraft.server.packs.resources.ResourceManager +import net.minecraft.server.packs.resources.SimplePreparableReloadListener +import net.minecraft.world.inventory.AbstractContainerMenu +import net.minecraft.world.inventory.Slot +import net.minecraft.network.chat.Component +import net.minecraft.resources.ResourceLocation +import net.minecraft.util.profiling.ProfilerFiller import moe.nea.firmament.Firmament import moe.nea.firmament.annotations.Subscribe import moe.nea.firmament.events.FinalizeResourceManagerEvent @@ -32,7 +32,7 @@ import moe.nea.firmament.mixins.accessor.AccessorScreenHandler import moe.nea.firmament.util.ErrorUtil.intoCatch import moe.nea.firmament.util.IdentifierSerializer -object CustomScreenLayouts : SinglePreparationResourceReloader>() { +object CustomScreenLayouts : SimplePreparableReloadListener>() { @Serializable data class CustomScreenLayout( @@ -61,19 +61,19 @@ object CustomScreenLayouts : SinglePreparationResourceReloader -> (screen.screenHandler as AccessorScreenHandler).type_firmament?.let { - Registries.SCREEN_HANDLER.getId(it) + is AbstractContainerScreen<*> -> (screen.menu as AccessorScreenHandler).type_firmament?.let { + BuiltInRegistries.MENU.getKey(it) } - is HangingSignEditScreen -> Identifier.of("firmskyblock", "hanging_sign") - is SignEditScreen -> Identifier.of("firmskyblock", "sign") + is HangingSignEditScreen -> ResourceLocation.fromNamespaceAndPath("firmskyblock", "hanging_sign") + is SignEditScreen -> ResourceLocation.fromNamespaceAndPath("firmskyblock", "sign") else -> null } val typeMatches = screenType == null || type == screenType; @@ -83,16 +83,16 @@ object CustomScreenLayouts : SinglePreparationResourceReloader) { + fun renderGeneric(context: GuiGraphics, screen: AbstractContainerScreen<*>) { screen as AccessorHandledScreen val originalX: Int = (screen.width - screen.backgroundWidth_Firmament) / 2 val originalY: Int = (screen.height - screen.backgroundHeight_Firmament) / 2 @@ -109,7 +109,7 @@ object CustomScreenLayouts : SinglePreparationResourceReloader 0 - CENTER -> -font.getWidth(text) / 2 - RIGHT -> -font.getWidth(text) + CENTER -> -font.width(text) / 2 + RIGHT -> -font.width(text) } } /** * Not technically part of the package, but it does allow for us to later on seamlessly integrate a color option into this class as well */ - fun replaceColor(text: Text, color: Int): Int { + fun replaceColor(text: Component, color: Int): Int { return CustomTextColors.mapTextColor(text, color) } } @@ -191,18 +191,18 @@ object CustomScreenLayouts : SinglePreparationResourceReloader { - val allScreenLayouts = manager.findResources( + val allScreenLayouts = manager.listResources( "overrides/screen_layout", { it.path.endsWith(".json") && it.namespace == "firmskyblock" }) val allParsedLayouts = allScreenLayouts.mapNotNull { (path, stream) -> - Firmament.tryDecodeJsonFromStream(stream.inputStream) + Firmament.tryDecodeJsonFromStream(stream.open()) .intoCatch("Could not read custom screen layout from $path").orNull() } return allParsedLayouts @@ -211,9 +211,9 @@ object CustomScreenLayouts : SinglePreparationResourceReloader() override fun apply( - prepared: List, - manager: ResourceManager?, - profiler: Profiler? + prepared: List, + manager: ResourceManager?, + profiler: ProfilerFiller? ) { this.customScreenLayouts = prepared } @@ -245,8 +245,8 @@ object CustomScreenLayouts : SinglePreparationResourceReloader ?: return - val handler = screen.screenHandler + val screen = event.new as? AbstractContainerScreen<*> ?: return + val handler = screen.menu activeScreenOverride?.let { override -> override.slots.forEach { slotReplacer -> slotReplacer.move(handler.slots) diff --git a/src/texturePacks/java/moe/nea/firmament/features/texturepack/CustomSkyBlockTextures.kt b/src/texturePacks/java/moe/nea/firmament/features/texturepack/CustomSkyBlockTextures.kt index b837a3c..a324402 100644 --- a/src/texturePacks/java/moe/nea/firmament/features/texturepack/CustomSkyBlockTextures.kt +++ b/src/texturePacks/java/moe/nea/firmament/features/texturepack/CustomSkyBlockTextures.kt @@ -5,11 +5,11 @@ import com.mojang.authlib.properties.Property import java.util.Optional import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable import kotlin.jvm.optionals.getOrNull -import net.minecraft.block.SkullBlock -import net.minecraft.client.MinecraftClient -import net.minecraft.client.render.RenderLayer -import net.minecraft.component.type.ProfileComponent -import net.minecraft.util.Identifier +import net.minecraft.world.level.block.SkullBlock +import net.minecraft.client.Minecraft +import net.minecraft.client.renderer.RenderType +import net.minecraft.world.item.component.ResolvableProfile +import net.minecraft.resources.ResourceLocation import moe.nea.firmament.annotations.Subscribe import moe.nea.firmament.events.CustomItemModelEvent import moe.nea.firmament.events.FinalizeResourceManagerEvent @@ -75,13 +75,13 @@ object CustomSkyBlockTextures { fun onCustomModelId(it: CustomItemModelEvent) { if (!TConfig.enabled) return val id = it.itemStack.skyBlockId ?: return - it.overrideIfEmpty(Identifier.of("firmskyblock", id.identifier.path)) + it.overrideIfEmpty(ResourceLocation.fromNamespaceAndPath("firmskyblock", id.identifier.path)) } private val skullTextureCache = - WeakCache.memoize>("SkullTextureCache") { component -> + WeakCache.memoize>("SkullTextureCache") { component -> val id = getSkullTexture(component) ?: return@memoize Optional.empty() - if (!MinecraftClient.getInstance().resourceManager.getResource(id).isPresent) { + if (!Minecraft.getInstance().resourceManager.getResource(id).isPresent) { return@memoize Optional.empty() } return@memoize Optional.of(id) @@ -97,21 +97,21 @@ object CustomSkyBlockTextures { return mcUrlData.groupValues[1] } - fun getSkullTexture(profile: ProfileComponent): Identifier? { - val id = getSkullId(profile.gameProfile.properties["textures"].firstOrNull() ?: return null) ?: return null - return Identifier.of("firmskyblock", "textures/placedskull/$id.png") + fun getSkullTexture(profile: ResolvableProfile): ResourceLocation? { + val id = getSkullId(profile.partialProfile().properties["textures"].firstOrNull() ?: return null) ?: return null + return ResourceLocation.fromNamespaceAndPath("firmskyblock", "textures/placedskull/$id.png") } fun modifySkullTexture( - type: SkullBlock.SkullType?, - component: ProfileComponent?, - cir: CallbackInfoReturnable + type: SkullBlock.Type?, + component: ResolvableProfile?, + cir: CallbackInfoReturnable ) { - if (type != SkullBlock.Type.PLAYER) return + if (type != SkullBlock.Types.PLAYER) return if (!TConfig.skullsEnabled) return if (component == null) return val n = skullTextureCache.invoke(component).getOrNull() ?: return - cir.returnValue = RenderLayer.getEntityTranslucent(n) + cir.returnValue = RenderType.entityTranslucent(n) } } diff --git a/src/texturePacks/java/moe/nea/firmament/features/texturepack/CustomTextColors.kt b/src/texturePacks/java/moe/nea/firmament/features/texturepack/CustomTextColors.kt index 3ac895a..5f3b08d 100644 --- a/src/texturePacks/java/moe/nea/firmament/features/texturepack/CustomTextColors.kt +++ b/src/texturePacks/java/moe/nea/firmament/features/texturepack/CustomTextColors.kt @@ -4,17 +4,17 @@ import java.util.Optional import kotlinx.serialization.Serializable import kotlinx.serialization.Transient import kotlin.jvm.optionals.getOrNull -import net.minecraft.resource.ResourceManager -import net.minecraft.resource.SinglePreparationResourceReloader -import net.minecraft.text.Text -import net.minecraft.util.Identifier -import net.minecraft.util.profiler.Profiler +import net.minecraft.server.packs.resources.ResourceManager +import net.minecraft.server.packs.resources.SimplePreparableReloadListener +import net.minecraft.network.chat.Component +import net.minecraft.resources.ResourceLocation +import net.minecraft.util.profiling.ProfilerFiller import moe.nea.firmament.Firmament import moe.nea.firmament.annotations.Subscribe import moe.nea.firmament.events.FinalizeResourceManagerEvent import moe.nea.firmament.util.collections.WeakCache -object CustomTextColors : SinglePreparationResourceReloader() { +object CustomTextColors : SimplePreparableReloadListener() { @Serializable data class TextOverrides( val defaultColor: Int, @@ -42,26 +42,26 @@ object CustomTextColors : SinglePreparationResourceReloader>("CustomTextColor") { text -> + val cache = WeakCache.memoize>("CustomTextColor") { text -> val override = textOverrides ?: return@memoize Optional.empty() Optional.ofNullable(override.overrides.find { it.predicate.matches(text) }) } - fun mapTextColor(text: Text, oldColor: Int): Int { + fun mapTextColor(text: Component, oldColor: Int): Int { val override = cache(text).orElse(null) return override?.override ?: textOverrides?.defaultColor ?: oldColor } override fun prepare( - manager: ResourceManager, - profiler: Profiler + manager: ResourceManager, + profiler: ProfilerFiller ): TextOverrides? { - val resource = manager.getResource(Identifier.of("firmskyblock", "overrides/text_colors.json")).getOrNull() + val resource = manager.getResource(ResourceLocation.fromNamespaceAndPath("firmskyblock", "overrides/text_colors.json")).getOrNull() ?: return null - return Firmament.tryDecodeJsonFromStream(resource.inputStream) + return Firmament.tryDecodeJsonFromStream(resource.open()) .getOrElse { Firmament.logger.error("Could not parse text_colors.json", it) null @@ -71,9 +71,9 @@ object CustomTextColors : SinglePreparationResourceReloader>() { +object CustomTextReplacements : SimplePreparableReloadListener>() { override fun prepare( - manager: ResourceManager, - profiler: Profiler + manager: ResourceManager, + profiler: ProfilerFiller ): List { - return manager.findResources("overrides/texts") { it.namespace == "firmskyblock" && it.path.endsWith(".json") } + return manager.listResources("overrides/texts") { it.namespace == "firmskyblock" && it.path.endsWith(".json") } .mapNotNull { - Firmament.tryDecodeJsonFromStream(it.value.inputStream) + Firmament.tryDecodeJsonFromStream(it.value.open()) .intoCatch("Failed to load text override from ${it.key}").orNull() } } @@ -25,20 +25,20 @@ object CustomTextReplacements : SinglePreparationResourceReloader = listOf() override fun apply( - prepared: List, - manager: ResourceManager, - profiler: Profiler + prepared: List, + manager: ResourceManager, + profiler: ProfilerFiller ) { this.textReplacers = prepared } @JvmStatic - fun replaceTexts(texts: List): List { + fun replaceTexts(texts: List): List { return texts.map { replaceText(it) } } @JvmStatic - fun replaceText(text: Text): Text { + fun replaceText(text: Component): Component { // TODO: add a config option for this val rawText = text.string var text = text @@ -51,6 +51,6 @@ object CustomTextReplacements : SinglePreparationResourceReloader { + override fun type(): MapCodec { return CODEC } - override fun bake(context: ItemModel.BakeContext): ItemModel { + override fun bake(context: ItemModel.BakingContext): ItemModel { return Baked( head.bake(context), regular.bake(context) ) } - override fun resolve(resolver: ResolvableModel.Resolver) { - head.resolve(resolver) - regular.resolve(resolver) + override fun resolveDependencies(resolver: ResolvableModel.Resolver) { + head.resolveDependencies(resolver) + regular.resolveDependencies(resolver) } companion object { @@ -75,15 +75,15 @@ object HeadModelChooser { fun fromLegacyJson(jsonObject: JsonObject, unbakedModel: ItemModel.Unbaked): ItemModel.Unbaked { val model = jsonObject["firmament:head_model"] ?: return unbakedModel val modelUrl = model.asJsonPrimitive.asString - val headModel = BasicItemModel.Unbaked(Identifier.of(modelUrl), listOf()) + val headModel = BlockModelWrapper.Unbaked(ResourceLocation.parse(modelUrl), listOf()) return Unbaked(headModel, unbakedModel) } val CODEC = RecordCodecBuilder.mapCodec { it.group( - ItemModelTypes.CODEC.fieldOf("head") + ItemModels.CODEC.fieldOf("head") .forGetter(Unbaked::head), - ItemModelTypes.CODEC.fieldOf("regular") + ItemModels.CODEC.fieldOf("regular") .forGetter(Unbaked::regular), ).apply(it, ::Unbaked) } diff --git a/src/texturePacks/java/moe/nea/firmament/features/texturepack/PredicateModel.kt b/src/texturePacks/java/moe/nea/firmament/features/texturepack/PredicateModel.kt index a3926a8..e53c9c7 100644 --- a/src/texturePacks/java/moe/nea/firmament/features/texturepack/PredicateModel.kt +++ b/src/texturePacks/java/moe/nea/firmament/features/texturepack/PredicateModel.kt @@ -4,42 +4,42 @@ import com.google.gson.JsonObject import com.mojang.serialization.Codec import com.mojang.serialization.MapCodec import com.mojang.serialization.codecs.RecordCodecBuilder -import net.minecraft.client.item.ItemModelManager -import net.minecraft.client.render.item.ItemRenderState -import net.minecraft.client.render.item.model.BasicItemModel -import net.minecraft.client.render.item.model.ItemModel -import net.minecraft.client.render.item.model.ItemModelTypes -import net.minecraft.client.render.model.ResolvableModel -import net.minecraft.client.world.ClientWorld -import net.minecraft.entity.LivingEntity -import net.minecraft.item.ItemDisplayContext -import net.minecraft.item.ItemStack -import net.minecraft.util.HeldItemContext -import net.minecraft.util.Identifier +import net.minecraft.client.renderer.item.ItemModelResolver +import net.minecraft.client.renderer.item.ItemStackRenderState +import net.minecraft.client.renderer.item.BlockModelWrapper +import net.minecraft.client.renderer.item.ItemModel +import net.minecraft.client.renderer.item.ItemModels +import net.minecraft.client.resources.model.ResolvableModel +import net.minecraft.client.multiplayer.ClientLevel +import net.minecraft.world.entity.LivingEntity +import net.minecraft.world.item.ItemDisplayContext +import net.minecraft.world.item.ItemStack +import net.minecraft.world.entity.ItemOwner +import net.minecraft.resources.ResourceLocation import moe.nea.firmament.features.texturepack.predicates.AndPredicate class PredicateModel { data class Baked( - val fallback: ItemModel, - val overrides: List + val fallback: ItemModel, + val overrides: List ) : ItemModel { data class Override( - val model: ItemModel, - val predicate: FirmamentModelPredicate, + val model: ItemModel, + val predicate: FirmamentModelPredicate, ) override fun update( - state: ItemRenderState?, - stack: ItemStack, - resolver: ItemModelManager?, - displayContext: ItemDisplayContext?, - world: ClientWorld?, - heldItemContext: HeldItemContext?, - seed: Int + state: ItemStackRenderState?, + stack: ItemStack, + resolver: ItemModelResolver?, + displayContext: ItemDisplayContext?, + world: ClientLevel?, + heldItemContext: ItemOwner?, + seed: Int ) { val model = overrides - .findLast { it.predicate.test(stack, heldItemContext?.entity) } + .findLast { it.predicate.test(stack, heldItemContext?.asLivingEntity()) } ?.model ?: fallback model.update(state, stack, resolver, displayContext, world, heldItemContext, seed) @@ -47,8 +47,8 @@ class PredicateModel { } data class Unbaked( - val fallback: ItemModel.Unbaked, - val overrides: List, + val fallback: ItemModel.Unbaked, + val overrides: List, ) : ItemModel.Unbaked { companion object { @JvmStatic @@ -57,10 +57,10 @@ class PredicateModel { val newOverrides = ArrayList() for (legacyOverride in legacyOverrides) { legacyOverride as JsonObject - val overrideModel = Identifier.tryParse(legacyOverride.get("model")?.asString ?: continue) ?: continue + val overrideModel = ResourceLocation.tryParse(legacyOverride.get("model")?.asString ?: continue) ?: continue val predicate = CustomModelOverrideParser.parsePredicates(legacyOverride.getAsJsonObject("predicate")) newOverrides.add(Override( - BasicItemModel.Unbaked(overrideModel, listOf()), + BlockModelWrapper.Unbaked(overrideModel, listOf()), AndPredicate(predicate.toTypedArray()) )) } @@ -69,34 +69,34 @@ class PredicateModel { val OVERRIDE_CODEC: Codec = RecordCodecBuilder.create { it.group( - ItemModelTypes.CODEC.fieldOf("model").forGetter(Override::model), + ItemModels.CODEC.fieldOf("model").forGetter(Override::model), CustomModelOverrideParser.LEGACY_CODEC.fieldOf("predicate").forGetter(Override::predicate), ).apply(it, Unbaked::Override) } val CODEC: MapCodec = RecordCodecBuilder.mapCodec { it.group( - ItemModelTypes.CODEC.fieldOf("fallback").forGetter(Unbaked::fallback), + ItemModels.CODEC.fieldOf("fallback").forGetter(Unbaked::fallback), OVERRIDE_CODEC.listOf().fieldOf("overrides").forGetter(Unbaked::overrides), ).apply(it, ::Unbaked) } } data class Override( - val model: ItemModel.Unbaked, - val predicate: FirmamentModelPredicate, + val model: ItemModel.Unbaked, + val predicate: FirmamentModelPredicate, ) - override fun resolve(resolver: ResolvableModel.Resolver) { - fallback.resolve(resolver) - overrides.forEach { it.model.resolve(resolver) } + override fun resolveDependencies(resolver: ResolvableModel.Resolver) { + fallback.resolveDependencies(resolver) + overrides.forEach { it.model.resolveDependencies(resolver) } } - override fun getCodec(): MapCodec { + override fun type(): MapCodec { return CODEC } - override fun bake(context: ItemModel.BakeContext): ItemModel { + override fun bake(context: ItemModel.BakingContext): ItemModel { return Baked( fallback.bake(context), overrides.map { Baked.Override(it.model.bake(context), it.predicate) } diff --git a/src/texturePacks/java/moe/nea/firmament/features/texturepack/StringMatcher.kt b/src/texturePacks/java/moe/nea/firmament/features/texturepack/StringMatcher.kt index 446bf07..52800bd 100644 --- a/src/texturePacks/java/moe/nea/firmament/features/texturepack/StringMatcher.kt +++ b/src/texturePacks/java/moe/nea/firmament/features/texturepack/StringMatcher.kt @@ -12,8 +12,8 @@ import kotlinx.serialization.Serializable import kotlinx.serialization.descriptors.SerialDescriptor import kotlinx.serialization.encoding.Decoder import kotlinx.serialization.encoding.Encoder -import net.minecraft.nbt.NbtString -import ne