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