diff --git a/src/main/java/com/minelittlepony/client/PonyRenderManager.java b/src/main/java/com/minelittlepony/client/PonyRenderManager.java index 380f0afa..cb88889d 100644 --- a/src/main/java/com/minelittlepony/client/PonyRenderManager.java +++ b/src/main/java/com/minelittlepony/client/PonyRenderManager.java @@ -5,10 +5,10 @@ import java.util.function.Function; import com.google.common.collect.Maps; import com.minelittlepony.client.model.IPonyModel; +import com.minelittlepony.client.model.PlayerModelKey; import com.minelittlepony.client.model.entity.race.PlayerModels; import com.minelittlepony.client.render.LevitatingItemRenderer; import com.minelittlepony.client.render.entity.MobRenderers; -import com.minelittlepony.client.render.entity.RenderPonyPlayer; import com.minelittlepony.client.render.IPonyRender; import javax.annotation.Nullable; @@ -16,11 +16,9 @@ import javax.annotation.Nullable; import com.minelittlepony.common.mixin.MixinEntityRenderDispatcher; import com.minelittlepony.mson.api.Mson; -import net.fabricmc.fabric.api.client.rendereregistry.v1.EntityRendererRegistry; import net.minecraft.client.MinecraftClient; import net.minecraft.client.render.entity.EntityRenderDispatcher; import net.minecraft.client.render.entity.EntityRenderer; -import net.minecraft.client.render.entity.PlayerEntityRenderer; import net.minecraft.client.render.entity.model.EntityModel; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityType; @@ -62,14 +60,11 @@ public class PonyRenderManager { } private void addPlayerSkin(EntityRenderDispatcher manager, boolean slimArms, PlayerModels playerModel) { - RenderPonyPlayer renderer = playerModel.createRenderer(manager, slimArms); - addPlayerRenderer(playerModel.getId(slimArms), renderer); - } + PlayerModelKey.Key key = playerModel.getModelKey().getKey(slimArms); + String id = playerModel.getId(slimArms); - private static void addPlayerRenderer(String modelType, PlayerEntityRenderer renderer) { - EntityRenderDispatcher mx = MinecraftClient.getInstance().getEntityRenderManager(); - ((MixinEntityRenderDispatcher)mx).getPlayerRenderers().put(modelType, renderer); + Mson.getInstance().getEntityRendererRegistry().registerPlayerRenderer(id, key.getFactory()); } /** @@ -95,20 +90,6 @@ public class PonyRenderManager { } } - @Deprecated - public void switchRenderer(boolean state, EntityType type, EntityRendererRegistry.Factory factory) { - if (state) { - if (!renderMap.containsKey(type)) { - renderMap.put(type, ((MixinEntityRenderDispatcher)MinecraftClient.getInstance().getEntityRenderManager()).getEntityRenderers().get(type)); - } - EntityRendererRegistry.INSTANCE.register(type, factory); - } else { - if (renderMap.containsKey(type)) { - EntityRendererRegistry.INSTANCE.register(type, (m, c) -> renderMap.get(type)); - } - } - } - public LevitatingItemRenderer getMagicRenderer() { return magicRenderer; } diff --git a/src/main/java/com/minelittlepony/client/hdskins/DummyPonyRenderer.java b/src/main/java/com/minelittlepony/client/hdskins/DummyPonyRenderer.java index 7d19176e..81f17d4e 100644 --- a/src/main/java/com/minelittlepony/client/hdskins/DummyPonyRenderer.java +++ b/src/main/java/com/minelittlepony/client/hdskins/DummyPonyRenderer.java @@ -2,8 +2,8 @@ package com.minelittlepony.client.hdskins; import com.minelittlepony.client.MineLittlePony; import com.minelittlepony.client.model.ClientPonyModel; +import com.minelittlepony.client.model.ModelType; import com.minelittlepony.client.model.ModelWrapper; -import com.minelittlepony.client.model.entity.race.PlayerModels; import com.minelittlepony.client.render.IPonyRender; import com.minelittlepony.client.render.RenderPony; import com.minelittlepony.client.render.entity.feature.LayerGear; @@ -12,10 +12,10 @@ import com.minelittlepony.client.render.entity.feature.LayerPonyArmor; import com.minelittlepony.client.render.entity.feature.LayerPonyElytra; import com.minelittlepony.hdskins.dummy.DummyPlayerRenderer; import com.minelittlepony.hdskins.profile.SkinType; +import com.minelittlepony.mson.api.ModelKey; import com.minelittlepony.pony.IPony; import com.minelittlepony.pony.meta.Race; -import net.fabricmc.fabric.api.client.rendereregistry.v1.EntityRendererRegistry; import net.minecraft.client.render.entity.EntityRenderDispatcher; import net.minecraft.client.render.entity.feature.FeatureRenderer; import net.minecraft.client.util.math.MatrixStack; @@ -28,18 +28,18 @@ class DummyPonyRenderer extends DummyPlayerRenderer> renderPony = new RenderPony<>(this); - public DummyPonyRenderer(EntityRenderDispatcher manager, EntityRendererRegistry.Context context) { - super(manager, context); + @SuppressWarnings("unchecked") + public DummyPonyRenderer(EntityRenderDispatcher manager) { + super(manager, null); addFeature(new LayerGear<>(this)); + renderPony.setPonyModel((ModelKey>)(Object)ModelType.EARTH_PONY.getKey(false)); renderPony.setSkipBlend(); } - private ModelWrapper> playerModel; - @Override public ModelWrapper> getModelWrapper() { - return playerModel; + return renderPony.playerModel; } @Override @@ -78,12 +78,11 @@ class DummyPonyRenderer extends DummyPlayerRenderer> key = (ModelKey>)(canWet ? ModelType.SEA_PONY.getKey(slim) : ModelType.getPlayerModel(thePony.getRace(true)).getKey(slim)); - return playerModel.getBody(); + return renderPony.setPonyModel(key).apply(thePony.getMetadata()).getBody(); } @Override diff --git a/src/main/java/com/minelittlepony/client/hdskins/MineLPHDSkins.java b/src/main/java/com/minelittlepony/client/hdskins/MineLPHDSkins.java index 0b08afd4..ab7a309a 100644 --- a/src/main/java/com/minelittlepony/client/hdskins/MineLPHDSkins.java +++ b/src/main/java/com/minelittlepony/client/hdskins/MineLPHDSkins.java @@ -5,8 +5,8 @@ import com.minelittlepony.client.SkinsProxy; import com.minelittlepony.common.event.ClientReadyCallback; import com.minelittlepony.hdskins.SkinCacheClearCallback; import com.minelittlepony.hdskins.dummy.DummyPlayer; +import com.minelittlepony.mson.api.Mson; -import net.fabricmc.fabric.api.client.rendereregistry.v1.EntityRendererRegistry; import net.minecraft.client.MinecraftClient; import com.minelittlepony.client.pony.PonyManager; @@ -23,7 +23,7 @@ class MineLPHDSkins { ClientReadyCallback.EVENT.register(this::postInit); // Preview on the select skin gui - EntityRendererRegistry.INSTANCE.register(DummyPlayer.TYPE, DummyPonyRenderer::new); + Mson.getInstance().getEntityRendererRegistry().registerEntityRenderer(DummyPlayer.TYPE, DummyPonyRenderer::new); } private void postInit(MinecraftClient minecraft) { diff --git a/src/main/java/com/minelittlepony/client/model/ModelType.java b/src/main/java/com/minelittlepony/client/model/ModelType.java index 3df4ddf6..ed45aa57 100644 --- a/src/main/java/com/minelittlepony/client/model/ModelType.java +++ b/src/main/java/com/minelittlepony/client/model/ModelType.java @@ -1,6 +1,7 @@ package com.minelittlepony.client.model; import net.minecraft.client.model.Model; +import net.minecraft.entity.LivingEntity; import net.minecraft.entity.mob.VexEntity; import net.minecraft.util.Identifier; @@ -16,17 +17,28 @@ import com.minelittlepony.client.model.entity.ModelZombiePony; import com.minelittlepony.client.model.entity.ModelZombieVillagerPony; import com.minelittlepony.client.model.entity.race.ModelAlicorn; import com.minelittlepony.client.model.entity.race.ModelChangeling; +import com.minelittlepony.client.model.entity.race.ModelEarthPony; import com.minelittlepony.client.model.entity.race.ModelPegasus; import com.minelittlepony.client.model.entity.race.ModelUnicorn; import com.minelittlepony.client.model.entity.race.ModelZebra; +import com.minelittlepony.client.render.entity.RenderPonyPlayer; +import com.minelittlepony.client.render.entity.RenderSeaponyPlayer; import com.minelittlepony.mson.api.ModelKey; import com.minelittlepony.mson.api.Mson; import com.minelittlepony.mson.api.MsonModel; +import com.minelittlepony.pony.meta.Race; +import javax.annotation.Nullable; + +import java.util.HashMap; +import java.util.Map; import java.util.function.Function; import java.util.function.Supplier; public final class ModelType { + + private static final Map> PLAYER_MODELS = new HashMap<>(); + public static final ModelKey> VILLAGER = register("villager", ModelVillagerPony::new); public static final ModelKey WITCH = register("witch", ModelWitchPony::new); public static final ModelKey> ZOMBIE = register("zombie", ModelZombiePony::new); @@ -38,20 +50,39 @@ public final class ModelType { public static final ModelKey ENDERMAN = register("enderman", ModelEnderStallion::new); public static final ModelKey> BREEZIE = register("breezie", ModelBreezie::new); - public static final PlayerModelKey> ALICORN = registerPlayer("alicorn", ModelAlicorn::new); - public static final PlayerModelKey> UNICORN = registerPlayer("unicorn", ModelUnicorn::new); - public static final PlayerModelKey> PEGASUS = registerPlayer("pegasus", ModelPegasus::new); - public static final PlayerModelKey> BAT_PONY = registerPlayer("batpony", ModelPegasus::new); - public static final PlayerModelKey> CHANGELING = registerPlayer("changeling", ModelChangeling::new); - public static final PlayerModelKey> ZEBRA = registerPlayer("zebra", ModelZebra::new); + public static final PlayerModelKey> ALICORN = registerPlayer("alicorn", Race.ALICORN, ModelAlicorn::new); + public static final PlayerModelKey> UNICORN = registerPlayer("unicorn", Race.UNICORN, ModelUnicorn::new); + public static final PlayerModelKey> KIRIN = registerPlayer("kirin", Race.KIRIN, ModelUnicorn::new); + public static final PlayerModelKey> PEGASUS = registerPlayer("pegasus", Race.PEGASUS, ModelPegasus::new); + public static final PlayerModelKey> GRYPHON = registerPlayer("gryphon", Race.GRYPHON, ModelPegasus::new); + public static final PlayerModelKey> HIPPOGRIFF = registerPlayer("hippogriff", Race.HIPPOGRIFF, ModelPegasus::new); + public static final PlayerModelKey> EARTH_PONY = registerPlayer("earth_pony", Race.EARTH, ModelEarthPony::new); + public static final PlayerModelKey> SEA_PONY = registerPlayer("sea_pony", Race.SEAPONY, ModelEarthPony::new, RenderSeaponyPlayer::new); + public static final PlayerModelKey> BAT_PONY = registerPlayer("bat_pony", Race.BATPONY, ModelPegasus::new); + public static final PlayerModelKey> CHANGELING = registerPlayer("changeling", Race.CHANGELING, ModelChangeling::new); + public static final PlayerModelKey> CHANGEDLING = registerPlayer("reformed_changeling", Race.CHANGEDLING, ModelChangeling::new); + public static final PlayerModelKey> ZEBRA = registerPlayer("zebra", Race.ZEBRA, ModelZebra::new); - static PlayerModelKey registerPlayer(String name, Function constructor) { - return new PlayerModelKey<>(new Identifier("minelittlepony", "races/" + name), constructor); + static PlayerModelKey registerPlayer(String name, Race race, Function constructor) { + return registerPlayer(name, race, constructor, RenderPonyPlayer::new); + } + + @SuppressWarnings("unchecked") + static PlayerModelKey registerPlayer(String name, Race race, Function constructor, PlayerModelKey.RendererFactory rendererFactory) { + return (PlayerModelKey)PLAYER_MODELS.computeIfAbsent(race, r -> { + return new PlayerModelKey<>(new Identifier("minelittlepony", "races/" + name), constructor, rendererFactory); + }); } static ModelKey register(String name, Supplier constructor) { return Mson.getInstance().registerModel(new Identifier("minelittlepony", name), constructor); } + @SuppressWarnings("unchecked") + @Nullable + public static PlayerModelKey getPlayerModel(Race race) { + return (PlayerModelKey)PLAYER_MODELS.get(race); + } + public static void bootstrap() {}; } diff --git a/src/main/java/com/minelittlepony/client/model/ModelWrapper.java b/src/main/java/com/minelittlepony/client/model/ModelWrapper.java index 72a771ed..b449a15b 100644 --- a/src/main/java/com/minelittlepony/client/model/ModelWrapper.java +++ b/src/main/java/com/minelittlepony/client/model/ModelWrapper.java @@ -39,8 +39,9 @@ public class ModelWrapper implements I } @Override - public void apply(IPonyData meta) { + public ModelWrapper apply(IPonyData meta) { body.apply(meta); armor.apply(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 d0b2e581..cc8f93c0 100644 --- a/src/main/java/com/minelittlepony/client/model/PlayerModelKey.java +++ b/src/main/java/com/minelittlepony/client/model/PlayerModelKey.java @@ -1,6 +1,10 @@ package com.minelittlepony.client.model; import net.minecraft.client.model.Model; +import net.minecraft.client.network.AbstractClientPlayerEntity; +import net.minecraft.client.render.entity.EntityRenderDispatcher; +import net.minecraft.client.render.entity.PlayerEntityRenderer; +import net.minecraft.entity.LivingEntity; import net.minecraft.util.Identifier; import com.minelittlepony.mson.api.ModelKey; @@ -9,29 +13,32 @@ import com.minelittlepony.mson.api.MsonModel; import java.util.function.Function; -public class PlayerModelKey { +public class PlayerModelKey { - private final ModelKey key; + private final ModelKey key; private boolean slim; - public final ModelKey steveKey; - public final ModelKey alexKey; + private final Key steveKey; + private final Key alexKey; - PlayerModelKey(Identifier id, Function factory) { + private final RendererFactory rendererFactory; + + PlayerModelKey(Identifier id, Function factory, RendererFactory rendererFactory) { this.key = Mson.getInstance().registerModel(id, () -> factory.apply(slim)); + this.rendererFactory = rendererFactory; steveKey = new Key(false); alexKey = new Key(true); } - public T createModel(boolean slimArms) { - return (slimArms ? alexKey : steveKey).createModel(); + public Key getKey(boolean slimArms) { + return slimArms ? alexKey : steveKey; } - private class Key implements ModelKey { + public class Key implements ModelKey { - private final boolean slim; + final boolean slim; public Key(boolean slim) { this.slim = slim; @@ -43,10 +50,18 @@ public class PlayerModelKey { } @Override - public T createModel() { + public M createModel() { PlayerModelKey.this.slim = this.slim; return key.createModel(); } + @SuppressWarnings("unchecked") + public Function getFactory() { + return d -> rendererFactory.create(d, slim, (ModelKey>)this); + } + } + + public interface RendererFactory { + PlayerEntityRenderer create(EntityRenderDispatcher dispatcher, boolean slim, ModelKey> 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 index f3c2064f..546aaa4c 100644 --- a/src/main/java/com/minelittlepony/client/model/armour/ArmourWrapper.java +++ b/src/main/java/com/minelittlepony/client/model/armour/ArmourWrapper.java @@ -19,9 +19,10 @@ public class ArmourWrapper implements IEquestrianArmour< } @Override - public void apply(IPonyData meta) { + public ArmourWrapper apply(IPonyData meta) { outerLayer.apply(meta); innerLayer.apply(meta); + return this; } @Override diff --git a/src/main/java/com/minelittlepony/client/model/entity/race/PlayerModels.java b/src/main/java/com/minelittlepony/client/model/entity/race/PlayerModels.java index bcd563a4..ef7470e7 100644 --- a/src/main/java/com/minelittlepony/client/model/entity/race/PlayerModels.java +++ b/src/main/java/com/minelittlepony/client/model/entity/race/PlayerModels.java @@ -1,41 +1,27 @@ package com.minelittlepony.client.model.entity.race; import com.google.common.collect.Maps; -import com.minelittlepony.client.model.ModelWrapper; -import com.minelittlepony.client.model.entity.ModelSeapony; -import com.minelittlepony.client.render.entity.RenderPonyPlayer; -import com.minelittlepony.client.render.entity.RenderSeaponyPlayer; -import com.minelittlepony.model.IModel; +import com.minelittlepony.client.model.ModelType; +import com.minelittlepony.client.model.PlayerModelKey; import com.minelittlepony.pony.meta.Race; -import javax.annotation.Nullable; - -import net.minecraft.client.render.entity.EntityRenderDispatcher; -import net.minecraft.entity.LivingEntity; - import java.util.Arrays; import java.util.List; import java.util.Map; -import java.util.function.Function; public enum PlayerModels { /** * The default non-pony model. This is typically handled my the vanilla renderer. */ - DEFAULT("default", "slim", Race.HUMAN, ModelEarthPony::new), - EARTHPONY(Race.EARTH, ModelEarthPony::new), - PEGASUS(Race.PEGASUS, ModelPegasus::new), - BATPONY(Race.BATPONY, ModelPegasus::new), - UNICORN(Race.UNICORN, ModelUnicorn::new), - ALICORN(Race.ALICORN, ModelAlicorn::new), - CHANGELING(Race.CHANGELING, ModelChangeling::new), - ZEBRA(Race.ZEBRA, ModelZebra::new), - SEAPONY(Race.SEAPONY, ModelSeapony::new) { - @Override - public RenderPonyPlayer createRenderer(EntityRenderDispatcher manager, boolean slimArms) { - return new RenderSeaponyPlayer(manager, slimArms, PlayerModels.UNICORN.getWrappedModel(slimArms), getWrappedModel(slimArms)); - } - }; + DEFAULT("default", "slim", Race.HUMAN), + EARTHPONY(Race.EARTH), + PEGASUS(Race.PEGASUS), + BATPONY(Race.BATPONY), + UNICORN(Race.UNICORN), + ALICORN(Race.ALICORN), + CHANGELING(Race.CHANGELING), + ZEBRA(Race.ZEBRA), + SEAPONY(Race.SEAPONY); public static final List registry = Arrays.asList(values()); private static final Map raceModelsMap = Maps.newEnumMap(Race.class); @@ -46,71 +32,34 @@ public enum PlayerModels { } } - private final Function resolver; - - private final PendingModel normal; - private final PendingModel slim; + private final String normal; + private final String slim; private final Race race; - PlayerModels(Race race, Function resolver) { - normal = new PendingModel(name().toLowerCase()); - slim = new PendingModel("slim" + normal.key); - - this.resolver = resolver; + PlayerModels(Race race) { + normal = name().toLowerCase(); + slim = "slim" + normal; this.race = race; } - PlayerModels(String normalKey, String slimKey, Race race, Function resolver) { - normal = new PendingModel(normalKey); - slim = new PendingModel(slimKey); - - this.resolver = resolver; + PlayerModels(String normalKey, String slimKey, Race race) { + normal = normalKey; + slim = slimKey; this.race = race; } - @Deprecated - public PendingModel getPendingModel(boolean isSlim) { - return isSlim ? slim : normal; - } - - @Deprecated - public ModelWrapper getWrappedModel(boolean isSlim) { - return getPendingModel(isSlim).getWrappedModel(isSlim); + public PlayerModelKey getModelKey() { + return ModelType.getPlayerModel(race); } public String getId(boolean isSlim) { - return getPendingModel(isSlim).key; - } - - public RenderPonyPlayer createRenderer(EntityRenderDispatcher manager, boolean slimArms) { - return new RenderPonyPlayer(manager, getWrappedModel(slimArms)); + return isSlim ? slim : normal; } public static PlayerModels forRace(Race race) { return raceModelsMap.getOrDefault(race.getAlias(), DEFAULT); } - - @Deprecated - private final class PendingModel { - @Nullable - private ModelWrapper model; - - private final String key; - - PendingModel(String key) { - this.key = key; - } - - @SuppressWarnings("unchecked") - public ModelWrapper getWrappedModel(boolean isSlim) { - if (model == null) { - model = new ModelWrapper<>(resolver.apply(isSlim)); - } - - return (ModelWrapper)model; - } - } } diff --git a/src/main/java/com/minelittlepony/client/render/RenderPony.java b/src/main/java/com/minelittlepony/client/render/RenderPony.java index 3a714c75..33d66731 100644 --- a/src/main/java/com/minelittlepony/client/render/RenderPony.java +++ b/src/main/java/com/minelittlepony/client/render/RenderPony.java @@ -5,6 +5,7 @@ import com.minelittlepony.client.PonyRenderManager; import com.minelittlepony.client.model.IPonyModel; import com.minelittlepony.client.model.ModelWrapper; import com.minelittlepony.client.transform.PonyPosture; +import com.minelittlepony.mson.api.ModelKey; import com.minelittlepony.pony.IPony; import com.minelittlepony.util.math.MathUtil; import com.mojang.blaze3d.platform.GlStateManager.DestFactor; @@ -132,10 +133,10 @@ public class RenderPony & IPony return playerModel.getBody(); } - public M setPonyModel(ModelWrapper model) { - playerModel = model; + public ModelWrapper setPonyModel(ModelKey model) { + playerModel = new ModelWrapper<>(model.createModel()); - return getModel(); + return playerModel; } public void updateMetadata(Identifier texture) { diff --git a/src/main/java/com/minelittlepony/client/render/entity/RenderPonyMob.java b/src/main/java/com/minelittlepony/client/render/entity/RenderPonyMob.java index e798f005..5b2c65fd 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/RenderPonyMob.java +++ b/src/main/java/com/minelittlepony/client/render/entity/RenderPonyMob.java @@ -38,7 +38,7 @@ public abstract class RenderPonyMob key) { super(manager, (M)key.createModel(), 0.5F); - this.model = renderPony.setPonyModel(new ModelWrapper<>(model)); + this.model = renderPony.setPonyModel((ModelKey)key).getBody(); addLayers(); } diff --git a/src/main/java/com/minelittlepony/client/render/entity/RenderPonyPlayer.java b/src/main/java/com/minelittlepony/client/render/entity/RenderPonyPlayer.java index 419fff52..8c655cc9 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/RenderPonyPlayer.java +++ b/src/main/java/com/minelittlepony/client/render/entity/RenderPonyPlayer.java @@ -16,6 +16,7 @@ import com.minelittlepony.client.render.entity.feature.LayerPonyCape; import com.minelittlepony.client.render.entity.feature.LayerPonyCustomHead; import com.minelittlepony.client.render.entity.feature.LayerPonyElytra; import com.minelittlepony.model.gear.IGear; +import com.minelittlepony.mson.api.ModelKey; import com.minelittlepony.pony.IPony; import com.minelittlepony.pony.meta.Race; @@ -38,10 +39,10 @@ public class RenderPonyPlayer extends PlayerEntityRenderer implements IPonyRende protected final RenderPony> renderPony = new RenderPony<>(this); - public RenderPonyPlayer(EntityRenderDispatcher manager, ModelWrapper> model) { - super(manager, false); + public RenderPonyPlayer(EntityRenderDispatcher manager, boolean slim, ModelKey> key) { + super(manager, slim); - this.model = renderPony.setPonyModel(model); + this.model = renderPony.setPonyModel(key).getBody(); addLayers(); } diff --git a/src/main/java/com/minelittlepony/client/render/entity/RenderPonyTrader.java b/src/main/java/com/minelittlepony/client/render/entity/RenderPonyTrader.java index 872758f4..4b6954bb 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/RenderPonyTrader.java +++ b/src/main/java/com/minelittlepony/client/render/entity/RenderPonyTrader.java @@ -13,7 +13,7 @@ public class RenderPonyTrader extends RenderPonyMob.Caster> seapony; - protected final ModelWrapper> normalPony; + protected final ModelKey> seapony; + protected final ModelKey> normalPony; - public RenderSeaponyPlayer(EntityRenderDispatcher manager, boolean useSmallArms, - ModelWrapper> model, - ModelWrapper> alternate) { - super(manager, model); + public RenderSeaponyPlayer(EntityRenderDispatcher manager, boolean slim, ModelKey> key) { + super(manager, slim, key); - seapony = alternate; - normalPony = model; + seapony = ModelType.>getPlayerModel(Race.UNICORN).getKey(slim); + normalPony = key; } @Override @@ -29,7 +29,7 @@ public class RenderSeaponyPlayer extends RenderPonyPlayer { boolean wet = pony.isPartiallySubmerged(player); - model = renderPony.setPonyModel(wet ? seapony : normalPony); + model = renderPony.setPonyModel(wet ? seapony : normalPony).getBody(); float state = wet ? 100 : 0; float interpolated = pony.getMetadata().getInterpolator(player.getUuid()).interpolate("seapony_state", state, 5); diff --git a/src/main/java/com/minelittlepony/client/render/entity/feature/AbstractPonyLayer.java b/src/main/java/com/minelittlepony/client/render/entity/feature/AbstractPonyLayer.java index b7a6ec9e..7ff1d174 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/feature/AbstractPonyLayer.java +++ b/src/main/java/com/minelittlepony/client/render/entity/feature/AbstractPonyLayer.java @@ -1,6 +1,7 @@ package com.minelittlepony.client.render.entity.feature; import com.minelittlepony.client.model.IPonyModel; +import com.minelittlepony.client.model.ModelWrapper; import com.minelittlepony.client.render.IPonyRender; import net.minecraft.client.render.VertexConsumerProvider; @@ -42,11 +43,7 @@ public abstract class AbstractPonyLayer getModelWrapper() { + return getContext().getModelWrapper(); } } diff --git a/src/main/java/com/minelittlepony/client/render/entity/feature/LayerDJPon3Head.java b/src/main/java/com/minelittlepony/client/render/entity/feature/LayerDJPon3Head.java index 482ea24b..461b57d9 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/feature/LayerDJPon3Head.java +++ b/src/main/java/com/minelittlepony/client/render/entity/feature/LayerDJPon3Head.java @@ -24,8 +24,11 @@ public class LayerDJPon3Head & IPonyM return; } - M model = getPlayerModel(); + M model = getModelWrapper().getBody(); Map renderStackingOffsets = new HashMap<>(); diff --git a/src/main/java/com/minelittlepony/client/render/entity/feature/LayerHeldPonyItem.java b/src/main/java/com/minelittlepony/client/render/entity/feature/LayerHeldPonyItem.java index 0051be6e..b443b265 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/feature/LayerHeldPonyItem.java +++ b/src/main/java/com/minelittlepony/client/render/entity/feature/LayerHeldPonyItem.java @@ -14,8 +14,6 @@ import net.minecraft.entity.LivingEntity; import net.minecraft.item.ItemStack; import net.minecraft.util.Arm; -import static com.mojang.blaze3d.platform.GlStateManager.*; - public class LayerHeldPonyItem & IPonyModel> extends AbstractPonyLayer { public LayerHeldPonyItem(IPonyRender livingPony) { @@ -56,11 +54,11 @@ public class LayerHeldPonyItem private void renderHeldItem(T entity, ItemStack drop, ModelTransformation.Type transform, Arm arm, MatrixStack stack, VertexConsumerProvider renderContext, int lightUv) { if (!drop.isEmpty()) { - pushMatrix(); + stack.push(); renderArm(arm, stack); - if (getMainModel().getAttributes().isCrouching) { - translatef(0, 0.2F, 0); + if (getModel().getAttributes().isCrouching) { + stack.translate(0, 0.2F, 0); } float left = arm == Arm.LEFT ? 1 : -1; @@ -77,7 +75,7 @@ public class LayerHeldPonyItem MinecraftClient.getInstance().getFirstPersonRenderer().renderItem(entity, drop, transform, arm == Arm.LEFT, stack, renderContext, lightUv); postItemRender(entity, drop, transform, arm, stack, renderContext); - popMatrix(); + stack.pop(); } } diff --git a/src/main/java/com/minelittlepony/client/render/entity/feature/LayerPonyElytra.java b/src/main/java/com/minelittlepony/client/render/entity/feature/LayerPonyElytra.java index 327e9853..2561fa7c 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/feature/LayerPonyElytra.java +++ b/src/main/java/com/minelittlepony/client/render/entity/feature/LayerPonyElytra.java @@ -55,8 +55,9 @@ public class LayerPonyElytra & } protected void preRenderCallback(MatrixStack stack) { - stack.translate(0, getPlayerModel().getRiderYOffset(), 0.125F); - getPlayerModel().transform(BodyPart.BODY, stack); + M body = getModelWrapper().getBody(); + stack.translate(0, body.getRiderYOffset(), 0.125F); + body.transform(BodyPart.BODY, stack); } protected EntityModel getElytraModel() { diff --git a/src/main/java/com/minelittlepony/model/capabilities/IModelWrapper.java b/src/main/java/com/minelittlepony/model/capabilities/IModelWrapper.java index 1a5e1482..7a410873 100644 --- a/src/main/java/com/minelittlepony/model/capabilities/IModelWrapper.java +++ b/src/main/java/com/minelittlepony/model/capabilities/IModelWrapper.java @@ -6,5 +6,5 @@ public interface IModelWrapper { /** * Updates metadata values to this wrapper's contained models. */ - void apply(IPonyData meta); + IModelWrapper apply(IPonyData meta); } diff --git a/src/main/java/com/minelittlepony/pony/meta/Race.java b/src/main/java/com/minelittlepony/pony/meta/Race.java index f1f807ca..c6f2092e 100644 --- a/src/main/java/com/minelittlepony/pony/meta/Race.java +++ b/src/main/java/com/minelittlepony/pony/meta/Race.java @@ -16,7 +16,7 @@ public enum Race implements ITriggerPixelMapped { CHANGELING (0x282b29, true, true), ZEBRA (0xd0cccf, false, false), CHANGEDLING (0xcaed5a, CHANGELING), - GRIFFIN (0xae9145, PEGASUS), + GRYPHON (0xae9145, PEGASUS), HIPPOGRIFF (0xd6ddac, PEGASUS), KIRIN (0xfa88af, UNICORN), BATPONY (0xeeeeee, true, false), diff --git a/src/main/resources/assets/minelittlepony/models/alex_pony.json b/src/main/resources/assets/minelittlepony/models/alex_pony.json deleted file mode 100644 index d31ce305..00000000 --- a/src/main/resources/assets/minelittlepony/models/alex_pony.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "minelittlepony:steve_pony", - "locals": { - "arm_width": 3, - "arm_rotation_x": 2, - "arm_rotation_y": 8.5 - } -} diff --git a/src/main/resources/assets/minelittlepony/models/armour.json b/src/main/resources/assets/minelittlepony/models/armour.json new file mode 100644 index 00000000..81bec048 --- /dev/null +++ b/src/main/resources/assets/minelittlepony/models/armour.json @@ -0,0 +1,335 @@ +{ + "parent": "mson:steve", + "texture": { + "w": 64, "h": 64 + }, + "locals": { + "arm_length": 12, + "arm_width": 4, + "arm_depth": 4, + "arm_x": 0, + "arm_x_neg": ["#arm_x", "-", "#arm_width"], + "arm_z": [2, "-", "#arm_depth"], + "arm_rotation_x": 3, + "arm_rotation_x_neg": [0, "-", "#arm_rotation_x"], + "arm_rotation_y": 8 + }, + "head": { + "offset": [ 0, -1, -2 ], + "center": [ 0, 0, -2 ], + "cubes": [ + { "from": [-4, -4, -4], "size": [ 8, 8, 8] } + ], + "children": [ + { + "type": "mson:slot", + "name": "snout", + "implementation": "com.minelittlepony.client.model.part.PonySnout", + "content": "minelittlepony:components/snout" + }, + { + "type": "mson:slot", + "name": "ears", + "implementation": "com.minelittlepony.client.model.part.PonyEars", + "content": "minelittlepony:components/ears" + } + ] + }, + "helmet": { + "texture": { "u": 32, "v": 0 }, + "offset": [ 0, -1, -2 ], + "center": [ 0, 0, -2 ], + "cubes": [ + { "from": [-4, -4, -4], "size": [ 8, 8, 8], "stretch": 0.5 } + ] + }, + "torso": { + "texture": { "u": 16, "v": 16 }, + "cubes": [ + { "from": [-4, 4, -2], "size": [ 8, 8, 4] } + ] + }, + "upper_torso": { + "texture": { "u": 24, "v": 0 }, + "offset": [ 0, 8, 6 ], + "cubes": [ + { + "type": "mson:plane", "__comment": "body sides", + "texture": { "u": 24, "v": 0 }, + "face": "east", + "position": [ 4, -4, -4 ], "size": [ 8, 8 ] + }, + { + "type": "mson:plane", "__comment": "body sides", + "texture": { "u": 24, "v": 0 }, + "mirror": [ false, false, true ], + "face": "west", + "position": [ -4, -4, -4 ], "size": [ 8, 8 ] + }, + { + "type": "mson:plane", "__comment": "cutie mark", + "texture": { "u": 4, "v": 0 }, + "face": "east", + "position": [ 4, -4, 4 ], "size": [ 8, 4 ] + }, + { + "type": "mson:plane", "__comment": "cutie mark", + "texture": { "u": 4, "v": 0 }, + "mirror": [ false, false, true ], + "face": "east", + "position": [ -4, -4, 4 ], "size": [ 8, 4 ] + }, + { + "type": "mson:plane", "__comment": "stomach", + "texture": { "u": 56, "v": 0 }, + "face": "down", + "position": [ -4, 4, -4 ], + "size": [ 8, 8 ] + }, + { + "type": "mson:plane", "__comment": "butt", + "texture": { "u": 36, "v": 16 }, + "face": "south", + "position": [ -4, -4, 8 ], "size": [ 8, 4 ] + }, + { + "type": "mson:plane", "__comment": "butt", + "texture": { "u": 36, "v": 16 }, + "face": "south", + "position": [ -4, 0, 8 ], + "size": [ 8, 4 ] + }, + { + "type": "mson:plane", "__comment": "butt", + "texture": { "u": 36, "v": 16 }, + "face": "down", + "position": [ -4, 4, 4 ], "size": [ 8, 4 ] + }, + { + "type": "mson:plane", "__comment": "back", + "texture": { "u": 32, "v": 20 }, + "mirror": [ false, false, true ], + "face": "up", + "position": [ -4, -4, -4 ], "size": [ 8, 12 ] + } + ], + "children": [ + { + "type": "mson:planar", + "texture": { "u": 32, "v": 0 }, + "rotate": [0.5, 0, 0], + "up": [-1, 2, 2, 2, 6], + "down": [-1, 4, 2, 2, 6], + "east": [ 1, 2, 2, 2, 6], + "south":[-1, 2, 8, 2, 2], + "cubes": [ + { + "type": "mson:plane", + "mirror": [ false, false, true ], + "face": "west", + "position": [ -1, -2, -2 ], "size": [ 2, 6 ] + } + ] + } + ] + }, + "neck": { + "type": "mson:planar", + "texture": { "u": 0, "v": 16 }, + "rotate": [0.166, 0, 0], + "north": [-2, 1.199998, -2.8, 4, 4], + "south": [-2, 1.199998, 1.2, 4, 4], + "east": [ 2, 1.199998, -2.8, 4, 4], + "west": [-2, 1.199998, -2.8, 4, 4] + }, + "jacket": { + "texture": { "u": 16, "v": 32 }, + "cubes": [ + { "from": [-4, 0, -2], "size": [ 8, 12, 4], "stretch": 0.25 }, + { "from": [-4, 4, -2], "size": [ 8, 8, 4 ], "stretch": 0.25 } + ] + }, + "saddle": { + "texture": { "u": 24, "v": 0 }, + "offset": [0, 8, 6], + "cubes": [ + { + "type": "mson:plane", "__comment": "body sides a", + "texture": { "u": 12, "v": 32 }, + "face": "east", + "position": [ 4, -4, -4 ], "size": [ 4, 8 ], "stretch": 0.25 + }, + { + "type": "mson:plane", "__comment": "body sides a", + "texture": { "u": 12, "v": 32 }, + "mirror": [ false, false, true ], + "face": "west", + "position": [ -4, -4, -4 ], "size": [ 4, 8 ], "stretch": 0.25 + }, + { + "type": "mson:plane", "__comment": "body sides b", + "texture": { "u": 12, "v": 48 }, + "face": "east", + "position": [ 4, 0, -4 ], "size": [ 4, 8 ], "stretch": 0.25 + }, + { + "type": "mson:plane", "__comment": "body sides b", + "mirror": [ false, false, true ], + "texture": { "u": 12, "v": 48 }, + "face": "west", + "position": [ -4, 0, -4 ], "size": [ 4, 8 ], "stretch": 0.25 + }, + { + "type": "mson:plane", "__comment": "qt mark a", + "texture": { "u": 0, "v": 32 }, + "face": "east", + "position": [ 4, -4, 4 ], "size": [ 4, 4 ], "stretch": 0.25 + }, + { + "type": "mson:plane", "__comment": "qt mark a", + "mirror": [ false, false, true ], + "texture": { "u": 0, "v": 32 }, + "face": "west", + "position": [ -4, -4, 4 ], "size": [ 4, 4 ], "stretch": 0.25 + }, + { + "type": "mson:plane", "__comment": "qt mark b", + "texture": { "u": 0, "v": 48 }, + "face": "east", + "position": [ 4, 0, 4 ], "size": [ 4, 4 ], "stretch": 0.25 + }, + { + "type": "mson:plane", "__comment": "qt mark b", + "texture": { "u": 0, "v": 48 }, + "face": "west", + "position": [ -4, 0, 4 ], "size": [ 4, 4 ], "stretch": 0.25 + }, + { + "type": "mson:plane", "__comment": "stomach a", + "texture": { "u": 28, "v": 48 }, + "face": "down", + "position": [ -4, 4, -4 ], "size": [ 8, 4 ], "stretch": 0.25 + }, + { + "type": "mson:plane", "__comment": "stomach b", + "texture": { "u": 44, "v": 48 }, + "face": "down", + "position": [ -4, 4, 0 ], "size": [ 8, 4 ], "stretch": 0.25 + }, + { + "type": "mson:plane", "__comment": "stomach c", + "texture": { "u": 36, "v": 32 }, + "face": "down", + "position": [ -4, 4, 4 ], "size": [ 8, 4 ], "stretch": 0.25 + }, + { + "type": "mson:plane", "__comment": "butt", + "texture": { "u": 36, "v": 32 }, + "face": "south", + "position": [ -4, -4, 8 ], "size": [ 8, 4 ], "stretch": 0.25 + }, + { + "type": "mson:plane", "__comment": "butt", + "texture": { "u": 36, "v": 32 }, + "face": "south", + "position": [ -4, 0, 8 ], "size": [ 8, 4 ], "stretch": 0.25 + }, + { + "type": "mson:plane", "__comment": "back", + "texture": { "u": 32, "v": 36 }, + "face": "up", + "position": [ -4, -4, -4 ], "size": [ 8, 12 ], "stretch": 0.25 + } + ] + }, + "tail": { + "type": "mson:slot", + "name": "tail", + "implementation": "com.minelittlepony.client.model.part.PonyTail", + "content": "minelittlepony:components/tail" + }, + "right_arm": { + "center": ["#arm_rotation_x_neg", "#arm_rotation_y", 0], + "texture": { "u": 40, "v": 16 }, + "cubes": [ + { + "from": [ "#arm_x_neg", 4, "#arm_z"], + "size": [ "#arm_width", "#arm_length", "#arm_depth" ] + } + ] + }, + "left_arm": { + "center": ["#arm_rotation_x", "#arm_rotation_y", 0], + "texture": { "u": 32, "v": 48 }, + "cubes": [ + { + "from": [ "#arm_x", 4, "#arm_z"], + "size": [ "#arm_width", "#arm_length", "#arm_depth" ] + } + ] + }, + "right_leg": { + "center": ["#arm_rotation_x_neg", 0, 0], + "texture": { "u": 0, "v": 16 }, + "cubes": [ + { + "from": [ "#arm_x_neg", 4, "#arm_z"], + "size": [ "#arm_width", "#arm_length", "#arm_depth" ] + } + ] + }, + "left_leg": { + "center": ["#arm_rotation_x", 0, 0], + "texture": { "u": 16, "v": 48 }, + "cubes": [ + { + "from": [ "#arm_x", 4, "#arm_z"], + "size": [ "#arm_width", "#arm_length", "#arm_depth" ] + } + ] + }, + "right_sleeve": { + "center": ["#arm_rotation_x_neg", "#arm_rotation_y", 0], + "texture": { "u": 40, "v": 32 }, + "cubes": [ + { + "from": [ "#arm_x_neg", 4, "#arm_z"], + "size": [ "#arm_width", "#arm_length", "#arm_depth" ], + "stretch": 0.25 + } + ] + }, + "left_sleeve": { + "center": ["#arm_rotation_x", "#arm_rotation_y", 0], + "texture": { "u": 48, "v": 48 }, + "cubes": [ + { + "from": [ "#arm_x", 4, "#arm_z"], + "size": [ "#arm_width", "#arm_length", "#arm_depth" ], + "stretch": 0.25 + } + ] + }, + "right_pant_leg": { + "center": ["#arm_rotation_x_neg", 0, 0], + "texture": { "u": 0, "v": 32 }, + "cubes": [ + { + "from": [ "#arm_x_neg", 4, "#arm_z"], + "size": [ "#arm_width", "#arm_length", "#arm_depth" ], + "stretch": 0.25 + } + ] + }, + "left_pant_leg": { + "center": ["#arm_rotation_x", 0, 0], + "texture": { "u": 0, "v": 48 }, + "cubes": [ + { + "from": [ "#arm_x", 4, "#arm_z"], + "size": [ "#arm_width", "#arm_length", "#arm_depth" ], + "stretch": 0.25 + } + ] + } +} diff --git a/src/main/resources/assets/minelittlepony/models/guardian.json b/src/main/resources/assets/minelittlepony/models/guardian.json index 06d4b136..67983459 100644 --- a/src/main/resources/assets/minelittlepony/models/guardian.json +++ b/src/main/resources/assets/minelittlepony/models/guardian.json @@ -1,3 +1,3 @@ { - "parent": "minelittlepony:seapony" + "parent": "minelittlepony:races/sea_pony" } diff --git a/src/main/resources/assets/minelittlepony/models/races/batpony.json b/src/main/resources/assets/minelittlepony/models/races/bat_pony.json similarity index 100% rename from src/main/resources/assets/minelittlepony/models/races/batpony.json rename to src/main/resources/assets/minelittlepony/models/races/bat_pony.json diff --git a/src/main/resources/assets/minelittlepony/models/races/earth_pony.json b/src/main/resources/assets/minelittlepony/models/races/earth_pony.json new file mode 100644 index 00000000..820a9e78 --- /dev/null +++ b/src/main/resources/assets/minelittlepony/models/races/earth_pony.json @@ -0,0 +1,3 @@ +{ + "parent": "minelittlepony:steve_pony" +} diff --git a/src/main/resources/assets/minelittlepony/models/races/gryphon.json b/src/main/resources/assets/minelittlepony/models/races/gryphon.json new file mode 100644 index 00000000..75a78a89 --- /dev/null +++ b/src/main/resources/assets/minelittlepony/models/races/gryphon.json @@ -0,0 +1,3 @@ +{ + "parent": "minelittlepony:races/pegasus" +} diff --git a/src/main/resources/assets/minelittlepony/models/races/hippogriff.json b/src/main/resources/assets/minelittlepony/models/races/hippogriff.json new file mode 100644 index 00000000..75a78a89 --- /dev/null +++ b/src/main/resources/assets/minelittlepony/models/races/hippogriff.json @@ -0,0 +1,3 @@ +{ + "parent": "minelittlepony:races/pegasus" +} diff --git a/src/main/resources/assets/minelittlepony/models/races/kirin.json b/src/main/resources/assets/minelittlepony/models/races/kirin.json new file mode 100644 index 00000000..ed5fb1aa --- /dev/null +++ b/src/main/resources/assets/minelittlepony/models/races/kirin.json @@ -0,0 +1,3 @@ +{ + "parent": "minelittlepony:races/unicorn" +} diff --git a/src/main/resources/assets/minelittlepony/models/seapony.json b/src/main/resources/assets/minelittlepony/models/races/sea_pony.json similarity index 100% rename from src/main/resources/assets/minelittlepony/models/seapony.json rename to src/main/resources/assets/minelittlepony/models/races/sea_pony.json