    001    package net.minecraft.src;
    002
    003    import cpw.mods.fml.common.Side;
    004    import cpw.mods.fml.common.asm.SideOnly;
    005
    006    public class EntitySpider extends EntityMob
    007    {
    008        public EntitySpider(World par1World)
    009        {
    010            super(par1World);
    011            this.texture = "/mob/spider.png";
    012            this.setSize(1.4F, 0.9F);
    013            this.moveSpeed = 0.8F;
    014        }
    015
    016        protected void entityInit()
    017        {
    018            super.entityInit();
    019            this.dataWatcher.addObject(16, new Byte((byte)0));
    020        }
    021
    022        /**
    023         * Called to update the entity's position/logic.
    024         */
    025        public void onUpdate()
    026        {
    027            super.onUpdate();
    028
    029            if (!this.worldObj.isRemote)
    030            {
    031                this.setBesideClimbableBlock(this.isCollidedHorizontally);
    032            }
    033        }
    034
    035        public int getMaxHealth()
    036        {
    037            return 16;
    038        }
    039
    040        /**
    041         * Returns the Y offset from the entity's position for any entity riding this one.
    042         */
    043        public double getMountedYOffset()
    044        {
    045            return (double)this.height * 0.75D - 0.5D;
    046        }
    047
    048        /**
    049         * returns if this entity triggers Block.onEntityWalking on the blocks they walk on. used for spiders and wolves to
    050         * prevent them from trampling crops
    051         */
    052        protected boolean canTriggerWalking()
    053        {
    054            return false;
    055        }
    056
    057        /**
    058         * Finds the closest player within 16 blocks to attack, or null if this Entity isn't interested in attacking
    059         * (Animals, Spiders at day, peaceful PigZombies).
    060         */
    061        protected Entity findPlayerToAttack()
    062        {
    063            float var1 = this.getBrightness(1.0F);
    064
    065            if (var1 < 0.5F)
    066            {
    067                double var2 = 16.0D;
    068                return this.worldObj.getClosestVulnerablePlayerToEntity(this, var2);
    069            }
    070            else
    071            {
    072                return null;
    073            }
    074        }
    075
    076        /**
    077         * Returns the sound this mob makes while it's alive.
    078         */
    079        protected String getLivingSound()
    080        {
    081            return "mob.spider";
    082        }
    083
    084        /**
    085         * Returns the sound this mob makes when it is hurt.
    086         */
    087        protected String getHurtSound()
    088        {
    089            return "mob.spider";
    090        }
    091
    092        /**
    093         * Returns the sound this mob makes on death.
    094         */
    095        protected String getDeathSound()
    096        {
    097            return "mob.spiderdeath";
    098        }
    099
    100        /**
    101         * Basic mob attack. Default to touch of death in EntityCreature. Overridden by each mob to define their attack.
    102         */
    103        protected void attackEntity(Entity par1Entity, float par2)
    104        {
    105            float var3 = this.getBrightness(1.0F);
    106
    107            if (var3 > 0.5F && this.rand.nextInt(100) == 0)
    108            {
    109                this.entityToAttack = null;
    110            }
    111            else
    112            {
    113                if (par2 > 2.0F && par2 < 6.0F && this.rand.nextInt(10) == 0)
    114                {
    115                    if (this.onGround)
    116                    {
    117                        double var4 = par1Entity.posX - this.posX;
    118                        double var6 = par1Entity.posZ - this.posZ;
    119                        float var8 = MathHelper.sqrt_double(var4 * var4 + var6 * var6);
    120                        this.motionX = var4 / (double)var8 * 0.5D * 0.800000011920929D + this.motionX * 0.20000000298023224D;
    121                        this.motionZ = var6 / (double)var8 * 0.5D * 0.800000011920929D + this.motionZ * 0.20000000298023224D;
    122                        this.motionY = 0.4000000059604645D;
    123                    }
    124                }
    125                else
    126                {
    127                    super.attackEntity(par1Entity, par2);
    128                }
    129            }
    130        }
    131
    132        /**
    133         * Returns the item ID for the item the mob drops on death.
    134         */
    135        protected int getDropItemId()
    136        {
    137            return Item.silk.shiftedIndex;
    138        }
    139
    140        /**
    141         * Drop 0-2 items of this living's type
    142         */
    143        protected void dropFewItems(boolean par1, int par2)
    144        {
    145            super.dropFewItems(par1, par2);
    146
    147            if (par1 && (this.rand.nextInt(3) == 0 || this.rand.nextInt(1 + par2) > 0))
    148            {
    149                this.dropItem(Item.spiderEye.shiftedIndex, 1);
    150            }
    151        }
    152
    153        /**
    154         * returns true if this entity is by a ladder, false otherwise
    155         */
    156        public boolean isOnLadder()
    157        {
    158            return this.isBesideClimbableBlock();
    159        }
    160
    161        /**
    162         * Sets the Entity inside a web block.
    163         */
    164        public void setInWeb() {}
    165
    166        @SideOnly(Side.CLIENT)
    167
    168        /**
    169         * How large the spider should be scaled.
    170         */
    171        public float spiderScaleAmount()
    172        {
    173            return 1.0F;
    174        }
    175
    176        /**
    177         * Get this Entity's EnumCreatureAttribute
    178         */
    179        public EnumCreatureAttribute getCreatureAttribute()
    180        {
    181            return EnumCreatureAttribute.ARTHROPOD;
    182        }
    183
    184        public boolean isPotionApplicable(PotionEffect par1PotionEffect)
    185        {
    186            return par1PotionEffect.getPotionID() == Potion.poison.id ? false : super.isPotionApplicable(par1PotionEffect);
    187        }
    188
    189        /**
    190         * Returns true if the WatchableObject (Byte) is 0x01 otherwise returns false. The WatchableObject is updated using
    191         * setBesideClimableBlock.
    192         */
    193        public boolean isBesideClimbableBlock()
    194        {
    195            return (this.dataWatcher.getWatchableObjectByte(16) & 1) != 0;
    196        }
    197
    198        /**
    199         * Updates the WatchableObject (Byte) created in entityInit(), setting it to 0x01 if par1 is true or 0x00 if it is
    200         * false.
    201         */
    202        public void setBesideClimbableBlock(boolean par1)
    203        {
    204            byte var2 = this.dataWatcher.getWatchableObjectByte(16);
    205
    206            if (par1)
    207            {
    208                var2 = (byte)(var2 | 1);
    209            }
    210            else
    211            {
    212                var2 &= -2;
    213            }
    214
    215            this.dataWatcher.updateObject(16, Byte.valueOf(var2));
    216        }
    217    }