001 package net.minecraft.entity.monster; 002 003 import net.minecraft.block.Block; 004 import net.minecraft.block.BlockSilverfish; 005 import net.minecraft.entity.Entity; 006 import net.minecraft.entity.EnumCreatureAttribute; 007 import net.minecraft.entity.player.EntityPlayer; 008 import net.minecraft.util.DamageSource; 009 import net.minecraft.util.EntityDamageSource; 010 import net.minecraft.util.Facing; 011 import net.minecraft.util.MathHelper; 012 import net.minecraft.world.World; 013 014 public class EntitySilverfish extends EntityMob 015 { 016 /** 017 * A cooldown before this entity will search for another Silverfish to join them in battle. 018 */ 019 private int allySummonCooldown; 020 021 public EntitySilverfish(World par1World) 022 { 023 super(par1World); 024 this.texture = "/mob/silverfish.png"; 025 this.setSize(0.3F, 0.7F); 026 this.moveSpeed = 0.6F; 027 } 028 029 public int getMaxHealth() 030 { 031 return 8; 032 } 033 034 /** 035 * returns if this entity triggers Block.onEntityWalking on the blocks they walk on. used for spiders and wolves to 036 * prevent them from trampling crops 037 */ 038 protected boolean canTriggerWalking() 039 { 040 return false; 041 } 042 043 /** 044 * Finds the closest player within 16 blocks to attack, or null if this Entity isn't interested in attacking 045 * (Animals, Spiders at day, peaceful PigZombies). 046 */ 047 protected Entity findPlayerToAttack() 048 { 049 double var1 = 8.0D; 050 return this.worldObj.getClosestVulnerablePlayerToEntity(this, var1); 051 } 052 053 /** 054 * Returns the sound this mob makes while it's alive. 055 */ 056 protected String getLivingSound() 057 { 058 return "mob.silverfish.say"; 059 } 060 061 /** 062 * Returns the sound this mob makes when it is hurt. 063 */ 064 protected String getHurtSound() 065 { 066 return "mob.silverfish.hit"; 067 } 068 069 /** 070 * Returns the sound this mob makes on death. 071 */ 072 protected String getDeathSound() 073 { 074 return "mob.silverfish.kill"; 075 } 076 077 /** 078 * Called when the entity is attacked. 079 */ 080 public boolean attackEntityFrom(DamageSource par1DamageSource, int par2) 081 { 082 if (this.isEntityInvulnerable()) 083 { 084 return false; 085 } 086 else 087 { 088 if (this.allySummonCooldown <= 0 && (par1DamageSource instanceof EntityDamageSource || par1DamageSource == DamageSource.magic)) 089 { 090 this.allySummonCooldown = 20; 091 } 092 093 return super.attackEntityFrom(par1DamageSource, par2); 094 } 095 } 096 097 /** 098 * Basic mob attack. Default to touch of death in EntityCreature. Overridden by each mob to define their attack. 099 */ 100 protected void attackEntity(Entity par1Entity, float par2) 101 { 102 if (this.attackTime <= 0 && par2 < 1.2F && par1Entity.boundingBox.maxY > this.boundingBox.minY && par1Entity.boundingBox.minY < this.boundingBox.maxY) 103 { 104 this.attackTime = 20; 105 this.attackEntityAsMob(par1Entity); 106 } 107 } 108 109 /** 110 * Plays step sound at given x, y, z for the entity 111 */ 112 protected void playStepSound(int par1, int par2, int par3, int par4) 113 { 114 this.playSound("mob.silverfish.step", 0.15F, 1.0F); 115 } 116 117 /** 118 * Returns the item ID for the item the mob drops on death. 119 */ 120 protected int getDropItemId() 121 { 122 return 0; 123 } 124 125 /** 126 * Called to update the entity's position/logic. 127 */ 128 public void onUpdate() 129 { 130 this.renderYawOffset = this.rotationYaw; 131 super.onUpdate(); 132 } 133 134 protected void updateEntityActionState() 135 { 136 super.updateEntityActionState(); 137 138 if (!this.worldObj.isRemote) 139 { 140 int var1; 141 int var2; 142 int var3; 143 int var5; 144 145 if (this.allySummonCooldown > 0) 146 { 147 --this.allySummonCooldown; 148 149 if (this.allySummonCooldown == 0) 150 { 151 var1 = MathHelper.floor_double(this.posX); 152 var2 = MathHelper.floor_double(this.posY); 153 var3 = MathHelper.floor_double(this.posZ); 154 boolean var4 = false; 155 156 for (var5 = 0; !var4 && var5 <= 5 && var5 >= -5; var5 = var5 <= 0 ? 1 - var5 : 0 - var5) 157 { 158 for (int var6 = 0; !var4 && var6 <= 10 && var6 >= -10; var6 = var6 <= 0 ? 1 - var6 : 0 - var6) 159 { 160 for (int var7 = 0; !var4 && var7 <= 10 && var7 >= -10; var7 = var7 <= 0 ? 1 - var7 : 0 - var7) 161 { 162 int var8 = this.worldObj.getBlockId(var1 + var6, var2 + var5, var3 + var7); 163 164 if (var8 == Block.silverfish.blockID) 165 { 166 this.worldObj.playAuxSFX(2001, var1 + var6, var2 + var5, var3 + var7, Block.silverfish.blockID + (this.worldObj.getBlockMetadata(var1 + var6, var2 + var5, var3 + var7) << 12)); 167 this.worldObj.setBlockWithNotify(var1 + var6, var2 + var5, var3 + var7, 0); 168 Block.silverfish.onBlockDestroyedByPlayer(this.worldObj, var1 + var6, var2 + var5, var3 + var7, 0); 169 170 if (this.rand.nextBoolean()) 171 { 172 var4 = true; 173 break; 174 } 175 } 176 } 177 } 178 } 179 } 180 } 181 182 if (this.entityToAttack == null && !this.hasPath()) 183 { 184 var1 = MathHelper.floor_double(this.posX); 185 var2 = MathHelper.floor_double(this.posY + 0.5D); 186 var3 = MathHelper.floor_double(this.posZ); 187 int var9 = this.rand.nextInt(6); 188 var5 = this.worldObj.getBlockId(var1 + Facing.offsetsXForSide[var9], var2 + Facing.offsetsYForSide[var9], var3 + Facing.offsetsZForSide[var9]); 189 190 if (BlockSilverfish.getPosingIdByMetadata(var5)) 191 { 192 this.worldObj.setBlockAndMetadataWithNotify(var1 + Facing.offsetsXForSide[var9], var2 + Facing.offsetsYForSide[var9], var3 + Facing.offsetsZForSide[var9], Block.silverfish.blockID, BlockSilverfish.getMetadataForBlockType(var5)); 193 this.spawnExplosionParticle(); 194 this.setDead(); 195 } 196 else 197 { 198 this.updateWanderPath(); 199 } 200 } 201 else if (this.entityToAttack != null && !this.hasPath()) 202 { 203 this.entityToAttack = null; 204 } 205 } 206 } 207 208 /** 209 * Takes a coordinate in and returns a weight to determine how likely this creature will try to path to the block. 210 * Args: x, y, z 211 */ 212 public float getBlockPathWeight(int par1, int par2, int par3) 213 { 214 return this.worldObj.getBlockId(par1, par2 - 1, par3) == Block.stone.blockID ? 10.0F : super.getBlockPathWeight(par1, par2, par3); 215 } 216 217 /** 218 * Checks to make sure the light is not too bright where the mob is spawning 219 */ 220 protected boolean isValidLightLevel() 221 { 222 return true; 223 } 224 225 /** 226 * Checks if the entity's current position is a valid location to spawn this entity. 227 */ 228 public boolean getCanSpawnHere() 229 { 230 if (super.getCanSpawnHere()) 231 { 232 EntityPlayer var1 = this.worldObj.getClosestPlayerToEntity(this, 5.0D); 233 return var1 == null; 234 } 235 else 236 { 237 return false; 238 } 239 } 240 241 /** 242 * Returns the amount of damage a mob should deal. 243 */ 244 public int getAttackStrength(Entity par1Entity) 245 { 246 return 1; 247 } 248 249 /** 250 * Get this Entity's EnumCreatureAttribute 251 */ 252 public EnumCreatureAttribute getCreatureAttribute() 253 { 254 return EnumCreatureAttribute.ARTHROPOD; 255 } 256 }