From 032fb2719faef9d0928dca67bf719befa2f030d6 Mon Sep 17 00:00:00 2001 From: Sollace Date: Thu, 28 Nov 2019 16:09:47 +0200 Subject: [PATCH] Port the gears to mson --- .../client/model/ModelType.java | 25 +++++++++---- .../client/model/gear/IRenderContext.java | 5 +-- .../client/model/gear/SaddleBags.java | 2 +- .../client/render/IPonyRender.java | 4 +-- .../render/entity/RenderPonyPlayer.java | 8 ++--- .../render/entity/feature/LayerGear.java | 36 ++++++++----------- .../villager/AbstractVillagerRenderer.java | 16 ++++----- .../com/minelittlepony/model/gear/IGear.java | 3 +- 8 files changed, 52 insertions(+), 47 deletions(-) diff --git a/src/main/java/com/minelittlepony/client/model/ModelType.java b/src/main/java/com/minelittlepony/client/model/ModelType.java index 30677c4a..d566ff80 100644 --- a/src/main/java/com/minelittlepony/client/model/ModelType.java +++ b/src/main/java/com/minelittlepony/client/model/ModelType.java @@ -29,10 +29,12 @@ import com.minelittlepony.client.model.gear.Stetson; import com.minelittlepony.client.model.gear.WitchHat; import com.minelittlepony.client.render.entity.RenderPonyPlayer; import com.minelittlepony.client.render.entity.RenderSeaponyPlayer; +import com.minelittlepony.model.gear.IGear; 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 com.minelittlepony.pony.meta.Wearable; import javax.annotation.Nullable; @@ -40,10 +42,12 @@ import java.util.HashMap; import java.util.Map; import java.util.function.Function; import java.util.function.Supplier; +import java.util.stream.Stream; public final class ModelType { private static final Map> PLAYER_MODELS = new HashMap<>(); + private static final Map> GEAR_MODELS = new HashMap<>(); public static final ModelKey> VILLAGER = register("villager", ModelVillagerPony::new); public static final ModelKey WITCH = register("witch", ModelWitchPony::new); @@ -61,11 +65,11 @@ public final class ModelType { public static final ModelKey> ARMOUR_INNER = register("armour_inner", ModelPonyArmour::new); public static final ModelKey> ARMOUR_OUTER = register("armour_outer", ModelPonyArmour::new); - public static final ModelKey STETSON = registerGear("stetson", Stetson::new); - public static final ModelKey SADDLEBAGS = registerGear("saddlebags", SaddleBags::new); - public static final ModelKey MUFFIN = registerGear("muffin", Muffin::new); - public static final ModelKey WITCH_HAT = registerGear("witch_hat", WitchHat::new); - public static final ModelKey ANTLERS = registerGear("antlers", ChristmasHat::new); + public static final ModelKey STETSON = registerGear("stetson", Wearable.STETSON, Stetson::new); + public static final ModelKey SADDLEBAGS = registerGear("saddlebags", Wearable.SADDLE_BAGS, SaddleBags::new); + public static final ModelKey MUFFIN = registerGear("muffin", Wearable.MUFFIN, Muffin::new); + public static final ModelKey WITCH_HAT = registerGear("witch_hat", Wearable.HAT, WitchHat::new); + public static final ModelKey ANTLERS = registerGear("antlers", Wearable.ANTLERS, ChristmasHat::new); public static final PlayerModelKey> ALICORN = registerPlayer("alicorn", Race.ALICORN, ModelAlicorn::new); public static final PlayerModelKey> UNICORN = registerPlayer("unicorn", Race.UNICORN, ModelUnicorn::new); @@ -91,8 +95,11 @@ public final class ModelType { }); } - static ModelKey registerGear(String name, Supplier constructor) { - return register("gear/" + name, constructor); + @SuppressWarnings("unchecked") + static ModelKey registerGear(String name, Wearable wearable, Supplier constructor) { + return (ModelKey)GEAR_MODELS.computeIfAbsent(wearable, w -> { + return Mson.getInstance().registerModel(new Identifier("minelittlepony", "gear/" + name), constructor); + }); } static ModelKey register(String name, Supplier constructor) { @@ -105,5 +112,9 @@ public final class ModelType { return (PlayerModelKey)PLAYER_MODELS.get(race); } + public static Stream>> getWearables() { + return GEAR_MODELS.entrySet().stream(); + } + public static void bootstrap() {}; } diff --git a/src/main/java/com/minelittlepony/client/model/gear/IRenderContext.java b/src/main/java/com/minelittlepony/client/model/gear/IRenderContext.java index 039d8222..87669827 100644 --- a/src/main/java/com/minelittlepony/client/model/gear/IRenderContext.java +++ b/src/main/java/com/minelittlepony/client/model/gear/IRenderContext.java @@ -5,6 +5,7 @@ import net.minecraft.util.Identifier; import com.minelittlepony.model.IModel; import com.minelittlepony.model.gear.IGear; +import com.minelittlepony.pony.meta.Wearable; import javax.annotation.Nullable; @@ -12,7 +13,7 @@ public interface IRenderContext { IRenderContext NULL = (e, g) -> null; - default boolean shouldRender(M model, T entity, IGear gear) { + default boolean shouldRender(M model, T entity, Wearable wearable, IGear gear) { return gear.canRender(model, entity); } @@ -21,5 +22,5 @@ public interface IRenderContext { return null; } - Identifier getDefaultTexture(T entity, IGear gear); + Identifier getDefaultTexture(T entity, Wearable wearable); } diff --git a/src/main/java/com/minelittlepony/client/model/gear/SaddleBags.java b/src/main/java/com/minelittlepony/client/model/gear/SaddleBags.java index 327a5b46..dd33a8b6 100644 --- a/src/main/java/com/minelittlepony/client/model/gear/SaddleBags.java +++ b/src/main/java/com/minelittlepony/client/model/gear/SaddleBags.java @@ -105,6 +105,6 @@ public class SaddleBags extends AbstractGear { if (context.getEntityModel() != null && context.getEntityModel().getMetadata().getRace().isEquivalentTo(Race.CHANGELING)) { return TEXTURE; } - return context.getDefaultTexture(entity, this); + return context.getDefaultTexture(entity, Wearable.SADDLE_BAGS); } } diff --git a/src/main/java/com/minelittlepony/client/render/IPonyRender.java b/src/main/java/com/minelittlepony/client/render/IPonyRender.java index ad06e5f2..aa608c4d 100644 --- a/src/main/java/com/minelittlepony/client/render/IPonyRender.java +++ b/src/main/java/com/minelittlepony/client/render/IPonyRender.java @@ -5,8 +5,8 @@ import com.minelittlepony.client.model.ModelWrapper; import com.minelittlepony.client.model.gear.IRenderContext; import com.minelittlepony.model.BodyPart; import com.minelittlepony.model.PonyModelConstants; -import com.minelittlepony.model.gear.IGear; import com.minelittlepony.pony.IPony; +import com.minelittlepony.pony.meta.Wearable; import com.minelittlepony.util.math.MathUtil; import net.minecraft.client.render.entity.model.EntityModel; @@ -28,7 +28,7 @@ public interface IPonyRender & Identifier findTexture(T entity); @Override - default Identifier getDefaultTexture(T entity, IGear gear) { + default Identifier getDefaultTexture(T entity, Wearable wearable) { return findTexture(entity); } 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 8c655cc9..7af9db42 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/RenderPonyPlayer.java +++ b/src/main/java/com/minelittlepony/client/render/entity/RenderPonyPlayer.java @@ -15,10 +15,10 @@ import com.minelittlepony.client.render.entity.feature.LayerPonyArmor; 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; +import com.minelittlepony.pony.meta.Wearable; import java.util.List; @@ -181,13 +181,13 @@ public class RenderPonyPlayer extends PlayerEntityRenderer implements IPonyRende } @Override - public Identifier getDefaultTexture(AbstractClientPlayerEntity entity, IGear gear) { - if (gear == LayerGear.SADDLE_BAGS) { + public Identifier getDefaultTexture(AbstractClientPlayerEntity entity, Wearable wearable) { + if (wearable == Wearable.SADDLE_BAGS) { if (getInternalRenderer().getModel().getMetadata().getRace() == Race.BATPONY) { return SaddleBags.TEXTURE; } } - return IPonyRender.super.getDefaultTexture(entity, gear); + return IPonyRender.super.getDefaultTexture(entity, wearable); } } diff --git a/src/main/java/com/minelittlepony/client/render/entity/feature/LayerGear.java b/src/main/java/com/minelittlepony/client/render/entity/feature/LayerGear.java index 9b8de4a8..28b570df 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/feature/LayerGear.java +++ b/src/main/java/com/minelittlepony/client/render/entity/feature/LayerGear.java @@ -8,40 +8,29 @@ import net.minecraft.client.render.entity.model.EntityModel; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.LivingEntity; -import com.google.common.collect.Lists; import com.minelittlepony.client.model.IPonyModel; -import com.minelittlepony.client.model.gear.ChristmasHat; -import com.minelittlepony.client.model.gear.Muffin; -import com.minelittlepony.client.model.gear.SaddleBags; -import com.minelittlepony.client.model.gear.Stetson; -import com.minelittlepony.client.model.gear.WitchHat; +import com.minelittlepony.client.model.ModelType; import com.minelittlepony.client.render.IPonyRender; import com.minelittlepony.model.BodyPart; import com.minelittlepony.model.gear.IGear; import com.minelittlepony.model.gear.IStackable; +import com.minelittlepony.pony.meta.Wearable; import java.util.HashMap; -import java.util.List; import java.util.Map; +import java.util.stream.Collectors; public class LayerGear & IPonyModel> extends AbstractPonyLayer { - public static final IGear SADDLE_BAGS = new SaddleBags(); - public static final IGear WITCH_HAT = new WitchHat(); - public static final IGear MUFFIN = new Muffin(); - public static final IGear STETSON = new Stetson(); - public static final IGear ANTLERS = new ChristmasHat(); - - private static List gears = Lists.newArrayList( - SADDLE_BAGS, - WITCH_HAT, - MUFFIN, - STETSON, - ANTLERS - ); + private final Map gears; public LayerGear(IPonyRender renderer) { super(renderer); + + gears = ModelType.getWearables().collect(Collectors.toMap( + Map.Entry::getKey, + e -> e.getValue().createModel() + )); } @Override @@ -55,8 +44,11 @@ public class LayerGear & IPonyM Map renderStackingOffsets = new HashMap<>(); - for (IGear gear : gears) { - if (getContext().shouldRender(model, entity, gear)) { + for (Map.Entry entry : gears.entrySet()) { + Wearable wearable = entry.getKey(); + IGear gear = entry.getValue(); + + if (getContext().shouldRender(model, entity, wearable, gear)) { stack.push(); model.transform(gear.getGearLocation(), stack); model.getBodyPart(gear.getGearLocation()).rotate(stack); diff --git a/src/main/java/com/minelittlepony/client/render/entity/villager/AbstractVillagerRenderer.java b/src/main/java/com/minelittlepony/client/render/entity/villager/AbstractVillagerRenderer.java index da5081ae..fe5a4b86 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/villager/AbstractVillagerRenderer.java +++ b/src/main/java/com/minelittlepony/client/render/entity/villager/AbstractVillagerRenderer.java @@ -10,10 +10,10 @@ import net.minecraft.village.VillagerProfession; import com.minelittlepony.client.model.ClientPonyModel; import com.minelittlepony.client.render.entity.RenderPonyMob; -import com.minelittlepony.client.render.entity.feature.LayerGear; import com.minelittlepony.model.IUnicorn; import com.minelittlepony.model.gear.IGear; import com.minelittlepony.mson.api.ModelKey; +import com.minelittlepony.pony.meta.Wearable; import com.minelittlepony.util.resources.ITextureSupplier; abstract class AbstractVillagerRenderer< @@ -33,11 +33,11 @@ abstract class AbstractVillagerRenderer< } @Override - public boolean shouldRender(M model, T entity, IGear gear) { + public boolean shouldRender(M model, T entity, Wearable wearable, IGear gear) { boolean special = PonyTextures.isBestPony(entity); - if (gear == LayerGear.SADDLE_BAGS) { + if (wearable == Wearable.SADDLE_BAGS) { VillagerProfession profession = entity.getVillagerData().getProfession(); return !special && profession != VillagerProfession.NONE && ( profession == VillagerProfession.CARTOGRAPHER @@ -47,19 +47,19 @@ abstract class AbstractVillagerRenderer< || profession == VillagerProfession.SHEPHERD); } - if (gear == LayerGear.MUFFIN) { + if (wearable == Wearable.MUFFIN) { return PonyTextures.isCrownPony(entity); } - return super.shouldRender(model, entity, gear); + return super.shouldRender(model, entity, wearable, gear); } @Override - public Identifier getDefaultTexture(T villager, IGear gear) { - if (gear == LayerGear.SADDLE_BAGS) { + public Identifier getDefaultTexture(T villager, Wearable wearable) { + if (wearable == Wearable.SADDLE_BAGS) { return ClothingLayer.getClothingTexture(villager, entityType); } - return super.getDefaultTexture(villager, gear); + return super.getDefaultTexture(villager, wearable); } @Override diff --git a/src/main/java/com/minelittlepony/model/gear/IGear.java b/src/main/java/com/minelittlepony/model/gear/IGear.java index 77f8bcb1..6afb05ab 100644 --- a/src/main/java/com/minelittlepony/model/gear/IGear.java +++ b/src/main/java/com/minelittlepony/model/gear/IGear.java @@ -7,8 +7,9 @@ import com.minelittlepony.client.model.gear.IRenderContext; import com.minelittlepony.model.BodyPart; import com.minelittlepony.model.IModel; import com.minelittlepony.model.IPart; +import com.minelittlepony.mson.api.MsonModel; -public interface IGear extends IPart { +public interface IGear extends IPart, MsonModel { /** * Determines if this wearable can and is worn by the selected entity.