001 package net.minecraft.src;
002
003 import cpw.mods.fml.common.Side;
004 import cpw.mods.fml.common.asm.SideOnly;
005 import java.util.List;
006
007 public class EntityPigZombie extends EntityZombie
008 {
009 /** Above zero if this PigZombie is Angry. */
010 private int angerLevel = 0;
011
012 /** A random delay until this PigZombie next makes a sound. */
013 private int randomSoundDelay = 0;
014
015 public EntityPigZombie(World par1World)
016 {
017 super(par1World);
018 this.texture = "/mob/pigzombie.png";
019 this.moveSpeed = 0.5F;
020 this.isImmuneToFire = true;
021 }
022
023 /**
024 * Returns true if the newer Entity AI code should be run
025 */
026 protected boolean isAIEnabled()
027 {
028 return false;
029 }
030
031 /**
032 * Called to update the entity's position/logic.
033 */
034 public void onUpdate()
035 {
036 this.moveSpeed = this.entityToAttack != null ? 0.95F : 0.5F;
037
038 if (this.randomSoundDelay > 0 && --this.randomSoundDelay == 0)
039 {
040 this.func_85030_a("mob.zombiepig.zpigangry", this.getSoundVolume() * 2.0F, ((this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F) * 1.8F);
041 }
042
043 super.onUpdate();
044 }
045
046 @SideOnly(Side.CLIENT)
047
048 /**
049 * Returns the texture's file path as a String.
050 */
051 public String getTexture()
052 {
053 return "/mob/pigzombie.png";
054 }
055
056 /**
057 * Checks if the entity's current position is a valid location to spawn this entity.
058 */
059 public boolean getCanSpawnHere()
060 {
061 return this.worldObj.difficultySetting > 0 && this.worldObj.checkIfAABBIsClear(this.boundingBox) && this.worldObj.getCollidingBoundingBoxes(this, this.boundingBox).isEmpty() && !this.worldObj.isAnyLiquid(this.boundingBox);
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.setShort("Anger", (short)this.angerLevel);
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.angerLevel = par1NBTTagCompound.getShort("Anger");
080 }
081
082 /**
083 * Finds the closest player within 16 blocks to attack, or null if this Entity isn't interested in attacking
084 * (Animals, Spiders at day, peaceful PigZombies).
085 */
086 protected Entity findPlayerToAttack()
087 {
088 return this.angerLevel == 0 ? null : super.findPlayerToAttack();
089 }
090
091 /**
092 * Called when the entity is attacked.
093 */
094 public boolean attackEntityFrom(DamageSource par1DamageSource, int par2)
095 {
096 if (this.func_85032_ar())
097 {
098 return false;
099 }
100 else
101 {
102 Entity var3 = par1DamageSource.getEntity();
103
104 if (var3 instanceof EntityPlayer)
105 {
106 List var4 = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.expand(32.0D, 32.0D, 32.0D));
107
108 for (int var5 = 0; var5 < var4.size(); ++var5)
109 {
110 Entity var6 = (Entity)var4.get(var5);
111
112 if (var6 instanceof EntityPigZombie)
113 {
114 EntityPigZombie var7 = (EntityPigZombie)var6;
115 var7.becomeAngryAt(var3);
116 }
117 }
118
119 this.becomeAngryAt(var3);
120 }
121
122 return super.attackEntityFrom(par1DamageSource, par2);
123 }
124 }
125
126 /**
127 * Causes this PigZombie to become angry at the supplied Entity (which will be a player).
128 */
129 private void becomeAngryAt(Entity par1Entity)
130 {
131 this.entityToAttack = par1Entity;
132 this.angerLevel = 400 + this.rand.nextInt(400);
133 this.randomSoundDelay = this.rand.nextInt(40);
134 }
135
136 /**
137 * Returns the sound this mob makes while it's alive.
138 */
139 protected String getLivingSound()
140 {
141 return "mob.zombiepig.zpig";
142 }
143
144 /**
145 * Returns the sound this mob makes when it is hurt.
146 */
147 protected String getHurtSound()
148 {
149 return "mob.zombiepig.zpighurt";
150 }
151
152 /**
153 * Returns the sound this mob makes on death.
154 */
155 protected String getDeathSound()
156 {
157 return "mob.zombiepig.zpigdeath";
158 }
159
160 /**
161 * Drop 0-2 items of this living's type
162 */
163 protected void dropFewItems(boolean par1, int par2)
164 {
165 int var3 = this.rand.nextInt(2 + par2);
166 int var4;
167
168 for (var4 = 0; var4 < var3; ++var4)
169 {
170 this.dropItem(Item.rottenFlesh.shiftedIndex, 1);
171 }
172
173 var3 = this.rand.nextInt(2 + par2);
174
175 for (var4 = 0; var4 < var3; ++var4)
176 {
177 this.dropItem(Item.goldNugget.shiftedIndex, 1);
178 }
179 }
180
181 /**
182 * Called when a player interacts with a mob. e.g. gets milk from a cow, gets into the saddle on a pig.
183 */
184 public boolean interact(EntityPlayer par1EntityPlayer)
185 {
186 return false;
187 }
188
189 protected void dropRareDrop(int par1)
190 {
191 this.dropItem(Item.ingotGold.shiftedIndex, 1);
192 }
193
194 /**
195 * Returns the item ID for the item the mob drops on death.
196 */
197 protected int getDropItemId()
198 {
199 return Item.rottenFlesh.shiftedIndex;
200 }
201
202 protected void func_82164_bB()
203 {
204 this.setCurrentItemOrArmor(0, new ItemStack(Item.swordGold));
205 }
206
207 /**
208 * Initialize this creature.
209 */
210 public void initCreature()
211 {
212 super.initCreature();
213 this.setVillager(false);
214 }
215
216 /**
217 * Returns the amount of damage a mob should deal.
218 */
219 public int getAttackStrength(Entity par1Entity)
220 {
221 ItemStack var2 = this.getHeldItem();
222 int var3 = 5;
223
224 if (var2 != null)
225 {
226 var3 += var2.getDamageVsEntity(this);
227 }
228
229 return var3;
230 }
231 }