diff --git a/src/main/java/com/minelittlepony/client/render/MobRenderers.java b/src/main/java/com/minelittlepony/client/render/MobRenderers.java index e76552c3..19f686e0 100644 --- a/src/main/java/com/minelittlepony/client/render/MobRenderers.java +++ b/src/main/java/com/minelittlepony/client/render/MobRenderers.java @@ -51,6 +51,9 @@ public final class MobRenderers { public static final MobRenderers ENDERMAN = register("endermen", (state, pony) -> { pony.switchRenderer(state, EntityType.ENDERMAN, EnderStallionRenderer::new); }); + public static final MobRenderers INANIMATE = register("inanimates", (state, pony) -> { + pony.switchRenderer(state, EntityType.ARMOR_STAND, PonyStandRenderer::new); + }); private final BiConsumer changer; diff --git a/src/main/java/com/minelittlepony/client/render/blockentity/skull/AbstractPonySkull.java b/src/main/java/com/minelittlepony/client/render/blockentity/skull/AbstractPonySkull.java index 843418a2..f6106272 100644 --- a/src/main/java/com/minelittlepony/client/render/blockentity/skull/AbstractPonySkull.java +++ b/src/main/java/com/minelittlepony/client/render/blockentity/skull/AbstractPonySkull.java @@ -4,8 +4,8 @@ import net.minecraft.client.render.VertexConsumer; import net.minecraft.client.util.math.MatrixStack; import com.minelittlepony.client.model.PonySkullModel; -import com.minelittlepony.client.model.ModelType; import com.minelittlepony.client.render.blockentity.skull.PonySkullRenderer.ISkull; +import com.minelittlepony.client.model.ModelType; import com.minelittlepony.pony.IPony; public abstract class AbstractPonySkull implements ISkull { diff --git a/src/main/java/com/minelittlepony/client/render/entity/PonyStandRenderer.java b/src/main/java/com/minelittlepony/client/render/entity/PonyStandRenderer.java new file mode 100644 index 00000000..77719c7a --- /dev/null +++ b/src/main/java/com/minelittlepony/client/render/entity/PonyStandRenderer.java @@ -0,0 +1,62 @@ +package com.minelittlepony.client.render.entity; + +import net.minecraft.client.render.VertexConsumerProvider; +import net.minecraft.client.render.entity.ArmorStandEntityRenderer; +import net.minecraft.client.render.entity.EntityRenderDispatcher; +import net.minecraft.client.render.entity.feature.ArmorBipedFeatureRenderer; +import net.minecraft.client.render.entity.feature.ElytraFeatureRenderer; +import net.minecraft.client.render.entity.feature.FeatureRendererContext; +import net.minecraft.client.render.entity.feature.HeadFeatureRenderer; +import net.minecraft.client.render.entity.feature.HeldItemFeatureRenderer; +import net.minecraft.client.render.entity.model.ArmorStandArmorEntityModel; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.entity.EquipmentSlot; +import net.minecraft.entity.decoration.ArmorStandEntity; + +import com.minelittlepony.client.model.ModelType; +import com.minelittlepony.client.model.ModelWrapper; +import com.minelittlepony.client.model.entity.race.EarthPonyModel; +import com.minelittlepony.client.pony.PonyData; +import com.minelittlepony.client.render.entity.feature.ArmourFeature; +import com.minelittlepony.model.armour.ArmourLayer; +import com.minelittlepony.pony.meta.Race; + +public class PonyStandRenderer extends ArmorStandEntityRenderer { + + public PonyStandRenderer(EntityRenderDispatcher entityRenderDispatcher) { + super(entityRenderDispatcher); + + features.clear(); + addFeature(new Armour(this)); + addFeature(new HeldItemFeatureRenderer<>(this)); + addFeature(new ElytraFeatureRenderer<>(this)); + addFeature(new HeadFeatureRenderer<>(this)); + } + + class Armour extends ArmorBipedFeatureRenderer { + private final ModelWrapper> pony = new ModelWrapper<>(ModelType.EARTH_PONY.getKey(false)); + + public Armour(FeatureRendererContext context) { + super(context, new ArmorStandArmorEntityModel(0.5F), new ArmorStandArmorEntityModel(1)); + + pony.apply(new PonyData(Race.EARTH)); + } + + @Override + public void render(MatrixStack stack, VertexConsumerProvider renderContext, int lightUv, ArmorStandEntity entity, float limbDistance, float limbAngle, float tickDelta, float age, float headYaw, float headPitch) { + if (entity.hasCustomName() && "Ponita".equals(entity.getCustomName().asString())) { + + pony.getBody().setAngles(entity, limbDistance, limbAngle, tickDelta, headYaw, headPitch); + + for (EquipmentSlot i : EquipmentSlot.values()) { + if (i.getType() == EquipmentSlot.Type.ARMOR) { + ArmourFeature.renderArmor(pony, stack, renderContext, lightUv, entity, limbDistance, limbAngle, tickDelta, age, headYaw, headPitch, i, ArmourLayer.INNER); + ArmourFeature.renderArmor(pony, stack, renderContext, lightUv, entity, limbDistance, limbAngle, tickDelta, age, headYaw, headPitch, i, ArmourLayer.OUTER); + } + } + } else { + super.render(stack, renderContext, lightUv, entity, limbDistance, limbAngle, tickDelta, age, headYaw, headPitch); + } + } + } +} 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 d58fe96c..c1e14f8b 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 @@ -31,26 +31,24 @@ public class ArmourFeature & IP private static final IArmourTextureResolver textures = new DefaultArmourTextureResolver<>(); - private ModelWrapper pony; - public ArmourFeature(IPonyRenderContext renderer) { super(renderer); } @Override public void render(MatrixStack stack, VertexConsumerProvider renderContext, int lightUv, T entity, float limbDistance, float limbAngle, float tickDelta, float age, float headYaw, float headPitch) { - pony = getContext().getModelWrapper(); + ModelWrapper pony = getContext().getModelWrapper(); for (EquipmentSlot i : EquipmentSlot.values()) { if (i.getType() == EquipmentSlot.Type.ARMOR) { - renderArmor(stack, renderContext, lightUv, entity, limbDistance, limbAngle, tickDelta, age, headYaw, headPitch, i, ArmourLayer.INNER); - renderArmor(stack, renderContext, lightUv, entity, limbDistance, limbAngle, tickDelta, age, headYaw, headPitch, i, ArmourLayer.OUTER); + renderArmor(pony, stack, renderContext, lightUv, entity, limbDistance, limbAngle, tickDelta, age, headYaw, headPitch, i, ArmourLayer.INNER); + renderArmor(pony, stack, renderContext, lightUv, entity, limbDistance, limbAngle, tickDelta, age, headYaw, headPitch, i, ArmourLayer.OUTER); } } } @SuppressWarnings("unchecked") - private & IArmour> void renderArmor(MatrixStack stack, VertexConsumerProvider renderContext, int lightUv, T entity, float limbDistance, float limbAngle, float tickDelta, float age, float headYaw, float headPitch, EquipmentSlot armorSlot, ArmourLayer layer) { + public static & IArmour> void renderArmor(ModelWrapper> pony, MatrixStack stack, VertexConsumerProvider renderContext, int lightUv, T entity, float limbDistance, float limbAngle, float tickDelta, float age, float headYaw, float headPitch, EquipmentSlot armorSlot, ArmourLayer layer) { ItemStack itemstack = entity.getEquippedStack(armorSlot); if (!itemstack.isEmpty() && itemstack.getItem() instanceof ArmorItem) { diff --git a/src/main/resources/assets/minelittlepony/lang/en_us.json b/src/main/resources/assets/minelittlepony/lang/en_us.json index 9f0f371b..38bbcf08 100644 --- a/src/main/resources/assets/minelittlepony/lang/en_us.json +++ b/src/main/resources/assets/minelittlepony/lang/en_us.json @@ -22,6 +22,7 @@ "minelp.mobs.illagers": "Ponify Illagers", "minelp.mobs.guardians": "Ponify Guardians", "minelp.mobs.endermen": "Ponify Endermen", + "minelp.mobs.inanimates": "Ponify Objects", "minelp.mode.dry": "Land pony", "minelp.mode.wet": "Sea pony", "minelp.debug.reload_models.message": "Reloading pony models...",