Pony endermen

This commit is contained in:
Sollace 2018-08-15 17:14:40 +02:00
parent 3c53d3e4ff
commit 6ea3ed2d75
15 changed files with 378 additions and 38 deletions

View file

@ -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.

View file

@ -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;
}

View file

@ -60,6 +60,5 @@ public class ModelMobPony extends ModelAlicorn {
arm.rotateAngleY = direction * (0.1F - swing * 0.6F);
arm.rotateAngleZ = cos;
}
}

View file

@ -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()) {

View file

@ -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.

View file

@ -55,7 +55,7 @@ public class ModelPonyHead extends ModelHumanoidHead implements ICapitated {
if (metadata.hasMagic()) {
skeletonHead.postRender(scale);
horn.render(scale);
horn.renderPart(scale);
}
}

View file

@ -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 <T extends ModelBase & ICapitated> 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;
}
}

View file

@ -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);
}
}

View file

@ -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;
}
}

View file

@ -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<T extends EntityLiving> extends AbstractPonyLayer<T> {
private final ResourceLocation eyeTexture;
public <V extends RenderLiving<T> & 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<T>)getRenderer()).setLightmap(entity);
depthMask(true);
blendFunc(SourceFactor.ONE, DestFactor.ZERO);
disableBlend();
enableAlpha();
}
public interface IGlowingRenderer {
ResourceLocation getEyeTexture();
}
}

View file

@ -20,16 +20,23 @@ public class LayerHeldPonyItem<T extends EntityLivingBase> 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();

View file

@ -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

View file

@ -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<EntityEnderman> 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<EntityEnderman> createItemHoldingLayer() {
return new LayerHeldPonyItemMagical<EntityEnderman>(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;
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 972 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 113 B