package net.minecraft.server;
import com.google.common.base.Predicate;
import java.util.List;
import javax.annotation.Nullable;
public class EntityEvoker extends EntityMonster {
protected static final DataWatcherObject<Byte> a = DataWatcher.a(EntityEvoker.class, DataWatcherRegistry.a);
private int b;
private int c;
private EntitySheep bw;
public EntityEvoker(World world) {
super(world);
this.setSize(0.6F, 1.95F);
this.b_ = 10;
}
protected void r() {
super.r();
this.goalSelector.a(0, new PathfinderGoalFloat(this));
this.goalSelector.a(1, new EntityEvoker.b());
this.goalSelector.a(2, new PathfinderGoalAvoidTarget(this, EntityHuman.class, 8.0F, 0.6D, 1.0D));
this.goalSelector.a(4, new EntityEvoker.c(null));
this.goalSelector.a(5, new EntityEvoker.a(null));
this.goalSelector.a(6, new EntityEvoker.e());
this.goalSelector.a(8, new PathfinderGoalRandomStroll(this, 0.6D));
this.goalSelector.a(9, new PathfinderGoalLookAtPlayer(this, EntityHuman.class, 3.0F, 1.0F));
this.goalSelector.a(10, new PathfinderGoalLookAtPlayer(this, EntityInsentient.class, 8.0F));
this.targetSelector.a(1, new PathfinderGoalHurtByTarget(this, true, new Class[] { EntityEvoker.class}));
this.targetSelector.a(2, (new PathfinderGoalNearestAttackableTarget(this, EntityHuman.class, true)).b(300));
this.targetSelector.a(3, (new PathfinderGoalNearestAttackableTarget(this, EntityVillager.class, false)).b(300));
this.targetSelector.a(3, new PathfinderGoalNearestAttackableTarget(this, EntityIronGolem.class, false));
}
protected void initAttributes() {
super.initAttributes();
this.getAttributeInstance(GenericAttributes.MOVEMENT_SPEED).setValue(0.5D);
this.getAttributeInstance(GenericAttributes.FOLLOW_RANGE).setValue(12.0D);
this.getAttributeInstance(GenericAttributes.maxHealth).setValue(24.0D);
}
protected void i() {
super.i();
this.datawatcher.register(EntityEvoker.a, Byte.valueOf((byte) 0));
}
public static void a(DataConverterManager dataconvertermanager) {
EntityInsentient.a(dataconvertermanager, EntityEvoker.class);
}
public void a(NBTTagCompound nbttagcompound) {
super.a(nbttagcompound);
this.b = nbttagcompound.getInt("SpellTicks");
}
public void b(NBTTagCompound nbttagcompound) {
super.b(nbttagcompound);
nbttagcompound.setInt("SpellTicks", this.b);
}
public EnumMonsterType getMonsterType() {
return EnumMonsterType.ILLAGER;
}
protected MinecraftKey J() {
return LootTables.au;
}
public boolean o() {
return this.world.isClientSide ? ((Byte) this.datawatcher.get(EntityEvoker.a)).byteValue() > 0 : this.b > 0;
}
public void a(int i) {
this.datawatcher.set(EntityEvoker.a, Byte.valueOf((byte) i));
}
// CraftBukkit start
public int getSpell() {
return this.datawatcher.get(EntityEvoker.a).intValue();
}
// CraftBukkit end
private int di() {
return this.b;
}
protected void M() {
super.M();
if (this.b > 0) {
--this.b;
}
}
public void A_() {
super.A_();
if (this.world.isClientSide && this.o()) {
byte b0 = ((Byte) this.datawatcher.get(EntityEvoker.a)).byteValue();
double d0 = 0.7D;
double d1 = 0.5D;
double d2 = 0.2D;
if (b0 == 2) {
d0 = 0.4D;
d1 = 0.3D;
d2 = 0.35D;
} else if (b0 == 1) {
d0 = 0.7D;
d1 = 0.7D;
d2 = 0.8D;
}
float f = this.aN * 0.017453292F + MathHelper.cos((float) this.ticksLived * 0.6662F) * 0.25F;
float f1 = MathHelper.cos(f);
float f2 = MathHelper.sin(f);
this.world.addParticle(EnumParticle.SPELL_MOB, this.locX + (double) f1 * 0.6D, this.locY + 1.8D, this.locZ + (double) f2 * 0.6D, d0, d1, d2, new int[0]);
this.world.addParticle(EnumParticle.SPELL_MOB, this.locX - (double) f1 * 0.6D, this.locY + 1.8D, this.locZ - (double) f2 * 0.6D, d0, d1, d2, new int[0]);
}
}
public boolean r(Entity entity) {
return entity == null ? false : (entity == this ? true : (super.r(entity) ? true : (entity instanceof EntityVex ? this.r(((EntityVex) entity).o()) : (entity instanceof EntityLiving && ((EntityLiving) entity).getMonsterType() == EnumMonsterType.ILLAGER ? this.aQ() == null && entity.aQ() == null : false))));
}
protected SoundEffect G() {
return SoundEffects.bm;
}
protected SoundEffect bX() {
return SoundEffects.bo;
}
protected SoundEffect bW() {
return SoundEffects.bp;
}
private void a(@Nullable EntitySheep entitysheep) {
this.bw = entitysheep;
}
@Nullable
private EntitySheep dj() {
return this.bw;
}
public class e extends EntityEvoker.d {
final Predicate<EntitySheep> a = new Predicate() {
public boolean a(EntitySheep entitysheep) {
return entitysheep.getColor() == EnumColor.BLUE;
}
public boolean apply(Object object) {
return this.a((EntitySheep) object);
}
};
public e() {
super(null);
}
public boolean a() {
if (EntityEvoker.this.getGoalTarget() != null) {
return false;
} else if (EntityEvoker.this.o()) {
return false;
} else if (EntityEvoker.this.ticksLived < this.c) {
return false;
} else if (!EntityEvoker.this.world.getGameRules().getBoolean("mobGriefing")) {
return false;
} else {
List list = EntityEvoker.this.world.a(EntitySheep.class, EntityEvoker.this.getBoundingBox().grow(16.0D, 4.0D, 16.0D), this.a);
if (list.isEmpty()) {
return false;
} else {
EntityEvoker.this.a((EntitySheep) list.get(EntityEvoker.this.random.nextInt(list.size())));
return true;
}
}
}
public boolean b() {
return EntityEvoker.this.dj() != null && this.b > 0;
}
public void d() {
super.d();
EntityEvoker.this.a((EntitySheep) null);
}
protected void j() {
EntitySheep entitysheep = EntityEvoker.this.dj();
if (entitysheep != null && entitysheep.isAlive()) {
entitysheep.setColor(EnumColor.RED);
}
}
protected int m() {
return 40;
}
protected int f() {
return 60;
}
protected int i() {
return 140;
}
protected SoundEffect k() {
return SoundEffects.bs;
}
protected int l() {
return 3;
}
}
class c extends EntityEvoker.d {
private c() {
super(null);
}
public boolean a() {
if (!super.a()) {
return false;
} else {
int i = EntityEvoker.this.world.a(EntityVex.class, EntityEvoker.this.getBoundingBox().g(16.0D)).size();
return EntityEvoker.this.random.nextInt(8) + 1 > i;
}
}
protected int f() {
return 100;
}
protected int i() {
return 340;
}
protected void j() {
for (int i = 0; i < 3; ++i) {
BlockPosition blockposition = (new BlockPosition(EntityEvoker.this)).a(-2 + EntityEvoker.this.random.nextInt(5), 1, -2 + EntityEvoker.this.random.nextInt(5));
EntityVex entityvex = new EntityVex(EntityEvoker.this.world);
entityvex.setPositionRotation(blockposition, 0.0F, 0.0F);
entityvex.prepare(EntityEvoker.this.world.D(blockposition), (GroupDataEntity) null);
entityvex.a((EntityInsentient) EntityEvoker.this);
entityvex.g(blockposition);
entityvex.a(20 * (30 + EntityEvoker.this.random.nextInt(90)));
EntityEvoker.this.world.addEntity(entityvex);
}
}
protected SoundEffect k() {
return SoundEffects.br;
}
protected int l() {
return 1;
}
c(Object object) {
this();
}
}
class a extends EntityEvoker.d {
private a() {
super(null);
}
protected int f() {
return 40;
}
protected int i() {
return 100;
}
protected void j() {
EntityLiving entityliving = EntityEvoker.this.getGoalTarget();
double d0 = Math.min(entityliving.locY, EntityEvoker.this.locY);
double d1 = Math.max(entityliving.locY, EntityEvoker.this.locY) + 1.0D;
float f = (float) MathHelper.c(entityliving.locZ - EntityEvoker.this.locZ, entityliving.locX - EntityEvoker.this.locX);
int i;
if (EntityEvoker.this.h((Entity) entityliving) < 9.0D) {
float f1;
for (i = 0; i < 5; ++i) {
f1 = f + (float) i * 3.1415927F * 0.4F;
this.a(EntityEvoker.this.locX + (double) MathHelper.cos(f1) * 1.5D, EntityEvoker.this.locZ + (double) MathHelper.sin(f1) * 1.5D, d0, d1, f1, 0);
}
for (i = 0; i < 8; ++i) {
f1 = f + (float) i * 3.1415927F * 2.0F / 8.0F + 1.2566371F;
this.a(EntityEvoker.this.locX + (double) MathHelper.cos(f1) * 2.5D, EntityEvoker.this.locZ + (double) MathHelper.sin(f1) * 2.5D, d0, d1, f1, 3);
}
} else {
for (i = 0; i < 16; ++i) {
double d2 = 1.25D * (double) (i + 1);
int j = 1 * i;
this.a(EntityEvoker.this.locX + (double) MathHelper.cos(f) * d2, EntityEvoker.this.locZ + (double) MathHelper.sin(f) * d2, d0, d1, f, j);
}
}
}
private void a(double d0, double d1, double d2, double d3, float f, int i) {
BlockPosition blockposition = new BlockPosition(d0, d3, d1);
boolean flag = false;
double d4 = 0.0D;
do {
if (!EntityEvoker.this.world.d(blockposition, true) && EntityEvoker.this.world.d(blockposition.down(), true)) {
if (!EntityEvoker.this.world.isEmpty(blockposition)) {
IBlockData iblockdata = EntityEvoker.this.world.getType(blockposition);
AxisAlignedBB axisalignedbb = iblockdata.c(EntityEvoker.this.world, blockposition);
if (axisalignedbb != null) {
d4 = axisalignedbb.e;
}
}
flag = true;
break;
}
blockposition = blockposition.down();
} while (blockposition.getY() >= MathHelper.floor(d2) - 1);
if (flag) {
EntityEvokerFangs entityevokerfangs = new EntityEvokerFangs(EntityEvoker.this.world, d0, (double) blockposition.getY() + d4, d1, f, i, EntityEvoker.this);
EntityEvoker.this.world.addEntity(entityevokerfangs);
}
}
protected SoundEffect k() {
return SoundEffects.bq;
}
protected int l() {
return 2;
}
a(Object object) {
this();
}
}
abstract class d extends PathfinderGoal {
protected int b;
protected int c;
private d() {}
public boolean a() {
return EntityEvoker.this.getGoalTarget() == null ? false : (EntityEvoker.this.o() ? false : EntityEvoker.this.ticksLived >= this.c);
}
public boolean b() {
return EntityEvoker.this.getGoalTarget() != null && this.b > 0;
}
public void c() {
this.b = this.m();
EntityEvoker.this.b = this.f();
this.c = EntityEvoker.this.ticksLived + this.i();
EntityEvoker.this.a(this.k(), 1.0F, 1.0F);
EntityEvoker.this.c = this.l();
}
public void e() {
--this.b;
if (this.b == 0) {
this.j();
EntityEvoker.this.a(SoundEffects.bn, 1.0F, 1.0F);
}
}
protected abstract void j();
protected int m() {
return 20;
}
protected abstract int f();
protected abstract int i();
protected abstract SoundEffect k();
protected abstract int l();
d(Object object) {
this();
}
}
class b extends PathfinderGoal {
public b() {
this.a(3);
}
public boolean a() {
return EntityEvoker.this.di() > 0;
}
public void c() {
super.c();
EntityEvoker.this.a(EntityEvoker.this.c);
EntityEvoker.this.navigation.o();
}
public void d() {
super.d();
EntityEvoker.this.a(0);
}
public void e() {
if (EntityEvoker.this.getGoalTarget() != null) {
EntityEvoker.this.getControllerLook().a(EntityEvoker.this.getGoalTarget(), (float) EntityEvoker.this.cL(), (float) EntityEvoker.this.N());
} else if (EntityEvoker.this.dj() != null) {
EntityEvoker.this.getControllerLook().a(EntityEvoker.this.dj(), (float) EntityEvoker.this.cL(), (float) EntityEvoker.this.N());
}
}
}
}