package net.minecraft.entity.passive;
import com.google.common.base.Predicate;
import net.minecraft.block.Block;
import net.minecraft.block.BlockCarrot;
import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityAgeable;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.IEntityLivingData;
import net.minecraft.entity.SharedMonsterAttributes;
import net.minecraft.entity.ai.EntityAIAttackOnCollide;
import net.minecraft.entity.ai.EntityAIAvoidEntity;
import net.minecraft.entity.ai.EntityAIHurtByTarget;
import net.minecraft.entity.ai.EntityAIMate;
import net.minecraft.entity.ai.EntityAIMoveToBlock;
import net.minecraft.entity.ai.EntityAINearestAttackableTarget;
import net.minecraft.entity.ai.EntityAIPanic;
import net.minecraft.entity.ai.EntityAISwimming;
import net.minecraft.entity.ai.EntityAITempt;
import net.minecraft.entity.ai.EntityAIWander;
import net.minecraft.entity.ai.EntityAIWatchClosest;
import net.minecraft.entity.ai.EntityJumpHelper;
import net.minecraft.entity.ai.EntityMoveHelper;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.pathfinding.PathEntity;
import net.minecraft.pathfinding.PathNavigateGround;
import net.minecraft.util.BlockPos;
import net.minecraft.util.DamageSource;
import net.minecraft.util.EnumParticleTypes;
import net.minecraft.util.StatCollector;
import net.minecraft.util.Vec3;
import net.minecraft.world.DifficultyInstance;
import net.minecraft.world.World;
public class EntityRabbit extends EntityAnimal
{
private EntityRabbit.AIAvoidEntity field_175539_bk;
private int field_175540_bm = 0;
private int field_175535_bn = 0;
private boolean field_175536_bo = false;
private boolean field_175537_bp = false;
private int field_175538_bq = 0;
private EntityRabbit.EnumMoveType field_175542_br;
private int field_175541_bs;
private EntityPlayer field_175543_bt;
private static final String __OBFID = "CL_00002242";
public EntityRabbit(World worldIn)
{
super(worldIn);
this.field_175542_br = EntityRabbit.EnumMoveType.HOP;
this.field_175541_bs = 0;
this.field_175543_bt = null;
this.setSize(0.6F, 0.7F);
this.jumpHelper = new EntityRabbit.RabbitJumpHelper(this);
this.moveHelper = new EntityRabbit.RabbitMoveHelper();
((PathNavigateGround)this.getNavigator()).func_179690_a(true);
this.navigator.func_179678_a(2.5F);
this.tasks.addTask(1, new EntityAISwimming(this));
this.tasks.addTask(1, new EntityRabbit.AIPanic(1.33D));
this.tasks.addTask(2, new EntityAITempt(this, 1.0D, Items.carrot, false));
this.tasks.addTask(3, new EntityAIMate(this, 0.8D));
this.tasks.addTask(5, new EntityRabbit.AIRaidFarm());
this.tasks.addTask(5, new EntityAIWander(this, 0.6D));
this.tasks.addTask(11, new EntityAIWatchClosest(this, EntityPlayer.class, 10.0F));
this.field_175539_bk = new EntityRabbit.AIAvoidEntity(new Predicate()
{
private static final String __OBFID = "CL_00002241";
public boolean func_180086_a(Entity p_180086_1_)
{
return p_180086_1_ instanceof EntityWolf;
}
public boolean apply(Object p_apply_1_)
{
return this.func_180086_a((Entity)p_apply_1_);
}
}, 16.0F, 1.33D, 1.33D);
this.tasks.addTask(4, this.field_175539_bk);
this.func_175515_b(0.0D);
}
protected float func_175134_bD()
{
return this.moveHelper.isUpdating() && this.moveHelper.func_179919_e() > this.posY + 0.5D ? 0.5F : this.field_175542_br.func_180074_b();
}
public void func_175522_a(EntityRabbit.EnumMoveType p_175522_1_)
{
this.field_175542_br = p_175522_1_;
}
public void func_175515_b(double p_175515_1_)
{
this.getNavigator().setSpeed(p_175515_1_);
this.moveHelper.setMoveTo(this.moveHelper.func_179917_d(), this.moveHelper.func_179919_e(), this.moveHelper.func_179918_f(), p_175515_1_);
}
public void func_175519_a(boolean p_175519_1_, EntityRabbit.EnumMoveType p_175519_2_)
{
super.setJumping(p_175519_1_);
if (!p_175519_1_)
{
if (this.field_175542_br == EntityRabbit.EnumMoveType.ATTACK)
{
this.field_175542_br = EntityRabbit.EnumMoveType.HOP;
}
}
else
{
this.func_175515_b(1.5D * (double)p_175519_2_.func_180072_a());
this.playSound(this.func_175516_ck(), this.getSoundVolume(), ((this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F) * 0.8F);
}
this.field_175536_bo = p_175519_1_;
}
public void func_175524_b(EntityRabbit.EnumMoveType p_175524_1_)
{
this.func_175519_a(true, p_175524_1_);
this.field_175535_bn = p_175524_1_.func_180073_d();
this.field_175540_bm = 0;
}
public boolean func_175523_cj()
{
return this.field_175536_bo;
}
protected void entityInit()
{
super.entityInit();
this.dataWatcher.addObject(18, Byte.valueOf((byte)0));
}
public void updateAITasks()
{
if (this.moveHelper.getSpeed() > 0.8D)
{
this.func_175522_a(EntityRabbit.EnumMoveType.SPRINT);
}
else if (this.field_175542_br != EntityRabbit.EnumMoveType.ATTACK)
{
this.func_175522_a(EntityRabbit.EnumMoveType.HOP);
}
if (this.field_175538_bq > 0)
{
--this.field_175538_bq;
}
if (this.field_175541_bs > 0)
{
this.field_175541_bs -= this.rand.nextInt(3);
if (this.field_175541_bs < 0)
{
this.field_175541_bs = 0;
}
}
if (this.onGround)
{
if (!this.field_175537_bp)
{
this.func_175519_a(false, EntityRabbit.EnumMoveType.NONE);
this.func_175517_cu();
}
if (this.func_175531_cl() == 99 && this.field_175538_bq == 0)
{
EntityLivingBase var1 = this.getAttackTarget();
if (var1 != null && this.getDistanceSqToEntity(var1) < 16.0D)
{
this.func_175533_a(var1.posX, var1.posZ);
this.moveHelper.setMoveTo(var1.posX, var1.posY, var1.posZ, this.moveHelper.getSpeed());
this.func_175524_b(EntityRabbit.EnumMoveType.ATTACK);
this.field_175537_bp = true;
}
}
EntityRabbit.RabbitJumpHelper var4 = (EntityRabbit.RabbitJumpHelper)this.jumpHelper;
if (!var4.func_180067_c())
{
if (this.moveHelper.isUpdating() && this.field_175538_bq == 0)
{
PathEntity var2 = this.navigator.getPath();
Vec3 var3 = new Vec3(this.moveHelper.func_179917_d(), this.moveHelper.func_179919_e(), this.moveHelper.func_179918_f());
if (var2 != null && var2.getCurrentPathIndex() < var2.getCurrentPathLength())
{
var3 = var2.getPosition(this);
}
this.func_175533_a(var3.xCoord, var3.zCoord);
this.func_175524_b(this.field_175542_br);
}
}
else if (!var4.func_180065_d())
{
this.func_175518_cr();
}
}
this.field_175537_bp = this.onGround;
}
public void func_174830_Y() {}
private void func_175533_a(double p_175533_1_, double p_175533_3_)
{
this.rotationYaw = (float)(Math.atan2(p_175533_3_ - this.posZ, p_175533_1_ - this.posX) * 180.0D / Math.PI) - 90.0F;
}
private void func_175518_cr()
{
((EntityRabbit.RabbitJumpHelper)this.jumpHelper).func_180066_a(true);
}
private void func_175520_cs()
{
((EntityRabbit.RabbitJumpHelper)this.jumpHelper).func_180066_a(false);
}
private void func_175530_ct()
{
this.field_175538_bq = this.func_175532_cm();
}
private void func_175517_cu()
{
this.func_175530_ct();
this.func_175520_cs();
}
/**
* 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.
*/
public void onLivingUpdate()
{
super.onLivingUpdate();
if (this.field_175540_bm != this.field_175535_bn)
{
if (this.field_175540_bm == 0 && !this.worldObj.isRemote)
{
this.worldObj.setEntityState(this, (byte)1);
}
++this.field_175540_bm;
}
else if (this.field_175535_bn != 0)
{
this.field_175540_bm = 0;
this.field_175535_bn = 0;
}
}
protected void applyEntityAttributes()
{
super.applyEntityAttributes();
this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(10.0D);
this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.30000001192092896D);
}
/**
* (abstract) Protected helper method to write subclass entity data to NBT.
*/
public void writeEntityToNBT(NBTTagCompound tagCompound)
{
super.writeEntityToNBT(tagCompound);
tagCompound.setInteger("RabbitType", this.func_175531_cl());
tagCompound.setInteger("MoreCarrotTicks", this.field_175541_bs);
}
/**
* (abstract) Protected helper method to read subclass entity data from NBT.
*/
public void readEntityFromNBT(NBTTagCompound tagCompund)
{
super.readEntityFromNBT(tagCompund);
this.func_175529_r(tagCompund.getInteger("RabbitType"));
this.field_175541_bs = tagCompund.getInteger("MoreCarrotTicks");
}
protected String func_175516_ck()
{
return "mob.rabbit.hop";
}
/**
* Returns the sound this mob makes while it's alive.
*/
protected String getLivingSound()
{
return "mob.rabbit.idle";
}
/**
* Returns the sound this mob makes when it is hurt.
*/
protected String getHurtSound()
{
return "mob.rabbit.hurt";
}
/**
* Returns the sound this mob makes on death.
*/
protected String getDeathSound()
{
return "mob.rabbit.death";
}
public boolean attackEntityAsMob(Entity p_70652_1_)
{
if (this.func_175531_cl() == 99)
{
this.playSound("mob.attack", 1.0F, (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F);
return p_70652_1_.attackEntityFrom(DamageSource.causeMobDamage(this), 8.0F);
}
else
{
return p_70652_1_.attackEntityFrom(DamageSource.causeMobDamage(this), 3.0F);
}
}
/**
* Returns the current armor value as determined by a call to InventoryPlayer.getTotalArmorValue
*/
public int getTotalArmorValue()
{
return this.func_175531_cl() == 99 ? 8 : super.getTotalArmorValue();
}
/**
* Called when the entity is attacked.
*/
public boolean attackEntityFrom(DamageSource source, float amount)
{
return this.func_180431_b(source) ? false : super.attackEntityFrom(source, amount);
}
/**
* Makes entity wear random armor based on difficulty
*/
protected void addRandomArmor()
{
this.entityDropItem(new ItemStack(Items.rabbit_foot, 1), 0.0F);
}
/**
* Drop 0-2 items of this living's type
*/
protected void dropFewItems(boolean p_70628_1_, int p_70628_2_)
{
int var3 = this.rand.nextInt(2) + this.rand.nextInt(1 + p_70628_2_);
int var4;
for (var4 = 0; var4 < var3; ++var4)
{
this.dropItem(Items.rabbit_hide, 1);
}
var3 = this.rand.nextInt(2);
for (var4 = 0; var4 < var3; ++var4)
{
if (this.isBurning())
{
this.dropItem(Items.cooked_rabbit, 1);
}
else
{
this.dropItem(Items.rabbit, 1);
}
}
}
private boolean func_175525_a(Item p_175525_1_)
{
return p_175525_1_ == Items.carrot || p_175525_1_ == Items.golden_carrot || p_175525_1_ == Item.getItemFromBlock(Blocks.yellow_flower);
}
public EntityRabbit func_175526_b(EntityAgeable p_175526_1_)
{
EntityRabbit var2 = new EntityRabbit(this.worldObj);
if (p_175526_1_ instanceof EntityRabbit)
{
var2.func_175529_r(this.rand.nextBoolean() ? this.func_175531_cl() : ((EntityRabbit)p_175526_1_).func_175531_cl());
}
return var2;
}
/**
* 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 p_70877_1_)
{
return p_70877_1_ != null && this.func_175525_a(p_70877_1_.getItem());
}
public int func_175531_cl()
{
return this.dataWatcher.getWatchableObjectByte(18);
}
public void func_175529_r(int p_175529_1_)
{
if (p_175529_1_ == 99)
{
this.tasks.removeTask(this.field_175539_bk);
this.tasks.addTask(4, new EntityRabbit.AIEvilAttack());
this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, false, new Class[0]));
this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityPlayer.class, true));
this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityWolf.class, true));
if (!this.hasCustomName())
{
this.setCustomNameTag(StatCollector.translateToLocal("entity.KillerBunny.name"));
}
}
this.dataWatcher.updateObject(18, Byte.valueOf((byte)p_175529_1_));
}
public IEntityLivingData func_180482_a(DifficultyInstance p_180482_1_, IEntityLivingData p_180482_2_)
{
Object p_180482_2_1 = super.func_180482_a(p_180482_1_, p_180482_2_);
int var3 = this.rand.nextInt(6);
boolean var4 = false;
if (p_180482_2_1 instanceof EntityRabbit.RabbitTypeData)
{
var3 = ((EntityRabbit.RabbitTypeData)p_180482_2_1).field_179427_a;
var4 = true;
}
else
{
p_180482_2_1 = new EntityRabbit.RabbitTypeData(var3);
}
this.func_175529_r(var3);
if (var4)
{
this.setGrowingAge(-24000);
}
return (IEntityLivingData)p_180482_2_1;
}
private boolean func_175534_cv()
{
return this.field_175541_bs == 0;
}
protected int func_175532_cm()
{
return this.field_175542_br.func_180075_c();
}
protected void func_175528_cn()
{
this.worldObj.spawnParticle(EnumParticleTypes.BLOCK_DUST, this.posX + (double)(this.rand.nextFloat() * this.width * 2.0F) - (double)this.width, this.posY + 0.5D + (double)(this.rand.nextFloat() * this.height), this.posZ + (double)(this.rand.nextFloat() * this.width * 2.0F) - (double)this.width, 0.0D, 0.0D, 0.0D, new int[] {Block.getStateId(Blocks.carrots.getStateFromMeta(7))});
this.field_175541_bs = 100;
}
public EntityAgeable createChild(EntityAgeable p_90011_1_)
{
return this.func_175526_b(p_90011_1_);
}
class AIAvoidEntity extends EntityAIAvoidEntity
{
private EntityRabbit field_179511_d = EntityRabbit.this;
private static final String __OBFID = "CL_00002238";
public AIAvoidEntity(Predicate p_i45865_2_, float p_i45865_3_, double p_i45865_4_, double p_i45865_6_)
{
super(EntityRabbit.this, p_i45865_2_, p_i45865_3_, p_i45865_4_, p_i45865_6_);
}
public void updateTask()
{
super.updateTask();
}
}
class AIEvilAttack extends EntityAIAttackOnCollide
{
private static final String __OBFID = "CL_00002240";
public AIEvilAttack()
{
super(EntityRabbit.this, EntityLivingBase.class, 1.4D, true);
}
protected double func_179512_a(EntityLivingBase p_179512_1_)
{
return (double)(4.0F + p_179512_1_.width);
}
}
class AIPanic extends EntityAIPanic
{
private EntityRabbit field_179486_b = EntityRabbit.this;
private static final String __OBFID = "CL_00002234";
public AIPanic(double p_i45861_2_)
{
super(EntityRabbit.this, p_i45861_2_);
}
public void updateTask()
{
super.updateTask();
this.field_179486_b.func_175515_b(this.speed);
}
}
class AIRaidFarm extends EntityAIMoveToBlock
{
private boolean field_179498_d;
private boolean field_179499_e = false;
private static final String __OBFID = "CL_00002233";
public AIRaidFarm()
{
super(EntityRabbit.this, 0.699999988079071D, 16);
}
public boolean shouldExecute()
{
if (this.field_179496_a <= 0)
{
if (!EntityRabbit.this.worldObj.getGameRules().getGameRuleBooleanValue("mobGriefing"))
{
return false;
}
this.field_179499_e = false;
this.field_179498_d = EntityRabbit.this.func_175534_cv();
}
return super.shouldExecute();
}
public boolean continueExecuting()
{
return this.field_179499_e && super.continueExecuting();
}
public void startExecuting()
{
super.startExecuting();
}
public void resetTask()
{
super.resetTask();
}
public void updateTask()
{
super.updateTask();
EntityRabbit.this.getLookHelper().setLookPosition((double)this.field_179494_b.getX() + 0.5D, (double)(this.field_179494_b.getY() + 1), (double)this.field_179494_b.getZ() + 0.5D, 10.0F, (float)EntityRabbit.this.getVerticalFaceSpeed());
if (this.func_179487_f())
{
World var1 = EntityRabbit.this.worldObj;
BlockPos var2 = this.field_179494_b.offsetUp();
IBlockState var3 = var1.getBlockState(var2);
Block var4 = var3.getBlock();
if (this.field_179499_e && var4 instanceof BlockCarrot && ((Integer)var3.getValue(BlockCarrot.AGE)).intValue() == 7)
{
var1.setBlockState(var2, Blocks.air.getDefaultState(), 2);
var1.destroyBlock(var2, true);
EntityRabbit.this.func_175528_cn();
}
this.field_179499_e = false;
this.field_179496_a = 10;
}
}
protected boolean func_179488_a(World worldIn, BlockPos p_179488_2_)
{
Block var3 = worldIn.getBlockState(p_179488_2_).getBlock();
if (var3 == Blocks.farmland)
{
p_179488_2_ = p_179488_2_.offsetUp();
IBlockState var4 = worldIn.getBlockState(p_179488_2_);
var3 = var4.getBlock();
if (var3 instanceof BlockCarrot && ((Integer)var4.getValue(BlockCarrot.AGE)).intValue() == 7 && this.field_179498_d && !this.field_179499_e)
{
this.field_179499_e = true;
return true;
}
}
return false;
}
}
static enum EnumMoveType
{
NONE("NONE", 0, 0.0F, 0.0F, 30, 1),
HOP("HOP", 1, 0.8F, 0.2F, 20, 10),
STEP("STEP", 2, 1.0F, 0.45F, 14, 14),
SPRINT("SPRINT", 3, 1.75F, 0.4F, 1, 8),
ATTACK("ATTACK", 4, 2.0F, 0.7F, 7, 8);
private final float field_180076_f;
private final float field_180077_g;
private final int field_180084_h;
private final int field_180085_i;
private static final EntityRabbit.EnumMoveType[] $VALUES = new EntityRabbit.EnumMoveType[]{NONE, HOP, STEP, SPRINT, ATTACK};
private static final String __OBFID = "CL_00002239";
private EnumMoveType(String p_i45866_1_, int p_i45866_2_, float p_i45866_3_, float p_i45866_4_, int p_i45866_5_, int p_i45866_6_)
{
this.field_180076_f = p_i45866_3_;
this.field_180077_g = p_i45866_4_;
this.field_180084_h = p_i45866_5_;
this.field_180085_i = p_i45866_6_;
}
public float func_180072_a()
{
return this.field_180076_f;
}
public float func_180074_b()
{
return this.field_180077_g;
}
public int func_180075_c()
{
return this.field_180084_h;
}
public int func_180073_d()
{
return this.field_180085_i;
}
}
public class RabbitJumpHelper extends EntityJumpHelper
{
private EntityRabbit field_180070_c;
private boolean field_180068_d = false;
private static final String __OBFID = "CL_00002236";
public RabbitJumpHelper(EntityRabbit p_i45863_2_)
{
super(p_i45863_2_);
this.field_180070_c = p_i45863_2_;
}
public boolean func_180067_c()
{
return this.isJumping;
}
public boolean func_180065_d()
{
return this.field_180068_d;
}
public void func_180066_a(boolean p_180066_1_)
{
this.field_180068_d = p_180066_1_;
}
public void doJump()
{
if (this.isJumping)
{
this.field_180070_c.func_175524_b(EntityRabbit.EnumMoveType.STEP);
this.isJumping = false;
}
}
}
class RabbitMoveHelper extends EntityMoveHelper
{
private EntityRabbit field_179929_g = EntityRabbit.this;
private static final String __OBFID = "CL_00002235";
public RabbitMoveHelper()
{
super(EntityRabbit.this);
}
public void onUpdateMoveHelper()
{
if (this.field_179929_g.onGround && !this.field_179929_g.func_175523_cj())
{
this.field_179929_g.func_175515_b(0.0D);
}
super.onUpdateMoveHelper();
}
}
public static class RabbitTypeData implements IEntityLivingData
{
public int field_179427_a;
private static final String __OBFID = "CL_00002237";
public RabbitTypeData(int p_i45864_1_)
{
this.field_179427_a = p_i45864_1_;
}
}
}