package net.minecraft.entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumParticleTypes; import net.minecraft.util.MathHelper; import net.minecraft.world.World; public abstract class EntityAgeable extends EntityCreature { protected int field_175504_a; protected int field_175502_b; protected int field_175503_c; private float field_98056_d = -1.0F; private float field_98057_e; private static final String __OBFID = "CL_00001530"; public EntityAgeable(World worldIn) { super(worldIn); } public abstract EntityAgeable createChild(EntityAgeable p_90011_1_); /** * Called when a player interacts with a mob. e.g. gets milk from a cow, gets into the saddle on a pig. */ public boolean interact(EntityPlayer p_70085_1_) { ItemStack var2 = p_70085_1_.inventory.getCurrentItem(); if (var2 != null && var2.getItem() == Items.spawn_egg) { if (!this.worldObj.isRemote) { Class var3 = EntityList.getClassFromID(var2.getMetadata()); if (var3 != null && this.getClass() == var3) { EntityAgeable var4 = this.createChild(this); if (var4 != null) { var4.setGrowingAge(-24000); var4.setLocationAndAngles(this.posX, this.posY, this.posZ, 0.0F, 0.0F); this.worldObj.spawnEntityInWorld(var4); if (var2.hasDisplayName()) { var4.setCustomNameTag(var2.getDisplayName()); } if (!p_70085_1_.capabilities.isCreativeMode) { --var2.stackSize; if (var2.stackSize <= 0) { p_70085_1_.inventory.setInventorySlotContents(p_70085_1_.inventory.currentItem, (ItemStack)null); } } } } } return true; } else { return false; } } protected void entityInit() { super.entityInit(); this.dataWatcher.addObject(12, Byte.valueOf((byte)0)); } /** * The age value may be negative or positive or zero. If it's negative, it get's incremented on each tick, if it's * positive, it get's decremented each tick. Don't confuse this with EntityLiving.getAge. With a negative value the * Entity is considered a child. */ public int getGrowingAge() { return this.worldObj.isRemote ? this.dataWatcher.getWatchableObjectByte(12) : this.field_175504_a; } public void func_175501_a(int p_175501_1_, boolean p_175501_2_) { int var3 = this.getGrowingAge(); int var4 = var3; var3 += p_175501_1_ * 20; if (var3 > 0) { var3 = 0; if (var4 < 0) { this.func_175500_n(); } } int var5 = var3 - var4; this.setGrowingAge(var3); if (p_175501_2_) { this.field_175502_b += var5; if (this.field_175503_c == 0) { this.field_175503_c = 40; } } if (this.getGrowingAge() == 0) { this.setGrowingAge(this.field_175502_b); } } /** * "Adds the value of the parameter times 20 to the age of this entity. If the entity is an adult (if the entity's * age is greater than 0), it will have no effect." */ public void addGrowth(int p_110195_1_) { this.func_175501_a(p_110195_1_, false); } /** * The age value may be negative or positive or zero. If it's negative, it get's incremented on each tick, if it's * positive, it get's decremented each tick. With a negative value the Entity is considered a child. */ public void setGrowingAge(int p_70873_1_) { this.dataWatcher.updateObject(12, Byte.valueOf((byte)MathHelper.clamp_int(p_70873_1_, -1, 1))); this.field_175504_a = p_70873_1_; this.setScaleForAge(this.isChild()); } /** * (abstract) Protected helper method to write subclass entity data to NBT. */ public void writeEntityToNBT(NBTTagCompound tagCompound) { super.writeEntityToNBT(tagCompound); tagCompound.setInteger("Age", this.getGrowingAge()); tagCompound.setInteger("ForcedAge", this.field_175502_b); } /** * (abstract) Protected helper method to read subclass entity data from NBT. */ public void readEntityFromNBT(NBTTagCompound tagCompund) { super.readEntityFromNBT(tagCompund); this.setGrowingAge(tagCompund.getInteger("Age")); this.field_175502_b = tagCompund.getInteger("ForcedAge"); } /** * 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.worldObj.isRemote) { if (this.field_175503_c > 0) { if (this.field_175503_c % 4 == 0) { this.worldObj.spawnParticle(EnumParticleTypes.VILLAGER_HAPPY, 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[0]); } --this.field_175503_c; } this.setScaleForAge(this.isChild()); } else { int var1 = this.getGrowingAge(); if (var1 < 0) { ++var1; this.setGrowingAge(var1); if (var1 == 0) { this.func_175500_n(); } } else if (var1 > 0) { --var1; this.setGrowingAge(var1); } } } protected void func_175500_n() {} /** * If Animal, checks if the age timer is negative */ public boolean isChild() { return this.getGrowingAge() < 0; } /** * "Sets the scale for an ageable entity according to the boolean parameter, which says if it's a child." */ public void setScaleForAge(boolean p_98054_1_) { this.setScale(p_98054_1_ ? 0.5F : 1.0F); } /** * Sets the width and height of the entity. Args: width, height */ protected final void setSize(float width, float height) { boolean var3 = this.field_98056_d > 0.0F; this.field_98056_d = width; this.field_98057_e = height; if (!var3) { this.setScale(1.0F); } } protected final void setScale(float p_98055_1_) { super.setSize(this.field_98056_d * p_98055_1_, this.field_98057_e * p_98055_1_); } }