Sorry for taking so long to respond, I was trying to fix a memory leak with my packets. But yeah, it's still a little choppy but not as bad now with the new code. Also I'm having trouble toggling the sprinting. Whenever I press the key that tells it to sprint, it sprints but the animation gets stuck sprinting and it seems to be the boolean getting fixed on true
Packet
package common.zeroquest.network.imessage;
import io.netty.buffer.ByteBuf;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler;
import net.minecraftforge.fml.common.network.simpleimpl.MessageContext;
import common.zeroquest.entity.EntityZertumEntity;
public class ZertumSprint implements IMessage{
public int entityId;
public ZertumSprint(){}
public ZertumSprint(int entityId)
{
this.entityId = entityId;
}
@Override
public void fromBytes(ByteBuf buf) {
entityId = buf.readInt();
}
@Override
public void toBytes(ByteBuf buf) {
buf.writeInt(this.entityId);
}
public static class Handler implements IMessageHandler<ZertumSprint, IMessage> {
public Handler(){}
@Override
public IMessage onMessage(ZertumSprint message, MessageContext ctx) {
Entity target = ctx.getServerHandler().playerEntity.worldObj.getEntityByID(message.entityId);
if(!(target instanceof EntityZertumEntity))
return null;
EntityZertumEntity dog = (EntityZertumEntity)target;
if(dog.riddenByEntity != null)
dog.setDashing(true);
return message;
}
}
}
KeyState
package common.zeroquest.core.handlers;
import java.util.HashMap;
import net.minecraft.client.Minecraft;
import net.minecraft.client.settings.KeyBinding;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraftforge.fml.client.FMLClientHandler;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.TickEvent.ClientTickEvent;
import net.minecraftforge.fml.common.gameevent.TickEvent.Phase;
import org.lwjgl.input.Keyboard;
import common.zeroquest.ModItems;
import common.zeroquest.entity.EntityJakan;
import common.zeroquest.entity.EntityKortor;
import common.zeroquest.entity.EntityZertumEntity;
import common.zeroquest.network.PacketHandler;
import common.zeroquest.network.imessage.JakanJump;
import common.zeroquest.network.imessage.KortorJump;
import common.zeroquest.network.imessage.SealCommand;
import common.zeroquest.network.imessage.ZertumJump;
import common.zeroquest.network.imessage.ZertumSprint;
/**
* @author ProPercivalalb
**/
public class KeyStateHandler {
public static final KeyBinding come = new KeyBinding("zeroquest.key.come", Keyboard.KEY_W, "key.categories.zeroquest");
public static final KeyBinding stay = new KeyBinding("zeroquest.key.stay", Keyboard.KEY_S, "key.categories.zeroquest");
public static final KeyBinding ok = new KeyBinding("zeroquest.key.ok", Keyboard.KEY_D, "key.categories.zeroquest");
public static final KeyBinding heel = new KeyBinding("zeroquest.key.heel", Keyboard.KEY_A, "key.categories.zeroquest");
public static final KeyBinding sprint = new KeyBinding("zeroquest.key.sprint", Keyboard.KEY_Z, "key.categories.zeroquest");
public static final KeyBinding[] keyBindings = new KeyBinding[] {come, stay, ok, heel, sprint, Minecraft.getMinecraft().gameSettings.keyBindJump};
private HashMap<KeyBinding, Boolean> keyState = new HashMap<KeyBinding, Boolean>();
private Minecraft mc = Minecraft.getMinecraft();
@SubscribeEvent
public void keyEvent(ClientTickEvent event) {
this.keyTick(event.phase == Phase.END);
}
private void keyTick(boolean tickEnd) {
for(KeyBinding kb : keyBindings) {
if(kb.isKeyDown()) {
if (!tickEnd && (!this.keyState.containsKey(kb) || !this.keyState.get(kb))) {
this.keyState.put(kb, true);
//Key Pressed
EntityPlayer player = FMLClientHandler.instance().getClientPlayerEntity();
if(kb == mc.gameSettings.keyBindJump) {
if(player.ridingEntity instanceof EntityZertumEntity && mc.currentScreen == null) {
EntityZertumEntity dog = (EntityZertumEntity)player.ridingEntity;
PacketHandler.sendToServer(new ZertumJump(dog.getEntityId()));
}
else if(player.ridingEntity instanceof EntityJakan && mc.currentScreen == null) {
EntityJakan dog = (EntityJakan)player.ridingEntity;
PacketHandler.sendToServer(new JakanJump(dog.getEntityId()));
}
else if(player.ridingEntity instanceof EntityKortor && mc.currentScreen == null) {
EntityKortor dog = (EntityKortor)player.ridingEntity;
PacketHandler.sendToServer(new KortorJump(dog.getEntityId()));
}
}
else if(kb == sprint) {
if(player.ridingEntity instanceof EntityZertumEntity && mc.currentScreen == null) {
EntityZertumEntity dog = (EntityZertumEntity)player.ridingEntity;
PacketHandler.sendToServer(new ZertumSprint(dog.getEntityId()));
}
}
else if(FMLClientHandler.instance().getClient().inGameHasFocus && player != null && player.getCurrentEquippedItem() != null && player.getCurrentEquippedItem().getItem() == ModItems.commandSeal) {
int command = -1;
if(kb == come) {
command = 1;
}
else if(kb == stay) {
command = 2;
}
else if(kb == ok) {
command = 3;
}
else if(kb == heel) {
command = 4;
}
if(command != -1)
PacketHandler.sendToServer(new SealCommand(command));
}
}
else if(!tickEnd) {
//Key Released
}
}
else {
this.keyState.put(kb, false);
}
}
}
}
Model
package common.zeroquest.client.renderer.entity.model;
import net.minecraft.client.model.ModelBase;
import net.minecraft.client.model.ModelRenderer;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.util.MathHelper;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import org.lwjgl.opengl.GL11;
import common.zeroquest.entity.EntityZertumEntity;
@SideOnly(Side.CLIENT)
public class ModelZertum extends ModelBase
{
//fields
ModelRenderer Nose;
ModelRenderer Ear2;
ModelRenderer Ear1;
ModelRenderer Head;
ModelRenderer LeftHindLeg1;
ModelRenderer LeftHindLeg2;
ModelRenderer LeftHindLeg3;
ModelRenderer RightHindLeg1;
ModelRenderer RightHindLeg2;
ModelRenderer RightHindLeg3;
ModelRenderer Mane1;
ModelRenderer RightLeg;
ModelRenderer LeftLeg;
ModelRenderer Tail1;
ModelRenderer Tail2;
ModelRenderer Tail3;
ModelRenderer Mane2;
ModelRenderer Torso;
ModelRenderer Neck;
ModelRenderer Pad1;
ModelRenderer Pad2;
ModelRenderer Pad3;
ModelRenderer Pad4;
ModelRenderer PadPart1;
ModelRenderer PadPart2;
ModelRenderer Rope1;
ModelRenderer Metal1;
ModelRenderer Rope2;
ModelRenderer Metal2;
ModelRenderer Seat1;
ModelRenderer Seat2;
private float rightFemur = -0.2974289F;
private float leftFemur = -0.2974289F;
private float rightTibia = 0.8205006F;
private float leftTibia = 0.8205006F;
private float rightMetatarus = -0.5205006F;
private float leftMetatarus = -0.5205006F;
private float mane2StartingRotation = -0.34653F;
private float vertebrae = -0.6015813F;
//Evolved Model\\
ModelRenderer Throat;
ModelRenderer UpSection;
ModelRenderer MidSection;
ModelRenderer Pelvis;
ModelRenderer TailPart1;
ModelRenderer TailPart2;
ModelRenderer TailPart3;
ModelRenderer LeftHumerus;
ModelRenderer LeftRadius;
ModelRenderer LeftFClawRPart1;
ModelRenderer LeftFClawRPart2;
ModelRenderer LeftFClawMPart1;
ModelRenderer LeftFClawMPart2;
ModelRenderer LeftFClawLPart1;
ModelRenderer LeftFClawLPart2;
ModelRenderer RightHumerus;
ModelRenderer RightRadius;
ModelRenderer RightFClawRPart1;
ModelRenderer RightFClawRPart2;
ModelRenderer RightFClawMPart1;
ModelRenderer RightFClawMPart2;
ModelRenderer RightFClawLPart1;
ModelRenderer RightFClawLPart2;
ModelRenderer LeftFemur;
ModelRenderer LeftTibia;
ModelRenderer LeftMetatarsus;
ModelRenderer LeftClawRPart1;
ModelRenderer LeftClawRPart2;
ModelRenderer LeftClawLPart1;
ModelRenderer LeftClawLPart2;
ModelRenderer LeftClawMPart1;
ModelRenderer LeftClawMPart2;
ModelRenderer RightFemur;
ModelRenderer RightTibia;
ModelRenderer RightMetatarsus;
ModelRenderer RightClawRPart1;
ModelRenderer RightClawRPart2;
ModelRenderer RightClawMPart1;
ModelRenderer RightClawMPart2;
ModelRenderer RightClawLPart1;
ModelRenderer RightClawLPart2;
ModelRenderer RightEarPart1;
ModelRenderer LeftBottomJaw;
ModelRenderer RightEarPart2;
ModelRenderer BottomJawPart1;
ModelRenderer RightEarPart3;
ModelRenderer BottomJawPart2;
ModelRenderer LeftEarPart1;
ModelRenderer BottomJawCenter;
ModelRenderer LeftEarPart2;
ModelRenderer LeftTopTeeth;
ModelRenderer LeftEarPart3;
ModelRenderer LeftTopJaw;
ModelRenderer LeftBottomTeeth;
ModelRenderer RightTopTeeth;
ModelRenderer RightBottomTeeth;
ModelRenderer TopJawPart1;
ModelRenderer TopJawPart2;
ModelRenderer TopJawCenter;
ModelRenderer RightTopJaw;
ModelRenderer RightBottomJaw;
ModelRenderer EPad1;
ModelRenderer EPad2;
ModelRenderer EPad3;
ModelRenderer EPad4;
ModelRenderer EPadPart1;
ModelRenderer EPadPart2;
ModelRenderer ERope1;
ModelRenderer EMetal1;
ModelRenderer ERope2;
ModelRenderer EMetal2;
ModelRenderer ESeat1;
ModelRenderer ESeat2;
// create an animation cycle
// for movement based animations you need to measure distance moved
// and perform number of cycles per block distance moved.
protected double distanceMovedTotal = 0.0D;
// don't make this too large or animations will be skipped
protected static final double CYCLES_PER_BLOCK = 1.3D;
protected int cycleIndex = 0;
protected float[][] undulationCycle = new float[][]
{
{-32, -27, -22, -18, -15, -12, -9, -6, -3, 0, 3, 6,
9, 12, 15, 18, 22, 27, 32, 27, 22, 18, 15,
12, 9, 6, 3, 0, -3, -6, -9, -12, -15, -18, -22, -27, -32},
{0, 3, 6,
9, 12, 15, 18, 22, 27, 32, 27, 22, 18, 15,
12, 9, 6, 3, 0, -3, -6, -9, -12, -15, -18, -22, -27, -32},
{-32, -27, -22, -18, -15, -12, -9, -6, -3, 0, 3, 6,
9, 12, 15, 18, 22, 27, 32, 27, 22, 18, 15,
12, 9, 6, 3, 0, -3, -6, -9, -12, -15, -18, -22, -27, -32},
{0, 3, 6,
9, 12, 15, 18, 22, 27, 32, 27, 22, 18, 15,
12, 9, 6, 3, 0, -3, -6, -9, -12, -15, -18, -22, -27, -32},
};
public ModelZertum()
{
textureWidth = 256;
textureHeight = 128;
Nose = new ModelRenderer(this, 25, 27);
Nose.addBox(-1.5F, 0F, -3F, 3, 3, 4);
Nose.setRotationPoint(0F, 2.5F, -15F);
setRotation(Nose, 0F, 0F, 0F);
Ear2 = new ModelRenderer(this, 40, 28);
Ear2.addBox(-1F, -3F, 0F, 2, 3, 1);
Ear2.setRotationPoint(2F, -0.5F, -10.5F);
setRotation(Ear2, 0F, 0F, 0F);
Ear1 = new ModelRenderer(this, 40, 28);
Ear1.addBox(-1F, -3F, 0F, 2, 3, 1);
Ear1.setRotationPoint(-2F, -0.5F, -10.5F);
setRotation(Ear1, 0F, 0F, 0F);
Head = new ModelRenderer(this, 25, 15);
Head.addBox(-3F, -0.5F, -14F, 6, 6, 5);
Head.setRotationPoint(-0.5F, 6F, -3F);
setRotation(Head, 0F, 0F, 0F);
LeftHindLeg1 = new ModelRenderer(this, 11, 18);
LeftHindLeg1.addBox(-1F, 0F, -1F, 2, 5, 3);
LeftHindLeg1.setRotationPoint(1.5F, 13F, 5F);
setRotation(LeftHindLeg1, -0.2974289F, 0F, 0F);
LeftHindLeg2 = new ModelRenderer(this, 3, 44);
LeftHindLeg2.addBox(-1F, 0F, -1F, 2, 4, 2);
LeftHindLeg2.setRotationPoint(0F, 4.3F, -0.3F);
setRotation(LeftHindLeg2, leftTibia, 0F, 0F);
LeftHindLeg3 = new ModelRenderer(this, 0, 51);
LeftHindLeg3.addBox(-1F, 0F, -1F, 2, 4, 2);
LeftHindLeg3.setRotationPoint(0F, 3.55F, 0.2F);
setRotation(LeftHindLeg3, leftMetatarus, 0F, 0F);
RightHindLeg1 = new ModelRenderer(this, 11, 31);
RightHindLeg1.addBox(-1F, 0F, -1F, 2, 5, 3);
RightHindLeg1.setRotationPoint(-2.5F, 13F, 5F);
setRotation(RightHindLeg1, -0.2974289F, 0F, 0F);
RightHindLeg2 = new ModelRenderer(this, 3, 44);
RightHindLeg2.addBox(-1F, 0F, -1F, 2, 4, 2);
RightHindLeg2.setRotationPoint(0F, 4.3F, -0.3F);
setRotation(RightHindLeg2, rightTibia, 0F, 0F);
RightHindLeg3 = new ModelRenderer(this, 9, 51);
RightHindLeg3.addBox(-1F, 0F, -1F, 2, 4, 2);
RightHindLeg3.setRotationPoint(0F, 3.55F, 0.2F);
setRotation(RightHindLeg3, rightMetatarus, 0F, 0F);
Mane1 = new ModelRenderer(this, 43, 0);
Mane1.addBox(-3F, -3F, -3F, 6, 6, 7);
Mane1.setRotationPoint(-0.5F, 14F, -3F);
setRotation(Mane1, 1.496439F, 0F, 0F);
Neck = new ModelRenderer(this, 0, 0);
Neck.addBox(-2.5F, -12F, -4F, 4, 7, 4);
Neck.setRotationPoint(0.5F, 0F, 0F);
setRotation(Neck, -0.6015813F, 0F, 0F);
Mane2 = new ModelRenderer(this, 18, 0);
Mane2.addBox(-2.5F, -7F, -3.6F, 5, 6, 7);
Mane2.setRotationPoint(0F, 0F, 0F);
setRotation(Mane2, -0.34653F, 0F, 0F);
RightLeg = new ModelRenderer(this, 0, 30);
RightLeg.addBox(-1F, 0F, -1F, 2, 10, 2);
RightLeg.setRotationPoint(-3F, 14F, -4F);
setRotation(RightLeg, 0F, 0F, 0F);
LeftLeg = new ModelRenderer(this, 0, 16);
LeftLeg.addBox(-1F, 0F, -1F, 2, 10, 2);
LeftLeg.setRotationPoint(2F, 14F, -4F);
setRotation(LeftLeg, 0F, 0F, 0F);
Tail1 = new ModelRenderer(this, 91, 0);
Tail1.addBox(-1.5F, 0F, -1F, 4, 8, 4);
Tail1.setRotationPoint(-1F, 14.3F, 6F);
setRotation(Tail1, 1.315962F, 0F, 0F);
Tail2 = new ModelRenderer(this, 110, 0);
Tail2.addBox(-1.5F, 0F, -1F, 3, 8, 3);
Tail2.setRotationPoint(0.5F, 6F, 0.5F);
setRotation(Tail2, -0.041605F, 0F, 0F);
Tail3 = new ModelRenderer(this, 110, 13);
Tail3.addBox(-1F, 0F, -1F, 2, 8, 2);
Tail3.setRotationPoint(0F, 6.5F, 0.5F);
setRotation(Tail3, 0.001605F, 0F, 0F);
Torso = new ModelRenderer(this, 69, 0);
Torso.addBox(-2.5F, -3F, -3F, 5, 9, 5);
Torso.setRotationPoint(-0.5F, 12.5F, 1F);
setRotation(Torso, 1.496439F, 0F, 0F);
//Saddle\\
Pad1 = new ModelRenderer(this, 110, 32);
Pad1.addBox(-2F, 0F, 0F, 4, 1, 1);
Pad1.setRotationPoint(-0.5F, 9.3F, -2.5F);
setRotation(Pad1, -0.0650564F, 0F, 0F);
Pad2 = new ModelRenderer(this, 110, 35);
Pad2.addBox(-3F, 0F, 0F, 6, 1, 2);
Pad2.setRotationPoint(-0.5F, 9.4F, -1.5F);
setRotation(Pad2, -0.0743572F, 0F, 0F);
Pad3 = new ModelRenderer(this, 110, 39);
Pad3.addBox(-2F, 0F, 0F, 5, 1, 4);
Pad3.setRotationPoint(-1F, 9.5F, 0.2F);
setRotation(Pad3, -0.0650564F, 0F, 0F);
Pad4 = new ModelRenderer(this, 110, 48);
Pad4.addBox(-1.5F, 0F, 0F, 3, 1, 1);
Pad4.setRotationPoint(-0.5F, 9.8F, 4.1F);
setRotation(Pad4, -0.0650564F, 0F, 0F);
PadPart1 = new ModelRenderer(this, 110, 29);
PadPart1.addBox(-0.5F, 0F, 0F, 1, 1, 1);
PadPart1.setRotationPoint(1F, 9.23F, -3.5F);
setRotation(PadPart1, -0.0650564F, 0F, 0F);
PadPart2 = new ModelRenderer(this, 110, 29);
PadPart2.addBox(-0.5F, 0F, 0F, 1, 1, 1);
PadPart2.setRotationPoint(-2F, 9.2F, -3.5F);
setRotation(PadPart2, -0.0650564F, 0F, 0F);
Rope1 = new ModelRenderer(this, 105, 32);
Rope1.addBox(0F, 0F, -0.5F, 1, 4, 1);
Rope1.setRotationPoint(1.8F, 9.6F, 0F);
setRotation(Rope1, 0F, 0F, 0F);
Metal1 = new ModelRenderer(this, 102, 39);
Metal1.addBox(0F, 0F, -1F, 1, 1, 2);
Metal1.setRotationPoint(1.8F, 13.6F, 0F);
setRotation(Metal1, 0F, 0F, 0F);
Rope2 = new ModelRenderer(this, 105, 32);
Rope2.addBox(-1F, 0F, -0.5F, 1, 4, 1);
Rope2.setRotationPoint(-2.8F, 9.6F, 0F);
setRotation(Rope2, 0F, 0F, 0F);
Metal2 = new ModelRenderer(this, 102, 39);
Metal2.addBox(0F, 0F, -1F, 1, 1, 2);
Metal2.setRotationPoint(-3.8F, 13.6F, 0F);
setRotation(Metal2, 0F, 0F, 0F);
Seat1 = new ModelRenderer(this, 100, 45);
Seat1.addBox(-1F, 0F, 0F, 2, 1, 1);
Seat1.setRotationPoint(-0.5F, 8.7F, -1.5F);
setRotation(Seat1, -0.0650484F, 0F, 0F);
Seat2 = new ModelRenderer(this, 100, 49);
Seat2.addBox(-2F, 0F, 0F, 4, 1, 1);
Seat2.setRotationPoint(-0.5F, 9F, 3.2F);
setRotation(Seat2, -0.0650484F, 0F, 0F);
Head.addChild(Nose);
Head.addChild(Ear1);
Head.addChild(Ear2);
LeftHindLeg1.addChild(LeftHindLeg2);
RightHindLeg1.addChild(RightHindLeg2);
LeftHindLeg2.addChild(LeftHindLeg3);
RightHindLeg2.addChild(RightHindLeg3);
Mane1.addChild(Mane2);
Mane1.addChild(Neck);
Tail1.addChild(Tail2);
Tail2.addChild(Tail3);
//Ears\\
RightEarPart1 = new ModelRenderer(this, 18, 60);
RightEarPart1.addBox(-1F, -1F, -1F, 1, 1, 4);
RightEarPart1.setRotationPoint(-1.5F, 1.5F, -5F);
RightEarPart1.setTextureSize(256, 128);
setRotation(RightEarPart1, 0.0346075F, -0.3346075F, 0F);
RightEarPart2 = new ModelRenderer(this, 15, 66);
RightEarPart2.addBox(-1F, -1F, 0F, 2, 2, 6);
RightEarPart2.setRotationPoint(-0.5F, -0.5F, 0F);
RightEarPart2.setTextureSize(256, 128);
setRotation(RightEarPart2, 0.3346075F, -0.0346075F, 0F);
RightEarPart3 = new ModelRenderer(this, 16, 75);
RightEarPart3.addBox(-0.5F, -0.5F, 0F, 1, 1, 6);
RightEarPart3.setRotationPoint(-0.5F, 0F, 4F);
RightEarPart3.setTextureSize(256, 128);
setRotation(RightEarPart3, 0.0346075F, 0.4115358F, 0.0743572F);
LeftEarPart1 = new ModelRenderer(this, 18, 60);
LeftEarPart1.addBox(-1F, -1F, -1F, 1, 1, 4);
LeftEarPart1.setRotationPoint(3.5F, 1.5F, -5F);
LeftEarPart1.setTextureSize(256, 128);
setRotation(LeftEarPart1, 0.3346075F, 0.3346145F, 0F);
LeftEarPart2 = new ModelRenderer(this, 15, 66);
LeftEarPart2.addBox(-1F, -1F, 0F, 2, 2, 6);
LeftEarPart2.setRotationPoint(-0.5F, -0.5F, 0F);
LeftEarPart2.setTextureSize(256, 128);
setRotation(LeftEarPart2, 0.0346075F, 0.0346145F, 0F);
LeftEarPart3 = new ModelRenderer(this, 16, 75);
LeftEarPart3.addBox(-0.5F, -0.5F, 0F, 1, 1, 6);
LeftEarPart3.setRotationPoint(0.5F, 0F, 4F);
LeftEarPart3.setTextureSize(256, 128);
setRotation(LeftEarPart3, 0.0346145F, -0.411544F, -0.074351F);
Throat = new ModelRenderer(this, 0, 0);
Throat.addBox(-2F, -3F, -9F, 6, 5, 6);
Throat.setRotationPoint(-1F, 7.7F, -11F);
Throat.setTextureOffset(256, 128);
setRotation(Throat, -0.2288904F, 0F, 0F);
UpSection = new ModelRenderer(this, 25, 0);
UpSection.addBox(-2F, -2.5F, -9F, 7, 7, ;
UpSection.setRotationPoint(-1.5F, 7F, -6F);
UpSection.setTextureSize(256, 128);
setRotation(UpSection, -0.1917118F, 0F, 0F);
MidSection = new ModelRenderer(this, 56, 0);
MidSection.addBox(-2F, -2.5F, 0F, 6, 6, 9);
MidSection.setRotationPoint(-1F, 7.5F, -8F);
MidSection.setTextureSize(256, 128);
setRotation(MidSection, -0.0429974F, 0F, 0F);
Pelvis = new ModelRenderer(this, 87, 0);
Pelvis.addBox(-2F, -2.5F, 0F, 6, 6, 7);
Pelvis.setRotationPoint(-1F, 7.8F, 0F);
Pelvis.setTextureSize(256, 128);
setRotation(Pelvis, 0F, 0F, 0F);
TailPart1 = new ModelRenderer(this, 114, 0);
TailPart1.addBox(-1F, -1F, 0F, 2, 2, 11);
TailPart1.setRotationPoint(0F, 7F, 6F);
TailPart1.setTextureOffset(256, 128);
setRotation(TailPart1, -0.3346075F, 0F, 0F);
TailPart2 = new ModelRenderer(this, 141, 0);
TailPart2.addBox(-1F, -1F, 0F, 2, 2, 11);
TailPart2.setRotationPoint(0F, -0.2F, 10F);
TailPart2.setTextureSize(256, 128);
setRotation(TailPart2, -0.3948578F, 0F, 0F);
TailPart3 = new ModelRenderer(this, 168, 0);
TailPart3.addBox(-1F, -1F, 0F, 2, 2, 11);
TailPart3.setRotationPoint(0F, 0F, 10.8F);
TailPart3.setTextureSize(256, 128);
setRotation(TailPart3, 0.2974289F, 0F, 0F);
LeftHumerus = new ModelRenderer(this, 39, 16);
LeftHumerus.addBox(0F, 0F, 0F, 3, 10, 4);
LeftHumerus.setRotationPoint(1.5F, 4.7F, -12F);
LeftHumerus.setTextureSize(256, 128);
setRotation(LeftHumerus, 0.3869765F, 0F, 0F);
LeftRadius = new ModelRenderer(this, 71, 16);
LeftRadius.addBox(0F, 0F, 0F, 3, 11, 4);
LeftRadius.setRotationPoint(0F, 8.0F, 0.45F);
LeftRadius.setTextureSize(256, 128);
setRotation(LeftRadius, -0.3869765F, 0F, 0F);
LeftFClawRPart1 = new ModelRenderer(this, 0, 58);
LeftFClawRPart1.addBox(-0.5F, 0F, -1F, 1, 1, 1);
LeftFClawRPart1.setRotationPoint(0F, 9.7F, 0F);
LeftFClawRPart1.setTextureSize(256, 128);
setRotation(LeftFClawRPart1, 0F, 0.5159687F, 0F);
LeftFClawRPart2 = new ModelRenderer(this, 5, 58);
LeftFClawRPart2.addBox(-0.5F, -1F, -3.4F, 1, 1, 3);
LeftFClawRPart2.setRotationPoint(0F, 0F, 0F);
LeftFClawRPart2.setTextureSize(256, 128);
setRotation(LeftFClawRPart2, 1.16093F, 0.0259717F, 0F);
LeftFClawMPart1 = new ModelRenderer(this, 0, 58);
LeftFClawMPart1.addBox(-0.5F, 0F, -1F, 1, 1, 1);
LeftFClawMPart1.setRotationPoint(1.5F, 9.7F, 0F);
LeftFClawMPart1.setTextureSize(256, 128);
setRotation(LeftFClawMPart1, 0F, 0F, 0F);
LeftFClawMPart2 = new ModelRenderer(this, 5, 58);
LeftFClawMPart2.addBox(-0.5F, -1F, -3.4F, 1, 1, 3);
LeftFClawMPart2.setRotationPoint(0F, 0F, 0F);
LeftFClawMPart2.setTextureSize(256, 128);
setRotation(LeftFClawMPart2, 1.16093F, 0F, 0F);
LeftFClawLPart1 = new ModelRenderer(this, 0, 58);
LeftFClawLPart1.addBox(-0.5F, 0F, -1F, 1, 1, 1);
LeftFClawLPart1.setRotationPoint(3F, 9.7F, 0F);
LeftFClawLPart1.setTextureSize(256, 128);
setRotation(LeftFClawLPart1, 0F, -0.5159717F, 0F);
LeftFClawLPart2 = new ModelRenderer(this, 5, 58);
LeftFClawLPart2.addBox(-0.5F, -1F, -3.4F, 1, 1, 3);
LeftFClawLPart2.setRotationPoint(0F, 0F, 0F);
LeftFClawLPart2.setTextureSize(256, 128);
setRotation(LeftFClawLPart2, 1.16093F, -0.0059717F, 0F);
RightHumerus = new ModelRenderer(this, 55, 16);
RightHumerus.addBox(-3F, 0F, 0F, 3, 10, 4);
RightHumerus.setRotationPoint(-1.5F, 4.7F, -12F);
RightHumerus.setTextureSize(256, 128);
setRotation(RightHumerus, 0.3869765F, 0F, 0F);
RightRadius = new ModelRenderer(this, 71, 16);
RightRadius.addBox(-3F, 0F, 0F, 3, 11, 4);
RightRadius.setRotationPoint(0F, 8.0F, 0.45F);
RightRadius.setTextureSize(256, 128);
setRotation(RightRadius, -0.3869765F, 0F, 0F);
RightFClawRPart1 = new ModelRenderer(this, 0, 58);
RightFClawRPart1.addBox(-0.5F, 0F, -1F, 1, 1, 1);
RightFClawRPart1.setRotationPoint(-3F, 9.7F, 0F);
RightFClawRPart1.setTextureSize(256, 128);
setRotation(RightFClawRPart1, 0F, 0.5159687F, 0F);
RightFClawRPart2 = new ModelRenderer(this, 5, 58);
RightFClawRPart2.addBox(-0.5F, -1F, -3.4F, 1, 1, 3);
RightFClawRPart2.setRotationPoint(0F, 0F, 0F);
RightFClawRPart2.setTextureSize(256, 128);
setRotation(RightFClawRPart2, 1.16093F, 0.0259717F, 0F);
RightFClawMPart1 = new ModelRenderer(this, 0, 58);
RightFClawMPart1.addBox(-0.5F, 0F, -1F, 1, 1, 1);
RightFClawMPart1.setRotationPoint(-1.5F, 9.7F, 0F);
RightFClawMPart1.setTextureSize(256, 128);
setRotation(RightFClawMPart1, 0F, 0F, 0F);
RightFClawMPart2 = new ModelRenderer(this, 5, 58);
RightFClawMPart2.addBox(-0.5F, -1F, -3.4F, 1, 1, 3);
RightFClawMPart2.setRotationPoint(0F, 0F, 0F);
RightFClawMPart2.setTextureSize(256, 128);
setRotation(RightFClawMPart2, 1.16093F, 0F, 0F);
RightFClawLPart1 = new ModelRenderer(this, 0, 58);
RightFClawLPart1.addBox(-0.5F, 0F, -1F, 1, 1, 1);
RightFClawLPart1.setRotationPoint(0F, 9.7F, 0F);
RightFClawLPart1.setTextureSize(256, 128);
setRotation(RightFClawLPart1, 0F, -0.5159717F, 0F);
RightFClawLPart2 = new ModelRenderer(this, 5, 58);
RightFClawLPart2.addBox(-0.5F, -1F, -3.4F, 1, 1, 3);
RightFClawLPart2.setRotationPoint(0F, 0F, 0F);
RightFClawLPart2.setTextureSize(256, 128);
setRotation(RightFClawLPart2, 1.16093F, -0.0059717F, 0F);
LeftFemur = new ModelRenderer(this, 19, 16);
LeftFemur.addBox(0F, 0F, 0F, 3, 8, 6);
LeftFemur.setRotationPoint(1.5F, 5.7F, 0F);
LeftFemur.setTextureSize(256, 128);
setRotation(LeftFemur, 0F, 0F, 0F);
LeftTibia = new ModelRenderer(this, 0, 31);
LeftTibia.addBox(0F, 0F, 0F, 3, 3, 9);
LeftTibia.setRotationPoint(0F, 7.7F, 0F);
LeftTibia.setTextureSize(256, 128);
setRotation(LeftTibia, 0F, 0F, 0F);
LeftMetatarsus = new ModelRenderer(this, 0, 44);
LeftMetatarsus.addBox(0F, 0F, 0F, 3, 10, 3);
LeftMetatarsus.setRotationPoint(0F, -0.02F, 8F);
LeftMetatarsus.setTextureSize(256, 128);
setRotation(LeftMetatarsus, -0.1289922F, 0F, 0F);
LeftClawRPart1 = new ModelRenderer(this, 0, 58);
LeftClawRPart1.addBox(-0.5F, 0F, -1F, 1, 1, 1);
LeftClawRPart1.setRotationPoint(0F, 9F, 0F);
LeftClawRPart1.setTextureSize(256, 128);
setRotation(LeftClawRPart1, 0F, 0.5159687F, 0F);
LeftClawRPart2 = new ModelRenderer(this, 5, 58);
LeftClawRPart2.addBox(-0.5F, -1F, -3.4F, 1, 1, 3);
LeftClawRPart2.setRotationPoint(0F, 0F, 0F);
LeftClawRPart2.setTextureSize(256, 128);
setRotation(LeftClawRPart2, 1.16093F, -0.0259717F, 0F);
LeftClawMPart1 = new ModelRenderer(this, 0, 58);
LeftClawMPart1.addBox(-0.5F, 0F, -1F, 1, 1, 1);
LeftClawMPart1.setRotationPoint(1.5F, 9F, 0F);
LeftClawMPart1.setTextureSize(256, 128);
setRotation(LeftClawMPart1, 0F, 0F, 0F);
LeftClawMPart2 = new ModelRenderer(this, 5, 58);
LeftClawMPart2.addBox(-0.5F, -1F, -3.4F, 1, 1, 3);
LeftClawMPart2.setRotationPoint(0F, 0F, 0F);
LeftClawMPart2.setTextureSize(256, 128);
setRotation(LeftClawMPart2, 1.16093F, 0F, 0F);
LeftClawLPart1 = new ModelRenderer(this, 0, 58);
LeftClawLPart1.addBox(-0.5F, 0F, -1F, 1, 1, 1);
LeftClawLPart1.setRotationPoint(3F, 9F, 0F);
LeftClawLPart1.setTextureSize(256, 128);
setRotation(LeftClawLPart1, 0F, -0.5159717F, 0F);
LeftClawLPart2 = new ModelRenderer(this, 5, 58);
LeftClawLPart2.addBox(-0.5F, -1F, -3.4F, 1, 1, 3);
LeftClawLPart2.setRotationPoint(0F, 0F, 0F);
LeftClawLPart2.setTextureSize(256, 128);
setRotation(LeftClawLPart2, 1.16093F, 0.0059717F, 0F);
RightFemur = new ModelRenderer(this, 0, 16);
RightFemur.addBox(-2F, 0F, 0F, 3, 8, 6);
RightFemur.setRotationPoint(-2.5F, 5.7F, 0F);
RightFemur.setTextureSize(256, 128);
setRotation(RightFemur, 0F, 0F, 0F);
RightTibia = new ModelRenderer(this, 0, 31);
RightTibia.addBox(-2F, 0F, 0F, 3, 3, 9);
RightTibia.setRotationPoint(0F, 7.7F, 0F);
RightTibia.setTextureSize(256, 128);
setRotation(RightTibia, 0F, 0F, 0F);
RightMetatarsus = new ModelRenderer(this, 0, 44);
RightMetatarsus.addBox(-2F, 0F, 0F, 3, 10, 3);
RightMetatarsus.setRotationPoint(0F, -0.02F, 8F);
RightMetatarsus.setTextureSize(256, 128);
setRotation(RightMetatarsus, -0.1289922F, 0F, 0F);
RightClawRPart1 = new ModelRenderer(this, 0, 58);
RightClawRPart1.addBox(-0.5F, 0F, -1F, 1, 1, 1);
RightClawRPart1.setRotationPoint(-2F, 9F, 0F);
RightClawRPart1.setTextureSize(256, 128);
setRotation(RightClawRPart1, 0F, 0.5159687F, 0F);
RightClawRPart2 = new ModelRenderer(this, 5, 58);
RightClawRPart2.addBox(-0.5F, -1F, -3.4F, 1, 1, 3);
RightClawRPart2.setRotationPoint(0F, 0F, 0F);
RightClawRPart2.setTextureSize(256, 128);
setRotation(RightClawRPart2, 1.16093F, -0.0259717F, 0F);
RightClawMPart1 = new ModelRenderer(this, 0, 58);
RightClawMPart1.addBox(-0.5F, 0F, -1F, 1, 1, 1);
RightClawMPart1.setRotationPoint(-0.5F, 9F, 0F);
RightClawMPart1.setTextureSize(256, 128);
setRotation(RightClawMPart1, 0F, 0F, 0F);
RightClawMPart2 = new ModelRenderer(this, 5, 58);
RightClawMPart2.addBox(-0.5F, -1F, -3.4F, 1, 1, 3);
RightClawMPart2.setRotationPoint(0F, 0F, 0F);
RightClawMPart2.setTextureSize(256, 128);
setRotation(RightClawMPart2, 1.16093F, 0F, 0F);
RightClawLPart1 = new ModelRenderer(this, 0, 58);
RightClawLPart1.addBox(-0.5F, 0F, -1F, 1, 1, 1);
RightClawLPart1.setRotationPoint(1F, 9F, 0F);
RightClawLPart1.setTextureSize(256, 128);
setRotation(RightClawLPart1, 0F, -0.5159717F, 0F);
RightClawLPart2 = new ModelRenderer(this, 5, 58);
RightClawLPart2.addBox(-0.5F, -1F, -3.4F, 1, 1, 3);
RightClawLPart2.setRotationPoint(0F, 0F, 0F);
RightClawLPart2.setTextureSize(256, 128);
setRotation(RightClawLPart2, 1.16093F, 0.0059717F, 0F);
//Top Jaw\\
TopJawCenter = new ModelRenderer(this, 56, 38);
TopJawCenter.addBox(-0.5F, 0F, -7.4F, 2, 1, ;
TopJawCenter.setRotationPoint(0.5F, -2.5F, -9F);
TopJawCenter.setTextureSize(256, 128);
setRotation(TopJawCenter, 0.2288904F, 0F, 0F);
LeftTopJaw = new ModelRenderer(this, 39, 50);
LeftTopJaw.addBox(0F, 0F, -9F, 1, 2, 9);
LeftTopJaw.setRotationPoint(3F, 0F, 0F);
LeftTopJaw.setTextureSize(256, 128);
setRotation(LeftTopJaw, 0F, 0.3346075F, 0F);
LeftTopTeeth = new ModelRenderer(this, 61, 50);
LeftTopTeeth.addBox(0.5F, 0F, -9.3F, 0, 1, 5);
LeftTopTeeth.setRotationPoint(0F, 2F, 0F);
LeftTopTeeth.setTextureSize(256, 128);
setRotation(LeftTopTeeth, 0F, -0.0346145F, 0F);
RightTopJaw = new ModelRenderer(this, 39, 63);
RightTopJaw.addBox(-1F, 0F, -9F, 1, 2, 9);
RightTopJaw.setRotationPoint(-2F, 0F, 0F);
RightTopJaw.setTextureSize(256, 128);
setRotation(RightTopJaw, 0F, -0.3346075F, 0F);
RightTopTeeth = new ModelRenderer(this, 61, 50);
RightTopTeeth.addBox(-0.5F, 0F, -9.3F, 0, 1, 5);
RightTopTeeth.setRotationPoint(0F, 2F, 0F);
RightTopTeeth.setTextureSize(256, 128);
setRotation(RightTopTeeth, 0F, 0.0346075F, 0F);
TopJawPart1 = new ModelRenderer(this, 38, 40);
TopJawPart1.addBox(-1F, 0F, -5.7F, 2, 1, 6);
TopJawPart1.setRotationPoint(-1F, 0F, 0F);
TopJawPart1.setTextureSize(256, 128);
setRotation(TopJawPart1, 0F, -0.3346075F, 0F);
TopJawPart2 = new ModelRenderer(this, 38, 40);
TopJawPart2.addBox(-1F, 0F, -5.7F, 2, 1, 6);
TopJawPart2.setRotationPoint(2F, 0F, 0F);
TopJawPart2.setTextureSize(256, 128);
setRotation(TopJawPart2, 0F, 0.3346145F, 0F);
//BottomJaw\\
BottomJawCenter = new ModelRenderer(this, 0, 109);
BottomJawCenter.addBox(-0.5F, 0F, -7.2F, 2, 1, ;
BottomJawCenter.setRotationPoint(0.5F, 1.5F, -8F);
BottomJawCenter.setTextureSize(256, 128);
setRotation(BottomJawCenter, 0.2288904F, 0F, 0F);
LeftBottomJaw = new ModelRenderer(this, 0, 84);
LeftBottomJaw.addBox(0F, 0F, -9F, 1, 2, 9);
LeftBottomJaw.setRotationPoint(3F, -1.1F, 0F);
LeftBottomJaw.setTextureSize(256, 128);
setRotation(LeftBottomJaw, 0F, 0.3346075F, 0F);
LeftBottomTeeth = new ModelRenderer(this, 21, 93);
LeftBottomTeeth.addBox(0.5F, 0F, -9.3F, 0, 1, 5);
LeftBottomTeeth.setRotationPoint(0.5F, -1.2F, 0F);
LeftBottomTeeth.setTextureSize(256, 128);
setRotation(LeftBottomTeeth, 0, 0.0346145F, 0F);
RightBottomJaw = new ModelRenderer(this, 0, 97);
RightBottomJaw.addBox(-1F, 0F, -9F, 1, 2, 9);
RightBottomJaw.setRotationPoint(-2F, -1.1F, 0F);
RightBottomJaw.setTextureSize(256, 128);
setRotation(RightBottomJaw, 0, -0.3346075F, 0F);
RightBottomTeeth = new ModelRenderer(this, 21, 93);
RightBottomTeeth.addBox(-0.5F, 0F, -9.3F, 0, 1, 5);
RightBottomTeeth.setRotationPoint(-0.5F,-1.2F, 0F);
RightBottomTeeth.setTextureSize(256, 128);
setRotation(RightBottomTeeth, 0, -0.0346075F, 0F);
BottomJawPart1 = new ModelRenderer(this, 21, 84);
BottomJawPart1.addBox(-1F, 0F, -6.5F, 2, 1, 7);
BottomJawPart1.setRotationPoint(-1F, 0F, 0F);
BottomJawPart1.setTextureSize(256, 128);
setRotation(BottomJawPart1, 0, -0.3346075F, 0F);
BottomJawPart2 = new ModelRenderer(this, 21, 84);
BottomJawPart2.addBox(-1F, 0F, -6.5F, 2, 1, 7);
BottomJawPart2.setRotationPoint(2F, 0F, 0F);
BottomJawPart2.setTextureSize(256, 128);
setRotation(BottomJawPart2, 0, 0.3346075F, 0F);
EPad1 = new ModelRenderer(this, 110, 32);
EPad1.addBox(-2F, 0F, 0F, 4, 1, 1);
EPad1.setRotationPoint(0F, 4.5F, -5.5F);
EPad1.setTextureSize(256, 128);
setRotation(EPad1, 0F, 0F, 0F);
EPad2 = new ModelRenderer(this, 110, 35);
EPad2.addBox(-3F, 0F, 0F, 6, 1, 2);
EPad2.setRotationPoint(0F, 4.5F, -4.5F);
EPad2.setTextureSize(256, 128);
setRotation(EPad2, 0F, 0F, 0F);
EPad3 = new ModelRenderer(this, 110, 39);
EPad3.addBox(-2F, 0F, 0F, 5, 1, 4);
EPad3.setRotationPoint(-0.5F, 4.5F, -2.8F);
EPad3.setTextureSize(256, 128);
setRotation(EPad3, 0F, 0F, 0F);
EPad4 = new ModelRenderer(this, 110, 48);
EPad4.addBox(-1.5F, 0F, 0F, 3, 1, 1);
EPad4.setRotationPoint(0F, 4.5F, 1.1F);
EPad4.setTextureSize(256, 128);
setRotation(EPad4, 0F, 0F, 0F);
EPadPart1 = new ModelRenderer(this, 110, 29);
EPadPart1.addBox(-0.5F, 0F, 0F, 1, 1, 1);
EPadPart1.setRotationPoint(1.5F, 4.5F, -6.5F);
EPadPart1.setTextureSize(256, 128);
setRotation(EPadPart1, 0F, 0F, 0F);
EPadPart2 = new ModelRenderer(this, 110, 29);
EPadPart2.addBox(-0.5F, 0F, 0F, 1, 1, 1);
EPadPart2.setRotationPoint(-1.5F, 4.5F, -6.5F);
EPadPart2.setTextureSize(256, 128);
EPadPart2.mirror = true;
setRotation(EPadPart2, 0F, 0F, 0F);
ERope1 = new ModelRenderer(this, 105, 32);
ERope1.addBox(0F, 0F, -0.5F, 1, 6, 1);
ERope1.setRotationPoint(2.8F, 4.6F, -3F);
ERope1.setTextureSize(256, 128);
setRotation(ERope1, 0F, 0F, 0F);
EMetal1 = new ModelRenderer(this, 102, 41);
EMetal1.addBox(0F, 0F, -1F, 1, 1, 2);
EMetal1.setRotationPoint(2.8F, 10.6F, -3F);
EMetal1.setTextureSize(256, 128);
setRotation(EMetal1, 0F, 0F, 0F);
ERope2 = new ModelRenderer(this, 105, 32);
ERope2.addBox(-1F, 0F, -0.5F, 1, 6, 1);
ERope2.setRotationPoint(-2.8F, 4.6F, -3F);
ERope2.setTextureSize(256, 128);
setRotation(ERope2, 0F, 0F, 0F);
EMetal2 = new ModelRenderer(this, 102, 41);
EMetal2.addBox(-1F, 0F, -1F, 1, 1, 2);
EMetal2.setRotationPoint(-2.8F, 10.6F, -3F);
EMetal2.setTextureSize(256, 128);
setRotation(EMetal2, 0F, 0F, 0F);
ESeat1 = new ModelRenderer(this, 100, 45);
ESeat1.addBox(-1F, 0F, 0F, 2, 1, 1);
ESeat1.setRotationPoint(0F, 4F, -4.5F);
ESeat1.setTextureSize(256, 128);
setRotation(ESeat1, 0F, 0F, 0F);
ESeat2 = new ModelRenderer(this, 100, 49);
ESeat2.addBox(-2F, 0F, 0F, 4, 1, 1);
ESeat2.setRotationPoint(0F, 4F, 0.2F);
ESeat2.setTextureSize(256, 128);
setRotation(ESeat2, 0F, 0F, 0F);
//Head\\
this.Throat.addChild(TopJawCenter);
this.Throat.addChild(BottomJawCenter);
this.TopJawCenter.addChild(LeftEarPart1);
this.TopJawCenter.addChild(RightEarPart1);
this.TopJawCenter.addChild(TopJawPart1);
this.TopJawCenter.addChild(TopJawPart2);
this.TopJawCenter.addChild(LeftTopJaw);
this.TopJawCenter.addChild(RightTopJaw);
this.LeftTopJaw.addChild(LeftTopTeeth);
this.RightTopJaw.addChild(RightTopTeeth);
this.LeftEarPart1.addChild(LeftEarPart2);
this.LeftEarPart2.addChild(LeftEarPart3);
this.BottomJawCenter.addChild(BottomJawPart1);
this.BottomJawCenter.addChild(BottomJawPart2);
this.BottomJawCenter.addChild(LeftBottomJaw);
this.BottomJawCenter.addChild(RightBottomJaw);
this.LeftBottomJaw.addChild(LeftBottomTeeth);
this.RightBottomJaw.addChild(RightBottomTeeth);
this.RightEarPart1.addChild(RightEarPart2);
this.RightEarPart2.addChild(RightEarPart3);
//Front Legs\\
this.LeftHumerus.addChild(LeftRadius);
this.LeftRadius.addChild(LeftFClawLPart1);
this.LeftRadius.addChild(LeftFClawMPart1);
this.LeftRadius.addChild(LeftFClawRPart1);
this.LeftFClawLPart1.addChild(LeftFClawLPart2);
this.LeftFClawMPart1.addChild(LeftFClawMPart2);
this.LeftFClawRPart1.addChild(LeftFClawRPart2);
this.RightHumerus.addChild(RightRadius);
this.RightRadius.addChild(RightFClawLPart1);
this.RightRadius.addChild(RightFClawMPart1);
this.RightRadius.addChild(RightFClawRPart1);
this.RightFClawLPart1.addChild(RightFClawLPart2);
this.RightFClawMPart1.addChild(RightFClawMPart2);
this.RightFClawRPart1.addChild(RightFClawRPart2);
//Back Legs\\\
this.LeftFemur.addChild(LeftTibia);
this.LeftTibia.addChild(LeftMetatarsus);
this.LeftMetatarsus.addChild(LeftClawLPart1);
this.LeftMetatarsus.addChild(LeftClawMPart1);
this.LeftMetatarsus.addChild(LeftClawRPart1);
this.LeftClawLPart1.addChild(LeftClawLPart2);
this.LeftClawMPart1.addChild(LeftClawMPart2);
this.LeftClawRPart1.addChild(LeftClawRPart2);
this.RightFemur.addChild(RightTibia);
this.RightTibia.addChild(RightMetatarsus);
this.RightMetatarsus.addChild(RightClawLPart1);
this.RightMetatarsus.addChild(RightClawMPart1);
this.RightMetatarsus.addChild(RightClawRPart1);
this.RightClawLPart1.addChild(RightClawLPart2);
this.RightClawMPart1.addChild(RightClawMPart2);
this.RightClawRPart1.addChild(RightClawRPart2);
//Tail\\
this.TailPart1.addChild(TailPart2);
this.TailPart2.addChild(TailPart3);
}
@Override
public void render(Entity par1Entity, float par2, float par3, float par4, float par5, float par6, float par7)
{
EntityZertumEntity entityzertum = (EntityZertumEntity)par1Entity;
boolean flag = entityzertum.isSaddled();
super.render(par1Entity, par2, par3, par4, par5, par6, par7);
this.setRotationAngles(par2, par3, par4, par5, par6, par7, par1Entity);
if(!entityzertum.hasEvolved()){
if (this.isChild)
{
float f6 = 2.0F;
GL11.glPushMatrix();
GL11.glTranslatef(0.0F, 5.0F * par7, 6.0F * par7);
Head.render(par7);
GL11.glPopMatrix();
GL11.glPushMatrix();
GL11.glScalef(1.0F / f6, 1.0F / f6, 1.0F / f6);
GL11.glTranslatef(0.0F, 24.0F * par7, 0.0F);
LeftHindLeg1.render(par7);
RightHindLeg1.render(par7);
Mane1.render(par7);
RightLeg.render(par7);
LeftLeg.render(par7);
Tail1.render(par7);
Torso.render(par7);
GL11.glPopMatrix();
}
else
{
GL11.glPushMatrix();
GL11.glScalef(1.5F, 1.5F, 1.5F);
GL11.glTranslatef(0.0F, -0.5F, 0.0F);
Head.render(par7);
LeftHindLeg1.render(par7);
RightHindLeg1.render(par7);
Mane1.render(par7);
RightLeg.render(par7);
LeftLeg.render(par7);
Tail1.render(par7);
Torso.render(par7);
GL11.glPopMatrix();
if(flag){
GL11.glPushMatrix();
GL11.glScalef(1.5F, 1.5F, 1.5F);
GL11.glTranslatef(0.0F, -0.5F, 0.0F);
Pad1.render(par7);
Pad2.render(par7);
Pad3.render(par7);
Pad4.render(par7);
PadPart1.render(par7);
PadPart2.render(par7);
Rope1.render(par7);
Metal1.render(par7);
Rope2.render(par7);
Metal2.render(par7);
Seat1.render(par7);
Seat2.render(par7);
GL11.glPopMatrix();
}
}
}else if(entityzertum.hasEvolved()){
if (this.isChild)
{
float f6 = 2.0F;
GL11.glPushMatrix();
GL11.glTranslatef(0.0F, 5.0F * par7, 6.0F * par7);
Throat.render(par7);
GL11.glPopMatrix();
GL11.glPushMatrix();
GL11.glScalef(1.0F / f6, 1.0F / f6, 1.0F / f6);
GL11.glTranslatef(0.0F, 24.0F * par7, 0.0F);
UpSection.render(par7);
MidSection.render(par7);
Pelvis.render(par7);
TailPart1.render(par7);
LeftHumerus.render(par7);
RightHumerus.render(par7);
LeftFemur.render(par7);
RightFemur.render(par7);
GL11.glPopMatrix();
}
else
{
Throat.render(par7);
UpSection.render(par7);
MidSection.render(par7);
Pelvis.render(par7);
TailPart1.render(par7);
LeftHumerus.render(par7);
RightHumerus.render(par7);
LeftFemur.render(par7);
RightFemur.render(par7);
}
if(flag){
EPad1.render(par7);
EPad2.render(par7);
EPad3.render(par7);
EPad4.render(par7);
EPadPart1.render(par7);
EPadPart2.render(par7);
ERope1.render(par7);
EMetal1.render(par7);
ERope2.render(par7);
EMetal2.render(par7);
ESeat1.render(par7);
ESeat2.render(par7);
}
}
}
/**
* Used for easily adding entity-dependent animations. The second and third float params here are the same second
* and third as in the setRotationAngles method.
*/
@Override
public void setLivingAnimations(EntityLivingBase par1EntityLivingBase, float par2, float par3, float par4)
{
EntityZertumEntity entityzertum = (EntityZertumEntity)par1EntityLivingBase;
float f11 = entityzertum.func_110201_q(par4);
if (entityzertum.isAngry())
{
this.Ear1.rotateAngleX = -0.5948578F;
this.Ear2.rotateAngleX = -0.5948578F;
}else if (entityzertum.getHealth() <=10){
this.Ear1.rotateAngleX = -0.9948578F;
this.Ear2.rotateAngleX = -0.9948578F;
}else{
this.Ear1.rotateAngleX = 0.0F;
this.Ear2.rotateAngleX = 0.0F;
}
if(!entityzertum.hasEvolved()){
if (entityzertum.isSitting()) //TODO
{
LeftHindLeg1.setRotationPoint(1.5F, 18F, 5F);
LeftHindLeg1.rotateAngleX = -2.082003F;
LeftHindLeg2.setRotationPoint(0F, 4F, 1.2F);
LeftHindLeg2.rotateAngleX = 2.6205006F;
LeftHindLeg3.setRotationPoint(0F, 3.55F, 0.2F);
LeftHindLeg3.rotateAngleX = -0.5205006F;
RightHindLeg1.setRotationPoint(-2.5F, 18F, 5F);
RightHindLeg1.rotateAngleX = -2.082003F;
RightHindLeg2.setRotationPoint(0F, 4F, 1.2F);
RightHindLeg2.rotateAngleX = 2.6205006F;
RightHindLeg3.setRotationPoint(0F, 3.55F, 0.2F);
RightHindLeg3.rotateAngleX = -0.5205006F;
Torso.setRotationPoint(-0.5F, 14F, 1F);
Torso.rotateAngleX = 0.9759358F;
Tail1.setRotationPoint(-1F, 18.5F, 5F);
Tail1.rotateAngleX = 1.167248F;
Tail2.rotateAngleX = 0.315962F;
Tail3.rotateAngleX = 0.23333F;
//Saddle\\
Pad1.setRotationPoint(-0.5F, 9.7F, -1.5F);
setRotation(Pad1, -0.288128F, 0F, 0F);
Pad2.setRotationPoint(-0.5F, 10F, -0.5F);
setRotation(Pad2, -0.3346075F, 0F, 0F);
Pad3.setRotationPoint(-1F, 10.7F, 1.4F);
setRotation(Pad3, -0.5855569F, 0F, 0F);
Pad4.setRotationPoint(-0.5F, 12.9F, 4.7F);
setRotation(Pad4, -0.5948648F, 0F, 0F);
PadPart1.setRotationPoint(1F, 9.6F, -2.4F);
setRotation(PadPart1, -0.3624853F, 0F, 0F);
PadPart2.setRotationPoint(-2F, 9.6F, -2.4F);
setRotation(PadPart2, -0.3624874F, 0F, 0F);
Rope1.setRotationPoint(1.8F, 10.6F, 1F);
setRotation(Rope1, -0.3346075F, 0F, 0F);
Metal1.setRotationPoint(1.8F, 14.2F, -0.3F);
setRotation(Metal1, -0.3346145F, 0F, 0F);
Rope2.setRotationPoint(-2.8F, 10.6F, 1F);
setRotation(Rope2, -0.3346145F, 0F, 0F);
Metal2.setRotationPoint(-3.8F, 13.6F, 0F);
setRotation(Metal2, -0.3346145F, 0F, 0F);
Seat1.setRotationPoint(-0.5F, 11.6F, 4.3F);
setRotation(Seat1, -0.5483867F, 0F, 0F);
Seat2.setRotationPoint(-0.5F, 8.9F, -1.2F);
setRotation(Seat2, -0.2881364F, 0F, 0F);
}
else
{
LeftHindLeg1.setRotationPoint(1.5F, 13F, 5F);
LeftHindLeg1.rotateAngleX = -0.2974289F;
LeftHindLeg2.setRotationPoint(0F, 4.3F, -0.3F);
LeftHindLeg2.rotateAngleX = leftTibia;
LeftHindLeg3.setRotationPoint(0F, 3.55F, 0.2F);
LeftHindLeg3.rotateAngleX = leftMetatarus;
RightHindLeg1.setRotationPoint(-2.5F, 13F, 5F);
RightHindLeg1.rotateAngleX = -0.2974289F;
RightHindLeg2.setRotationPoint(0F, 4.3F, -0.3F);
RightHindLeg2.rotateAngleX = rightTibia;
RightHindLeg3.setRotationPoint(0F, 3.55F, 0.2F);
RightHindLeg3.rotateAngleX = rightMetatarus;
Torso.setRotationPoint(-0.5F, 12.5F, 1F);
Torso.rotateAngleX = 1.496439F;
Tail1.setRotationPoint(-1F, 14.3F, 6F);
Tail1.rotateAngleX = 1.315962F;
Tail2.setRotationPoint(0.5F, 6F, 0.5F);
Tail2.rotateAngleX = -0.041605F;
Tail3.setRotationPoint(0F, 6.5F, 0.5F);
Tail3.rotateAngleX = 0.001605F;
//Saddle\\ TODO
Pad1.setRotationPoint(-0.5F, 9.3F, -2.5F);
setRotation(Pad1, -0.0650564F, 0F, 0F);
Pad2.setRotationPoint(-0.5F, 9.4F, -1.5F);
setRotation(Pad2, -0.0743572F, 0F, 0F);
Pad3.setRotationPoint(-1F, 9.5F, 0.2F);
setRotation(Pad3, -0.0650564F, 0F, 0F);
Pad4.setRotationPoint(-0.5F, 9.8F, 4.1F);
setRotation(Pad4, -0.0650564F, 0F, 0F);
PadPart1.setRotationPoint(1F, 9.23F, -3.5F);
setRotation(PadPart1, -0.0650564F, 0F, 0F);
PadPart2.setRotationPoint(-2F, 9.2F, -3.5F);
setRotation(PadPart2, -0.0650564F, 0F, 0F);
Rope1.setRotationPoint(1.8F, 9.6F, 0F);
setRotation(Rope1, 0F, 0F, 0F);
Metal1.setRotationPoint(1.8F, 13.6F, 0F);
setRotation(Metal1, 0F, 0F, 0F);
Rope2.setRotationPoint(-2.8F, 9.6F, 0F);
setRotation(Rope2, 0F, 0F, 0F);
Metal2.setRotationPoint(-3.8F, 13.6F, 0F);
setRotation(Metal2, 0F, 0F, 0F);
Seat1.setRotationPoint(-0.5F, 8.7F, -1.5F);
setRotation(Seat1, -0.0650484F, 0F, 0F);
Seat2.setRotationPoint(-0.5F, 9F, 3.2F);
setRotation(Seat2, -0.0650484F, 0F, 0F);
this.RightHindLeg1.rotateAngleX = rightFemur + MathHelper.cos(par2 * 0.4662F) * 1.4F * par3;
this.LeftHindLeg1.rotateAngleX = leftFemur + MathHelper.cos(par2 * 0.4662F + (float)Math.PI) * 1.4F * par3;
this.RightLeg.rotateAngleX = MathHelper.cos(par2 * 0.4662F + (float)Math.PI) * 1.4F * par3;
this.LeftLeg.rotateAngleX = MathHelper.cos(par2 * 0.4662F) * 1.4F * par3;
}
}else if(entityzertum.hasEvolved()){
if (entityzertum.isSitting()) //TODO
{
MidSection.setRotationPoint(-1F, 7.5F, -8F);
setRotation(MidSection, -0.3032477F, 0F, 0F);
Pelvis.setRotationPoint(-1F, 9.8F, -1F);
setRotation(Pelvis, -0.2974289F, 0F, 0F);
TailPart1.setRotationPoint(0F, 11F, 6F);
setRotation(TailPart1, -0.3346075F, 0F, 0F);
TailPart2.setRotationPoint(0F, -0.2F, 10F);
setRotation(TailPart2, -0.3948578F, 0F, 0F);
TailPart3.setRotationPoint(0F, 0F, 10.8F);
setRotation(TailPart3, 0.2974289F, 0F, 0F);
LeftFemur.setRotationPoint(1.5F, 6.7F, 0F);
LeftFemur.rotateAngleX = -0.3892433F;
LeftTibia.setRotationPoint(0F, 7.5F, -0.2F);
setRotation(LeftTibia, 0.3892433F, 0F, 0F);
LeftMetatarsus.setRotationPoint(0F, 0F, 7.5F);
setRotation(LeftMetatarsus, -0.1289922F, 0F, 0F);
LeftClawRPart1.setRotationPoint(0F, 8.5F, 0F);
setRotation(LeftClawRPart1, 0F, 0.5159687F, 0F);
LeftClawRPart2.setRotationPoint(0F, 0F, 0F);
setRotation(LeftClawRPart2, 1.16093F, -0.0259717F, 0F);
LeftClawMPart1.setRotationPoint(1.5F, 8.5F, 0F);
setRotation(LeftClawMPart1, 0F, 0F, 0F);
LeftClawMPart2.setRotationPoint(0F, 0F, 0F);
setRotation(LeftClawMPart2, 1.16093F, 0F, 0F);
LeftClawLPart1.setRotationPoint(3F, 8.5F, 0F);
setRotation(LeftClawLPart1, 0F, -0.5159717F, 0F);
LeftClawLPart2.setRotationPoint(0F, 0F, 0F);
setRotation(LeftClawLPart2, 1.16093F, 0.0059717F, 0F);
RightFemur.setRotationPoint(-2.5F, 6.7F, 0F);
RightFemur.rotateAngleX = -0.3892433F;
RightTibia.setRotationPoint(0F, 7.5F, -0.2F);
setRotation(RightTibia, 0.3892433F, 0F, 0F);
RightMetatarsus.setRotationPoint(0F, 0F, 7.5F);
setRotation(RightMetatarsus, -0.1289922F, 0F, 0F);
RightClawRPart1.setRotationPoint(-2F, 8.5F, 0F);
setRotation(RightClawRPart1, 0F, 0.5159687F, 0F);
RightClawRPart2.setRotationPoint(0F, 0F, 0F);
setRotation(RightClawRPart2, 1.16093F, -0.0259717F, 0F);
RightClawMPart1.setRotationPoint(-0.5F, 8.5F, 0F);
setRotation(RightClawMPart1, 0F, 0F, 0F);
RightClawMPart2.setRotationPoint(0F, 0F, 0F);
setRotation(RightClawMPart2, 1.16093F, 0F, 0F);
RightClawLPart1.setRotationPoint(1F, 8.5F, 0F);
setRotation(RightClawLPart1, 0F, -0.5159717F, 0F);
RightClawLPart2.setRotationPoint(0F, 0F, 0F);
setRotation(RightClawLPart2, 1.16093F, 0.0059717F, 0F);
EPad1.setRotationPoint(0F, 4.7F, -5.5F);
setRotation(EPad1, -0.2230717F, 0F, 0F);
EPad2.setRotationPoint(0F, 5F, -4.5F);
setRotation(EPad2, -0.2230717F, 0F, 0F);
EPad3.setRotationPoint(-0.5F, 5.4F, -2.8F);
setRotation(EPad3, -0.3346075F, 0F, 0F);
EPad4.setRotationPoint(0F, 6.7F, 0.8F);
setRotation(EPad4, -0.3346075F, 0F, 0F);
EPadPart1.setRotationPoint(1.5F, 4.5F, -6.5F);
setRotation(EPadPart1, -0.2230717F, 0F, 0F);
EPadPart2.setRotationPoint(-1.5F, 4.5F, -6.5F);
setRotation(EPadPart2, -0.2230717F, 0F, 0F);
ERope1.setRotationPoint(2.8F, 5.6F, -3F);
setRotation(ERope1, 0F, 0F, 0F);
EMetal1.setRotationPoint(2.8F, 11.6F, -3F);
setRotation(EMetal1, 0F, 0F, 0F);
ERope2.setRotationPoint(-2.8F, 5.6F, -3F);
setRotation(ERope2, 0F, 0F, 0F);
EMetal2.setRotationPoint(-2.8F, 11.6F, -3F);
setRotation(EMetal2, 0F, 0F, 0F);
ESeat1.setRotationPoint(0F, 4.4F, -4.5F);
setRotation(ESeat1, -0.2230717F, 0F, 0F);
ESeat2.setRotationPoint(0F, 5.9F, 0.2F);
setRotation(ESeat2, -0.3346075F, 0F, 0F);
}else{
MidSection.setRotationPoint(-1F, 7.5F, -8F);
setRotation(MidSection, -0.0429974F, 0F, 0F);
Pelvis.setRotationPoint(-1F, 7.8F, 0F);
setRotation(Pelvis, 0F, 0F, 0F);
TailPart1.setRotationPoint(0F, 7F, 6F);
setRotation(TailPart1, -0.3346075F, 0F, 0F);
TailPart2.setRotationPoint(0F, -0.2F, 10F);
setRotation(TailPart2, -0.3948578F, 0F, 0F);
TailPart3.setRotationPoint(0F, 0F, 10.8F);
setRotation(TailPart3, 0.2974289F, 0F, 0F);
LeftFemur.setRotationPoint(1.5F, 5.7F, 0F);
setRotation(LeftFemur, 0F, 0F, 0F);
LeftTibia.setRotationPoint(0F, 7.7F, 0F);
setRotation(LeftTibia, 0F, 0F, 0F);
LeftMetatarsus.setRotationPoint(0F, -0.02F, 8F);
setRotation(LeftMetatarsus, -0.1289922F, 0F, 0F);
LeftClawRPart1.setRotationPoint(0F, 9F, 0F);
setRotation(LeftClawRPart1, 0F, 0.5159687F, 0F);
LeftClawRPart2.setRotationPoint(0F, 0F, 0F);
setRotation(LeftClawRPart2, 1.16093F, -0.0259717F, 0F);
LeftClawMPart1.setRotationPoint(1.5F, 9F, 0F);
setRotation(LeftClawMPart1, 0F, 0F, 0F);
LeftClawMPart2.setRotationPoint(0F, 0F, 0F);
setRotation(LeftClawMPart2, 1.16093F, 0F, 0F);
LeftClawLPart1.setRotationPoint(3F, 9F, 0F);
setRotation(LeftClawLPart1, 0F, -0.5159717F, 0F);
LeftClawLPart2.setRotationPoint(0F, 0F, 0F);
setRotation(LeftClawLPart2, 1.16093F, 0.0059717F, 0F);
RightFemur.setRotationPoint(-2.5F, 5.7F, 0F);
RightFemur.rotateAngleX = 0F;
RightTibia.setRotationPoint(0F, 7.7F, 0F);
setRotation(RightTibia, 0F, 0F, 0F);
RightMetatarsus.setRotationPoint(0F, -0.02F, 8F);
setRotation(RightMetatarsus, -0.1289922F, 0F, 0F);
RightClawRPart1.setRotationPoint(-2F, 9F, 0F);
setRotation(RightClawRPart1, 0F, 0.5159687F, 0F);
RightClawRPart2.setRotationPoint(0F, 0F, 0F);
setRotation(RightClawRPart2, 1.16093F, -0.0259717F, 0F);
RightClawMPart1.setRotationPoint(-0.5F, 9F, 0F);
setRotation(RightClawMPart1, 0F, 0F, 0F);
RightClawMPart2.setRotationPoint(0F, 0F, 0F);
setRotation(RightClawMPart2, 1.16093F, 0F, 0F);
RightClawLPart1.setRotationPoint(1F, 9F, 0F);
setRotation(RightClawLPart1, 0F, -0.5159717F, 0F);
RightClawLPart2.setRotationPoint(0F, 0F, 0F);
setRotation(RightClawLPart2, 1.16093F, 0.0059717F, 0F);
//Saddle\\
EPad1.setRotationPoint(0F, 4.5F, -5.5F);
setRotation(EPad1, 0F, 0F, 0F);
EPad2.setRotationPoint(0F, 4.5F, -4.5F);
setRotation(EPad2, 0F, 0F, 0F);
EPad3.setRotationPoint(-0.5F, 4.5F, -2.8F);
setRotation(EPad3, 0F, 0F, 0F);
EPad4.setRotationPoint(0F, 4.5F, 1.1F);
setRotation(EPad4, 0F, 0F, 0F);
EPadPart1.setRotationPoint(1.5F, 4.5F, -6.5F);
setRotation(EPadPart1, 0F, 0F, 0F);
EPadPart2.setRotationPoint(-1.5F, 4.5F, -6.5F);
setRotation(EPadPart2, 0F, 0F, 0F);
ERope1.setRotationPoint(2.8F, 4.6F, -3F);
setRotation(ERope1, 0F, 0F, 0F);
EMetal1.setRotationPoint(2.8F, 10.6F, -3F);
setRotation(EMetal1, 0F, 0F, 0F);
ERope2.setRotationPoint(-2.8F, 4.6F, -3F);
setRotation(ERope2, 0F, 0F, 0F);
EMetal2.setRotationPoint(-2.8F, 10.6F, -3F);
setRotation(EMetal2, 0F, 0F, 0F);
ESeat1.setRotationPoint(0F, 4F, -4.5F);
setRotation(ESeat1, 0F, 0F, 0F);
ESeat2.setRotationPoint(0F, 4F, 0.2F);
setRotation(ESeat2, 0F, 0F, 0F);
System.out.println("Is Dashing = " + entityzertum.isDashing());
if(entityzertum.isDashing()){
updateDistanceMovedTotal(par1EntityLivingBase);
cycleIndex = (int) ((getDistanceMovedTotal(par1EntityLivingBase)*CYCLES_PER_BLOCK)%undulationCycle.length);
//System.out.println("ModelZertum setRotationAngles(), distanceMoved ="+getDistanceMovedTotal(par7Entity)+", cycleIndex ="+cycleIndex);
LeftFemur.rotateAngleX = degToRad(undulationCycle[0][cycleIndex]) ;
RightFemur.rotateAngleX = degToRad(undulationCycle[1][cycleIndex]) ;
LeftHumerus.rotateAngleX = degToRad(undulationCycle[2][cycleIndex]) ;
RightHumerus.rotateAngleX = degToRad(undulationCycle[3][cycleIndex]) ;
}else{
this.RightHumerus.rotateAngleX = 0.3869765F + MathHelper.cos(par2 * 0.4962F) * 0.5F * par3;
this.LeftHumerus.rotateAngleX = 0.3869765F + MathHelper.cos(par2 * 0.3962F + (float)Math.PI) * 0.5F * par3;
this.RightFemur.rotateAngleX = MathHelper.cos(par2 * 0.4062F) * 0.5F * par3;
this.LeftFemur.rotateAngleX = MathHelper.cos(par2 * 0.3362F + (float)Math.PI) * 0.5F * par3;
}
}
}
this.Head.rotateAngleZ = entityzertum.getInterestedAngle(par4) + entityzertum.getShakeAngle(par4, 0.0F);
this.Mane1.rotateAngleZ = entityzertum.getShakeAngle(par4, -0.08F);
this.Torso.rotateAngleZ = entityzertum.getShakeAngle(par4, -0.16F);
this.Tail1.rotateAngleZ = entityzertum.getShakeAngle(par4, -0.32F);
this.TopJawCenter.rotateAngleX = 0.2288904F - 0.45707964F * f11;
this.BottomJawCenter.rotateAngleX = 0.2288904F + 0.45707964F * f11;
}
private void setRotation(ModelRenderer model, float x, float y, float z)
{
model.rotateAngleX = x;
model.rotateAngleY = y;
model.rotateAngleZ = z;
}
@Override
public void setRotationAngles(float par1, float par2, float par3, float par4, float par5, float par6, Entity par7Entity)
{
super.setRotationAngles(par1, par2, par3, par4, par5, par6, par7Entity);
this.Head.rotateAngleX = par5 / (280F / (float)Math.PI);
this.Head.rotateAngleY = par4 / (180F / (float)Math.PI);
this.Neck.rotateAngleX = vertebrae + par5 / (280F / (float)Math.PI);
this.Mane2.rotateAngleX = mane2StartingRotation + par5 / (280F / (float)Math.PI);
this.Mane1.rotateAngleY = par4 / (180F / (float)Math.PI);
}
protected void updateDistanceMovedTotal(Entity parEntity)
{
distanceMovedTotal += parEntity.getDistance(parEntity.prevPosX, parEntity.prevPosY, parEntity.prevPosZ);
}
protected double getDistanceMovedTotal(Entity parEntity)
{
return (distanceMovedTotal);
}
protected float degToRad(float degrees)
{
return degrees * (float)Math.PI / 180 ;
}
}
Entity File
package common.zeroquest.entity;
import java.util.HashMap;
import java.util.Map;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.SharedMonsterAttributes;
import net.minecraft.entity.ai.EntityAIAttackOnCollide;
import net.minecraft.entity.ai.EntityAIHurtByTarget;
import net.minecraft.entity.ai.EntityAILeapAtTarget;
import net.minecraft.entity.ai.EntityAILookIdle;
import net.minecraft.entity.ai.EntityAIMate;
import net.minecraft.entity.ai.EntityAISit;
import net.minecraft.entity.ai.EntityAISwimming;
import net.minecraft.entity.ai.EntityAIWander;
import net.minecraft.entity.ai.EntityAIWatchClosest;
import net.minecraft.entity.monster.EntityCreeper;
import net.minecraft.entity.monster.EntityGhast;
import net.minecraft.entity.monster.EntityZombie;
import net.minecraft.entity.passive.EntityAnimal;
import net.minecraft.entity.passive.EntityHorse;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.projectile.EntityArrow;
import net.minecraft.init.Items;
import net.minecraft.item.EnumDyeColor;
import net.minecraft.item.Item;
import net.minecraft.item.ItemBow;
import net.minecraft.item.ItemFood;
import net.minecraft.item.ItemStack;
import net.minecraft.item.ItemSword;
import net.minecraft.item.ItemTool;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.pathfinding.PathNavigateGround;
import net.minecraft.potion.Potion;
import net.minecraft.potion.PotionEffect;
import net.minecraft.util.BlockPos;
import net.minecraft.util.DamageSource;
import net.minecraft.util.EnumParticleTypes;
import net.minecraft.util.MathHelper;
import net.minecraft.world.World;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import common.zeroquest.ModAchievements;
import common.zeroquest.ModItems;
import common.zeroquest.entity.ai.EntityAIFetchBone;
import common.zeroquest.entity.ai.EntityAIFollowOwner;
import common.zeroquest.entity.ai.EntityAIModeAttackTarget;
import common.zeroquest.entity.ai.EntityAIOwnerHurtByTarget;
import common.zeroquest.entity.ai.EntityAIOwnerHurtTarget;
import common.zeroquest.entity.ai.EntityAIRoundUp;
import common.zeroquest.entity.ai.EntityCustomAIBeg;
import common.zeroquest.entity.util.CoordUtil;
import common.zeroquest.entity.util.LevelUtil;
import common.zeroquest.entity.util.ModeUtil;
import common.zeroquest.entity.util.TalentHelper;
import common.zeroquest.entity.util.TalentUtil;
import common.zeroquest.inventory.InventoryPack;
import common.zeroquest.lib.Constants;
import common.zeroquest.lib.Sound;
public abstract class EntityZertumEntity extends EntityCustomTameable
{
public float headRotationCourse;
public float headRotationCourseOld;
public boolean isWet;
public boolean isShaking;
public float timeWolfIsShaking;
public float prevTimeWolfIsShaking;
private int hungerTick;
private int prevHungerTick;
private int healingTick;
private int prevHealingTick;
private int regenerationTick;
private int prevRegenerationTick;
public TalentUtil talents;
public LevelUtil levels;
public ModeUtil mode;
public CoordUtil coords;
public Map<String, Object> objects;
private boolean hasBone;
private float mouthOpenness;
private float prevMouthOpenness;
public int field_110278_bp;
public int field_110279_bq;
private String field_110286_bQ;
private int openMouthCounter;
public static final double maxHealth = 25;
public static final double attackDamage = 6;
public static final double speed = 0.30000001192092896;
public static final double maxHealthTamed = 35;
public static final double attackDamageTamed = 8;
public static final double maxHealthBaby = 10;
public static final double attackDamageBaby = 2;
public static final double maxHealthEvo = 25;
public static final double attackDamageEvo = 6;
public static final double speedEvo = 0.30000001192092896;
protected EntityAILeapAtTarget aiLeap = new EntityAILeapAtTarget(this, 0.4F);
public EntityAIWatchClosest aiStareAtPlayer = new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F);
public EntityAIWatchClosest aiGlareAtCreeper = new EntityAIWatchClosest(this, EntityCreeper.class, this.talents.getLevel("creeperspotter") * 6);
public EntityAIFetchBone aiFetchBone;
// data value IDs TODO
/**DO NOT CHANGE!**/
public static final int INDEX_TAME = 16;
public static final int INDEX_COLLAR = 19;
public static final int INDEX_SADDLE = 20;
public static final int INDEX_EVOLVE = 25;
public static final int INDEX_MOUTH = 29;
public static final int INDEX_DASH = 30;
public EntityZertumEntity(World worldIn)
{
super(worldIn);
this.objects = new HashMap<String, Object>();
this.setSize(0.6F, 1.5F);
((PathNavigateGround)this.getNavigator()).func_179690_a(true);
this.tasks.addTask(1, new EntityAISwimming(this));
this.tasks.addTask(2, this.aiSit);
this.tasks.addTask(3, this.aiLeap);
this.tasks.addTask(4, new EntityAIAttackOnCollide(this, 1.0D, true));
this.tasks.addTask(5, new EntityAIFollowOwner(this, 1.0D, 10.0F, 2.0F));
this.tasks.addTask(6, this.aiFetchBone = new EntityAIFetchBone(this, 1.0D, 0.5F, 20.0F));
this.tasks.addTask(7, new EntityAIMate(this, 1.0D));
this.tasks.addTask(8, new EntityAIWander(this, 1.0D));
this.tasks.addTask(9, new EntityCustomAIBeg(this, 8.0F));
this.tasks.addTask(10, aiStareAtPlayer);
this.tasks.addTask(10, new EntityAILookIdle(this));
this.targetTasks.addTask(1, new EntityAIOwnerHurtByTarget(this));
this.targetTasks.addTask(2, new EntityAIOwnerHurtTarget(this));
this.targetTasks.addTask(3, new EntityAIModeAttackTarget(this));
this.targetTasks.addTask(4, new EntityAIHurtByTarget(this, true));
this.setTamed(false);
this.setEvolved(false);
this.inventory = new InventoryPack(this);
this.targetTasks.addTask(6, new EntityAIRoundUp(this, EntityAnimal.class, 0, false));
TalentHelper.onClassCreation(this);
}
@Override
protected void applyEntityAttributes()
{
super.applyEntityAttributes();
this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(maxHealth);
this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(attackDamage);
this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(speed);
this.updateEntityAttributes();
}
public void updateEntityAttributes() {
if (this.isTamed())
{
this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(maxHealthTamed + this.effectiveLevel());
this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(attackDamageTamed);
if(this.isDashing()){
this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(speed + 0.2);
}
}
else if (this.isChild())
{
this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(maxHealthBaby);
this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(attackDamageBaby);
}
else if(this.hasEvolved()){
this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(maxHealthEvo);
this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(attackDamageEvo);
this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(speedEvo);
if(this.isDashing()){
this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(speedEvo + 0.2);
}
}
}
/**
* Sets the active target the Task system uses for tracking
*/
@Override
public void setAttackTarget(EntityLivingBase p_70624_1_)
{
super.setAttackTarget(p_70624_1_);
if (p_70624_1_ == null)
{
this.setAngry(false);
}
else if (!this.isTamed())
{
this.setAngry(true);
}
}
@Override
public String getName() {
String name = this.getDogName();
if(name != "")
return name;
return super.getName();
}
@Override
@SideOnly(Side.CLIENT)
public boolean getAlwaysRenderNameTagForRender() {
return true;
}
@Override
protected void entityInit()
{
super.entityInit();
this.talents = new TalentUtil(this);
this.levels = new LevelUtil(this);
this.mode = new ModeUtil(this);
this.coords = new CoordUtil(this);
this.dataWatcher.addObject(INDEX_COLLAR, new Byte((byte)EnumDyeColor.RED.getMetadata())); //Collar
this.dataWatcher.addObject(INDEX_SADDLE, Byte.valueOf((byte)0)); //Saddle
this.dataWatcher.addObject(21, new String("")); //Dog Name
this.dataWatcher.addObject(22, new String("")); //Talent Data
this.dataWatcher.addObject(23, new Integer(60)); //Dog Hunger
this.dataWatcher.addObject(24, new String("0:0")); //Level Data
this.dataWatcher.addObject(INDEX_EVOLVE, Byte.valueOf((byte)0)); //Evolution
this.dataWatcher.addObject(26, new Integer(0)); //Obey Others
this.dataWatcher.addObject(27, new Integer(0)); //Dog Mode
this.dataWatcher.addObject(28, "-1:-1:-1:-1:-1:-1"); //Dog Mode
this.dataWatcher.addObject(INDEX_MOUTH, Integer.valueOf(0)); //Mouth
this.dataWatcher.addObject(INDEX_DASH, Byte.valueOf((byte)0)); //Dash
}
@Override
public void writeEntityToNBT(NBTTagCompound tagCompound)
{
super.writeEntityToNBT(tagCompound);
tagCompound.setBoolean("Angry", this.isAngry());
tagCompound.setByte("CollarColor", (byte)this.getCollarColor().getDyeDamage());
tagCompound.setBoolean("Saddle", this.isSaddled());
tagCompound.setBoolean("Evolve", this.hasEvolved());
tagCompound.setBoolean("Dash", this.isDashing());
tagCompound.setString("version", Constants.version);
tagCompound.setString("dogName", this.getDogName());
tagCompound.setInteger("dogHunger", this.getDogHunger());
tagCompound.setBoolean("willObey", this.willObeyOthers());
this.talents.writeTalentsToNBT(tagCompound);
this.levels.writeTalentsToNBT(tagCompound);
this.mode.writeToNBT(tagCompound);
this.coords.writeToNBT(tagCompound);
TalentHelper.writeToNBT(this, tagCompound);
}
@Override
public void readEntityFromNBT(NBTTagCompound tagCompound)
{
super.readEntityFromNBT(tagCompound);
this.setAngry(tagCompound.getBoolean("Angry"));
this.setSaddled(tagCompound.getBoolean("Saddle"));
this.setEvolved(tagCompound.getBoolean("Evolve"));
this.setDashing(tagCompound.getBoolean("Dash"));
if (tagCompound.hasKey("CollarColor", 99))
{
this.setCollarColor(EnumDyeColor.byDyeDamage(tagCompound.getByte("CollarColor")));
}
String lastVersion = tagCompound.getString("version");
this.setDogName(tagCompound.getString("dogName"));
this.setDogHunger(tagCompound.getInteger("dogHunger"));
this.setWillObeyOthers(tagCompound.getBoolean("willObey"));
this.talents.readTalentsFromNBT(tagCompound);
this.levels.readTalentsFromNBT(tagCompound);
this.mode.readFromNBT(tagCompound);
this.coords.readFromNBT(tagCompound);
TalentHelper.readFromNBT(this, tagCompound);
}
@Override
protected void playStepSound(BlockPos p_180429_1_, Block p_180429_2_)
{
this.playSound("mob.wolf.step", 0.15F, 1.0F);
}
/**
* Returns the sound this mob makes while it's alive.
*/
@Override
protected String getLivingSound()
{
this.openMouth();
String sound = TalentHelper.getLivingSound(this);
if(!"".equals(sound))
return sound;
return this.isAngry() ? "mob.wolf.growl" : this.wantToHowl ? Sound.ZertumHowl : (this.rand.nextInt(3) == 0 ?
(this.isTamed() && this.getHealth() <= 10.0F ? "mob.wolf.whine"
: "mob.wolf.panting")
: "mob.wolf.bark");
}
/**
* Returns the sound this mob makes when it is hurt.
*/
@Override
protected String getHurtSound()
{
this.openMouth();
return "mob.wolf.hurt";
}
/**
* Returns the sound this mob makes on death.
*/
@Override
protected String getDeathSound()
{
this.openMouth();
return "mob.wolf.death";
}
/**
* Returns the volume for the sounds this mob makes.
*/
@Override
public float getSoundVolume()
{
return 0.5F;
}
/**
* Get number of ticks, at least during which the living entity will be silent.
*/
@Override
public int getTalkInterval() {
if((Boolean)this.objects.get("canseecreeper") == true){
return 40;
}else if(this.wantToHowl){
return 150;
}else if(this.getHealth() <=10){
return 20;
}else{
return 200;
}
}
/**
* Returns the item ID for the item the mob drops on death.
*/
@Override
protected void dropFewItems(boolean par1, int par2)
{
rare = rand.nextInt(20);
{
if (this.isBurning())
{
this.dropItem(ModItems.zertumMeatCooked, 1);
}
else if (rare <= 12)
{
this.dropItem(ModItems.zertumMeatRaw, 1);
}
if(rare <= 6 && !this.isTamed())
{
this.dropItem(ModItems.nileGrain, 1);
}
if (this.isSaddled())
{
this.dropItem(Items.saddle, 1);
}
else
{
}
}
}
/**
* Called frequently so the entity can update its state every tick as required. For example, zombies and skeletons
* use this to react to sunlight and start to burn.
*/
@Override
public void onLivingUpdate() //TODO
{
super.onLivingUpdate();
if (isServer() && this.isWet && !this.isShaking && !this.hasPath() && this.onGround)
{
this.isShaking = true;
this.timeWolfIsShaking = 0.0F;
this.prevTimeWolfIsShaking = 0.0F;
this.worldObj.setEntityState(this, (byte);
}
if(Constants.IS_HUNGER_ON) {
this.prevHungerTick = this.hungerTick;
if (this.riddenByEntity == null && !this.isSitting() /*&& !this.mode.isMode(EnumMode.WANDERING) && !this.level.isDireDog() || worldObj.getWorldInfo().getWorldTime() % 2L == 0L */)
this.hungerTick += 1;
this.hungerTick += TalentHelper.onHungerTick(this, this.hungerTick - this.prevHungerTick);
if (this.hungerTick > 400) {
this.setDogHunger(this.getDogHunger() - 1);
this.hungerTick -= 400;
}
}
if(Constants.DEF_HEALING == true && !this.isChild() && this.getHealth() <=10 && this.isTamed())
{
this.addPotionEffect(new PotionEffect(Potion.regeneration.id, 200));
}
if(this.getHealth() != 1) {
this.prevHealingTick = this.healingTick;
this.healingTick += this.nourishment();
if (this.healingTick >= 6000) {
if (this.getHealth() < this.getMaxHealth())
this.setHealth(this.getHealth() + 1);
this.healingTick = 0;
}
}
if(this.getDogHunger() == 0 && this.worldObj.getWorldInfo().getWorldTime() % 100L == 0L && this.getHealth() > 1) {
this.attackEntityFrom(DamageSource.generic, 1);
//this.fleeingTick = 0;
}
if (isServer() && this.getAttackTarget() == null && this.isAngry())
{
this.setAngry(false);
}
if(Constants.DEF_HOWL == true){
if (this.worldObj.isDaytime() && isServer()) //TODO
{
wantToHowl = false;
}
else if(isServer() && (this.isChild() || this.isChild()))
{
wantToHowl = true;
}
}
TalentHelper.onLivingUpdate(this);
}
/**
* Called to update the entity's position/logic.
*/
@Override
public void onUpdate()
{
super.onUpdate();
if (this.openMouthCounter > 0 && ++this.openMouthCounter > 30) //TODO
{
this.openMouthCounter = 0;
this.setHorseWatchableBoolean(128, false);
}
this.prevMouthOpenness = this.mouthOpenness;
if (this.getHorseWatchableBoolean(128))
{
this.mouthOpenness += (1.0F - this.mouthOpenness) * 0.7F + 0.05F;
if (this.mouthOpenness > 1.0F)
{
this.mouthOpenness = 1.0F;
}
}
else
{
this.mouthOpenness += (0.0F - this.mouthOpenness) * 0.7F - 0.05F;
if (this.mouthOpenness < 0.0F)
{
this.mouthOpenness = 0.0F;
}
}
this.headRotationCourseOld = this.headRotationCourse;
if (this.func_70922_bv())
{
this.headRotationCourse += (1.0F - this.headRotationCourse) * 0.4F;
}
else
{
this.headRotationCourse += (0.0F - this.headRotationCourse) * 0.4F;
}
if (this.isWet())
{
this.isWet = true;
this.isShaking = false;
this.timeWolfIsShaking = 0.0F;
this.prevTimeWolfIsShaking = 0.0F;
}
else if ((this.isWet || this.isShaking) && this.isShaking)
{
if (this.timeWolfIsShaking == 0.0F)
{
this.playSound("mob.wolf.shake", this.getSoundVolume(), (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F);
}
this.prevTimeWolfIsShaking = this.timeWolfIsShaking;
this.timeWolfIsShaking += 0.05F;
if (this.prevTimeWolfIsShaking >= 2.0F)
{
if(this.rand.nextInt(15) < this.talents.getLevel("fishing") * 2) {
if(this.rand.nextInt(15) < this.talents.getLevel("fire") * 2 && this instanceof EntityRedZertum) {
if(!this.worldObj.isRemote) {
dropItem(Items.cooked_fish, 1);
}
}
else {
if(!this.worldObj.isRemote) {
dropItem(Items.fish, 1);
}
}
}
this.isWet = false;
this.isShaking = false;
this.prevTimeWolfIsShaking = 0.0F;
this.timeWolfIsShaking = 0.0F;
}
if (this.timeWolfIsShaking > 0.4F)
{
float f = (float)this.getEntityBoundingBox().minY;
int i = (int)(MathHelper.sin((this.timeWolfIsShaking - 0.4F) * (float)Math.PI) * 7.0F);
for (int j = 0; j < i; ++j)
{
float f1 = (this.rand.nextFloat() * 2.0F - 1.0F) * this.width * 0.5F;
float f2 = (this.rand.nextFloat() * 2.0F - 1.0F) * this.width * 0.5F;
this.worldObj.spawnParticle(EnumParticleTypes.WATER_SPLASH, this.posX + (double)f1, (double)(f + 0.8F), this.posZ + (double)f2, this.motionX, this.motionY, this.motionZ, new int[0]);
}
}
}
if(this.isTamed()) {
EntityPlayer player = (EntityPlayer)this.getOwner();
if(player != null) {
float distanceToOwner = player.getDistanceToEntity(this);
if (distanceToOwner <= 2F && this.hasBone()) {
if(!this.worldObj.isRemote) {
this.entityDropItem(new ItemStack(ModItems.toy, 1, 1), 0.0F);
}
this.setHasBone(false);
}
}
}
TalentHelper.onUpdate(this);
}
@Override
public void moveEntityWithHeading(float strafe, float forward) {
if (this.riddenByEntity instanceof EntityPlayer) {
this.prevRotationYaw = this.rotationYaw = this.riddenByEntity.rotationYaw;
this.rotationPitch = this.riddenByEntity.rotationPitch * 0.5F;
this.setRotation(this.rotationYaw, this.rotationPitch);
this.rotationYawHead = this.renderYawOffset = this.rotationYaw;
strafe = ((EntityPlayer)this.riddenByEntity).moveStrafing * 0.5F;
forward = ((EntityPlayer)this.riddenByEntity).moveForward;
if (forward <= 0.0F)
forward *= 0.25F;
if (this.onGround) {
if (forward > 0.0F) {
float f2 = MathHelper.sin(this.rotationYaw * (float)Math.PI / 180.0F);
float f3 = MathHelper.cos(this.rotationYaw * (float)Math.PI / 180.0F);
this.motionX += (double)(-0.4F * f2 * 0.15F); // May change
this.motionZ += (double)(0.4F * f3 * 0.15F);
}
}
this.stepHeight = 1.0F;
this.jumpMovementFactor = this.getAIMoveSpeed() * 0.2F;
if (!this.worldObj.isRemote) {
this.setAIMoveSpeed((float)this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).getAttributeValue() / 4);
super.moveEntityWithHeading(strafe, forward);
}
if (this.onGround) {
//this.jumpPower = 0.0F;
// this.setHorseJumping(false);
}
this.prevLimbSwingAmount = this.limbSwingAmount;
double d0 = this.posX - this.prevPosX;
double d1 = this.posZ - this.prevPosZ;
float f4 = MathHelper.sqrt_double(d0 * d0 + d1 * d1) * 4.0F;
if (f4 > 1.0F)
f4 = 1.0F;
this.limbSwingAmount += (f4 - this.limbSwingAmount) * 0.4F;
this.limbSwing += this.limbSwingAmount;
}
else {
this.stepHeight = 0.5F;
this.jumpMovementFactor = 0.02F;
super.moveEntityWithHeading(strafe, forward);
}
}
@Override
public float getAIMoveSpeed() {
double speed = this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).getAttributeValue();
speed += TalentHelper.addToMoveSpeed(this);
if((!(this.getAttackTarget() instanceof EntityZertumEntity) && !(this.getAttackTarget() instanceof EntityPlayer)) || this.riddenByEntity instanceof EntityPlayer)
if (this.levels.getLevel() == 110 && this.hasEvolved())
speed += 1.0D;
if(this.riddenByEntity instanceof EntityPlayer)
speed /= 4;
return (float)speed;
}
@Override
public void fall(float distance, float damageMultiplier)
{
if (distance > 1.0F)
{
this.playSound("game.neutral.hurt.fall.small", 0.4F, 1.0F);
}
int i = MathHelper.ceiling_float_int(((distance * 0.5F - 3.0F) - TalentHelper.fallProtection(this)) * damageMultiplier);
if (i > 0 && !TalentHelper.isImmuneToFalls(this))
{
this.attackEntityFrom(DamageSource.fall, (float)i);
if (this.riddenByEntity != null)
{
this.riddenByEntity.attackEntityFrom(DamageSource.fall, (float)i);
}
Block block = this.worldObj.getBlockState(new BlockPos(this.posX, this.posY - 0.2D - (double)this.prevRotationYaw, this.posZ)).getBlock();
if (block.getMaterial() != Material.air && !this.isSilent())
{
Block.SoundType soundtype = block.stepSound;
this.worldObj.playSoundAtEntity(this, soundtype.getStepSound(), soundtype.getVolume() * 0.5F, soundtype.getFrequency() * 0.75F);
}
}
}
@SideOnly(Side.CLIENT)
public boolean isWolfWet()
{
return this.isWet;
}
@SideOnly(Side.CLIENT)
public float getShadingWhileWet(float p_70915_1_)
{
return 0.75F + (this.prevTimeWolfIsShaking + (this.timeWolfIsShaking - this.prevTimeWolfIsShaking) * p_70915_1_) / 2.0F * 0.25F;
}
@SideOnly(Side.CLIENT)
public float getShakeAngle(float p_70923_1_, float p_70923_2_)
{
float f2 = (this.prevTimeWolfIsShaking + (this.timeWolfIsShaking - this.prevTimeWolfIsShaking) * p_70923_1_ + p_70923_2_) / 1.8F;
if (f2 < 0.0F)
{
f2 = 0.0F;
}
else if (f2 > 1.0F)
{
f2 = 1.0F;
}
return MathHelper.sin(f2 * (float)Math.PI) * MathHelper.sin(f2 * (float)Math.PI * 11.0F) * 0.15F * (float)Math.PI;
}
@SideOnly(Side.CLIENT)
public float getInterestedAngle(float p_70917_1_)
{
return (this.headRotationCourseOld + (this.headRotationCourse - this.headRotationCourseOld) * p_70917_1_) * 0.15F * (float)Math.PI;
}
public float getEyeHeight()
{
return this.height * 0.8F;
}
public int getVerticalFaceSpeed()
{
return this.isSitting() ? 20 : super.getVerticalFaceSpeed();
}
@Override
public boolean attackEntityFrom(DamageSource damageSource, float damage) {
if (this.isEntityInvulnerable(damageSource))
return false;
else {
if(!TalentHelper.attackEntityFrom(this, damageSource, damage))
return false;
Entity entity = damageSource.getEntity();
this.aiSit.setSitting(false);
if (entity != null && !(entity instanceof EntityPlayer) && !(entity instanceof EntityArrow))
damage = (damage + 1.0F) / 2.0F;
return super.attackEntityFrom(damageSource, damage);
}
}
@Override
public boolean attackEntityAsMob(Entity entity) {
if(!TalentHelper.shouldDamageMob(this, entity))
return false;
int damage = (int)(4 + (this.effectiveLevel() + this.getEntityAttribute(SharedMonsterAttributes.attackDamage).getBaseValue()) / 2);
damage = TalentHelper.attackEntityAsMob(this, entity, damage);
if (entity instanceof EntityZombie)
((EntityZombie)entity).setAttackTarget(this);
return entity.attackEntityFrom(DamageSource.causeMobDamage(this), (float)damage);
}
/**
* Called when the mob's health reaches 0.
*/
@Override //TODO
public void onDeath(DamageSource par1DamageSource)
{
super.onDeath(par1DamageSource);
if (par1DamageSource.getEntity() instanceof EntityPlayer)
{
EntityPlayer entityplayer = (EntityPlayer)par1DamageSource.getEntity();
{
entityplayer.triggerAchievement(ModAchievements.ZertKill);
this.dropChestItems();
}
}
}
protected boolean isMovementBlocked() {
return this.isPlayerSleeping() || this.ridingEntity != null || this.riddenByEntity instanceof EntityPlayer || super.isMovementBlocked();
}
@Override
public double getYOffset() {
return this.ridingEntity instanceof EntityPlayer ? 0.5D : 0.0D;
}
@Override
public boolean isPotionApplicable(PotionEffect potionEffect) {
if (this.getHealth() <= 1)
return false;
if(!TalentHelper.isPostionApplicable(this, potionEffect))
return false;
return true;
}
@Override
public void setFire(int amount) {
if(TalentHelper.setFire(this, amount))
super.setFire(amount);
}
public int foodValue(ItemStack stack) {
if(stack == null || stack.getItem() == null)
return 0;
int foodValue = 0;
Item item = stack.getItem();
if(stack.getItem() != Items.rotten_flesh && item instanceof ItemFood) {
ItemFood itemfood = (ItemFood)item;
if (itemfood.isWolfsFavoriteMeat())
foodValue = 40;
}
foodValue = TalentHelper.changeFoodValue(this, stack, foodValue);
return foodValue;
}
public int masterOrder() {
int order = 0;
EntityPlayer player = (EntityPlayer)this.getOwner();
if (player != null) {
float distanceAway = player.getDistanceToEntity(this);
ItemStack itemstack = player.inventory.getCurrentItem();
if (itemstack != null && (itemstack.getItem() instanceof ItemTool) && distanceAway <= 20F)
order = 1;
if (itemstack != null && ((itemstack.getItem() instanceof ItemSword) || (itemstack.getItem() instanceof ItemBow)))
order = 2;
if (itemstack != null && itemstack.getItem() == Items.wheat)
order = 3;
}
return order;
}
@Override
public boolean isPlayerSleeping() {
return false;
}
@Override
public boolean canBreatheUnderwater() {
return TalentHelper.canBreatheUnderwater(this);
}
public boolean canInteract(EntityPlayer player) {
return this.isOwner(player) || this.willObeyOthers();
}
public int nourishment() {
int amount = 0;
if (this.getDogHunger() > 0) {
amount = 40 + 4 * (this.effectiveLevel() + 1);
if (isSitting() && this.talents.getLevel("rapidregen") == 5) {
amount += 20 + 2 * (this.effectiveLevel() + 1);
}
if (!this.isSitting()) {
amount *= 5 + this.talents.getLevel("rapidregen");
amount /= 10;
}
}
return amount;
}
public int effectiveLevel() {
return (this.levels.getLevel()) / 2;
}
public String getDogName() {
return this.dataWatcher.getWatchableObjectString(21);
}
public void setDogName(String var1) {
this.dataWatcher.updateObject(21, var1);
}
public void setWillObeyOthers(boolean flag) {
this.dataWatcher.updateObject(26, flag ? 1 : 0);
}
public boolean willObeyOthers() {
return this.dataWatcher.getWatchableObjectInt(26) != 0;
}
public int points() {
return this.levels.getLevel() + (this.getGrowingAge() < 0 ? 0 : 20);
}
public int spendablePoints() {
return this.points() - this.usedPoints();
}
public int usedPoints() {
return TalentHelper.getUsedPoints(this);
}
public int deductive(int par1) {
byte byte0 = 0;
switch(par1) {
case 1: return 1;
case 2: return 2;
case 3: return 4;
case 4: return 6;
case 5: return 8;
default: return 0;
}
}
public int getDogHunger() {
return this.dataWatcher.getWatchableObjectInt(23);
}
public void setDogHunger(int par1) {
this.dataWatcher.updateObject(23, MathHelper.clamp_int(par1, 0, 100));
}
@Override
public boolean func_142018_a(EntityLivingBase entityToAttack, EntityLivingBase owner) {
if(TalentHelper.canAttackEntity(this, entityToAttack))
return true;
if (!(entityToAttack instanceof EntityCreeper) && !(entityToAttack instanceof EntityGhast)) {
if (entityToAttack instanceof EntityZertumEntity) {
EntityZertumEntity entityDog = (EntityZertumEntity)entityToAttack;
if (entityDog.isTamed() && entityDog.getOwner() == owner)
return false;
}
return entityToAttack instanceof EntityPlayer && owner instanceof EntityPlayer && !((EntityPlayer)owner).canAttackPlayer((EntityPlayer)entityToAttack) ? false : !(entityToAttack instanceof EntityHorse) || !((EntityHorse)entityToAttack).isTame();
}
else {
return false;
}
}
@Override
public boolean canAttackClass(Class p_70686_1_) {
if(TalentHelper.canAttackClass(this, p_70686_1_))
return true;
return super.canAttackClass(p_70686_1_);
}
public void setHasBone(boolean hasBone) {
this.hasBone = hasBone;
}
public boolean hasBone() {
return this.hasBone;
}
/**
* Gets the pitch of living sounds in living entities.
*/
@Override
protected float getPitch() {
if(!this.isChild())
return super.getSoundPitch();
else{
return super.getSoundPitch() * 1;
}
}
@SideOnly(Side.CLIENT)
public void handleHealthUpdate(byte p_70103_1_)
{
if (p_70103_1_ ==
{
this.isShaking = true;
this.timeWolfIsShaking = 0.0F;
this.prevTimeWolfIsShaking = 0.0F;
}
else
{
super.handleHealthUpdate(p_70103_1_);
}
}
/**
* Checks if the parameter is an item which this animal can be fed to breed it (wheat, carrots or seeds depending on
* the animal type)
*/
public boolean isBreedingItem(ItemStack itemstack)
{
return itemstack == null ? false : itemstack.getItem() == ModItems.dogTreat;
}
public int getMaxSpawnedInChunk()
{
return 8;
}
public boolean isAngry()
{
return (this.dataWatcher.getWatchableObjectByte(INDEX_TAME) & 2) != 0;
}
public void setAngry(boolean p_70916_1_)
{
byte b0 = this.dataWatcher.getWatchableObjectByte(INDEX_TAME);
if (p_70916_1_)
{
this.dataWatcher.updateObject(INDEX_TAME, Byte.valueOf((byte)(b0 | 2)));
}
else
{
this.dataWatcher.updateObject(INDEX_TAME, Byte.valueOf((byte)(b0 & -3)));
}
}
public EnumDyeColor getCollarColor()
{
return EnumDyeColor.byDyeDamage(this.dataWatcher.getWatchableObjectByte(INDEX_COLLAR) & 15);
}
public void setCollarColor(EnumDyeColor collarcolor)
{
this.dataWatcher.updateObject(INDEX_COLLAR, Byte.valueOf((byte)(collarcolor.getDyeDamage() & 15)));
}
public boolean isSaddled()
{
return (this.dataWatcher.getWatchableObjectByte(INDEX_SADDLE) & 1) != 0;
}
public void setSaddled(boolean p_70900_1_)
{
if (p_70900_1_)
{
this.dataWatcher.updateObject(INDEX_SADDLE, Byte.valueOf((byte)1));
}
else
{
this.dataWatcher.updateObject(INDEX_SADDLE, Byte.valueOf((byte)0));
}
}
public boolean hasEvolved() //TODO
{
return (this.dataWatcher.getWatchableObjectByte(INDEX_EVOLVE) & 1) != 0;
}
public void setEvolved(boolean p_70900_1_)
{
if (p_70900_1_)
{
this.dataWatcher.updateObject(INDEX_EVOLVE, Byte.valueOf((byte)1));
}
else
{
this.dataWatcher.updateObject(INDEX_EVOLVE, Byte.valueOf((byte)0));
}
}
private boolean getHorseWatchableBoolean(int p_110233_1_) //TODO
{
return (this.dataWatcher.getWatchableObjectInt(INDEX_MOUTH) & p_110233_1_) != 0;
}
private void setHorseWatchableBoolean(int p_110208_1_, boolean p_110208_2_)
{
int j = this.dataWatcher.getWatchableObjectInt(INDEX_MOUTH);
if (p_110208_2_)
{
this.dataWatcher.updateObject(INDEX_MOUTH, Integer.valueOf(j | p_110208_1_));
}
else
{
this.dataWatcher.updateObject(INDEX_MOUTH, Integer.valueOf(j & ~p_110208_1_));
}
}
@SideOnly(Side.CLIENT)
public float func_110201_q(float p_110201_1_)
{
return this.prevMouthOpenness + (this.mouthOpenness - this.prevMouthOpenness) * p_110201_1_;
}
public void openMouth()
{
if (isServer())
{
this.openMouthCounter = 1;
this.setHorseWatchableBoolean(128, true);
}
}
public boolean isDashing() //TODO
{
return (this.dataWatcher.getWatchableObjectByte(INDEX_DASH) & 1) != 0;
}
public void setDashing(boolean p_70900_1_)
{
if (p_70900_1_)
{
this.dataWatcher.updateObject(INDEX_DASH, Byte.valueOf((byte)1));
}
else
{
this.dataWatcher.updateObject(INDEX_DASH, Byte.valueOf((byte)0));
}
}
/**
* Determines if an entity can be despawned, used on idle far away entities
*/
protected boolean canDespawn()
{
return !this.isTamed() && this.ticksExisted > 2400;
}
public boolean allowLeashing()
{
return !this.isAngry() && super.allowLeashing();
}
}