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 }