diff --git a/src/main/java/com/minelittlepony/api/model/Models.java b/src/main/java/com/minelittlepony/api/model/Models.java index f5c2dde8..9149edca 100644 --- a/src/main/java/com/minelittlepony/api/model/Models.java +++ b/src/main/java/com/minelittlepony/api/model/Models.java @@ -4,15 +4,11 @@ import net.minecraft.item.ItemStack; import net.minecraft.item.equipment.EquipmentModel; import net.minecraft.util.Util; -import org.jetbrains.annotations.Nullable; - import com.minelittlepony.client.model.AbstractPonyModel; -import com.minelittlepony.client.model.PlayerModelKey; import com.minelittlepony.client.model.armour.*; import com.minelittlepony.mson.api.ModelKey; +import com.minelittlepony.mson.api.MsonModel; -import java.util.*; -import java.util.function.Consumer; import java.util.function.Function; /** @@ -23,20 +19,15 @@ public record Models> ( M body ) { - public Models(PlayerModelKey playerModelKey, boolean slimArms, @Nullable Consumer initializer) { - this(Util.memoize(key -> key.createModel(playerModelKey.armorFactory())), playerModelKey.getKey(slimArms).createModel()); - if (initializer != null) { - initializer.accept(body); - } + public Models(ModelKey modelKey, MsonModel.Factory> armorFactory) { + this(Util.memoize(key -> key.createModel(armorFactory)), modelKey.createModel()); } - public Models(ModelKey key) { + public Models(ModelKey key) { this(Util.memoize(k -> k.createModel()), key.createModel()); } - public Optional> getArmourModel(ItemStack stack, EquipmentModel.LayerType layerType, ArmourVariant variant) { - return ArmorModelRegistry.getModelKey(stack.getItem(), layerType) - .or(() -> variant.getDefaultModel(layerType)) - .map(armor); + public AbstractPonyModel getArmourModel(ItemStack stack, EquipmentModel.LayerType layerType, ArmourVariant variant) { + return armor.apply(ArmorModelRegistry.getModelKey(stack.getItem(), layerType, variant)); } } diff --git a/src/main/java/com/minelittlepony/client/model/PlayerModelKey.java b/src/main/java/com/minelittlepony/client/model/PlayerModelKey.java index 65d42f9f..92187a27 100644 --- a/src/main/java/com/minelittlepony/client/model/PlayerModelKey.java +++ b/src/main/java/com/minelittlepony/client/model/PlayerModelKey.java @@ -3,8 +3,6 @@ package com.minelittlepony.client.model; import net.minecraft.client.model.Model; import net.minecraft.client.model.ModelPart; -import org.jetbrains.annotations.Nullable; - import com.minelittlepony.api.model.Models; import com.minelittlepony.api.model.PonyModel; import com.minelittlepony.client.MineLittlePony; @@ -28,15 +26,15 @@ public record PlayerModelKey> ( ); } - public ModelKey getKey(boolean slimArms) { - return slimArms ? alexKey : steveKey; + public Models alex() { + return new Models(alexKey, armorFactory); } - public Models create(boolean slimArms) { - return create(slimArms, null); + public Models steve() { + return new Models(steveKey, armorFactory); } - public Models create(boolean slimArms, @Nullable Consumer initializer) { - return new Models<>(this, slimArms, initializer); + public Models create(boolean slimArms) { + return slimArms ? alex() : steve(); } } diff --git a/src/main/java/com/minelittlepony/client/model/armour/ArmorModelRegistry.java b/src/main/java/com/minelittlepony/client/model/armour/ArmorModelRegistry.java index 0dd87485..d1bee93b 100644 --- a/src/main/java/com/minelittlepony/client/model/armour/ArmorModelRegistry.java +++ b/src/main/java/com/minelittlepony/client/model/armour/ArmorModelRegistry.java @@ -2,25 +2,35 @@ package com.minelittlepony.client.model.armour; import net.minecraft.item.Item; import net.minecraft.item.equipment.EquipmentModel; -import net.minecraft.registry.Registries; import net.minecraft.util.Identifier; import com.minelittlepony.client.model.AbstractPonyModel; import com.minelittlepony.mson.api.ModelKey; import com.minelittlepony.mson.api.Mson; +import com.minelittlepony.util.ResourceUtil; import java.util.*; public interface ArmorModelRegistry { static final Map>>> REGISTRY = new HashMap<>(); - public static Optional>> getModelKey(Item item, EquipmentModel.LayerType layerType) { - Identifier id = Registries.ITEM.getId(item); - if (id.getNamespace().equals("minecraft")) { - return Optional.empty(); - } - return REGISTRY.computeIfAbsent(id.withPath(p -> "armor/" + layerType.name().toLowerCase(Locale.ROOT) + "_" + p + ".json"), i -> { - return Optional.of(Mson.getInstance().registerModel(i, PonyArmourModel::new)); - }).filter(key -> key.getModelData().isPresent()); + @SuppressWarnings("deprecation") + public static ModelKey> getModelKey(Item item, EquipmentModel.LayerType layerType, ArmourVariant variant) { + return item.getRegistryEntry().getKey().map(key -> key.getValue()).flatMap(id -> { + if (id.getNamespace().equals("minecraft")) { + return Optional.empty(); + } + return REGISTRY.computeIfAbsent(id.withPath(p -> ResourceUtil.format("armor/%s_%s.json", layerName(layerType), p)), i -> { + return Optional.of(Mson.getInstance().registerModel(i, PonyArmourModel::new)); + }).filter(key -> key.getModelData().isPresent()); + }).orElse(variant.getDefaultModel(layerType)); + } + + private static String layerName(EquipmentModel.LayerType layerType) { + return switch (layerType) { + case HUMANOID -> "outer"; + case HUMANOID_LEGGINGS -> "inner"; + default -> layerType.name().toLowerCase(Locale.ROOT); + }; } } diff --git a/src/main/java/com/minelittlepony/client/model/armour/ArmourVariant.java b/src/main/java/com/minelittlepony/client/model/armour/ArmourVariant.java index dda97bd9..52195d61 100644 --- a/src/main/java/com/minelittlepony/client/model/armour/ArmourVariant.java +++ b/src/main/java/com/minelittlepony/client/model/armour/ArmourVariant.java @@ -6,22 +6,20 @@ import com.minelittlepony.client.model.AbstractPonyModel; import com.minelittlepony.client.model.ModelType; import com.minelittlepony.mson.api.ModelKey; -import java.util.Optional; - public enum ArmourVariant { NORMAL(ModelType.INNER_PONY_ARMOR, ModelType.OUTER_PONY_ARMOR), LEGACY(ModelType.INNER_VANILLA_ARMOR, ModelType.OUTER_VANILLA_ARMOR), TRIM(ModelType.INNER_VANILLA_ARMOR, ModelType.OUTER_VANILLA_ARMOR); - private final Optional>> innerModel; - private final Optional>> outerModel; + private final ModelKey> innerModel; + private final ModelKey> outerModel; ArmourVariant(ModelKey> inner, ModelKey> outer) { - this.innerModel = Optional.of(inner); - this.outerModel = Optional.of(outer); + this.innerModel = inner; + this.outerModel = outer; } - public Optional>> getDefaultModel(EquipmentModel.LayerType layerType) { + public ModelKey> getDefaultModel(EquipmentModel.LayerType layerType) { return layerType == EquipmentModel.LayerType.HUMANOID_LEGGINGS ? innerModel : outerModel; } } diff --git a/src/main/java/com/minelittlepony/client/model/armour/PonifiedEquipmentRenderer.java b/src/main/java/com/minelittlepony/client/model/armour/PonifiedEquipmentRenderer.java index 45fcec0d..f932a3ce 100644 --- a/src/main/java/com/minelittlepony/client/model/armour/PonifiedEquipmentRenderer.java +++ b/src/main/java/com/minelittlepony/client/model/armour/PonifiedEquipmentRenderer.java @@ -82,7 +82,7 @@ public class PonifiedEquipmentRenderer extends EquipmentRenderer { VertexConsumer armorConsumer = getArmorVertexConsumer(plugin, equipmentSlot, vertices, layerTexture, layerType, hasGlint); if (armorConsumer != null) { ArmourVariant variant = layer.usePlayerTexture() ? ArmourVariant.LEGACY : armorTexture.variant(); - AbstractPonyModel model = models.getArmourModel(stack, layerType, variant).orElse(null); + AbstractPonyModel model = models.getArmourModel(stack, layerType, variant); if (model != null) { model.setAngles(entity); models.body().copyTransforms(model); diff --git a/src/main/java/com/minelittlepony/client/render/EquineRenderManager.java b/src/main/java/com/minelittlepony/client/render/EquineRenderManager.java index 09275e60..98004759 100644 --- a/src/main/java/com/minelittlepony/client/render/EquineRenderManager.java +++ b/src/main/java/com/minelittlepony/client/render/EquineRenderManager.java @@ -62,9 +62,8 @@ public class EquineRenderManager< context.setModel(models.body()); } - @SuppressWarnings({"rawtypes", "unchecked"}) public EquineRenderManager(PonyRenderContext context, Transformer transformer, ModelKey key) { - this(context, transformer, new Models(key)); + this(context, transformer, new Models<>(key)); } public void setModelsLookup(Function> modelsLookup) { diff --git a/src/main/java/com/minelittlepony/client/render/blockentity/skull/PlayerPonySkull.java b/src/main/java/com/minelittlepony/client/render/blockentity/skull/PlayerPonySkull.java index a7ae1265..46cefd3c 100644 --- a/src/main/java/com/minelittlepony/client/render/blockentity/skull/PlayerPonySkull.java +++ b/src/main/java/com/minelittlepony/client/render/blockentity/skull/PlayerPonySkull.java @@ -62,7 +62,7 @@ public class PlayerPonySkull implements ISkull { return false; } } - ponyHead = modelCache.computeIfAbsent(ModelType.getPlayerModel(race), key -> key.getKey(false).createModel()); + ponyHead = modelCache.computeIfAbsent(ModelType.getPlayerModel(race), key -> key.steveKey().createModel()); state.pony = pony; state.race = pony.race(); state.attributes.size = pony.size(); diff --git a/src/main/java/com/minelittlepony/client/render/entity/feature/SkullFeature.java b/src/main/java/com/minelittlepony/client/render/entity/feature/SkullFeature.java index 043f8893..0e0c3364 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/feature/SkullFeature.java +++ b/src/main/java/com/minelittlepony/client/render/entity/feature/SkullFeature.java @@ -28,14 +28,11 @@ public class SkullFeature< private final HeadFeatureRenderer.HeadTransformation headTransformation; - private final boolean scaleForChild; - public SkullFeature(PonyRenderContext context, EntityModelLoader entityModelLoader, ItemRenderer itemRenderer, HeadFeatureRenderer.HeadTransformation headTransformation, boolean scaleForChild) { super(context); this.itemRenderer = itemRenderer; this.headTransformation = headTransformation; - this.scaleForChild = scaleForChild; } @Override diff --git a/src/main/java/com/minelittlepony/client/render/entity/npc/AbstractNpcRenderer.java b/src/main/java/com/minelittlepony/client/render/entity/npc/AbstractNpcRenderer.java index 88df81e9..33b4dd0c 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/npc/AbstractNpcRenderer.java +++ b/src/main/java/com/minelittlepony/client/render/entity/npc/AbstractNpcRenderer.java @@ -5,6 +5,7 @@ import net.minecraft.entity.mob.MobEntity; import net.minecraft.util.Identifier; import net.minecraft.village.*; +import com.minelittlepony.api.model.Models; import com.minelittlepony.api.model.gear.Gear; import com.minelittlepony.api.pony.meta.Race; import com.minelittlepony.api.pony.meta.Wearable; @@ -19,13 +20,15 @@ abstract class AbstractNpcRenderer< private final NpcClothingFeature, AbstractNpcRenderer> clothing; public AbstractNpcRenderer(EntityRendererFactory.Context context, String type, TextureSupplier textureSupplier, TextureSupplier formatter) { - super(context, ModelType.getPlayerModel(Race.EARTH).getKey(false), SillyPonyTextureSupplier.create(textureSupplier, formatter)); + super(context, ModelType.getPlayerModel(Race.EARTH).steveKey(), SillyPonyTextureSupplier.create(textureSupplier, formatter)); clothing = new NpcClothingFeature<>(this, type); this.manager.setModelsLookup(race -> { if (race.isHuman()) { race = Race.EARTH; } - return ModelType.getPlayerModel(race).create(false, this::initializeModel); + Models> models = ModelType.getPlayerModel(race).steve(); + initializeModel(models.body()); + return models; }); addFeature(clothing); } diff --git a/src/main/java/com/minelittlepony/client/render/entity/npc/TraderRenderer.java b/src/main/java/com/minelittlepony/client/render/entity/npc/TraderRenderer.java index af741842..cd266247 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/npc/TraderRenderer.java +++ b/src/main/java/com/minelittlepony/client/render/entity/npc/TraderRenderer.java @@ -15,7 +15,7 @@ public class TraderRenderer extends PonyRenderer