package net.minecraft.server;
import javax.annotation.Nullable;
public class EntityZombieVillager extends EntityZombie {
private static final DataWatcherObject<Boolean> b = DataWatcher.a(EntityZombieVillager.class, DataWatcherRegistry.h);
private static final DataWatcherObject<Integer> c = DataWatcher.a(EntityZombieVillager.class, DataWatcherRegistry.b);
private int conversionTime;
private int lastTick = MinecraftServer.currentTick; // CraftBukkit - add field
public EntityZombieVillager(World world) {
super(world);
}
protected void i() {
super.i();
this.datawatcher.register(EntityZombieVillager.b, Boolean.valueOf(false));
this.datawatcher.register(EntityZombieVillager.c, Integer.valueOf(0));
}
public void setProfession(int i) {
this.datawatcher.set(EntityZombieVillager.c, Integer.valueOf(i));
}
public int getProfession() {
return Math.max(((Integer) this.datawatcher.get(EntityZombieVillager.c)).intValue() % 6, 0);
}
public static void a(DataConverterManager dataconvertermanager) {
EntityInsentient.a(dataconvertermanager, EntityZombieVillager.class);
}
public void b(NBTTagCompound nbttagcompound) {
super.b(nbttagcompound);
nbttagcompound.setInt("Profession", this.getProfession());
nbttagcompound.setInt("ConversionTime", this.isConverting() ? this.conversionTime : -1);
}
public void a(NBTTagCompound nbttagcompound) {
super.a(nbttagcompound);
this.setProfession(nbttagcompound.getInt("Profession"));
if (nbttagcompound.hasKeyOfType("ConversionTime", 99) && nbttagcompound.getInt("ConversionTime") > -1) {
this.b(nbttagcompound.getInt("ConversionTime"));
}
}
@Nullable
public GroupDataEntity prepare(DifficultyDamageScaler difficultydamagescaler, @Nullable GroupDataEntity groupdataentity) {
this.setProfession(this.world.random.nextInt(6));
return super.prepare(difficultydamagescaler, groupdataentity);
}
public void A_() {
if (!this.world.isClientSide && this.isConverting()) {
int i = this.dq();
// CraftBukkit start - Use wall time instead of ticks for villager conversion
int elapsedTicks = MinecraftServer.currentTick - this.lastTick;
this.lastTick = MinecraftServer.currentTick;
i *= elapsedTicks;
// CraftBukkit end
this.conversionTime -= i;
if (this.conversionTime <= 0) {
this.dp();
}
}
super.A_();
}
public boolean a(EntityHuman entityhuman, EnumHand enumhand) {
ItemStack itemstack = entityhuman.b(enumhand);
if (itemstack.getItem() == Items.GOLDEN_APPLE && itemstack.getData() == 0 && this.hasEffect(MobEffects.WEAKNESS)) {
if (!entityhuman.abilities.canInstantlyBuild) {
itemstack.subtract(1);
}
if (!this.world.isClientSide) {
this.b(this.random.nextInt(2401) + 3600);
}
return true;
} else {
return false;
}
}
protected boolean isTypeNotPersistent() {
return !this.isConverting();
}
public boolean isConverting() {
return ((Boolean) this.getDataWatcher().get(EntityZombieVillager.b)).booleanValue();
}
protected void b(int i) {
this.conversionTime = i;
this.getDataWatcher().set(EntityZombieVillager.b, Boolean.valueOf(true));
this.removeEffect(MobEffects.WEAKNESS);
this.addEffect(new MobEffect(MobEffects.INCREASE_DAMAGE, i, Math.min(this.world.getDifficulty().a() - 1, 0)));
this.world.broadcastEntityEffect(this, (byte) 16);
}
protected void dp() {
EntityVillager entityvillager = new EntityVillager(this.world);
entityvillager.u(this);
entityvillager.setProfession(this.getProfession());
entityvillager.a(this.world.D(new BlockPosition(entityvillager)), (GroupDataEntity) null, false);
entityvillager.dl();
if (this.isBaby()) {
entityvillager.setAgeRaw(-24000);
}
this.world.kill(this);
entityvillager.setAI(this.hasAI());
if (this.hasCustomName()) {
entityvillager.setCustomName(this.getCustomName());
entityvillager.setCustomNameVisible(this.getCustomNameVisible());
}
this.world.addEntity(entityvillager, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.CURED); // CraftBukkit - add SpawnReason
entityvillager.addEffect(new MobEffect(MobEffects.CONFUSION, 200, 0));
this.world.a((EntityHuman) null, 1027, new BlockPosition((int) this.locX, (int) this.locY, (int) this.locZ), 0);
}
protected int dq() {
int i = 1;
if (this.random.nextFloat() < 0.01F) {
int j = 0;
BlockPosition.MutableBlockPosition blockposition_mutableblockposition = new BlockPosition.MutableBlockPosition();
for (int k = (int) this.locX - 4; k < (int) this.locX + 4 && j < 14; ++k) {
for (int l = (int) this.locY - 4; l < (int) this.locY + 4 && j < 14; ++l) {
for (int i1 = (int) this.locZ - 4; i1 < (int) this.locZ + 4 && j < 14; ++i1) {
Block block = this.world.getType(blockposition_mutableblockposition.c(k, l, i1)).getBlock();
if (block == Blocks.IRON_BARS || block == Blocks.BED) {
if (this.random.nextFloat() < 0.3F) {
++i;
}
++j;
}
}
}
}
}
return i;
}
protected float cj() {
return this.isBaby() ? (this.random.nextFloat() - this.random.nextFloat()) * 0.2F + 2.0F : (this.random.nextFloat() - this.random.nextFloat()) * 0.2F + 1.0F;
}
public SoundEffect G() {
return SoundEffects.it;
}
public SoundEffect bW() {
return SoundEffects.ix;
}
public SoundEffect bX() {
return SoundEffects.iw;
}
public SoundEffect di() {
return SoundEffects.iy;
}
@Nullable
protected MinecraftKey J() {
return LootTables.as;
}
protected ItemStack dj() {
return ItemStack.a;
}
}