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