From a9f070226f8ceb5337fe7d708ce6b85f649020b6 Mon Sep 17 00:00:00 2001 From: Sollace Date: Wed, 15 Feb 2023 19:09:59 +0000 Subject: [PATCH] Add support for custom armour models --- .../com/minelittlepony/api/model/IModel.java | 6 -- .../api/model/armour/ArmorModelRegistry.java | 32 +++++++++ .../api/model/armour/ArmourRegistry.java | 18 ----- .../api/model/armour/IArmour.java | 51 ------------- .../client/model/AbstractPonyModel.java | 8 --- .../client/model/IPonyMixinModel.java | 6 -- .../client/model/ModelType.java | 47 +++++++----- .../client/model/ModelWrapper.java | 53 +++++++++----- .../client/model/PlayerModelKey.java | 30 +++++--- .../client/model/armour/ArmourWrapper.java | 33 --------- .../client/model/armour/PonyArmourModel.java | 7 +- .../model/entity/race/SeaponyModel.java | 9 +-- .../client/render/EquineRenderManager.java | 5 +- .../render/entity/PlayerPonyRenderer.java | 8 +-- .../render/entity/PlayerSeaponyRenderer.java | 12 ++-- .../client/render/entity/PonyRenderer.java | 6 +- .../render/entity/PonyStandRenderer.java | 2 +- .../render/entity/feature/ArmourFeature.java | 72 +++++++++---------- .../entity/npc/AbstractNpcRenderer.java | 2 +- .../inner_pony_armor.json} | 0 .../models/armor/outer_pony_armor.json | 4 ++ .../minelittlepony/models/armour_outer.json | 4 -- 22 files changed, 175 insertions(+), 240 deletions(-) create mode 100644 src/main/java/com/minelittlepony/api/model/armour/ArmorModelRegistry.java delete mode 100644 src/main/java/com/minelittlepony/api/model/armour/ArmourRegistry.java delete mode 100644 src/main/java/com/minelittlepony/api/model/armour/IArmour.java delete mode 100644 src/main/java/com/minelittlepony/client/model/armour/ArmourWrapper.java rename src/main/resources/assets/minelittlepony/models/{armour_inner.json => armor/inner_pony_armor.json} (100%) create mode 100644 src/main/resources/assets/minelittlepony/models/armor/outer_pony_armor.json delete mode 100644 src/main/resources/assets/minelittlepony/models/armour_outer.json diff --git a/src/main/java/com/minelittlepony/api/model/IModel.java b/src/main/java/com/minelittlepony/api/model/IModel.java index ad5dec9d..19134402 100644 --- a/src/main/java/com/minelittlepony/api/model/IModel.java +++ b/src/main/java/com/minelittlepony/api/model/IModel.java @@ -4,7 +4,6 @@ import net.minecraft.client.util.math.MatrixStack; import net.minecraft.util.math.MathHelper; import com.minelittlepony.api.config.PonyConfig; -import com.minelittlepony.api.model.armour.IArmour; import com.minelittlepony.api.pony.IPonyData; import com.minelittlepony.api.pony.meta.*; @@ -19,11 +18,6 @@ public interface IModel { */ Size getSize(); - /** - * Returns a new pony armour to go with this model. Called on startup by a model wrapper. - */ - IArmour createArmour(); - /** * Gets the transitive properties of this model. */ diff --git a/src/main/java/com/minelittlepony/api/model/armour/ArmorModelRegistry.java b/src/main/java/com/minelittlepony/api/model/armour/ArmorModelRegistry.java new file mode 100644 index 00000000..d424584e --- /dev/null +++ b/src/main/java/com/minelittlepony/api/model/armour/ArmorModelRegistry.java @@ -0,0 +1,32 @@ +package com.minelittlepony.api.model.armour; + +import net.minecraft.item.Item; +import net.minecraft.registry.Registries; +import net.minecraft.util.Identifier; + +import com.minelittlepony.client.model.ModelType; +import com.minelittlepony.client.model.armour.PonyArmourModel; +import com.minelittlepony.mson.api.ModelKey; +import com.minelittlepony.mson.api.Mson; + +import java.util.*; + +public interface ArmorModelRegistry { + static final Optional>> DEFAULT_INNER = Optional.of(ModelType.INNER_ARMOR); + static final Optional>> DEFAULT_OUTER = Optional.of(ModelType.OUTER_ARMOR); + static final Map>>> REGISTRY = new HashMap<>(); + + public static Optional>> getModelKey(Item item, ArmourLayer layer) { + Identifier id = Registries.ITEM.getId(item); + if (id.getNamespace().equals("minecraft")) { + return Optional.empty(); + } + return REGISTRY.computeIfAbsent(id.withPath(p -> "models/armor/" + layer.name().toLowerCase() + "_" + p + ".json"), i -> { + return Optional.of(Mson.getInstance().registerModel(i, PonyArmourModel::new)); + }).filter(key -> key.getModelData().isPresent()); + } + + public static Optional>> getDefault(ArmourLayer layer) { + return layer == ArmourLayer.INNER ? DEFAULT_INNER : DEFAULT_OUTER; + } +} diff --git a/src/main/java/com/minelittlepony/api/model/armour/ArmourRegistry.java b/src/main/java/com/minelittlepony/api/model/armour/ArmourRegistry.java deleted file mode 100644 index 9a044eaa..00000000 --- a/src/main/java/com/minelittlepony/api/model/armour/ArmourRegistry.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.minelittlepony.api.model.armour; - -import net.minecraft.item.ItemStack; -import net.minecraft.registry.*; -import net.minecraft.util.Identifier; - -import com.mojang.serialization.Lifecycle; - -@Deprecated -public final class ArmourRegistry { - private ArmourRegistry() {} - static final Registry> REGISTRY = new SimpleRegistry<>(RegistryKey.ofRegistry(new Identifier("minelittlepony", "armour")), Lifecycle.stable()); - - @SuppressWarnings("unchecked") - public static IArmour getArmour(ItemStack stack, IArmour fallback) { - return (IArmour)REGISTRY.getOrEmpty(Registries.ITEM.getId(stack.getItem())).orElse(fallback); - } -} diff --git a/src/main/java/com/minelittlepony/api/model/armour/IArmour.java b/src/main/java/com/minelittlepony/api/model/armour/IArmour.java deleted file mode 100644 index c6b4c123..00000000 --- a/src/main/java/com/minelittlepony/api/model/armour/IArmour.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.minelittlepony.api.model.armour; - -import net.minecraft.item.Item; -import net.minecraft.registry.Registries; -import net.minecraft.registry.Registry; - -import org.jetbrains.annotations.Nullable; - -import com.minelittlepony.api.model.IModelWrapper; -import com.minelittlepony.api.pony.IPonyData; - -/** - * Wrapper for an armour model and texture. - * - * @param The type of the contained armour model. - */ -@Deprecated -public interface IArmour extends IModelWrapper { - /** - * Registers a custom armour for the supplied item. - * - * Mods can register their own armour here if they wish to override the default handling. - * - * Only one registration per item allowed. - */ - public static IArmour register(IArmour armour, Item item) { - return Registry.register(ArmourRegistry.REGISTRY, Registries.ITEM.getId(item), armour); - } - - /** - * Gets the armour model to render for the given layer. - *

- * Return null to preserve the default behaviour or override and return your custom model. - */ - @Nullable - V getModel(ArmourLayer layer); - - /** - * Override this to specify your own textures. - * - * The default resolver will simply attempt to ponify the vanilla locations. - */ - default IArmourTextureResolver getTextureResolver(IArmourTextureResolver defaultResolver) { - return defaultResolver; - } - - @Override - default IArmour applyMetadata(IPonyData meta) { - return this; - } -} diff --git a/src/main/java/com/minelittlepony/client/model/AbstractPonyModel.java b/src/main/java/com/minelittlepony/client/model/AbstractPonyModel.java index 6dd31793..fc5dc64b 100644 --- a/src/main/java/com/minelittlepony/client/model/AbstractPonyModel.java +++ b/src/main/java/com/minelittlepony/client/model/AbstractPonyModel.java @@ -1,11 +1,8 @@ package com.minelittlepony.client.model; -import com.minelittlepony.client.model.armour.PonyArmourModel; import com.minelittlepony.api.model.*; -import com.minelittlepony.api.model.armour.IArmour; import com.minelittlepony.api.model.fabric.PonyModelPrepareCallback; import com.minelittlepony.api.pony.meta.Sizes; -import com.minelittlepony.client.model.armour.ArmourWrapper; import com.minelittlepony.client.transform.PonyTransformation; import com.minelittlepony.client.util.render.RenderList; import com.minelittlepony.mson.util.PartUtil; @@ -57,11 +54,6 @@ public abstract class AbstractPonyModel extends ClientPo .add(withStage(BodyPart.HEAD, helmetRenderList = RenderList.of(hat))); } - @Override - public IArmour createArmour() { - return ArmourWrapper.of(PonyArmourModel::new); - } - protected RenderList forPart(Supplier part) { return (stack, vertices, overlayUv, lightUv, red, green, blue, alpha) -> { part.get().renderPart(stack, vertices, overlayUv, lightUv, red, green, blue, alpha, attributes); diff --git a/src/main/java/com/minelittlepony/client/model/IPonyMixinModel.java b/src/main/java/com/minelittlepony/client/model/IPonyMixinModel.java index ec09bcd7..cd221023 100644 --- a/src/main/java/com/minelittlepony/client/model/IPonyMixinModel.java +++ b/src/main/java/com/minelittlepony/client/model/IPonyMixinModel.java @@ -10,7 +10,6 @@ import net.minecraft.util.Arm; import com.minelittlepony.api.model.BodyPart; import com.minelittlepony.api.model.IUnicorn; import com.minelittlepony.api.model.ModelAttributes; -import com.minelittlepony.api.model.armour.IArmour; import com.minelittlepony.api.pony.IPony; import com.minelittlepony.api.pony.IPonyData; import com.minelittlepony.api.pony.meta.Size; @@ -59,11 +58,6 @@ public interface IPonyMixinModel return mixin().getSize(); } - @Override - default IArmour createArmour() { - return mixin().createArmour(); - } - @Override default void setMetadata(IPonyData meta) { mixin().setMetadata(meta); diff --git a/src/main/java/com/minelittlepony/client/model/ModelType.java b/src/main/java/com/minelittlepony/client/model/ModelType.java index 9a47791e..5d24c056 100644 --- a/src/main/java/com/minelittlepony/client/model/ModelType.java +++ b/src/main/java/com/minelittlepony/client/model/ModelType.java @@ -8,6 +8,7 @@ import net.minecraft.entity.mob.VexEntity; import net.minecraft.entity.passive.*; import net.minecraft.util.Identifier; +import com.minelittlepony.api.model.IModel; import com.minelittlepony.api.model.gear.IGear; import com.minelittlepony.api.pony.meta.Race; import com.minelittlepony.api.pony.meta.Wearable; @@ -51,8 +52,8 @@ public final class ModelType { public static final ModelKey> ELYTRA = register("elytra", PonyElytra::new); public static final ModelKey ARMOUR_STAND = register("armour_stand", PonyArmourStandModel::new); - public static final ModelKey> ARMOUR_INNER = register("armour_inner", PonyArmourModel::new); - public static final ModelKey> ARMOUR_OUTER = register("armour_outer", PonyArmourModel::new); + public static final ModelKey> INNER_ARMOR = register("armor/inner_pony_armor", PonyArmourModel::new); + public static final ModelKey> OUTER_ARMOR = register("armor/outer_pony_armor", PonyArmourModel::new); public static final GearModelKey STETSON = registerGear("stetson", Wearable.STETSON, Stetson::new); public static final GearModelKey SADDLEBAGS_BOTH = registerGear("saddlebags", Wearable.SADDLE_BAGS_BOTH, t -> new SaddleBags(t, Wearable.SADDLE_BAGS_BOTH)); @@ -63,27 +64,37 @@ public final class ModelType { public static final GearModelKey WITCH_HAT = registerGear("witch_hat", Wearable.HAT, WitchHat::new); public static final GearModelKey ANTLERS = registerGear("antlers", Wearable.ANTLERS, ChristmasHat::new); - public static final PlayerModelKey> ALICORN = registerPlayer("alicorn", Race.ALICORN, AlicornModel::new); - public static final PlayerModelKey> UNICORN = registerPlayer("unicorn", Race.UNICORN, UnicornModel::new); - public static final PlayerModelKey> KIRIN = registerPlayer("kirin", Race.KIRIN, UnicornModel::new); - public static final PlayerModelKey> PEGASUS = registerPlayer("pegasus", Race.PEGASUS, PegasusModel::new); - public static final PlayerModelKey> GRYPHON = registerPlayer("gryphon", Race.GRYPHON, PegasusModel::new); - public static final PlayerModelKey> HIPPOGRIFF = registerPlayer("hippogriff", Race.HIPPOGRIFF, PegasusModel::new); - public static final PlayerModelKey> EARTH_PONY = registerPlayer("earth_pony", Race.EARTH, EarthPonyModel::new); - public static final PlayerModelKey> SEA_PONY = registerPlayer("sea_pony", Race.SEAPONY, SeaponyModel::new, PlayerSeaponyRenderer::new); - public static final PlayerModelKey> BAT_PONY = registerPlayer("bat_pony", Race.BATPONY, PegasusModel::new); - public static final PlayerModelKey> CHANGELING = registerPlayer("changeling", Race.CHANGELING, ChangelingModel::new); - public static final PlayerModelKey> CHANGEDLING = registerPlayer("reformed_changeling", Race.CHANGEDLING, ChangelingModel::new); - public static final PlayerModelKey> ZEBRA = registerPlayer("zebra", Race.ZEBRA, EarthPonyModel::new); + public static final PlayerModelKey> ALICORN = registerPlayer("alicorn", Race.ALICORN, AlicornModel::new); + public static final PlayerModelKey> UNICORN = registerPlayer("unicorn", Race.UNICORN, UnicornModel::new); + public static final PlayerModelKey> KIRIN = registerPlayer("kirin", Race.KIRIN, UnicornModel::new); + public static final PlayerModelKey> PEGASUS = registerPlayer("pegasus", Race.PEGASUS, PegasusModel::new); + public static final PlayerModelKey> GRYPHON = registerPlayer("gryphon", Race.GRYPHON, PegasusModel::new); + public static final PlayerModelKey> HIPPOGRIFF = registerPlayer("hippogriff", Race.HIPPOGRIFF, PegasusModel::new); + public static final PlayerModelKey> EARTH_PONY = registerPlayer("earth_pony", Race.EARTH, EarthPonyModel::new); + public static final PlayerModelKey> SEA_PONY = registerPlayer("sea_pony", Race.SEAPONY, SeaponyModel::new, SeaponyModel.Armour::new, PlayerSeaponyRenderer::new); + public static final PlayerModelKey> BAT_PONY = registerPlayer("bat_pony", Race.BATPONY, PegasusModel::new); + public static final PlayerModelKey> CHANGELING = registerPlayer("changeling", Race.CHANGELING, ChangelingModel::new); + public static final PlayerModelKey> CHANGEDLING = registerPlayer("reformed_changeling", Race.CHANGEDLING, ChangelingModel::new); + public static final PlayerModelKey> ZEBRA = registerPlayer("zebra", Race.ZEBRA, EarthPonyModel::new); - static PlayerModelKey registerPlayer(String name, Race race, BiFunction constructor) { + static PlayerModelKey registerPlayer(String name, Race race, + BiFunction constructor) { return registerPlayer(name, race, constructor, PlayerPonyRenderer::new); } + static PlayerModelKey registerPlayer(String name, Race race, + BiFunction constructor, + PlayerModelKey.RendererFactory rendererFactory) { + return registerPlayer(name, race, constructor, PonyArmourModel::new, rendererFactory); + } + @SuppressWarnings("unchecked") - static PlayerModelKey registerPlayer(String name, Race race, BiFunction constructor, PlayerModelKey.RendererFactory rendererFactory) { + static PlayerModelKey registerPlayer(String name, Race race, + BiFunction constructor, + MsonModel.Factory> armorFactory, + PlayerModelKey.RendererFactory rendererFactory) { return (PlayerModelKey)PLAYER_MODELS.computeIfAbsent(race, r -> { - return new PlayerModelKey<>(name, constructor, rendererFactory); + return new PlayerModelKey<>(name, constructor, rendererFactory, armorFactory); }); } @@ -105,7 +116,7 @@ public final class ModelType { @SuppressWarnings("unchecked") @Nullable - public static PlayerModelKey getPlayerModel(Race race) { + public static PlayerModelKey getPlayerModel(Race race) { return (PlayerModelKey)PLAYER_MODELS.get(race); } diff --git a/src/main/java/com/minelittlepony/client/model/ModelWrapper.java b/src/main/java/com/minelittlepony/client/model/ModelWrapper.java index eaedfed5..01029e8b 100644 --- a/src/main/java/com/minelittlepony/client/model/ModelWrapper.java +++ b/src/main/java/com/minelittlepony/client/model/ModelWrapper.java @@ -1,44 +1,59 @@ package com.minelittlepony.client.model; import net.minecraft.entity.LivingEntity; +import net.minecraft.item.ArmorItem; +import net.minecraft.item.ItemStack; import org.jetbrains.annotations.Nullable; import com.minelittlepony.api.model.IModel; import com.minelittlepony.api.model.IModelWrapper; -import com.minelittlepony.api.model.armour.IArmour; +import com.minelittlepony.api.model.armour.*; import com.minelittlepony.api.pony.IPonyData; -import com.minelittlepony.mson.api.ModelKey; +import com.minelittlepony.client.model.armour.PonyArmourModel; +import com.minelittlepony.mson.api.*; +import java.util.*; import java.util.function.Consumer; /** * Container class for the various models and their associated piece of armour. */ -public record ModelWrapper ( - M body, - IArmour armor -) implements IModelWrapper { - /** - * Creates a new model wrapper to contain the given pony. - */ - public static ModelWrapper of(ModelKey key) { - return of(key, null); +public class ModelWrapper implements IModelWrapper { + @Nullable + private final MsonModel.Factory> armorFactory; + private final Map>, PonyArmourModel> armor = new HashMap<>(); + + private final M body; + + public ModelWrapper(PlayerModelKey playerModelKey, boolean slimArms, @Nullable Consumer initializer) { + this.armorFactory = playerModelKey.armorFactory(); + this.body = playerModelKey.getKey(slimArms).createModel(); + if (initializer != null) { + initializer.accept(this.body); + } } - public static ModelWrapper of(ModelKey key, @Nullable Consumer initializer) { - @SuppressWarnings("unchecked") - M body = (M)key.createModel(); - if (initializer != null) initializer.accept(body); - IArmour armor = body.createArmour(); - armor.applyMetadata(body.getMetadata()); - return new ModelWrapper<>(body, armor); + public ModelWrapper(ModelKey key) { + this.armorFactory = null; + this.body = key.createModel(); + } + + public M body() { + return body; + } + + public Optional> getArmourModel(ItemStack stack, ArmourLayer layer) { + return ArmorModelRegistry.getModelKey(stack.getItem(), layer).or(() -> ArmorModelRegistry.getDefault(layer).filter(l -> stack.getItem() instanceof ArmorItem)) + .map(key -> armor.computeIfAbsent(key, k -> { + return armorFactory == null ? k.createModel() : k.createModel(armorFactory); + })); } @Override public ModelWrapper applyMetadata(IPonyData meta) { body.setMetadata(meta); - armor.applyMetadata(meta); + armor.values().forEach(a -> a.setMetadata(meta)); return this; } } diff --git a/src/main/java/com/minelittlepony/client/model/PlayerModelKey.java b/src/main/java/com/minelittlepony/client/model/PlayerModelKey.java index 1ae49a67..acb9007d 100644 --- a/src/main/java/com/minelittlepony/client/model/PlayerModelKey.java +++ b/src/main/java/com/minelittlepony/client/model/PlayerModelKey.java @@ -8,23 +8,28 @@ import net.minecraft.client.render.entity.PlayerEntityRenderer; import net.minecraft.entity.LivingEntity; import net.minecraft.util.Identifier; +import org.jetbrains.annotations.Nullable; + +import com.minelittlepony.api.model.IModel; +import com.minelittlepony.client.model.armour.PonyArmourModel; import com.minelittlepony.mson.api.ModelKey; import com.minelittlepony.mson.api.Mson; import com.minelittlepony.mson.api.MsonModel; -import java.util.function.BiFunction; -import java.util.function.Function; +import java.util.function.*; -public record PlayerModelKey ( +public record PlayerModelKey ( ModelKey steveKey, ModelKey alexKey, - RendererFactory factory + RendererFactory factory, + MsonModel.Factory> armorFactory ) { - PlayerModelKey(String name, BiFunction modelFactory, RendererFactory rendererFactory) { + PlayerModelKey(String name, BiFunction modelFactory, RendererFactory rendererFactory, MsonModel.Factory> armorFactory) { this( Mson.getInstance().registerModel(new Identifier("minelittlepony", "races/steve/" + name), tree -> modelFactory.apply(tree, false)), Mson.getInstance().registerModel(new Identifier("minelittlepony", "races/alex/" + name), tree -> modelFactory.apply(tree, true)), - rendererFactory + rendererFactory, + armorFactory ); } @@ -32,16 +37,25 @@ public record PlayerModelKey ModelWrapper create(boolean slimArms) { + return create(slimArms, null); + } + + @SuppressWarnings({"rawtypes", "unchecked"}) + public ModelWrapper create(boolean slimArms, @Nullable Consumer initializer) { + return new ModelWrapper(this, slimArms, initializer); + } + @SuppressWarnings("unchecked") public Function getFactory(boolean slimArms) { - return d -> factory.create(d, slimArms, (ModelKey>)getKey(slimArms)); + return d -> factory.create(d, slimArms, (PlayerModelKey>)this); } public interface RendererFactory { PlayerEntityRenderer create( EntityRendererFactory.Context context, boolean slim, - ModelKey> key + PlayerModelKey> key ); } } diff --git a/src/main/java/com/minelittlepony/client/model/armour/ArmourWrapper.java b/src/main/java/com/minelittlepony/client/model/armour/ArmourWrapper.java deleted file mode 100644 index 753cf067..00000000 --- a/src/main/java/com/minelittlepony/client/model/armour/ArmourWrapper.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.minelittlepony.client.model.armour; - -import net.minecraft.entity.LivingEntity; - -import com.minelittlepony.api.model.armour.ArmourLayer; -import com.minelittlepony.api.model.armour.IArmour; -import com.minelittlepony.api.pony.IPonyData; -import com.minelittlepony.client.model.ModelType; -import com.minelittlepony.mson.api.MsonModel; - -public record ArmourWrapper ( - PonyArmourModel outerLayer, - PonyArmourModel innerLayer - ) implements IArmour> { - public static ArmourWrapper of(MsonModel.Factory> supplier) { - return new ArmourWrapper<>( - ModelType.ARMOUR_OUTER.createModel(supplier), - ModelType.ARMOUR_INNER.createModel(supplier) - ); - } - - @Override - public ArmourWrapper applyMetadata(IPonyData meta) { - outerLayer.setMetadata(meta); - innerLayer.setMetadata(meta); - return this; - } - - @Override - public PonyArmourModel getModel(ArmourLayer layer) { - return layer == ArmourLayer.INNER ? innerLayer : outerLayer; - } -} diff --git a/src/main/java/com/minelittlepony/client/model/armour/PonyArmourModel.java b/src/main/java/com/minelittlepony/client/model/armour/PonyArmourModel.java index bcced715..8b75cf24 100644 --- a/src/main/java/com/minelittlepony/client/model/armour/PonyArmourModel.java +++ b/src/main/java/com/minelittlepony/client/model/armour/PonyArmourModel.java @@ -5,8 +5,7 @@ import net.minecraft.client.render.entity.model.BipedEntityModel; import net.minecraft.entity.LivingEntity; import com.minelittlepony.api.model.IModel; -import com.minelittlepony.api.model.armour.ArmourVariant; -import com.minelittlepony.api.model.armour.IArmourModel; +import com.minelittlepony.api.model.armour.*; import com.minelittlepony.client.model.AbstractPonyModel; public class PonyArmourModel extends AbstractPonyModel implements IArmourModel { @@ -29,6 +28,10 @@ public class PonyArmourModel extends AbstractPonyModel extends UnicornModel { bodyRenderList.add(body, abdomin).add(body::rotate).add(forPart(tail)).add(leftFin, centerFin, rightFin); } - @Override - public IArmour createArmour() { - return ArmourWrapper.of(Armour::new); - } - @Override public void updateLivingState(T entity, IPony pony, ModelAttributes.Mode mode) { super.updateLivingState(entity, pony, mode); @@ -138,7 +131,7 @@ public class SeaponyModel extends UnicornModel { rightFin.visible = visible; } - class Armour extends PonyArmourModel { + public static class Armour extends PonyArmourModel { public Armour(ModelPart tree) { super(tree); diff --git a/src/main/java/com/minelittlepony/client/render/EquineRenderManager.java b/src/main/java/com/minelittlepony/client/render/EquineRenderManager.java index 27267921..597241f6 100644 --- a/src/main/java/com/minelittlepony/client/render/EquineRenderManager.java +++ b/src/main/java/com/minelittlepony/client/render/EquineRenderManager.java @@ -144,8 +144,9 @@ public class EquineRenderManager setModel(ModelKey key) { - return setModel(ModelWrapper.of(key)); + @SuppressWarnings({"rawtypes", "unchecked"}) + public ModelWrapper setModel(ModelKey key) { + return setModel(new ModelWrapper(key)); } public ModelWrapper setModel(ModelWrapper wrapper) { diff --git a/src/main/java/com/minelittlepony/client/render/entity/PlayerPonyRenderer.java b/src/main/java/com/minelittlepony/client/render/entity/PlayerPonyRenderer.java index 06f012ed..ce72639c 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/PlayerPonyRenderer.java +++ b/src/main/java/com/minelittlepony/client/render/entity/PlayerPonyRenderer.java @@ -5,8 +5,7 @@ import com.minelittlepony.api.pony.IPony; import com.minelittlepony.api.pony.meta.Race; import com.minelittlepony.api.pony.meta.Wearable; import com.minelittlepony.client.SkinsProxy; -import com.minelittlepony.client.model.ClientPonyModel; -import com.minelittlepony.client.model.ModelWrapper; +import com.minelittlepony.client.model.*; import com.minelittlepony.client.model.gear.SaddleBags; import com.minelittlepony.client.render.DebugBoundingBoxRenderer; import com.minelittlepony.client.render.IPonyRenderContext; @@ -19,7 +18,6 @@ import com.minelittlepony.client.render.entity.feature.ArmourFeature; import com.minelittlepony.client.render.entity.feature.CapeFeature; import com.minelittlepony.client.render.entity.feature.SkullFeature; import com.minelittlepony.client.render.entity.feature.ElytraFeature; -import com.minelittlepony.mson.api.ModelKey; import java.util.List; @@ -43,10 +41,10 @@ public class PlayerPonyRenderer extends PlayerEntityRenderer implements IPonyRen protected final EquineRenderManager> manager = new EquineRenderManager<>(this); - public PlayerPonyRenderer(EntityRendererFactory.Context context, boolean slim, ModelKey> key) { + public PlayerPonyRenderer(EntityRendererFactory.Context context, boolean slim, PlayerModelKey> key) { super(context, slim); - this.model = manager.setModel(key).body(); + this.model = manager.setModel(key.create(slim)).body(); addLayers(context); } diff --git a/src/main/java/com/minelittlepony/client/render/entity/PlayerSeaponyRenderer.java b/src/main/java/com/minelittlepony/client/render/entity/PlayerSeaponyRenderer.java index 690281b3..be2faf86 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/PlayerSeaponyRenderer.java +++ b/src/main/java/com/minelittlepony/client/render/entity/PlayerSeaponyRenderer.java @@ -4,10 +4,7 @@ import com.minelittlepony.api.pony.IPony; import com.minelittlepony.api.pony.PonyPosture; import com.minelittlepony.api.pony.meta.Race; import com.minelittlepony.client.SkinsProxy; -import com.minelittlepony.client.model.ClientPonyModel; -import com.minelittlepony.client.model.ModelType; -import com.minelittlepony.client.model.ModelWrapper; -import com.minelittlepony.mson.api.ModelKey; +import com.minelittlepony.client.model.*; import com.minelittlepony.util.MathUtil; import net.minecraft.client.network.AbstractClientPlayerEntity; @@ -21,11 +18,12 @@ public class PlayerSeaponyRenderer extends PlayerPonyRenderer { private final ModelWrapper> seapony; private final ModelWrapper> normalPony; - public PlayerSeaponyRenderer(EntityRendererFactory.Context context, boolean slim, ModelKey> key) { + public PlayerSeaponyRenderer(EntityRendererFactory.Context context, boolean slim, + PlayerModelKey> key) { super(context, slim, key); - normalPony = ModelWrapper.of(ModelType.>getPlayerModel(Race.UNICORN).getKey(slim)); - seapony = this.manager.getModelWrapper(); + normalPony = ModelType.getPlayerModel(Race.UNICORN).>create(slim); + seapony = getModelWrapper(); } @Override diff --git a/src/main/java/com/minelittlepony/client/render/entity/PonyRenderer.java b/src/main/java/com/minelittlepony/client/render/entity/PonyRenderer.java index 38bcd351..add7c4e2 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/PonyRenderer.java +++ b/src/main/java/com/minelittlepony/client/render/entity/PonyRenderer.java @@ -13,8 +13,8 @@ import com.minelittlepony.client.render.entity.feature.HeldItemFeature; import com.minelittlepony.client.render.entity.feature.GlowingItemFeature; import com.minelittlepony.client.render.entity.feature.ArmourFeature; import com.minelittlepony.client.render.entity.feature.SkullFeature; -import com.minelittlepony.client.render.entity.feature.ElytraFeature; import com.minelittlepony.mson.api.ModelKey; +import com.minelittlepony.client.render.entity.feature.ElytraFeature; import java.util.*; @@ -38,9 +38,7 @@ public abstract class PonyRenderer public PonyRenderer(EntityRendererFactory.Context context, ModelKey key) { super(context, null, 0.5F); - this.model = manager.setModel(key).body(); - addLayers(context); } @@ -149,7 +147,7 @@ public abstract class PonyRenderer public abstract static class Proxy & IPonyModel> extends PonyRenderer { @SuppressWarnings({"rawtypes", "unchecked"}) - public Proxy(List exportedLayers, EntityRendererFactory.Context context, ModelKey key) { + public Proxy(List exportedLayers, EntityRendererFactory.Context context, ModelKey key) { super(context, key); exportedLayers.addAll(features); diff --git a/src/main/java/com/minelittlepony/client/render/entity/PonyStandRenderer.java b/src/main/java/com/minelittlepony/client/render/entity/PonyStandRenderer.java index fc12b18e..148c7e82 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/PonyStandRenderer.java +++ b/src/main/java/com/minelittlepony/client/render/entity/PonyStandRenderer.java @@ -54,7 +54,7 @@ public class PonyStandRenderer extends ArmorStandEntityRenderer { } class Armour extends ArmorFeatureRenderer { - private final ModelWrapper> pony = ModelWrapper.of(ModelType.EARTH_PONY.getKey(false)); + private final ModelWrapper> pony = ModelType.EARTH_PONY.>create(false); public Armour(FeatureRendererContext renderer, EntityRendererFactory.Context context) { super(renderer, diff --git a/src/main/java/com/minelittlepony/client/render/entity/feature/ArmourFeature.java b/src/main/java/com/minelittlepony/client/render/entity/feature/ArmourFeature.java index 3a1b275d..253d5e61 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/feature/ArmourFeature.java +++ b/src/main/java/com/minelittlepony/client/render/entity/feature/ArmourFeature.java @@ -1,12 +1,9 @@ package com.minelittlepony.client.render.entity.feature; -import com.minelittlepony.api.model.armour.ArmourLayer; -import com.minelittlepony.api.model.armour.ArmourRegistry; -import com.minelittlepony.api.model.armour.IArmour; -import com.minelittlepony.api.model.armour.IArmourModel; -import com.minelittlepony.api.model.armour.IArmourTextureResolver; +import com.minelittlepony.api.model.armour.*; import com.minelittlepony.client.model.IPonyModel; import com.minelittlepony.client.model.ModelWrapper; +import com.minelittlepony.client.model.armour.PonyArmourModel; import com.minelittlepony.client.render.IPonyRenderContext; import com.minelittlepony.common.util.Color; @@ -20,9 +17,7 @@ import net.minecraft.client.render.item.ItemRenderer; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.EquipmentSlot; import net.minecraft.entity.LivingEntity; -import net.minecraft.item.ArmorItem; -import net.minecraft.item.DyeableArmorItem; -import net.minecraft.item.ItemStack; +import net.minecraft.item.*; import net.minecraft.util.Identifier; public class ArmourFeature & IPonyModel> extends AbstractPonyFeature { @@ -43,7 +38,6 @@ public class ArmourFeature & IP } } - @SuppressWarnings("unchecked") public static & IArmourModel> void renderArmor( ModelWrapper> pony, MatrixStack stack, VertexConsumerProvider renderContext, int lightUv, T entity, @@ -53,43 +47,43 @@ public class ArmourFeature & IP ItemStack itemstack = entity.getEquippedStack(armorSlot); - if (!itemstack.isEmpty() && itemstack.getItem() instanceof ArmorItem) { - IArmour armour = ArmourRegistry.getArmour(itemstack, (IArmour)pony.armor()); + if (itemstack.isEmpty()) { + return; + } - armour.applyMetadata(pony.body().getMetadata()); + PonyArmourModel model = pony.getArmourModel(itemstack, layer).orElse(null); + if (model == null) { + return; + } - V model = armour.getModel(layer); - if (model == null) { - model = ((IArmour)pony.armor()).getModel(layer); + model.setMetadata(pony.body().getMetadata()); + + if (model.prepareToRender(armorSlot, layer)) { + pony.body().copyAttributes(model); + model.setAngles(entity, limbAngle, limbDistance, age, headYaw, headPitch); + model.synchroniseAngles(pony.body()); + + Item item = itemstack.getItem(); + + float red = 1; + float green = 1; + float blue = 1; + + if (item instanceof DyeableArmorItem) { + int color = ((DyeableArmorItem)item).getColor(itemstack); + red = Color.r(color); + green = Color.g(color); + blue = Color.b(color); } - if (model.prepareToRender(armorSlot, layer)) { - pony.body().copyAttributes(model); - model.setAngles(entity, limbAngle, limbDistance, age, headYaw, headPitch); - model.synchroniseAngles(pony.body()); + IArmourTextureResolver resolver = model.getArmourTextureResolver(); - ArmorItem item = (ArmorItem) itemstack.getItem(); + boolean glint = itemstack.hasGlint(); - float red = 1; - float green = 1; - float blue = 1; + renderArmourPart(stack, renderContext, lightUv, glint, model, red, green, blue, resolver, layer, resolver.getTexture(entity, itemstack, armorSlot, layer, null)); - if (item instanceof DyeableArmorItem) { - int color = ((DyeableArmorItem)item).getColor(itemstack); - red = Color.r(color); - green = Color.g(color); - blue = Color.b(color); - } - - IArmourTextureResolver resolver = armour.getTextureResolver(IArmourTextureResolver.DEFAULT); - - boolean glint = itemstack.hasGlint(); - - renderArmourPart(stack, renderContext, lightUv, glint, model, red, green, blue, resolver, layer, resolver.getTexture(entity, itemstack, armorSlot, layer, null)); - - if (item instanceof DyeableArmorItem) { - renderArmourPart(stack, renderContext, lightUv, false, model, 1, 1, 1, resolver, layer, resolver.getTexture(entity, itemstack, armorSlot, layer, "overlay")); - } + if (item instanceof DyeableArmorItem) { + renderArmourPart(stack, renderContext, lightUv, false, model, 1, 1, 1, resolver, layer, resolver.getTexture(entity, itemstack, armorSlot, layer, "overlay")); } } } 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 60cd8616..4bb0f797 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 @@ -75,7 +75,7 @@ abstract class AbstractNpcRenderer if (race.isHuman()) { race = Race.EARTH; } - return ModelWrapper.>of(ModelType.getPlayerModel(race).getKey(false), this::initializeModel); + return ModelType.getPlayerModel(race).create(false, this::initializeModel); } protected void initializeModel(ClientPonyModel model) { diff --git a/src/main/resources/assets/minelittlepony/models/armour_inner.json b/src/main/resources/assets/minelittlepony/models/armor/inner_pony_armor.json similarity index 100% rename from src/main/resources/assets/minelittlepony/models/armour_inner.json rename to src/main/resources/assets/minelittlepony/models/armor/inner_pony_armor.json diff --git a/src/main/resources/assets/minelittlepony/models/armor/outer_pony_armor.json b/src/main/resources/assets/minelittlepony/models/armor/outer_pony_armor.json new file mode 100644 index 00000000..56b86655 --- /dev/null +++ b/src/main/resources/assets/minelittlepony/models/armor/outer_pony_armor.json @@ -0,0 +1,4 @@ +{ + "parent": "minelittlepony:armor/inner_pony_armor", + "dilate": 0.3 +} diff --git a/src/main/resources/assets/minelittlepony/models/armour_outer.json b/src/main/resources/assets/minelittlepony/models/armour_outer.json deleted file mode 100644 index 6e08454b..00000000 --- a/src/main/resources/assets/minelittlepony/models/armour_outer.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "parent": "minelittlepony:armour_inner", - "dilate": 0.3 -}