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 EntitySkeleton extends EntityMob 007 { 008 /** The ItemStack that any Skeleton holds (a bow). */ 009 private static final ItemStack defaultHeldItem = new ItemStack(Item.bow, 1); 010 011 public EntitySkeleton(World par1World) 012 { 013 super(par1World); 014 this.texture = "/mob/skeleton.png"; 015 this.moveSpeed = 0.25F; 016 this.tasks.addTask(1, new EntityAISwimming(this)); 017 this.tasks.addTask(2, new EntityAIRestrictSun(this)); 018 this.tasks.addTask(3, new EntityAIFleeSun(this, this.moveSpeed)); 019 this.tasks.addTask(4, new EntityAIArrowAttack(this, this.moveSpeed, 1, 60)); 020 this.tasks.addTask(5, new EntityAIWander(this, this.moveSpeed)); 021 this.tasks.addTask(6, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); 022 this.tasks.addTask(6, new EntityAILookIdle(this)); 023 this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, false)); 024 this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityPlayer.class, 16.0F, 0, true)); 025 } 026 027 /** 028 * Returns true if the newer Entity AI code should be run 029 */ 030 public boolean isAIEnabled() 031 { 032 return true; 033 } 034 035 public int getMaxHealth() 036 { 037 return 20; 038 } 039 040 /** 041 * Returns the sound this mob makes while it's alive. 042 */ 043 protected String getLivingSound() 044 { 045 return "mob.skeleton"; 046 } 047 048 /** 049 * Returns the sound this mob makes when it is hurt. 050 */ 051 protected String getHurtSound() 052 { 053 return "mob.skeletonhurt"; 054 } 055 056 /** 057 * Returns the sound this mob makes on death. 058 */ 059 protected String getDeathSound() 060 { 061 return "mob.skeletonhurt"; 062 } 063 064 @SideOnly(Side.CLIENT) 065 066 /** 067 * Returns the item that this EntityLiving is holding, if any. 068 */ 069 public ItemStack getHeldItem() 070 { 071 return defaultHeldItem; 072 } 073 074 /** 075 * Get this Entity's EnumCreatureAttribute 076 */ 077 public EnumCreatureAttribute getCreatureAttribute() 078 { 079 return EnumCreatureAttribute.UNDEAD; 080 } 081 082 /** 083 * Called frequently so the entity can update its state every tick as required. For example, zombies and skeletons 084 * use this to react to sunlight and start to burn. 085 */ 086 public void onLivingUpdate() 087 { 088 if (this.worldObj.isDaytime() && !this.worldObj.isRemote) 089 { 090 float var1 = this.getBrightness(1.0F); 091 092 if (var1 > 0.5F && this.worldObj.canBlockSeeTheSky(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.posY), MathHelper.floor_double(this.posZ)) && this.rand.nextFloat() * 30.0F < (var1 - 0.4F) * 2.0F) 093 { 094 this.setFire(8); 095 } 096 } 097 098 super.onLivingUpdate(); 099 } 100 101 /** 102 * Called when the mob's health reaches 0. 103 */ 104 public void onDeath(DamageSource par1DamageSource) 105 { 106 super.onDeath(par1DamageSource); 107 108 if (par1DamageSource.getSourceOfDamage() instanceof EntityArrow && par1DamageSource.getEntity() instanceof EntityPlayer) 109 { 110 EntityPlayer var2 = (EntityPlayer)par1DamageSource.getEntity(); 111 double var3 = var2.posX - this.posX; 112 double var5 = var2.posZ - this.posZ; 113 114 if (var3 * var3 + var5 * var5 >= 2500.0D) 115 { 116 var2.triggerAchievement(AchievementList.snipeSkeleton); 117 } 118 } 119 } 120 121 /** 122 * Returns the item ID for the item the mob drops on death. 123 */ 124 protected int getDropItemId() 125 { 126 return Item.arrow.shiftedIndex; 127 } 128 129 /** 130 * Drop 0-2 items of this living's type 131 */ 132 protected void dropFewItems(boolean par1, int par2) 133 { 134 int var3 = this.rand.nextInt(3 + par2); 135 int var4; 136 137 for (var4 = 0; var4 < var3; ++var4) 138 { 139 this.dropItem(Item.arrow.shiftedIndex, 1); 140 } 141 142 var3 = this.rand.nextInt(3 + par2); 143 144 for (var4 = 0; var4 < var3; ++var4) 145 { 146 this.dropItem(Item.bone.shiftedIndex, 1); 147 } 148 } 149 150 protected void dropRareDrop(int par1) 151 { 152 if (par1 > 0) 153 { 154 ItemStack var2 = new ItemStack(Item.bow); 155 EnchantmentHelper.addRandomEnchantment(this.rand, var2, 5); 156 this.entityDropItem(var2, 0.0F); 157 } 158 else 159 { 160 this.dropItem(Item.bow.shiftedIndex, 1); 161 } 162 } 163 }