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 createChild(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.itemID && !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.createChild(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    }