From e54b29146a67e1838cdd67878aae6ec1a8bafc28 Mon Sep 17 00:00:00 2001 From: Sollace Date: Sat, 10 Dec 2022 19:36:55 +0000 Subject: [PATCH] Players can now upload a texture to use for each type of wearable --- .../com/minelittlepony/api/model/IModel.java | 8 +++ .../api/model/ModelAttributes.java | 12 +++- .../minelittlepony/api/model/gear/IGear.java | 2 +- .../api/pony/meta/Wearable.java | 49 ++++++++++----- .../com/minelittlepony/client/SkinsProxy.java | 15 +++-- .../client/hdskins/MineLPHDSkins.java | 62 ++++++++++++++----- .../client/hdskins/PonyPreview.java | 7 +++ .../client/model/ModelType.java | 38 ++++++++---- .../client/model/PlayerModelKey.java | 25 ++++---- .../model/gear/AbstractWearableGear.java | 34 ++++++++++ .../client/model/gear/ChristmasHat.java | 18 +----- .../client/model/gear/Crown.java | 17 +---- .../client/model/gear/Muffin.java | 24 +------ .../client/model/gear/SaddleBags.java | 30 ++------- .../client/model/gear/Stetson.java | 23 +------ .../client/model/gear/WitchHat.java | 24 +------ .../client/model/part/PegasusWings.java | 2 +- .../client/render/PonyRenderDispatcher.java | 2 +- .../render/entity/PlayerPonyRenderer.java | 9 +-- .../render/entity/PlayerSeaponyRenderer.java | 3 +- .../client/render/entity/PonyPigRenderer.java | 5 +- .../entity/npc/AbstractNpcRenderer.java | 2 +- 22 files changed, 219 insertions(+), 192 deletions(-) create mode 100644 src/main/java/com/minelittlepony/client/model/gear/AbstractWearableGear.java diff --git a/src/main/java/com/minelittlepony/api/model/IModel.java b/src/main/java/com/minelittlepony/api/model/IModel.java index 5541aafd..8908a175 100644 --- a/src/main/java/com/minelittlepony/api/model/IModel.java +++ b/src/main/java/com/minelittlepony/api/model/IModel.java @@ -84,6 +84,14 @@ public interface IModel { * Tests if this model is wearing the given piece of gear. */ default boolean isWearing(Wearable wearable) { + return isEmbedded(wearable) || getAttributes().featureSkins.contains(wearable.getId()); + } + + /** + * Tests if the chosen piece of gear is sourcing its texture from the main skin. + * i.e. Used to change wing rendering when using saddlebags. + */ + default boolean isEmbedded(Wearable wearable) { return getMetadata().isWearing(wearable); } } diff --git a/src/main/java/com/minelittlepony/api/model/ModelAttributes.java b/src/main/java/com/minelittlepony/api/model/ModelAttributes.java index 05710e89..4583f041 100644 --- a/src/main/java/com/minelittlepony/api/model/ModelAttributes.java +++ b/src/main/java/com/minelittlepony/api/model/ModelAttributes.java @@ -2,16 +2,18 @@ package com.minelittlepony.api.model; import com.minelittlepony.api.pony.IPony; import com.minelittlepony.api.pony.PonyPosture; +import com.minelittlepony.client.SkinsProxy; import com.minelittlepony.util.MathUtil; +import java.util.*; + import net.minecraft.entity.LivingEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.util.Arm; +import net.minecraft.util.Identifier; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; -import java.util.UUID; - import static com.minelittlepony.api.model.PonyModelConstants.ROTATE_270; import static com.minelittlepony.api.model.PonyModelConstants.WING_ROT_Z_SNEAK; import static com.minelittlepony.api.model.PonyModelConstants.WING_ROT_Z_FLYING; @@ -95,6 +97,11 @@ public class ModelAttributes { */ public float wingAngle; + /** + * Contains a list of additional skins available for rendering. + */ + public Set featureSkins = new HashSet<>(); + /** * Checks flying and speed conditions and sets rainboom to true if we're a species with wings and is going faaast. */ @@ -135,6 +142,7 @@ public class ModelAttributes { isRidingInteractive = PonyPosture.isRidingAPony(entity); interpolatorId = entity.getUuid(); isLeftHanded = entity.getMainArm() == Arm.LEFT; + featureSkins = SkinsProxy.instance.getAvailableSkins(entity); } public enum Mode { diff --git a/src/main/java/com/minelittlepony/api/model/gear/IGear.java b/src/main/java/com/minelittlepony/api/model/gear/IGear.java index 60ddd970..d0177920 100644 --- a/src/main/java/com/minelittlepony/api/model/gear/IGear.java +++ b/src/main/java/com/minelittlepony/api/model/gear/IGear.java @@ -105,7 +105,7 @@ public interface IGear { /** * The empty context. */ - Context NULL = (e, g) -> null; + Context NULL = (e, g) -> g.getDefaultTexture(); /** * Checks whether the given wearable and gear are able to render for this specific entity and its renderer. diff --git a/src/main/java/com/minelittlepony/api/pony/meta/Wearable.java b/src/main/java/com/minelittlepony/api/pony/meta/Wearable.java index 46d89aff..40a95498 100644 --- a/src/main/java/com/minelittlepony/api/pony/meta/Wearable.java +++ b/src/main/java/com/minelittlepony/api/pony/meta/Wearable.java @@ -1,26 +1,44 @@ package com.minelittlepony.api.pony.meta; +import net.minecraft.util.Identifier; + import com.minelittlepony.api.pony.TriggerPixelType; +import com.minelittlepony.client.model.gear.SaddleBags; import com.minelittlepony.common.util.Color; -import java.util.ArrayList; -import java.util.List; +import java.util.*; public enum Wearable implements TriggerPixelType { - NONE (0x00), - CROWN (0x16), - MUFFIN (0x32), - HAT (0x64), - ANTLERS (0x96), - SADDLE_BAGS_LEFT (0xC6), - SADDLE_BAGS_RIGHT (0xC7), - SADDLE_BAGS_BOTH (0xC8), - STETSON (0xFA); + NONE (0x00, null), + CROWN (0x16, new Identifier("minelittlepony", "textures/models/crown.png")), + MUFFIN (0x32, new Identifier("minelittlepony", "textures/models/muffin.png")), + HAT (0x64, new Identifier("textures/entity/witch.png")), + ANTLERS (0x96, new Identifier("minelittlepony", "textures/models/antlers.png")), + SADDLE_BAGS_LEFT (0xC6, SaddleBags.TEXTURE), + SADDLE_BAGS_RIGHT (0xC7, SaddleBags.TEXTURE), + SADDLE_BAGS_BOTH (0xC8, SaddleBags.TEXTURE), + STETSON (0xFA, new Identifier("minelittlepony", "textures/models/stetson.png")); private int triggerValue; - Wearable(int pixel) { + private final Identifier id; + + private final Identifier texture; + + public static final List VALUES = Arrays.stream(values()).toList(); + + Wearable(int pixel, Identifier texture) { triggerValue = pixel; + id = new Identifier("minelittlepony", name().toLowerCase(Locale.ROOT)); + this.texture = texture; + } + + public Identifier getId() { + return id; + } + + public Identifier getDefaultTexture() { + return texture; } @Override @@ -38,7 +56,7 @@ public enum Wearable implements TriggerPixelType { } public static boolean[] flags(Wearable[] wears) { - boolean[] flags = new boolean[values().length]; + boolean[] flags = new boolean[VALUES.size()]; for (int i = 0; i < wears.length; i++) { flags[wears[i].ordinal()] = true; } @@ -47,9 +65,8 @@ public enum Wearable implements TriggerPixelType { public static Wearable[] flags(boolean[] flags) { List wears = new ArrayList<>(); - Wearable[] values = values(); - for (int i = 0; i < values.length; i++) { - if (flags[i]) wears.add(values[i]); + for (int i = 0; i < VALUES.size(); i++) { + if (flags[i]) wears.add(VALUES.get(i)); } return wears.toArray(new Wearable[0]); } diff --git a/src/main/java/com/minelittlepony/client/SkinsProxy.java b/src/main/java/com/minelittlepony/client/SkinsProxy.java index 4b7df9d9..69470f60 100644 --- a/src/main/java/com/minelittlepony/client/SkinsProxy.java +++ b/src/main/java/com/minelittlepony/client/SkinsProxy.java @@ -1,16 +1,19 @@ package com.minelittlepony.client; -import com.minelittlepony.client.model.ClientPonyModel; -import com.minelittlepony.client.render.EquineRenderManager; import com.minelittlepony.common.client.gui.ScrollContainer; import com.minelittlepony.common.client.gui.Tooltip; import com.minelittlepony.common.client.gui.element.Button; import com.mojang.authlib.GameProfile; import com.mojang.authlib.minecraft.MinecraftProfileTexture; + +import java.util.Optional; +import java.util.Set; + import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.network.AbstractClientPlayerEntity; import net.minecraft.client.texture.PlayerSkinProvider; +import net.minecraft.entity.Entity; import net.minecraft.util.Identifier; import org.jetbrains.annotations.Nullable; @@ -41,8 +44,12 @@ public class SkinsProxy { .setText("minelp.options.skins.hdskins.open"); } - public Identifier getSeaponySkin(EquineRenderManager> manager, AbstractClientPlayerEntity player) { - return manager.getTexture(player); + public Optional getSkin(Identifier skinTypeId, AbstractClientPlayerEntity player) { + return Optional.empty(); + } + + public Set getAvailableSkins(Entity entity) { + return Set.of(); } } diff --git a/src/main/java/com/minelittlepony/client/hdskins/MineLPHDSkins.java b/src/main/java/com/minelittlepony/client/hdskins/MineLPHDSkins.java index 89918ce8..fd2dcbfa 100644 --- a/src/main/java/com/minelittlepony/client/hdskins/MineLPHDSkins.java +++ b/src/main/java/com/minelittlepony/client/hdskins/MineLPHDSkins.java @@ -1,32 +1,36 @@ package com.minelittlepony.client.hdskins; +import com.minelittlepony.api.pony.meta.Wearable; import com.minelittlepony.client.MineLittlePony; import com.minelittlepony.client.SkinsProxy; -import com.minelittlepony.client.model.ClientPonyModel; import com.minelittlepony.common.client.gui.ScrollContainer; import com.minelittlepony.common.client.gui.element.Button; import com.minelittlepony.common.event.ClientReadyCallback; -import com.minelittlepony.hdskins.client.SkinCacheClearCallback; +import com.minelittlepony.hdskins.client.*; import com.minelittlepony.hdskins.client.ducks.ClientPlayerInfo; import com.minelittlepony.hdskins.client.dummy.DummyPlayer; import com.minelittlepony.hdskins.client.gui.GuiSkins; +import com.minelittlepony.hdskins.client.resources.LocalPlayerSkins; import com.minelittlepony.hdskins.mixin.client.MixinClientPlayer; import com.minelittlepony.hdskins.profile.SkinType; import com.mojang.authlib.GameProfile; +import java.util.*; +import java.util.stream.Collectors; + import org.jetbrains.annotations.Nullable; import net.fabricmc.api.ClientModInitializer; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.network.AbstractClientPlayerEntity; +import net.minecraft.entity.Entity; import net.minecraft.item.Items; import net.minecraft.util.Identifier; import com.minelittlepony.client.pony.PonyManager; -import com.minelittlepony.client.render.EquineRenderManager; -import com.minelittlepony.hdskins.client.HDSkins; +import com.minelittlepony.client.render.entity.PlayerSeaponyRenderer; /** * All the interactions with HD Skins. @@ -35,11 +39,18 @@ public class MineLPHDSkins extends SkinsProxy implements ClientModInitializer { static SkinType seaponySkinType; + static final Map wearableTypes = new HashMap<>(); + @Override public void onInitializeClient() { SkinsProxy.instance = this; - seaponySkinType = SkinType.register(new Identifier("minelp", "seapony"), Items.COD_BUCKET.getDefaultStack()); + seaponySkinType = SkinType.register(PlayerSeaponyRenderer.SKIN_TYPE_ID, Items.COD_BUCKET.getDefaultStack()); + Wearable.VALUES.forEach(wearable -> { + if (wearable != Wearable.NONE) { + wearableTypes.put(SkinType.register(wearable.getId(), Items.BUNDLE.getDefaultStack()), wearable); + } + }); ClientReadyCallback.EVENT.register(client -> { // Clear ponies when skins are cleared @@ -62,18 +73,39 @@ public class MineLPHDSkins extends SkinsProxy implements ClientModInitializer { } @Override - public Identifier getSeaponySkin(EquineRenderManager> manager, AbstractClientPlayerEntity player) { - if (player instanceof DummyPlayer) { - return ((DummyPlayer)player).getTextures().get(seaponySkinType).getId(); - } else { - ClientPlayerInfo info = (ClientPlayerInfo)((MixinClientPlayer)player).getBackingClientData(); - Identifier tex = info.getSkins().getSkin(seaponySkinType); - if (tex != null) { - return tex; - } + public Optional getSkin(Identifier skinTypeId, AbstractClientPlayerEntity player) { + return SkinType.REGISTRY.getOrEmpty(skinTypeId).flatMap(type -> getSkin(type, player)); + } + + public Set getAvailableSkins(Entity entity) { + + if (entity instanceof DummyPlayer dummy) { + return SkinType.REGISTRY.stream() + .filter(type -> { + return dummy.getTextures().get(type).isReady() + || (dummy.getTextures().getPosture().getActiveSkinType() == type && dummy.getTextures() instanceof LocalPlayerSkins); + }) + .map(SkinType::getId) + .collect(Collectors.toSet()); } - return super.getSeaponySkin(manager, player); + if (entity instanceof AbstractClientPlayerEntity player) { + PlayerSkins skins = ((ClientPlayerInfo)((MixinClientPlayer)player).getBackingClientData()).getSkins(); + return SkinType.REGISTRY.stream() + .filter(type -> skins.getSkin(type) != null) + .map(SkinType::getId) + .collect(Collectors.toSet()); + } + + return Set.of(); + } + + private Optional getSkin(SkinType type, AbstractClientPlayerEntity player) { + if (player instanceof DummyPlayer dummy) { + return Optional.of(dummy.getTextures().get(type).getId()); + } + + return Optional.ofNullable(((ClientPlayerInfo)((MixinClientPlayer)player).getBackingClientData()).getSkins().getSkin(type)); } @Override diff --git a/src/main/java/com/minelittlepony/client/hdskins/PonyPreview.java b/src/main/java/com/minelittlepony/client/hdskins/PonyPreview.java index 1c622690..ecdb1e24 100644 --- a/src/main/java/com/minelittlepony/client/hdskins/PonyPreview.java +++ b/src/main/java/com/minelittlepony/client/hdskins/PonyPreview.java @@ -9,6 +9,7 @@ import org.jetbrains.annotations.Nullable; import com.minelittlepony.api.pony.*; import com.minelittlepony.api.pony.meta.TriggerPixel; +import com.minelittlepony.api.pony.meta.Wearable; import com.minelittlepony.client.MineLittlePony; import com.minelittlepony.client.render.entity.SeaponyRenderer; import com.minelittlepony.common.client.gui.dimension.Bounds; @@ -34,6 +35,12 @@ class PonyPreview extends PlayerPreview { return DefaultSkinGenerator.generateGreyScale(SeaponyRenderer.TEXTURE, SeaponyRenderer.TEXTURE, getExclusion()); } + Wearable wearable = MineLPHDSkins.wearableTypes.getOrDefault(type, Wearable.NONE); + + if (wearable != Wearable.NONE) { + return DefaultSkinGenerator.generateGreyScale(wearable.getDefaultTexture(), wearable.getDefaultTexture(), getExclusion()); + } + return super.getDefaultSkin(type, slim); } diff --git a/src/main/java/com/minelittlepony/client/model/ModelType.java b/src/main/java/com/minelittlepony/client/model/ModelType.java index e4106d42..9a47791e 100644 --- a/src/main/java/com/minelittlepony/client/model/ModelType.java +++ b/src/main/java/com/minelittlepony/client/model/ModelType.java @@ -29,9 +29,8 @@ import java.util.function.BiFunction; 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<>(); + private static final Map> GEAR_MODELS = new HashMap<>(); public static final ModelKey DJ_PON_3 = register("dj_pon_three", DJPon3EarsModel::new); @@ -55,12 +54,14 @@ public final class ModelType { 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 STETSON = registerGear("stetson", Wearable.STETSON, Stetson::new); - public static final ModelKey SADDLEBAGS = registerGear("saddlebags", Wearable.SADDLE_BAGS_BOTH, SaddleBags::new); - public static final ModelKey CROWN = registerGear("crown", Wearable.CROWN, Crown::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 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)); + public static final GearModelKey SADDLEBAGS_LEFT = registerGear(SADDLEBAGS_BOTH, Wearable.SADDLE_BAGS_LEFT, t -> new SaddleBags(t, Wearable.SADDLE_BAGS_LEFT)); + public static final GearModelKey SADDLEBAGS_RIGHT = registerGear(SADDLEBAGS_BOTH, Wearable.SADDLE_BAGS_RIGHT, t -> new SaddleBags(t, Wearable.SADDLE_BAGS_RIGHT)); + public static final GearModelKey CROWN = registerGear("crown", Wearable.CROWN, Crown::new); + public static final GearModelKey MUFFIN = registerGear("muffin", Wearable.MUFFIN, Muffin::new); + 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); @@ -87,12 +88,17 @@ public final class ModelType { } @SuppressWarnings("unchecked") - static ModelKey registerGear(String name, Wearable wearable, MsonModel.Factory constructor) { - return (ModelKey)GEAR_MODELS.computeIfAbsent(wearable, w -> { - return Mson.getInstance().registerModel(new Identifier("minelittlepony", "gear/" + name), constructor); + static GearModelKey registerGear(String name, Wearable wearable, MsonModel.Factory constructor) { + return (GearModelKey)GEAR_MODELS.computeIfAbsent(wearable, w -> { + return new GearModelKey(Mson.getInstance().registerModel(new Identifier("minelittlepony", "gear/" + name), constructor), constructor); }); } + @SuppressWarnings("unchecked") + static GearModelKey registerGear(GearModelKey key, Wearable wearable, MsonModel.Factory constructor) { + return (GearModelKey)GEAR_MODELS.computeIfAbsent(wearable, w -> new GearModelKey(key.key, constructor)); + } + static ModelKey register(String name, MsonModel.Factory constructor) { return Mson.getInstance().registerModel(new Identifier("minelittlepony", name), constructor); } @@ -103,9 +109,15 @@ public final class ModelType { return (PlayerModelKey)PLAYER_MODELS.get(race); } - public static Stream>> getWearables() { + public static Stream>> getWearables() { return GEAR_MODELS.entrySet().stream(); } - public static void bootstrap() {}; + public static void bootstrap() { } + + public record GearModelKey(ModelKey key, MsonModel.Factory constructor) { + public T createModel() { + return key.createModel(constructor); + } + } } diff --git a/src/main/java/com/minelittlepony/client/model/PlayerModelKey.java b/src/main/java/com/minelittlepony/client/model/PlayerModelKey.java index 9f07863b..1ae49a67 100644 --- a/src/main/java/com/minelittlepony/client/model/PlayerModelKey.java +++ b/src/main/java/com/minelittlepony/client/model/PlayerModelKey.java @@ -15,18 +15,17 @@ import com.minelittlepony.mson.api.MsonModel; import java.util.function.BiFunction; import java.util.function.Function; -public class PlayerModelKey { - - private final ModelKey steveKey; - private final ModelKey alexKey; - - private final RendererFactory rendererFactory; - +public record PlayerModelKey ( + ModelKey steveKey, + ModelKey alexKey, + RendererFactory factory +) { PlayerModelKey(String name, BiFunction modelFactory, RendererFactory rendererFactory) { - this.rendererFactory = rendererFactory; - - steveKey = Mson.getInstance().registerModel(new Identifier("minelittlepony", "races/steve/" + name), tree -> modelFactory.apply(tree, false)); - alexKey = Mson.getInstance().registerModel(new Identifier("minelittlepony", "races/alex/" + name), tree -> modelFactory.apply(tree, true)); + 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 + ); } public ModelKey getKey(boolean slimArms) { @@ -34,8 +33,8 @@ public class PlayerModelKey } @SuppressWarnings("unchecked") - public Function getRendererFactory(boolean slimArms) { - return d -> rendererFactory.create(d, slimArms, (ModelKey>)getKey(slimArms)); + public Function getFactory(boolean slimArms) { + return d -> factory.create(d, slimArms, (ModelKey>)getKey(slimArms)); } public interface RendererFactory { diff --git a/src/main/java/com/minelittlepony/client/model/gear/AbstractWearableGear.java b/src/main/java/com/minelittlepony/client/model/gear/AbstractWearableGear.java new file mode 100644 index 00000000..bcc80d05 --- /dev/null +++ b/src/main/java/com/minelittlepony/client/model/gear/AbstractWearableGear.java @@ -0,0 +1,34 @@ +package com.minelittlepony.client.model.gear; + +import net.minecraft.entity.Entity; +import net.minecraft.util.Identifier; + +import com.minelittlepony.api.model.BodyPart; +import com.minelittlepony.api.model.IModel; +import com.minelittlepony.api.pony.meta.Wearable; + +public abstract class AbstractWearableGear extends AbstractGear { + + protected final Wearable wearable; + protected final BodyPart location; + + protected AbstractWearableGear(Wearable wearable, BodyPart location) { + this.wearable = wearable; + this.location = location; + } + + @Override + public BodyPart getGearLocation() { + return location; + } + + @Override + public boolean canRender(IModel model, Entity entity) { + return model.isWearing(wearable); + } + + @Override + public Identifier getTexture(T entity, Context context) { + return context.getDefaultTexture(entity, wearable); + } +} diff --git a/src/main/java/com/minelittlepony/client/model/gear/ChristmasHat.java b/src/main/java/com/minelittlepony/client/model/gear/ChristmasHat.java index bc72d63f..347a0286 100644 --- a/src/main/java/com/minelittlepony/client/model/gear/ChristmasHat.java +++ b/src/main/java/com/minelittlepony/client/model/gear/ChristmasHat.java @@ -4,7 +4,6 @@ import net.minecraft.client.model.ModelPart; import net.minecraft.client.render.VertexConsumer; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.Entity; -import net.minecraft.util.Identifier; import net.minecraft.util.math.MathHelper; import com.minelittlepony.api.model.BodyPart; @@ -16,7 +15,7 @@ import com.minelittlepony.common.util.Color; import java.util.Calendar; import java.util.UUID; -public class ChristmasHat extends AbstractGear implements PonyModelConstants { +public class ChristmasHat extends AbstractWearableGear implements PonyModelConstants { private static boolean dayChecked = false; private static boolean dayResult = false; @@ -32,21 +31,20 @@ public class ChristmasHat extends AbstractGear implements PonyModelConstants { return dayResult; } - private static final Identifier TEXTURE = new Identifier("minelittlepony", "textures/models/antlers.png"); - private final ModelPart left; private final ModelPart right; private int tint; public ChristmasHat(ModelPart tree) { + super(Wearable.ANTLERS, BodyPart.HEAD); left = tree.getChild("left"); right = tree.getChild("right"); } @Override public boolean canRender(IModel model, Entity entity) { - return isChristmasDay() || model.isWearing(Wearable.ANTLERS); + return isChristmasDay() || super.canRender(model, entity); } @Override @@ -65,16 +63,6 @@ public class ChristmasHat extends AbstractGear implements PonyModelConstants { right.roll = -bodySwing; } - @Override - public BodyPart getGearLocation() { - return BodyPart.HEAD; - } - - @Override - public Identifier getTexture(T entity, Context context) { - return TEXTURE; - } - @Override public void render(MatrixStack stack, VertexConsumer vertices, int overlayUv, int lightUv, float red, float green, float blue, float alpha, UUID interpolatorId) { if (tint != 0) { diff --git a/src/main/java/com/minelittlepony/client/model/gear/Crown.java b/src/main/java/com/minelittlepony/client/model/gear/Crown.java index e790f3c3..4a380e8d 100644 --- a/src/main/java/com/minelittlepony/client/model/gear/Crown.java +++ b/src/main/java/com/minelittlepony/client/model/gear/Crown.java @@ -5,23 +5,22 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.mob.AbstractPiglinEntity; import net.minecraft.entity.mob.ZombifiedPiglinEntity; import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.util.Identifier; import com.minelittlepony.api.model.BodyPart; import com.minelittlepony.api.model.IModel; import com.minelittlepony.api.model.gear.IStackable; import com.minelittlepony.api.pony.meta.Wearable; -public class Crown extends AbstractGear implements IStackable { - public static final Identifier TEXTURE = new Identifier("minelittlepony", "textures/models/crown.png"); +public class Crown extends AbstractWearableGear implements IStackable { public Crown(ModelPart tree) { + super(Wearable.CROWN, BodyPart.HEAD); addPart(tree.getChild("crown")); } @Override public boolean canRender(IModel model, Entity entity) { - return model.isWearing(Wearable.CROWN) + return super.canRender(model, entity) || (( entity instanceof AbstractPiglinEntity || entity instanceof PlayerEntity @@ -30,16 +29,6 @@ public class Crown extends AbstractGear implements IStackable { ); } - @Override - public BodyPart getGearLocation() { - return BodyPart.HEAD; - } - - @Override - public Identifier getTexture(T entity, Context context) { - return TEXTURE; - } - @Override public float getStackingHeight() { return 0.1F; diff --git a/src/main/java/com/minelittlepony/client/model/gear/Muffin.java b/src/main/java/com/minelittlepony/client/model/gear/Muffin.java index 51b20c9e..6d26692f 100644 --- a/src/main/java/com/minelittlepony/client/model/gear/Muffin.java +++ b/src/main/java/com/minelittlepony/client/model/gear/Muffin.java @@ -1,37 +1,17 @@ package com.minelittlepony.client.model.gear; import net.minecraft.client.model.ModelPart; -import net.minecraft.entity.Entity; -import net.minecraft.util.Identifier; - import com.minelittlepony.api.model.BodyPart; -import com.minelittlepony.api.model.IModel; import com.minelittlepony.api.model.gear.IStackable; import com.minelittlepony.api.pony.meta.Wearable; -public class Muffin extends AbstractGear implements IStackable { - - private static final Identifier TEXTURE = new Identifier("minelittlepony", "textures/models/muffin.png"); +public class Muffin extends AbstractWearableGear implements IStackable { public Muffin(ModelPart tree) { + super(Wearable.MUFFIN, BodyPart.HEAD); addPart(tree.getChild("crown")); } - @Override - public boolean canRender(IModel model, Entity entity) { - return model.isWearing(Wearable.MUFFIN); - } - - @Override - public BodyPart getGearLocation() { - return BodyPart.HEAD; - } - - @Override - public Identifier getTexture(T entity, Context context) { - return TEXTURE; - } - @Override public float getStackingHeight() { return 0.45F; 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 0a11a4ad..04990c64 100644 --- a/src/main/java/com/minelittlepony/client/model/gear/SaddleBags.java +++ b/src/main/java/com/minelittlepony/client/model/gear/SaddleBags.java @@ -15,7 +15,7 @@ import net.minecraft.entity.Entity; import net.minecraft.util.Identifier; import net.minecraft.util.math.MathHelper; -public class SaddleBags extends AbstractGear implements PonyModelConstants { +public class SaddleBags extends AbstractWearableGear implements PonyModelConstants { public static final Identifier TEXTURE = new Identifier("minelittlepony", "textures/models/saddlebags.png"); @@ -26,9 +26,10 @@ public class SaddleBags extends AbstractGear implements PonyModelConstants { private boolean hangLow = false; - float dropAmount = 0; + private float dropAmount = 0; - public SaddleBags(ModelPart tree) { + public SaddleBags(ModelPart tree, Wearable wearable) { + super(wearable, BodyPart.BODY); strap = tree.getChild("strap"); leftBag = tree.getChild("left_bag"); rightBag = tree.getChild("right_bag"); @@ -60,17 +61,13 @@ public class SaddleBags extends AbstractGear implements PonyModelConstants { leftBag.roll = bodySwing; rightBag.roll = -bodySwing; - leftBag.visible = model.isWearing(Wearable.SADDLE_BAGS_BOTH) || model.isWearing(Wearable.SADDLE_BAGS_LEFT); - rightBag.visible = model.isWearing(Wearable.SADDLE_BAGS_BOTH) || model.isWearing(Wearable.SADDLE_BAGS_RIGHT); + leftBag.visible = wearable == Wearable.SADDLE_BAGS_BOTH || wearable == Wearable.SADDLE_BAGS_LEFT; + rightBag.visible = wearable == Wearable.SADDLE_BAGS_BOTH || wearable == Wearable.SADDLE_BAGS_RIGHT; dropAmount = hangLow ? 0.15F : 0; dropAmount = model.getMetadata().getInterpolator(interpolatorId).interpolate("dropAmount", dropAmount, 3); } - public void sethangingLow(boolean veryLow) { - hangLow = veryLow; - } - @Override public void render(MatrixStack stack, VertexConsumer renderContext, int overlayUv, int lightUv, float red, float green, float blue, float alpha, UUID interpolatorId) { stack.push(); @@ -88,19 +85,4 @@ public class SaddleBags extends AbstractGear implements PonyModelConstants { strap.render(stack, renderContext, overlayUv, lightUv, red, green, blue, alpha); } } - - @Override - public boolean canRender(IModel model, Entity entity) { - return model.isWearing(Wearable.SADDLE_BAGS_BOTH) || model.isWearing(Wearable.SADDLE_BAGS_LEFT) || model.isWearing(Wearable.SADDLE_BAGS_RIGHT); - } - - @Override - public BodyPart getGearLocation() { - return BodyPart.BODY; - } - - @Override - public Identifier getTexture(T entity, Context context) { - return context.getDefaultTexture(entity, Wearable.SADDLE_BAGS_BOTH); - } } diff --git a/src/main/java/com/minelittlepony/client/model/gear/Stetson.java b/src/main/java/com/minelittlepony/client/model/gear/Stetson.java index 7cf08699..81c4938c 100644 --- a/src/main/java/com/minelittlepony/client/model/gear/Stetson.java +++ b/src/main/java/com/minelittlepony/client/model/gear/Stetson.java @@ -1,36 +1,17 @@ package com.minelittlepony.client.model.gear; import net.minecraft.client.model.ModelPart; -import net.minecraft.entity.Entity; -import net.minecraft.util.Identifier; - import com.minelittlepony.api.model.BodyPart; -import com.minelittlepony.api.model.IModel; import com.minelittlepony.api.model.gear.IStackable; import com.minelittlepony.api.pony.meta.Wearable; -public class Stetson extends AbstractGear implements IStackable { - private static final Identifier TEXTURE = new Identifier("minelittlepony", "textures/models/stetson.png"); +public class Stetson extends AbstractWearableGear implements IStackable { public Stetson(ModelPart tree) { + super(Wearable.STETSON, BodyPart.HEAD); addPart(tree.getChild("rim")); } - @Override - public BodyPart getGearLocation() { - return BodyPart.HEAD; - } - - @Override - public Identifier getTexture(T entity, Context context) { - return TEXTURE; - } - - @Override - public boolean canRender(IModel model, Entity entity) { - return model.isWearing(Wearable.STETSON); - } - @Override public float getStackingHeight() { return 0.15F; diff --git a/src/main/java/com/minelittlepony/client/model/gear/WitchHat.java b/src/main/java/com/minelittlepony/client/model/gear/WitchHat.java index 3bee3a7e..025cab94 100644 --- a/src/main/java/com/minelittlepony/client/model/gear/WitchHat.java +++ b/src/main/java/com/minelittlepony/client/model/gear/WitchHat.java @@ -1,37 +1,17 @@ package com.minelittlepony.client.model.gear; import net.minecraft.client.model.ModelPart; -import net.minecraft.entity.Entity; -import net.minecraft.util.Identifier; - import com.minelittlepony.api.model.BodyPart; -import com.minelittlepony.api.model.IModel; import com.minelittlepony.api.model.gear.IStackable; import com.minelittlepony.api.pony.meta.Wearable; -public class WitchHat extends AbstractGear implements IStackable { - - private static final Identifier WITCH_TEXTURES = new Identifier("textures/entity/witch.png"); +public class WitchHat extends AbstractWearableGear implements IStackable { public WitchHat(ModelPart tree) { + super(Wearable.HAT, BodyPart.HEAD); addPart(tree.getChild("hat")); } - @Override - public boolean canRender(IModel model, Entity entity) { - return model.isWearing(Wearable.HAT); - } - - @Override - public BodyPart getGearLocation() { - return BodyPart.HEAD; - } - - @Override - public Identifier getTexture(T entity, Context context) { - return WITCH_TEXTURES; - } - @Override public float getStackingHeight() { return 0.7F; diff --git a/src/main/java/com/minelittlepony/client/model/part/PegasusWings.java b/src/main/java/com/minelittlepony/client/model/part/PegasusWings.java index b3cd692c..7cd730c7 100644 --- a/src/main/java/com/minelittlepony/client/model/part/PegasusWings.java +++ b/src/main/java/com/minelittlepony/client/model/part/PegasusWings.java @@ -40,7 +40,7 @@ public class PegasusWings implements IPart, MsonMode } public Wing getRight() { - return pegasus.isBurdened() ? legacyWing : rightWing; + return (pegasus.isEmbedded(Wearable.SADDLE_BAGS_BOTH) || pegasus.isEmbedded(Wearable.SADDLE_BAGS_LEFT) || pegasus.isEmbedded(Wearable.SADDLE_BAGS_RIGHT)) ? legacyWing : rightWing; } @Override diff --git a/src/main/java/com/minelittlepony/client/render/PonyRenderDispatcher.java b/src/main/java/com/minelittlepony/client/render/PonyRenderDispatcher.java index 27b90119..ec5a2b15 100644 --- a/src/main/java/com/minelittlepony/client/render/PonyRenderDispatcher.java +++ b/src/main/java/com/minelittlepony/client/render/PonyRenderDispatcher.java @@ -57,7 +57,7 @@ public class PonyRenderDispatcher { private void addPlayerSkin(EntityRenderDispatcher manager, boolean slimArms, Race race) { Mson.getInstance().getEntityRendererRegistry().registerPlayerRenderer( race.getModelId(slimArms), - ModelType.getPlayerModel(race).getRendererFactory(slimArms) + ModelType.getPlayerModel(race).getFactory(slimArms) ); } 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 4517215a..62c13e35 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/PlayerPonyRenderer.java +++ b/src/main/java/com/minelittlepony/client/render/entity/PlayerPonyRenderer.java @@ -5,6 +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.MineLittlePony; +import com.minelittlepony.client.SkinsProxy; import com.minelittlepony.client.model.ClientPonyModel; import com.minelittlepony.client.model.ModelWrapper; import com.minelittlepony.client.model.gear.SaddleBags; @@ -198,12 +199,12 @@ public class PlayerPonyRenderer extends PlayerEntityRenderer implements IPonyRen @Override public Identifier getDefaultTexture(AbstractClientPlayerEntity entity, Wearable wearable) { - if (wearable.isSaddlebags()) { - if (getInternalRenderer().getModel().getMetadata().getRace() == Race.BATPONY) { + return SkinsProxy.instance.getSkin(wearable.getId(), entity).orElseGet(() -> { + if (wearable.isSaddlebags() && getInternalRenderer().getModel().getMetadata().getRace() == Race.BATPONY) { return SaddleBags.TEXTURE; } - } - return getTexture(entity); + return wearable.getDefaultTexture(); + }); } } 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 9f402ba8..690281b3 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/PlayerSeaponyRenderer.java +++ b/src/main/java/com/minelittlepony/client/render/entity/PlayerSeaponyRenderer.java @@ -16,6 +16,7 @@ import net.minecraft.particle.ParticleTypes; import net.minecraft.util.Identifier; public class PlayerSeaponyRenderer extends PlayerPonyRenderer { + public static final Identifier SKIN_TYPE_ID = new Identifier("minelp", "seapony"); private final ModelWrapper> seapony; private final ModelWrapper> normalPony; @@ -29,7 +30,7 @@ public class PlayerSeaponyRenderer extends PlayerPonyRenderer { @Override public Identifier getTexture(AbstractClientPlayerEntity player) { - return SkinsProxy.instance.getSeaponySkin(manager, player); + return SkinsProxy.instance.getSkin(SKIN_TYPE_ID, player).orElseGet(() -> super.getTexture(player)); } @Override diff --git a/src/main/java/com/minelittlepony/client/render/entity/PonyPigRenderer.java b/src/main/java/com/minelittlepony/client/render/entity/PonyPigRenderer.java index 671208a9..c7969a51 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/PonyPigRenderer.java +++ b/src/main/java/com/minelittlepony/client/render/entity/PonyPigRenderer.java @@ -8,7 +8,8 @@ import net.minecraft.client.render.entity.feature.*; import net.minecraft.client.render.entity.model.*; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.passive.PigEntity; -import com.minelittlepony.client.model.gear.Crown; + +import com.minelittlepony.api.pony.meta.Wearable; public class PonyPigRenderer extends PigEntityRenderer { @@ -34,7 +35,7 @@ public class PonyPigRenderer extends PigEntityRenderer { getContextModel().copyStateTo(model); model.animateModel(entity, limbAngle, limbDistance, tickDelta); model.setAngles(entity, limbAngle, limbDistance, animationProgress, headYaw, headPitch); - VertexConsumer vertexConsumer = vertexConsumers.getBuffer(RenderLayer.getEntityCutoutNoCull(Crown.TEXTURE)); + VertexConsumer vertexConsumer = vertexConsumers.getBuffer(RenderLayer.getEntityCutoutNoCull(Wearable.CROWN.getDefaultTexture())); model.render(matrices, vertexConsumer, light, OverlayTexture.DEFAULT_UV, 1, 1, 1, 1); } } 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 73a3499f..8b9335db 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 @@ -78,7 +78,7 @@ abstract class AbstractNpcRenderer if (wearable.isSaddlebags()) { return clothing.createTexture(villager, "accessory"); } - return getTexture(villager); + return wearable.getDefaultTexture(); } @Override