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