001 package net.minecraft.src;
002
003 public class EntityPig extends EntityAnimal
004 {
005 private final EntityAIControlledByPlayer field_82184_d;
006
007 public EntityPig(World par1World)
008 {
009 super(par1World);
010 this.texture = "/mob/pig.png";
011 this.setSize(0.9F, 0.9F);
012 this.getNavigator().setAvoidsWater(true);
013 float var2 = 0.25F;
014 this.tasks.addTask(0, new EntityAISwimming(this));
015 this.tasks.addTask(1, new EntityAIPanic(this, 0.38F));
016 this.tasks.addTask(2, this.field_82184_d = new EntityAIControlledByPlayer(this, 0.34F));
017 this.tasks.addTask(3, new EntityAIMate(this, var2));
018 this.tasks.addTask(4, new EntityAITempt(this, 0.3F, Item.field_82793_bR.shiftedIndex, false));
019 this.tasks.addTask(4, new EntityAITempt(this, 0.3F, Item.field_82797_bK.shiftedIndex, false));
020 this.tasks.addTask(5, new EntityAIFollowParent(this, 0.28F));
021 this.tasks.addTask(6, new EntityAIWander(this, var2));
022 this.tasks.addTask(7, new EntityAIWatchClosest(this, EntityPlayer.class, 6.0F));
023 this.tasks.addTask(8, new EntityAILookIdle(this));
024 }
025
026 /**
027 * Returns true if the newer Entity AI code should be run
028 */
029 public boolean isAIEnabled()
030 {
031 return true;
032 }
033
034 public int getMaxHealth()
035 {
036 return 10;
037 }
038
039 protected void updateAITasks()
040 {
041 super.updateAITasks();
042 }
043
044 public boolean func_82171_bF()
045 {
046 ItemStack var1 = ((EntityPlayer)this.riddenByEntity).getHeldItem();
047 return var1 != null && var1.itemID == Item.field_82793_bR.shiftedIndex;
048 }
049
050 protected void entityInit()
051 {
052 super.entityInit();
053 this.dataWatcher.addObject(16, Byte.valueOf((byte)0));
054 }
055
056 /**
057 * (abstract) Protected helper method to write subclass entity data to NBT.
058 */
059 public void writeEntityToNBT(NBTTagCompound par1NBTTagCompound)
060 {
061 super.writeEntityToNBT(par1NBTTagCompound);
062 par1NBTTagCompound.setBoolean("Saddle", this.getSaddled());
063 }
064
065 /**
066 * (abstract) Protected helper method to read subclass entity data from NBT.
067 */
068 public void readEntityFromNBT(NBTTagCompound par1NBTTagCompound)
069 {
070 super.readEntityFromNBT(par1NBTTagCompound);
071 this.setSaddled(par1NBTTagCompound.getBoolean("Saddle"));
072 }
073
074 /**
075 * Returns the sound this mob makes while it's alive.
076 */
077 protected String getLivingSound()
078 {
079 return "mob.pig.say";
080 }
081
082 /**
083 * Returns the sound this mob makes when it is hurt.
084 */
085 protected String getHurtSound()
086 {
087 return "mob.pig.say";
088 }
089
090 /**
091 * Returns the sound this mob makes on death.
092 */
093 protected String getDeathSound()
094 {
095 return "mob.pig.death";
096 }
097
098 /**
099 * Plays step sound at given x, y, z for the entity
100 */
101 protected void playStepSound(int par1, int par2, int par3, int par4)
102 {
103 this.worldObj.playSoundAtEntity(this, "mob.pig.step", 0.15F, 1.0F);
104 }
105
106 /**
107 * Called when a player interacts with a mob. e.g. gets milk from a cow, gets into the saddle on a pig.
108 */
109 public boolean interact(EntityPlayer par1EntityPlayer)
110 {
111 if (super.interact(par1EntityPlayer))
112 {
113 return true;
114 }
115 else if (this.getSaddled() && !this.worldObj.isRemote && (this.riddenByEntity == null || this.riddenByEntity == par1EntityPlayer))
116 {
117 par1EntityPlayer.mountEntity(this);
118 return true;
119 }
120 else
121 {
122 return false;
123 }
124 }
125
126 /**
127 * Returns the item ID for the item the mob drops on death.
128 */
129 protected int getDropItemId()
130 {
131 return this.isBurning() ? Item.porkCooked.shiftedIndex : Item.porkRaw.shiftedIndex;
132 }
133
134 /**
135 * Drop 0-2 items of this living's type
136 */
137 protected void dropFewItems(boolean par1, int par2)
138 {
139 int var3 = this.rand.nextInt(3) + 1 + this.rand.nextInt(1 + par2);
140
141 for (int var4 = 0; var4 < var3; ++var4)
142 {
143 if (this.isBurning())
144 {
145 this.dropItem(Item.porkCooked.shiftedIndex, 1);
146 }
147 else
148 {
149 this.dropItem(Item.porkRaw.shiftedIndex, 1);
150 }
151 }
152
153 if (this.getSaddled())
154 {
155 this.dropItem(Item.saddle.shiftedIndex, 1);
156 }
157 }
158
159 /**
160 * Returns true if the pig is saddled.
161 */
162 public boolean getSaddled()
163 {
164 return (this.dataWatcher.getWatchableObjectByte(16) & 1) != 0;
165 }
166
167 /**
168 * Set or remove the saddle of the pig.
169 */
170 public void setSaddled(boolean par1)
171 {
172 if (par1)
173 {
174 this.dataWatcher.updateObject(16, Byte.valueOf((byte)1));
175 }
176 else
177 {
178 this.dataWatcher.updateObject(16, Byte.valueOf((byte)0));
179 }
180 }
181
182 /**
183 * Called when a lightning bolt hits the entity.
184 */
185 public void onStruckByLightning(EntityLightningBolt par1EntityLightningBolt)
186 {
187 if (!this.worldObj.isRemote)
188 {
189 EntityPigZombie var2 = new EntityPigZombie(this.worldObj);
190 var2.setLocationAndAngles(this.posX, this.posY, this.posZ, this.rotationYaw, this.rotationPitch);
191 this.worldObj.spawnEntityInWorld(var2);
192 this.setDead();
193 }
194 }
195
196 /**
197 * Called when the mob is falling. Calculates and applies fall damage.
198 */
199 protected void fall(float par1)
200 {
201 super.fall(par1);
202
203 if (par1 > 5.0F && this.riddenByEntity instanceof EntityPlayer)
204 {
205 ((EntityPlayer)this.riddenByEntity).triggerAchievement(AchievementList.flyPig);
206 }
207 }
208
209 /**
210 * This function is used when two same-species animals in 'love mode' breed to generate the new baby animal.
211 */
212 public EntityAnimal spawnBabyAnimal(EntityAnimal par1EntityAnimal)
213 {
214 return new EntityPig(this.worldObj);
215 }
216
217 /**
218 * Checks if the parameter is an wheat item.
219 */
220 public boolean isWheat(ItemStack par1ItemStack)
221 {
222 return par1ItemStack != null && par1ItemStack.itemID == Item.field_82797_bK.shiftedIndex;
223 }
224
225 public EntityAIControlledByPlayer func_82183_n()
226 {
227 return this.field_82184_d;
228 }
229 }