    001    package net.minecraft.entity;
    002
    003    import net.minecraft.entity.player.EntityPlayer;
    004    import net.minecraft.item.Item;
    005    import net.minecraft.item.ItemStack;
    006    import net.minecraft.nbt.NBTTagCompound;
    007    import net.minecraft.world.World;
    008
    009    public abstract class EntityAgeable extends EntityCreature
    010    {
    011        public EntityAgeable(World par1World)
    012        {
    013            super(par1World);
    014        }
    015
    016        public abstract EntityAgeable func_90011_a(EntityAgeable var1);
    017
    018        /**
    019         * Called when a player interacts with a mob. e.g. gets milk from a cow, gets into the saddle on a pig.
    020         */
    021        public boolean interact(EntityPlayer par1EntityPlayer)
    022        {
    023            ItemStack var2 = par1EntityPlayer.inventory.getCurrentItem();
    024
    025            if (var2 != null && var2.itemID == Item.monsterPlacer.shiftedIndex && !this.worldObj.isRemote)
    026            {
    027                Class var3 = EntityList.getClassFromID(var2.getItemDamage());
    028
    029                if (var3 != null && var3.isAssignableFrom(this.getClass()))
    030                {
    031                    EntityAgeable var4 = this.func_90011_a(this);
    032
    033                    if (var4 != null)
    034                    {
    035                        var4.setGrowingAge(-24000);
    036                        var4.setLocationAndAngles(this.posX, this.posY, this.posZ, 0.0F, 0.0F);
    037                        this.worldObj.spawnEntityInWorld(var4);
    038
    039                        if (!par1EntityPlayer.capabilities.isCreativeMode)
    040                        {
    041                            --var2.stackSize;
    042
    043                            if (var2.stackSize <= 0)
    044                            {
    045                                par1EntityPlayer.inventory.setInventorySlotContents(par1EntityPlayer.inventory.currentItem, (ItemStack)null);
    046                            }
    047                        }
    048                    }
    049                }
    050            }
    051
    052            return super.interact(par1EntityPlayer);
    053        }
    054
    055        protected void entityInit()
    056        {
    057            super.entityInit();
    058            this.dataWatcher.addObject(12, new Integer(0));
    059        }
    060
    061        /**
    062         * The age value may be negative or positive or zero. If it's negative, it get's incremented on each tick, if it's
    063         * positive, it get's decremented each tick. Don't confuse this with EntityLiving.getAge. With a negative value the
    064         * Entity is considered a child.
    065         */
    066        public int getGrowingAge()
    067        {
    068            return this.dataWatcher.getWatchableObjectInt(12);
    069        }
    070
    071        /**
    072         * The age value may be negative or positive or zero. If it's negative, it get's incremented on each tick, if it's
    073         * positive, it get's decremented each tick. With a negative value the Entity is considered a child.
    074         */
    075        public void setGrowingAge(int par1)
    076        {
    077            this.dataWatcher.updateObject(12, Integer.valueOf(par1));
    078        }
    079
    080        /**
    081         * (abstract) Protected helper method to write subclass entity data to NBT.
    082         */
    083        public void writeEntityToNBT(NBTTagCompound par1NBTTagCompound)
    084        {
    085            super.writeEntityToNBT(par1NBTTagCompound);
    086            par1NBTTagCompound.setInteger("Age", this.getGrowingAge());
    087        }
    088
    089        /**
    090         * (abstract) Protected helper method to read subclass entity data from NBT.
    091         */
    092        public void readEntityFromNBT(NBTTagCompound par1NBTTagCompound)
    093        {
    094            super.readEntityFromNBT(par1NBTTagCompound);
    095            this.setGrowingAge(par1NBTTagCompound.getInteger("Age"));
    096        }
    097
    098        /**
    099         * Called frequently so the entity can update its state every tick as required. For example, zombies and skeletons
    100         * use this to react to sunlight and start to burn.
    101         */
    102        public void onLivingUpdate()
    103        {
    104            super.onLivingUpdate();
    105            int var1 = this.getGrowingAge();
    106
    107            if (var1 < 0)
    108            {
    109                ++var1;
    110                this.setGrowingAge(var1);
    111            }
    112            else if (var1 > 0)
    113            {
    114                --var1;
    115                this.setGrowingAge(var1);
    116            }
    117        }
    118
    119        /**
    120         * If Animal, checks if the age timer is negative
    121         */
    122        public boolean isChild()
    123        {
    124            return this.getGrowingAge() < 0;
    125        }
    126    }