package net.minecraft.server;
import javax.annotation.Nullable;
public class EntityRabbit extends EntityAnimal {
private static final DataWatcherObject<Integer> bw = DataWatcher.a(EntityRabbit.class, DataWatcherRegistry.b);
private int bx;
private int by;
private boolean bA;
private int bB;
private int bC;
public EntityRabbit(World world) {
super(world);
this.setSize(0.4F, 0.5F);
this.g = new EntityRabbit.ControllerJumpRabbit(this);
this.moveController = new EntityRabbit.ControllerMoveRabbit(this);
this.initializePathFinderGoals(); // CraftBukkit - moved code
}
// CraftBukkit start - code from constructor
public void initializePathFinderGoals(){
this.c(0.0D);
}
// CraftBukkit end
protected void r() {
this.goalSelector.a(1, new PathfinderGoalFloat(this));
this.goalSelector.a(1, new EntityRabbit.PathfinderGoalRabbitPanic(this, 2.2D));
this.goalSelector.a(2, new PathfinderGoalBreed(this, 0.8D));
this.goalSelector.a(3, new PathfinderGoalTempt(this, 1.0D, Items.CARROT, false));
this.goalSelector.a(3, new PathfinderGoalTempt(this, 1.0D, Items.GOLDEN_CARROT, false));
this.goalSelector.a(3, new PathfinderGoalTempt(this, 1.0D, Item.getItemOf(Blocks.YELLOW_FLOWER), false));
this.goalSelector.a(4, new EntityRabbit.PathfinderGoalRabbitAvoidTarget(this, EntityHuman.class, 8.0F, 2.2D, 2.2D));
this.goalSelector.a(4, new EntityRabbit.PathfinderGoalRabbitAvoidTarget(this, EntityWolf.class, 10.0F, 2.2D, 2.2D));
this.goalSelector.a(4, new EntityRabbit.PathfinderGoalRabbitAvoidTarget(this, EntityMonster.class, 4.0F, 2.2D, 2.2D));
this.goalSelector.a(5, new EntityRabbit.PathfinderGoalEatCarrots(this));
this.goalSelector.a(6, new PathfinderGoalRandomStrollLand(this, 0.6D));
this.goalSelector.a(11, new PathfinderGoalLookAtPlayer(this, EntityHuman.class, 10.0F));
}
protected float cl() {
if (!this.positionChanged && (!this.moveController.a() || this.moveController.e() <= this.locY + 0.5D)) {
PathEntity pathentity = this.navigation.k();
if (pathentity != null && pathentity.e() < pathentity.d()) {
Vec3D vec3d = pathentity.a((Entity) this);
if (vec3d.y > this.locY + 0.5D) {
return 0.5F;
}
}
return this.moveController.b() <= 0.6D ? 0.2F : 0.3F;
} else {
return 0.5F;
}
}
protected void cm() {
super.cm();
double d0 = this.moveController.b();
if (d0 > 0.0D) {
double d1 = this.motX * this.motX + this.motZ * this.motZ;
if (d1 < 0.010000000000000002D) {
this.a(0.0F, 1.0F, 0.1F);
}
}
if (!this.world.isClientSide) {
this.world.broadcastEntityEffect(this, (byte) 1);
}
}
public void c(double d0) {
this.getNavigation().a(d0);
this.moveController.a(this.moveController.d(), this.moveController.e(), this.moveController.f(), d0);
}
public void l(boolean flag) {
super.l(flag);
if (flag) {
this.a(this.di(), this.ci(), ((this.random.nextFloat() - this.random.nextFloat()) * 0.2F + 1.0F) * 0.8F);
}
}
public void dh() {
this.l(true);
this.by = 10;
this.bx = 0;
}
protected void i() {
super.i();
this.datawatcher.register(EntityRabbit.bw, Integer.valueOf(0));
}
public void M() {
if (this.bB > 0) {
--this.bB;
}
if (this.bC > 0) {
this.bC -= this.random.nextInt(3);
if (this.bC < 0) {
this.bC = 0;
}
}
if (this.onGround) {
if (!this.bA) {
this.l(false);
this.dr();
}
if (this.getRabbitType() == 99 && this.bB == 0) {
EntityLiving entityliving = this.getGoalTarget();
if (entityliving != null && this.h(entityliving) < 16.0D) {
this.a(entityliving.locX, entityliving.locZ);
this.moveController.a(entityliving.locX, entityliving.locY, entityliving.locZ, this.moveController.b());
this.dh();
this.bA = true;
}
}
EntityRabbit.ControllerJumpRabbit entityrabbit_controllerjumprabbit = (EntityRabbit.ControllerJumpRabbit) this.g;
if (!entityrabbit_controllerjumprabbit.c()) {
if (this.moveController.a() && this.bB == 0) {
PathEntity pathentity = this.navigation.k();
Vec3D vec3d = new Vec3D(this.moveController.d(), this.moveController.e(), this.moveController.f());
if (pathentity != null && pathentity.e() < pathentity.d()) {
vec3d = pathentity.a((Entity) this);
}
this.a(vec3d.x, vec3d.z);
this.dh();
}
} else if (!entityrabbit_controllerjumprabbit.d()) {
this.dl();
}
}
this.bA = this.onGround;
}
public void am() {}
private void a(double d0, double d1) {
this.yaw = (float) (MathHelper.c(d1 - this.locZ, d0 - this.locX) * 57.2957763671875D) - 90.0F;
}
private void dl() {
((EntityRabbit.ControllerJumpRabbit) this.g).a(true);
}
private void dp() {
((EntityRabbit.ControllerJumpRabbit) this.g).a(false);
}
private void dq() {
if (this.moveController.b() < 2.2D) {
this.bB = 10;
} else {
this.bB = 1;
}
}
private void dr() {
this.dq();
this.dp();
}
public void n() {
super.n();
if (this.bx != this.by) {
++this.bx;
} else if (this.by != 0) {
this.bx = 0;
this.by = 0;
this.l(false);
}
}
protected void initAttributes() {
super.initAttributes();
this.getAttributeInstance(GenericAttributes.maxHealth).setValue(3.0D);
this.getAttributeInstance(GenericAttributes.MOVEMENT_SPEED).setValue(0.30000001192092896D);
}
public static void a(DataConverterManager dataconvertermanager) {
EntityInsentient.a(dataconvertermanager, EntityRabbit.class);
}
public void b(NBTTagCompound nbttagcompound) {
super.b(nbttagcompound);
nbttagcompound.setInt("RabbitType", this.getRabbitType());
nbttagcompound.setInt("MoreCarrotTicks", this.bC);
}
public void a(NBTTagCompound nbttagcompound) {
super.a(nbttagcompound);
this.setRabbitType(nbttagcompound.getInt("RabbitType"));
this.bC = nbttagcompound.getInt("MoreCarrotTicks");
}
protected SoundEffect di() {
return SoundEffects.eY;
}
protected SoundEffect G() {
return SoundEffects.eU;
}
protected SoundEffect bW() {
return SoundEffects.eX;
}
protected SoundEffect bX() {
return SoundEffects.eW;
}
public boolean B(Entity entity) {
if (this.getRabbitType() == 99) {
this.a(SoundEffects.eV, 1.0F, (this.random.nextFloat() - this.random.nextFloat()) * 0.2F + 1.0F);
return entity.damageEntity(DamageSource.mobAttack(this), 8.0F);
} else {
return entity.damageEntity(DamageSource.mobAttack(this), 3.0F);
}
}
public SoundCategory bC() {
return this.getRabbitType() == 99 ? SoundCategory.HOSTILE : SoundCategory.NEUTRAL;
}
public boolean damageEntity(DamageSource damagesource, float f) {
return this.isInvulnerable(damagesource) ? false : super.damageEntity(damagesource, f);
}
@Nullable
protected MinecraftKey J() {
return LootTables.C;
}
private boolean a(Item item) {
return item == Items.CARROT || item == Items.GOLDEN_CARROT || item == Item.getItemOf(Blocks.YELLOW_FLOWER);
}
public EntityRabbit b(EntityAgeable entityageable) {
EntityRabbit entityrabbit = new EntityRabbit(this.world);
int i = this.ds();
if (this.random.nextInt(20) != 0) {
if (entityageable instanceof EntityRabbit && this.random.nextBoolean()) {
i = ((EntityRabbit) entityageable).getRabbitType();
} else {
i = this.getRabbitType();
}
}
entityrabbit.setRabbitType(i);
return entityrabbit;
}
public boolean e(ItemStack itemstack) {
return this.a(itemstack.getItem());
}
public int getRabbitType() {
return ((Integer) this.datawatcher.get(EntityRabbit.bw)).intValue();
}
public void setRabbitType(int i) {
if (i == 99) {
this.getAttributeInstance(GenericAttributes.g).setValue(8.0D);
this.goalSelector.a(4, new EntityRabbit.PathfinderGoalKillerRabbitMeleeAttack(this));
this.targetSelector.a(1, new PathfinderGoalHurtByTarget(this, false, new Class[0]));
this.targetSelector.a(2, new PathfinderGoalNearestAttackableTarget(this, EntityHuman.class, true));
this.targetSelector.a(2, new PathfinderGoalNearestAttackableTarget(this, EntityWolf.class, true));
if (!this.hasCustomName()) {
this.setCustomName(LocaleI18n.get("entity.KillerBunny.name"));
}
}
this.datawatcher.set(EntityRabbit.bw, Integer.valueOf(i));
}
@Nullable
public GroupDataEntity prepare(DifficultyDamageScaler difficultydamagescaler, @Nullable GroupDataEntity groupdataentity) {
Object object = super.prepare(difficultydamagescaler, groupdataentity);
int i = this.ds();
boolean flag = false;
if (object instanceof EntityRabbit.GroupDataRabbit) {
i = ((EntityRabbit.GroupDataRabbit) object).a;
flag = true;
} else {
object = new EntityRabbit.GroupDataRabbit(i);
}
this.setRabbitType(i);
if (flag) {
this.setAgeRaw(-24000);
}
return (GroupDataEntity) object;
}
private int ds() {
BiomeBase biomebase = this.world.getBiome(new BlockPosition(this));
int i = this.random.nextInt(100);
return biomebase.p() ? (i < 80 ? 1 : 3) : (biomebase instanceof BiomeDesert ? 4 : (i < 50 ? 0 : (i < 90 ? 5 : 2)));
}
private boolean dt() {
return this.bC == 0;
}
protected void dk() {
BlockCarrots blockcarrots = (BlockCarrots) Blocks.CARROTS;
IBlockData iblockdata = blockcarrots.setAge(blockcarrots.g());
this.world.addParticle(EnumParticle.BLOCK_DUST, this.locX + (double) (this.random.nextFloat() * this.width * 2.0F) - (double) this.width, this.locY + 0.5D + (double) (this.random.nextFloat() * this.length), this.locZ + (double) (this.random.nextFloat() * this.width * 2.0F) - (double) this.width, 0.0D, 0.0D, 0.0D, new int[] { Block.getCombinedId(iblockdata)});
this.bC = 40;
}
public EntityAgeable createChild(EntityAgeable entityageable) {
return this.b(entityageable);
}
static class PathfinderGoalKillerRabbitMeleeAttack extends PathfinderGoalMeleeAttack {
public PathfinderGoalKillerRabbitMeleeAttack(EntityRabbit entityrabbit) {
super(entityrabbit, 1.4D, true);
}
protected double a(EntityLiving entityliving) {
return (double) (4.0F + entityliving.width);
}
}
static class PathfinderGoalRabbitPanic extends PathfinderGoalPanic {
private final EntityRabbit b;
public PathfinderGoalRabbitPanic(EntityRabbit entityrabbit, double d0) {
super(entityrabbit, d0);
this.b = entityrabbit;
}
public void e() {
super.e();
this.b.c(this.a);
}
}
static class PathfinderGoalEatCarrots extends PathfinderGoalGotoTarget {
private final EntityRabbit c;
private boolean d;
private boolean e;
public PathfinderGoalEatCarrots(EntityRabbit entityrabbit) {
super(entityrabbit, 0.699999988079071D, 16);
this.c = entityrabbit;
}
public boolean a() {
if (this.a <= 0) {
if (!this.c.world.getGameRules().getBoolean("mobGriefing")) {
return false;
}
this.e = false;
this.d = this.c.dt();
this.d = true;
}
return super.a();
}
public boolean b() {
return this.e && super.b();
}
public void e() {
super.e();
this.c.getControllerLook().a((double) this.b.getX() + 0.5D, (double) (this.b.getY() + 1), (double) this.b.getZ() + 0.5D, 10.0F, (float) this.c.N());
if (this.f()) {
World world = this.c.world;
BlockPosition blockposition = this.b.up();
IBlockData iblockdata = world.getType(blockposition);
Block block = iblockdata.getBlock();
if (this.e && block instanceof BlockCarrots) {
Integer integer = (Integer) iblockdata.get(BlockCarrots.AGE);
if (integer.intValue() == 0) {
// CraftBukkit start
if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.c, blockposition, Blocks.AIR, 0).isCancelled()) {
return;
}
// CraftBukkit end
world.setTypeAndData(blockposition, Blocks.AIR.getBlockData(), 2);
world.setAir(blockposition, true);
} else {
// CraftBukkit start
if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(
this.c,
blockposition,
block, block.toLegacyData(iblockdata.set(BlockCarrots.AGE, Integer.valueOf(integer.intValue() - 1)))
).isCancelled()) {
return;
}
// CraftBukkit end
world.setTypeAndData(blockposition, iblockdata.set(BlockCarrots.AGE, Integer.valueOf(integer.intValue() - 1)), 2);
world.triggerEffect(2001, blockposition, Block.getCombinedId(iblockdata));
}
this.c.dk();
}
this.e = false;
this.a = 10;
}
}
protected boolean a(World world, BlockPosition blockposition) {
Block block = world.getType(blockposition).getBlock();
if (block == Blocks.FARMLAND && this.d && !this.e) {
blockposition = blockposition.up();
IBlockData iblockdata = world.getType(blockposition);
block = iblockdata.getBlock();
if (block instanceof BlockCarrots && ((BlockCarrots) block).A(iblockdata)) {
this.e = true;
return true;
}
}
return false;
}
}
static class PathfinderGoalRabbitAvoidTarget<T extends Entity> extends PathfinderGoalAvoidTarget<T> {
private final EntityRabbit c;
public PathfinderGoalRabbitAvoidTarget(EntityRabbit entityrabbit, Class<T> oclass, float f, double d0, double d1) {
super(entityrabbit, oclass, f, d0, d1);
this.c = entityrabbit;
}
public boolean a() {
return this.c.getRabbitType() != 99 && super.a();
}
}
static class ControllerMoveRabbit extends ControllerMove {
private final EntityRabbit i;
private double j;
public ControllerMoveRabbit(EntityRabbit entityrabbit) {
super(entityrabbit);
this.i = entityrabbit;
}
public void c() {
if (this.i.onGround && !this.i.bd && !((EntityRabbit.ControllerJumpRabbit) this.i.g).c()) {
this.i.c(0.0D);
} else if (this.a()) {
this.i.c(this.j);
}
super.c();
}
public void a(double d0, double d1, double d2, double d3) {
if (this.i.isInWater()) {
d3 = 1.5D;
}
super.a(d0, d1, d2, d3);
if (d3 > 0.0D) {
this.j = d3;
}
}
}
public class ControllerJumpRabbit extends ControllerJump {
private final EntityRabbit c;
private boolean d;
public ControllerJumpRabbit(EntityRabbit entityrabbit) {
super(entityrabbit);
this.c = entityrabbit;
}
public boolean c() {
return this.a;
}
public boolean d() {
return this.d;
}
public void a(boolean flag) {
this.d = flag;
}
public void b() {
if (this.a) {
this.c.dh();
this.a = false;
}
}
}
public static class GroupDataRabbit implements GroupDataEntity {
public int a;
public GroupDataRabbit(int i) {
this.a = i;
}
}
}