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 }