    001package net.minecraft.entity.monster;
    002
    003import net.minecraft.block.Block;
    004import net.minecraft.block.BlockSilverfish;
    005import net.minecraft.entity.Entity;
    006import net.minecraft.entity.EnumCreatureAttribute;
    007import net.minecraft.entity.player.EntityPlayer;
    008import net.minecraft.util.DamageSource;
    009import net.minecraft.util.EntityDamageSource;
    010import net.minecraft.util.Facing;
    011import net.minecraft.util.MathHelper;
    012import net.minecraft.world.World;
    013
    014public 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}