    001package net.minecraft.entity;
    002
    003import net.minecraft.entity.player.EntityPlayer;
    004import net.minecraft.item.Item;
    005import net.minecraft.item.ItemStack;
    006import net.minecraft.nbt.NBTTagCompound;
    007import net.minecraft.world.World;
    008
    009public abstract class EntityAgeable extends EntityCreature
    010{
    011    private float field_98056_d = -1.0F;
    012    private float field_98057_e;
    013
    014    public EntityAgeable(World par1World)
    015    {
    016        super(par1World);
    017    }
    018
    019    public abstract EntityAgeable createChild(EntityAgeable entityageable);
    020
    021    /**
    022     * Called when a player interacts with a mob. e.g. gets milk from a cow, gets into the saddle on a pig.
    023     */
    024    public boolean interact(EntityPlayer par1EntityPlayer)
    025    {
    026        ItemStack itemstack = par1EntityPlayer.inventory.getCurrentItem();
    027
    028        if (itemstack != null && itemstack.itemID == Item.monsterPlacer.itemID && !this.worldObj.isRemote)
    029        {
    030            Class oclass = EntityList.getClassFromID(itemstack.getItemDamage());
    031
    032            if (oclass != null && oclass.isAssignableFrom(this.getClass()))
    033            {
    034                EntityAgeable entityageable = this.createChild(this);
    035
    036                if (entityageable != null)
    037                {
    038                    entityageable.setGrowingAge(-24000);
    039                    entityageable.setLocationAndAngles(this.posX, this.posY, this.posZ, 0.0F, 0.0F);
    040                    this.worldObj.spawnEntityInWorld(entityageable);
    041
    042                    if (itemstack.hasDisplayName())
    043                    {
    044                        entityageable.func_94058_c(itemstack.getDisplayName());
    045                    }
    046
    047                    if (!par1EntityPlayer.capabilities.isCreativeMode)
    048                    {
    049                        --itemstack.stackSize;
    050
    051                        if (itemstack.stackSize <= 0)
    052                        {
    053                            par1EntityPlayer.inventory.setInventorySlotContents(par1EntityPlayer.inventory.currentItem, (ItemStack)null);
    054                        }
    055                    }
    056                }
    057            }
    058        }
    059
    060        return super.interact(par1EntityPlayer);
    061    }
    062
    063    protected void entityInit()
    064    {
    065        super.entityInit();
    066        this.dataWatcher.addObject(12, new Integer(0));
    067    }
    068
    069    /**
    070     * The age value may be negative or positive or zero. If it's negative, it get's incremented on each tick, if it's
    071     * positive, it get's decremented each tick. Don't confuse this with EntityLiving.getAge. With a negative value the
    072     * Entity is considered a child.
    073     */
    074    public int getGrowingAge()
    075    {
    076        return this.dataWatcher.getWatchableObjectInt(12);
    077    }
    078
    079    /**
    080     * The age value may be negative or positive or zero. If it's negative, it get's incremented on each tick, if it's
    081     * positive, it get's decremented each tick. With a negative value the Entity is considered a child.
    082     */
    083    public void setGrowingAge(int par1)
    084    {
    085        this.dataWatcher.updateObject(12, Integer.valueOf(par1));
    086        this.func_98054_a(this.isChild());
    087    }
    088
    089    /**
    090     * (abstract) Protected helper method to write subclass entity data to NBT.
    091     */
    092    public void writeEntityToNBT(NBTTagCompound par1NBTTagCompound)
    093    {
    094        super.writeEntityToNBT(par1NBTTagCompound);
    095        par1NBTTagCompound.setInteger("Age", this.getGrowingAge());
    096    }
    097
    098    /**
    099     * (abstract) Protected helper method to read subclass entity data from NBT.
    100     */
    101    public void readEntityFromNBT(NBTTagCompound par1NBTTagCompound)
    102    {
    103        super.readEntityFromNBT(par1NBTTagCompound);
    104        this.setGrowingAge(par1NBTTagCompound.getInteger("Age"));
    105    }
    106
    107    /**
    108     * Called frequently so the entity can update its state every tick as required. For example, zombies and skeletons
    109     * use this to react to sunlight and start to burn.
    110     */
    111    public void onLivingUpdate()
    112    {
    113        super.onLivingUpdate();
    114
    115        if (this.worldObj.isRemote)
    116        {
    117            this.func_98054_a(this.isChild());
    118        }
    119        else
    120        {
    121            int i = this.getGrowingAge();
    122
    123            if (i < 0)
    124            {
    125                ++i;
    126                this.setGrowingAge(i);
    127            }
    128            else if (i > 0)
    129            {
    130                --i;
    131                this.setGrowingAge(i);
    132            }
    133        }
    134    }
    135
    136    /**
    137     * If Animal, checks if the age timer is negative
    138     */
    139    public boolean isChild()
    140    {
    141        return this.getGrowingAge() < 0;
    142    }
    143
    144    public void func_98054_a(boolean par1)
    145    {
    146        this.func_98055_j(par1 ? 0.5F : 1.0F);
    147    }
    148
    149    /**
    150     * Sets the width and height of the entity. Args: width, height
    151     */
    152    protected final void setSize(float par1, float par2)
    153    {
    154        boolean flag = this.field_98056_d > 0.0F;
    155        this.field_98056_d = par1;
    156        this.field_98057_e = par2;
    157
    158        if (!flag)
    159        {
    160            this.func_98055_j(1.0F);
    161        }
    162    }
    163
    164    private void func_98055_j(float par1)
    165    {
    166        super.setSize(this.field_98056_d * par1, this.field_98057_e * par1);
    167    }
    168}