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