diff --git a/src/main/java/com/minelittlepony/PonyConfig.java b/src/main/java/com/minelittlepony/PonyConfig.java index 1cd5a732..302440e1 100644 --- a/src/main/java/com/minelittlepony/PonyConfig.java +++ b/src/main/java/com/minelittlepony/PonyConfig.java @@ -38,6 +38,7 @@ public class PonyConfig extends SensibleConfig implements Exposable { @Expose public boolean skeletons = true; @Expose public boolean illagers = true; @Expose public boolean guardians = true; + @Expose public boolean endermen = true; /** * Gets the current PonyLevel. That is the level of ponies you would like to see. diff --git a/src/main/java/com/minelittlepony/model/AbstractPonyModel.java b/src/main/java/com/minelittlepony/model/AbstractPonyModel.java index 33031705..cb643a86 100644 --- a/src/main/java/com/minelittlepony/model/AbstractPonyModel.java +++ b/src/main/java/com/minelittlepony/model/AbstractPonyModel.java @@ -615,6 +615,7 @@ public abstract class AbstractPonyModel extends ModelPlayer implements IModel { preInitLegs(); preInitLegwear(); + int armLength = getArmLength(); int armWidth = getArmWidth(); int armDepth = getArmDepth(); @@ -625,11 +626,11 @@ public abstract class AbstractPonyModel extends ModelPlayer implements IModel { float armY = THIRDP_ARM_CENTRE_Y; float armZ = BODY_CENTRE_Z / 2 - 1 - armDepth; - bipedLeftArm .addBox(armX, armY, armZ, armWidth, 12, armDepth, stretch); - bipedRightArm.addBox(armX - armWidth, armY, armZ, armWidth, 12, armDepth, stretch); + bipedLeftArm .addBox(armX, armY, armZ, armWidth, armLength, armDepth, stretch); + bipedRightArm.addBox(armX - armWidth, armY, armZ, armWidth, armLength, armDepth, stretch); - bipedLeftLeg .addBox(armX, armY, armZ, armWidth, 12, armDepth, stretch); - bipedRightLeg.addBox(armX - armWidth, armY, armZ, armWidth, 12, armDepth, stretch); + bipedLeftLeg .addBox(armX, armY, armZ, armWidth, armLength, armDepth, stretch); + bipedRightLeg.addBox(armX - armWidth, armY, armZ, armWidth, armLength, armDepth, stretch); bipedLeftArm .setRotationPoint( rarmX, yOffset + rarmY, 0); bipedRightArm.setRotationPoint(-rarmX, yOffset + rarmY, 0); @@ -637,16 +638,16 @@ public abstract class AbstractPonyModel extends ModelPlayer implements IModel { bipedLeftLeg .setRotationPoint( rarmX, yOffset, 0); bipedRightLeg.setRotationPoint(-rarmX, yOffset, 0); - bipedLeftArmwear.addBox(armX, armY, armZ, armWidth, 12, armDepth, stretch + 0.25f); + bipedLeftArmwear.addBox(armX, armY, armZ, armWidth, armLength, armDepth, stretch + 0.25f); bipedLeftArmwear.setRotationPoint(rarmX, yOffset + rarmY, 0); - bipedRightArmwear.addBox(armX - armWidth, armY, armZ, armWidth, 12, armDepth, stretch + 0.25f); + bipedRightArmwear.addBox(armX - armWidth, armY, armZ, armWidth, armLength, armDepth, stretch + 0.25f); bipedRightArmwear.setRotationPoint(-rarmX, yOffset + rarmY, 0); - bipedLeftLegwear.addBox(armX, armY, armZ, armWidth, 12, armDepth, stretch + 0.25f); + bipedLeftLegwear.addBox(armX, armY, armZ, armWidth, armLength, armDepth, stretch + 0.25f); bipedRightLegwear.setRotationPoint(rarmX, yOffset, 0); - bipedRightLegwear.addBox(armX - armWidth, armY, armZ, armWidth, 12, armDepth, stretch + 0.25f); + bipedRightLegwear.addBox(armX - armWidth, armY, armZ, armWidth, armLength, armDepth, stretch + 0.25f); bipedRightLegwear.setRotationPoint(-rarmX, yOffset, 0); } @@ -658,6 +659,10 @@ public abstract class AbstractPonyModel extends ModelPlayer implements IModel { return 4; } + protected int getArmLength() { + return 12; + } + protected float getLegRotationX() { return 3; } diff --git a/src/main/java/com/minelittlepony/model/ModelMobPony.java b/src/main/java/com/minelittlepony/model/ModelMobPony.java index 212cdd50..a2378cef 100644 --- a/src/main/java/com/minelittlepony/model/ModelMobPony.java +++ b/src/main/java/com/minelittlepony/model/ModelMobPony.java @@ -60,6 +60,5 @@ public class ModelMobPony extends ModelAlicorn { arm.rotateAngleY = direction * (0.1F - swing * 0.6F); arm.rotateAngleZ = cos; - } } diff --git a/src/main/java/com/minelittlepony/model/PMAPI.java b/src/main/java/com/minelittlepony/model/PMAPI.java index a6f83c84..39b67161 100644 --- a/src/main/java/com/minelittlepony/model/PMAPI.java +++ b/src/main/java/com/minelittlepony/model/PMAPI.java @@ -5,6 +5,7 @@ import com.minelittlepony.model.player.ModelEarthPony; import com.minelittlepony.model.player.ModelPegasus; import com.minelittlepony.model.player.ModelUnicorn; import com.minelittlepony.model.player.ModelZebra; +import com.minelittlepony.model.ponies.ModelEnderStallion; import com.minelittlepony.model.ponies.ModelIllagerPony; import com.minelittlepony.model.ponies.ModelSeapony; import com.minelittlepony.model.ponies.ModelSkeletonPony; @@ -43,6 +44,7 @@ public final class PMAPI { public static final ModelWrapper villager = new ModelWrapper(new ModelVillagerPony()); public static final ModelWrapper illager = new ModelWrapper(new ModelIllagerPony()); public static final ModelWrapper witch = new ModelWrapper(new ModelWitchPony()); + public static final ModelWrapper enderman = new ModelWrapper(new ModelEnderStallion()); public static void init() { for (Field field : PMAPI.class.getFields()) { diff --git a/src/main/java/com/minelittlepony/model/capabilities/IModelPart.java b/src/main/java/com/minelittlepony/model/capabilities/IModelPart.java index 44fc636e..85e6d455 100644 --- a/src/main/java/com/minelittlepony/model/capabilities/IModelPart.java +++ b/src/main/java/com/minelittlepony/model/capabilities/IModelPart.java @@ -6,14 +6,18 @@ public interface IModelPart { * @param yOffset * @param stretch */ - void init(float yOffset, float stretch); + default void init(float yOffset, float stretch) { + + } /** * Sets the model's various rotation angles. * * See {@link AbstractPonyMode.setRotationAndAngle} for an explanation of the various parameters. */ - void setRotationAndAngles(boolean rainboom, float move, float swing, float bodySwing, float ticks); + default void setRotationAndAngles(boolean rainboom, float move, float swing, float bodySwing, float ticks) { + + }; /** * Renders this model component. diff --git a/src/main/java/com/minelittlepony/model/components/ModelPonyHead.java b/src/main/java/com/minelittlepony/model/components/ModelPonyHead.java index 4b4bbb51..b6025be4 100644 --- a/src/main/java/com/minelittlepony/model/components/ModelPonyHead.java +++ b/src/main/java/com/minelittlepony/model/components/ModelPonyHead.java @@ -55,7 +55,7 @@ public class ModelPonyHead extends ModelHumanoidHead implements ICapitated { if (metadata.hasMagic()) { skeletonHead.postRender(scale); - horn.render(scale); + horn.renderPart(scale); } } diff --git a/src/main/java/com/minelittlepony/model/components/UnicornHorn.java b/src/main/java/com/minelittlepony/model/components/UnicornHorn.java index 81903de6..898352aa 100644 --- a/src/main/java/com/minelittlepony/model/components/UnicornHorn.java +++ b/src/main/java/com/minelittlepony/model/components/UnicornHorn.java @@ -1,6 +1,7 @@ package com.minelittlepony.model.components; import com.minelittlepony.model.capabilities.ICapitated; +import com.minelittlepony.model.capabilities.IModelPart; import com.minelittlepony.render.HornGlowRenderer; import com.minelittlepony.render.PonyRenderer; @@ -10,10 +11,12 @@ import static org.lwjgl.opengl.GL11.*; import static net.minecraft.client.renderer.GlStateManager.*; import static com.minelittlepony.model.PonyModelConstants.*; -public class UnicornHorn { +public class UnicornHorn implements IModelPart { - private PonyRenderer horn; - private HornGlowRenderer glow; + protected PonyRenderer horn; + protected HornGlowRenderer glow; + + protected boolean isVisible; public UnicornHorn(T pony, float yOffset, float stretch) { this(pony, yOffset, stretch, 0, 0, 0); @@ -34,24 +37,32 @@ public class UnicornHorn { .setAlpha(0.2f).box(0, 0, 0, 1, 3, 1, stretch + 0.8F); } - public void render(float scale) { - horn.render(scale); + @Override + public void renderPart(float scale) { + if (isVisible) { + horn.render(scale); + } } public void renderMagic(int tint, float scale) { - glPushAttrib(24577); - disableTexture2D(); - disableLighting(); - enableBlend(); - blendFunc(GL_SRC_ALPHA, GL_ONE); + if (isVisible) { + glPushAttrib(24577); + disableTexture2D(); + disableLighting(); + enableBlend(); + blendFunc(GL_SRC_ALPHA, GL_ONE); - horn.postRender(scale); + horn.postRender(scale); + glow.setTint(tint).render(scale); - glow.setTint(tint).render(scale); + enableTexture2D(); + enableLighting(); + disableBlend(); + popAttrib(); + } + } - enableTexture2D(); - enableLighting(); - disableBlend(); - popAttrib(); + public void setVisible(boolean visible) { + isVisible = visible; } } diff --git a/src/main/java/com/minelittlepony/model/player/ModelUnicorn.java b/src/main/java/com/minelittlepony/model/player/ModelUnicorn.java index 48731dff..fac74733 100644 --- a/src/main/java/com/minelittlepony/model/player/ModelUnicorn.java +++ b/src/main/java/com/minelittlepony/model/player/ModelUnicorn.java @@ -139,7 +139,7 @@ public class ModelUnicorn extends ModelEarthPony implements IModelUnicorn { super.renderHead(entity, move, swing, ticks, headYaw, headPitch, scale); if (canCast()) { - horn.render(scale); + horn.renderPart(scale); if (isCasting()) { horn.renderMagic(getMagicColor(), scale); } @@ -152,7 +152,20 @@ public class ModelUnicorn extends ModelEarthPony implements IModelUnicorn { unicornArmLeft = new PonyRenderer(this, 40, 32).size(64, 64); unicornArmRight = new PonyRenderer(this, 40, 32).size(64, 64); - unicornArmLeft .box(FIRSTP_ARM_CENTRE_X, THIRDP_ARM_CENTRE_Y, THIRDP_ARM_CENTRE_Z, 4, 12, 4, stretch + .25F).around(5, yOffset + 2, 0); - unicornArmRight.box(FIRSTP_ARM_CENTRE_X, THIRDP_ARM_CENTRE_Y, THIRDP_ARM_CENTRE_Z, 4, 12, 4, stretch + .25F).around(-5, yOffset + 2, 0); + int armLength = getArmLength(); + int armWidth = getArmWidth(); + int armDepth = getArmDepth(); + + float rarmX = getLegRotationX(); + float rarmY = getArmRotationY(); + + float armX = THIRDP_ARM_CENTRE_X; + float armY = THIRDP_ARM_CENTRE_Y; + float armZ = BODY_CENTRE_Z / 2 - 1 - armDepth; + + unicornArmLeft .box(armX, armY, armZ, armWidth, armLength, armDepth, stretch + .25F) + .around(rarmX, yOffset + rarmY, 0); + unicornArmRight.box(armX - armWidth, armY, armZ, armWidth, armLength, armDepth, stretch + .25F) + .around(-rarmX, yOffset + rarmY, 0); } } diff --git a/src/main/java/com/minelittlepony/model/ponies/ModelEnderStallion.java b/src/main/java/com/minelittlepony/model/ponies/ModelEnderStallion.java new file mode 100644 index 00000000..b475488f --- /dev/null +++ b/src/main/java/com/minelittlepony/model/ponies/ModelEnderStallion.java @@ -0,0 +1,164 @@ +package com.minelittlepony.model.ponies; + +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.util.math.MathHelper; + +import com.minelittlepony.model.components.PonySnout; +import com.minelittlepony.render.PonyRenderer; + +import static com.minelittlepony.model.PonyModelConstants.HEAD_CENTRE_X; +import static com.minelittlepony.model.PonyModelConstants.HEAD_CENTRE_Y; +import static com.minelittlepony.model.PonyModelConstants.HEAD_CENTRE_Z; +import static com.minelittlepony.model.PonyModelConstants.HEAD_RP_X; +import static com.minelittlepony.model.PonyModelConstants.HEAD_RP_Y; +import static com.minelittlepony.model.PonyModelConstants.HEAD_RP_Z; +import static com.minelittlepony.model.PonyModelConstants.LEFT_WING_ROTATE_ANGLE_Z_SNEAK; + +public class ModelEnderStallion extends ModelSkeletonPony { + + public boolean isCarrying; + public boolean isAttacking; + + public boolean isAlicorn; + public boolean isBoss; + + private PonyRenderer leftHorn; + private PonyRenderer rightHorn; + + @Override + public void setLivingAnimations(EntityLivingBase entity, float move, float swing, float ticks) { + rightArmPose = isCarrying ? ArmPose.BLOCK : ArmPose.EMPTY; + leftArmPose = rightArmPose; + + isAlicorn = entity.getUniqueID().getLeastSignificantBits() % 3 == 0; + isBoss = !isAlicorn && entity.getUniqueID().getLeastSignificantBits() % 20 == 0; + + leftHorn.isHidden = rightHorn.isHidden = !isBoss; + horn.setVisible(!isBoss); + + tail.setVisible(false); + snout.isHidden = true; + bipedLeftArmwear.isHidden = true; + bipedRightArmwear.isHidden = true; + + bipedLeftLegwear.isHidden = true; + bipedRightLegwear.isHidden = true; + + leftHorn.rotateAngleX = 0.5F; + rightHorn.rotateAngleX = 0.5F; + } + + public void setVisible(boolean visible) { + super.setVisible(visible); + + } + + @Override + public void setRotationAngles(float move, float swing, float ticks, float headYaw, float headPitch, float scale, Entity entity) { + super.setRotationAngles(move, swing, ticks, headYaw, headPitch, scale, entity); + + if (isAttacking) { + bipedHead.rotationPointY -= 5; + } + } + + @Override + public void render(Entity entity, float move, float swing, float ticks, float headYaw, float headPitch, float scale) { + + GlStateManager.pushMatrix(); + GlStateManager.translate(0, -1.15F, 0); + super.render(entity, move, swing, ticks, headYaw, headPitch, scale); + GlStateManager.popMatrix(); + } + + @Override + public boolean canCast() { + return true; + } + + @Override + public boolean canFly() { + return isAlicorn; + } + + @Override + protected void initHead(float yOffset, float stretch) { + bipedHead = new PonyRenderer(this, 0, 0) + .offset(HEAD_CENTRE_X, HEAD_CENTRE_Y, HEAD_CENTRE_Z) + .around(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z - 2) + .box(-4, -4, -4, 8, 8, 8, stretch) + .tex(12, 16).box(-4, -6, 1, 2, 2, 2, stretch) + .flip().box( 2, -6, 1, 2, 2, 2, stretch); + + leftHorn = ((PonyRenderer)bipedHead).child().tex(0, 52); + leftHorn.tex(0, 52) + .rotate(0.1F, 0, -0.8F) + .offset(-2, -10, -3) + .box(0, 0, 0, 2, 6, 2, stretch) + .child() + .rotate(0, 0, 0.9F) + .around(-3.9F, -6, 0.001F) + .box(0, 0, 0, 2, 6, 2, stretch); + + rightHorn = ((PonyRenderer)bipedHead).child().tex(0, 52); + rightHorn.tex(8, 52) + .rotate(0.1F, 0, 0.8F) + .offset(0, -10, -3) + .box(0, 0, 0, 2, 6, 2, stretch) + .child() + .rotate(0, 0, -0.9F) + .around(3.9F, -6, 0.001F) + .box(0, 0, 0, 2, 6, 2, stretch); + + bipedHeadwear = new PonyRenderer(this, 32, 0) + .offset(HEAD_CENTRE_X, HEAD_CENTRE_Y, HEAD_CENTRE_Z) + .around(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z - 2) + .box(-4, -4, -4, 8, 8, 8, stretch - 0.5F); + + snout = new PonySnout(this); + snout.init(yOffset, stretch); + } + + @Override + protected void rotateArmHolding(ModelRenderer arm, float direction, float swingProgress, float ticks) { + arm.rotateAngleX = -0.3707964F; + arm.rotateAngleX += 0.4F + MathHelper.sin(ticks * 0.067F) / 10; + } + + @Override + protected void preInitLegs() { + bipedLeftArm = new ModelRenderer(this, 0, 20); + bipedRightArm = new ModelRenderer(this, 0, 20); + + bipedLeftLeg = new ModelRenderer(this, 0, 20); + bipedRightLeg = new ModelRenderer(this, 0, 20); + } + + @Override + public boolean wingsAreOpen() { + return isAttacking; + } + + @Override + protected float getLegRotationX() { + return 3; + } + + @Override + protected float getArmRotationY() { + return 14; + } + + @Override + protected int getArmLength() { + return 30; + } + + @Override + public float getWingRotationFactor(float ticks) { + return MathHelper.sin(ticks) + LEFT_WING_ROTATE_ANGLE_Z_SNEAK; + } +} diff --git a/src/main/java/com/minelittlepony/render/layer/LayerEyeGlow.java b/src/main/java/com/minelittlepony/render/layer/LayerEyeGlow.java new file mode 100644 index 00000000..e8b05a6b --- /dev/null +++ b/src/main/java/com/minelittlepony/render/layer/LayerEyeGlow.java @@ -0,0 +1,53 @@ +package com.minelittlepony.render.layer; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.OpenGlHelper; +import net.minecraft.client.renderer.entity.RenderLiving; +import net.minecraft.entity.EntityLiving; +import net.minecraft.util.ResourceLocation; + +import static net.minecraft.client.renderer.GlStateManager.*; + +public class LayerEyeGlow extends AbstractPonyLayer { + + private final ResourceLocation eyeTexture; + + public & IGlowingRenderer> LayerEyeGlow(V renderer) { + super(renderer); + eyeTexture = renderer.getEyeTexture(); + } + + @Override + protected void doPonyRender(T entity, float move, float swing, float partialTicks, float ticks, float headYaw, float headPitch, float scale) { + getRenderer().bindTexture(eyeTexture); + + enableBlend(); + disableAlpha(); + blendFunc(SourceFactor.ONE, DestFactor.ONE); + + disableLighting(); + depthMask(!entity.isInvisible()); + OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 61680, 0); + enableLighting(); + + color(1, 1, 1, 1); + + Minecraft.getMinecraft().entityRenderer.setupFogColor(true); + + getMainModel().render(entity, move, swing, ticks, headYaw, headPitch, scale); + + Minecraft.getMinecraft().entityRenderer.setupFogColor(false); + + ((RenderLiving)getRenderer()).setLightmap(entity); + + depthMask(true); + + blendFunc(SourceFactor.ONE, DestFactor.ZERO); + disableBlend(); + enableAlpha(); + } + + public interface IGlowingRenderer { + ResourceLocation getEyeTexture(); + } +} diff --git a/src/main/java/com/minelittlepony/render/layer/LayerHeldPonyItem.java b/src/main/java/com/minelittlepony/render/layer/LayerHeldPonyItem.java index 86820ca2..f4d7f079 100644 --- a/src/main/java/com/minelittlepony/render/layer/LayerHeldPonyItem.java +++ b/src/main/java/com/minelittlepony/render/layer/LayerHeldPonyItem.java @@ -20,16 +20,23 @@ public class LayerHeldPonyItem extends AbstractPonyL super(livingPony); } + protected ItemStack getLeftItem(T entity) { + boolean main = entity.getPrimaryHand() == EnumHandSide.LEFT; + + return main ? entity.getHeldItemMainhand() : entity.getHeldItemOffhand(); + } + + protected ItemStack getRightItem(T entity) { + boolean main = entity.getPrimaryHand() == EnumHandSide.RIGHT; + + return main ? entity.getHeldItemMainhand() : entity.getHeldItemOffhand(); + } + @Override public void doPonyRender(T entity, float move, float swing, float partialTicks, float ticks, float headYaw, float headPitch, float scale) { - boolean mainRight = entity.getPrimaryHand() == EnumHandSide.RIGHT; - - ItemStack itemMain = entity.getHeldItemMainhand(); - ItemStack itemOff = entity.getHeldItemOffhand(); - - ItemStack left = mainRight ? itemOff : itemMain; - ItemStack right = mainRight ? itemMain : itemOff; + ItemStack left = getLeftItem(entity); + ItemStack right = getRightItem(entity); if (!left.isEmpty() || !right.isEmpty()) { ModelBase model = getMainModel(); diff --git a/src/main/java/com/minelittlepony/render/ponies/MobRenderers.java b/src/main/java/com/minelittlepony/render/ponies/MobRenderers.java index e7f17034..886922b5 100644 --- a/src/main/java/com/minelittlepony/render/ponies/MobRenderers.java +++ b/src/main/java/com/minelittlepony/render/ponies/MobRenderers.java @@ -60,6 +60,12 @@ public enum MobRenderers implements Setting { pony.switchRenderer(state, manager, EntityGuardian.class, new RenderPonyGuardian(manager)); pony.switchRenderer(state, manager, EntityElderGuardian.class, new RenderPonyGuardian.Elder(manager)); } + }, + ENDERMEN { + @Override + public void register(boolean state, PonyRenderManager pony, RenderManager manager) { + pony.switchRenderer(state, manager, EntityEnderman.class, new RenderEnderStallion(manager)); + } }; @Override diff --git a/src/main/java/com/minelittlepony/render/ponies/RenderEnderStallion.java b/src/main/java/com/minelittlepony/render/ponies/RenderEnderStallion.java new file mode 100644 index 00000000..5ba3d300 --- /dev/null +++ b/src/main/java/com/minelittlepony/render/ponies/RenderEnderStallion.java @@ -0,0 +1,75 @@ +package com.minelittlepony.render.ponies; + +import com.minelittlepony.model.PMAPI; +import com.minelittlepony.model.ponies.ModelEnderStallion; +import com.minelittlepony.render.RenderPonyMob; +import com.minelittlepony.render.layer.LayerEyeGlow; +import com.minelittlepony.render.layer.LayerHeldPonyItem; +import com.minelittlepony.render.layer.LayerHeldPonyItemMagical; +import com.minelittlepony.render.layer.LayerEyeGlow.IGlowingRenderer; + +import java.util.Random; + +import net.minecraft.block.state.IBlockState; +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.client.renderer.entity.layers.LayerArrow; +import net.minecraft.entity.monster.EntityEnderman; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; + +public class RenderEnderStallion extends RenderPonyMob implements IGlowingRenderer { + + public static final ResourceLocation ENDERMAN = new ResourceLocation("minelittlepony", "textures/entity/enderman/enderman_pony.png"); + private static final ResourceLocation EYES = new ResourceLocation("minelittlepony", "textures/entity/enderman/enderman_pony_eyes.png"); + + private final Random rnd = new Random(); + + public RenderEnderStallion(RenderManager manager) { + super(manager, PMAPI.enderman); + } + + protected void addLayers() { + addLayer(createItemHoldingLayer()); + addLayer(new LayerArrow(this)); + addLayer(new LayerEyeGlow<>(this)); + } + + protected LayerHeldPonyItem createItemHoldingLayer() { + return new LayerHeldPonyItemMagical(this) { + @Override + protected ItemStack getRightItem(EntityEnderman entity) { + IBlockState state = entity.getHeldBlockState(); + if (state == null) { + return ItemStack.EMPTY; + } + return new ItemStack(state.getBlock(), 1, state.getBlock().getMetaFromState(state)); + } + }; + } + + @Override + protected ResourceLocation getTexture(EntityEnderman entity) { + return ENDERMAN; + } + + @Override + public void doRender(EntityEnderman entity, double x, double y, double z, float entityYaw, float partialTicks) { + ModelEnderStallion modelenderman = (ModelEnderStallion)getMainModel(); + + modelenderman.isCarrying = entity.getHeldBlockState() != null; + modelenderman.isAttacking = entity.isScreaming(); + + if (entity.isScreaming()) { + x += rnd.nextGaussian() / 50; + z += rnd.nextGaussian() / 50; + } + + super.doRender(entity, x, y, z, entityYaw, partialTicks); + } + + @Override + public ResourceLocation getEyeTexture() { + return EYES; + } +} diff --git a/src/main/resources/assets/minelittlepony/textures/entity/enderman/enderman_pony.png b/src/main/resources/assets/minelittlepony/textures/entity/enderman/enderman_pony.png new file mode 100644 index 00000000..140be0d9 Binary files /dev/null and b/src/main/resources/assets/minelittlepony/textures/entity/enderman/enderman_pony.png differ diff --git a/src/main/resources/assets/minelittlepony/textures/entity/enderman/enderman_pony_eyes.png b/src/main/resources/assets/minelittlepony/textures/entity/enderman/enderman_pony_eyes.png new file mode 100644 index 00000000..e037fce5 Binary files /dev/null and b/src/main/resources/assets/minelittlepony/textures/entity/enderman/enderman_pony_eyes.png differ