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 }