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