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}