    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    }