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