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 }