package net.minecraft.entity.monster; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.entity.Entity; import net.minecraft.entity.EnumCreatureAttribute; import net.minecraft.item.Item; import net.minecraft.potion.Potion; import net.minecraft.potion.PotionEffect; import net.minecraft.util.MathHelper; import net.minecraft.world.World; public class EntitySpider extends EntityMob { public EntitySpider(World par1World) { super(par1World); this.texture = "/mob/spider.png"; this.setSize(1.4F, 0.9F); this.moveSpeed = 0.8F; } protected void entityInit() { super.entityInit(); this.dataWatcher.addObject(16, new Byte((byte)0)); } /** * Called to update the entity's position/logic. */ public void onUpdate() { super.onUpdate(); if (!this.worldObj.isRemote) { this.setBesideClimbableBlock(this.isCollidedHorizontally); } } public int getMaxHealth() { return 16; } /** * Returns the Y offset from the entity's position for any entity riding this one. */ public double getMountedYOffset() { return (double)this.height * 0.75D - 0.5D; } /** * Finds the closest player within 16 blocks to attack, or null if this Entity isn't interested in attacking * (Animals, Spiders at day, peaceful PigZombies). */ protected Entity findPlayerToAttack() { float var1 = this.getBrightness(1.0F); if (var1 < 0.5F) { double var2 = 16.0D; return this.worldObj.getClosestVulnerablePlayerToEntity(this, var2); } else { return null; } } /** * Returns the sound this mob makes while it's alive. */ protected String getLivingSound() { return "mob.spider.say"; } /** * Returns the sound this mob makes when it is hurt. */ protected String getHurtSound() { return "mob.spider.say"; } /** * Returns the sound this mob makes on death. */ protected String getDeathSound() { return "mob.spider.death"; } /** * Plays step sound at given x, y, z for the entity */ protected void playStepSound(int par1, int par2, int par3, int par4) { this.playSound("mob.spider.step", 0.15F, 1.0F); } /** * Basic mob attack. Default to touch of death in EntityCreature. Overridden by each mob to define their attack. */ protected void attackEntity(Entity par1Entity, float par2) { float var3 = this.getBrightness(1.0F); if (var3 > 0.5F && this.rand.nextInt(100) == 0) { this.entityToAttack = null; } else { if (par2 > 2.0F && par2 < 6.0F && this.rand.nextInt(10) == 0) { if (this.onGround) { double var4 = par1Entity.posX - this.posX; double var6 = par1Entity.posZ - this.posZ; float var8 = MathHelper.sqrt_double(var4 * var4 + var6 * var6); this.motionX = var4 / (double)var8 * 0.5D * 0.800000011920929D + this.motionX * 0.20000000298023224D; this.motionZ = var6 / (double)var8 * 0.5D * 0.800000011920929D + this.motionZ * 0.20000000298023224D; this.motionY = 0.4000000059604645D; } } else { super.attackEntity(par1Entity, par2); } } } /** * Returns the item ID for the item the mob drops on death. */ protected int getDropItemId() { return Item.silk.itemID; } /** * Drop 0-2 items of this living's type. @param par1 - Whether this entity has recently been hit by a player. @param * par2 - Level of Looting used to kill this mob. */ protected void dropFewItems(boolean par1, int par2) { super.dropFewItems(par1, par2); if (par1 && (this.rand.nextInt(3) == 0 || this.rand.nextInt(1 + par2) > 0)) { this.dropItem(Item.spiderEye.itemID, 1); } } /** * returns true if this entity is by a ladder, false otherwise */ public boolean isOnLadder() { return this.isBesideClimbableBlock(); } /** * Sets the Entity inside a web block. */ public void setInWeb() {} @SideOnly(Side.CLIENT) /** * How large the spider should be scaled. */ public float spiderScaleAmount() { return 1.0F; } /** * Get this Entity's EnumCreatureAttribute */ public EnumCreatureAttribute getCreatureAttribute() { return EnumCreatureAttribute.ARTHROPOD; } public boolean isPotionApplicable(PotionEffect par1PotionEffect) { return par1PotionEffect.getPotionID() == Potion.poison.id ? false : super.isPotionApplicable(par1PotionEffect); } /** * Returns true if the WatchableObject (Byte) is 0x01 otherwise returns false. The WatchableObject is updated using * setBesideClimableBlock. */ public boolean isBesideClimbableBlock() { return (this.dataWatcher.getWatchableObjectByte(16) & 1) != 0; } /** * Updates the WatchableObject (Byte) created in entityInit(), setting it to 0x01 if par1 is true or 0x00 if it is * false. */ public void setBesideClimbableBlock(boolean par1) { byte var2 = this.dataWatcher.getWatchableObjectByte(16); if (par1) { var2 = (byte)(var2 | 1); } else { var2 &= -2; } this.dataWatcher.updateObject(16, Byte.valueOf(var2)); } /** * Initialize this creature. */ public void initCreature() { if (this.worldObj.rand.nextInt(100) == 0) { EntitySkeleton var1 = new EntitySkeleton(this.worldObj); var1.setLocationAndAngles(this.posX, this.posY, this.posZ, this.rotationYaw, 0.0F); var1.initCreature(); this.worldObj.spawnEntityInWorld(var1); var1.mountEntity(this); } } }