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 * Finds the closest player within 16 blocks to attack, or null if this Entity isn't interested in attacking
050 * (Animals, Spiders at day, peaceful PigZombies).
051 */
052 protected Entity findPlayerToAttack()
053 {
054 float var1 = this.getBrightness(1.0F);
055
056 if (var1 < 0.5F)
057 {
058 double var2 = 16.0D;
059 return this.worldObj.getClosestVulnerablePlayerToEntity(this, var2);
060 }
061 else
062 {
063 return null;
064 }
065 }
066
067 /**
068 * Returns the sound this mob makes while it's alive.
069 */
070 protected String getLivingSound()
071 {
072 return "mob.spider.say";
073 }
074
075 /**
076 * Returns the sound this mob makes when it is hurt.
077 */
078 protected String getHurtSound()
079 {
080 return "mob.spider.say";
081 }
082
083 /**
084 * Returns the sound this mob makes on death.
085 */
086 protected String getDeathSound()
087 {
088 return "mob.spider.death";
089 }
090
091 /**
092 * Plays step sound at given x, y, z for the entity
093 */
094 protected void playStepSound(int par1, int par2, int par3, int par4)
095 {
096 this.func_85030_a("mob.spider.step", 0.15F, 1.0F);
097 }
098
099 /**
100 * Basic mob attack. Default to touch of death in EntityCreature. Overridden by each mob to define their attack.
101 */
102 protected void attackEntity(Entity par1Entity, float par2)
103 {
104 float var3 = this.getBrightness(1.0F);
105
106 if (var3 > 0.5F && this.rand.nextInt(100) == 0)
107 {
108 this.entityToAttack = null;
109 }
110 else
111 {
112 if (par2 > 2.0F && par2 < 6.0F && this.rand.nextInt(10) == 0)
113 {
114 if (this.onGround)
115 {
116 double var4 = par1Entity.posX - this.posX;
117 double var6 = par1Entity.posZ - this.posZ;
118 float var8 = MathHelper.sqrt_double(var4 * var4 + var6 * var6);
119 this.motionX = var4 / (double)var8 * 0.5D * 0.800000011920929D + this.motionX * 0.20000000298023224D;
120 this.motionZ = var6 / (double)var8 * 0.5D * 0.800000011920929D + this.motionZ * 0.20000000298023224D;
121 this.motionY = 0.4000000059604645D;
122 }
123 }
124 else
125 {
126 super.attackEntity(par1Entity, par2);
127 }
128 }
129 }
130
131 /**
132 * Returns the item ID for the item the mob drops on death.
133 */
134 protected int getDropItemId()
135 {
136 return Item.silk.shiftedIndex;
137 }
138
139 /**
140 * Drop 0-2 items of this living's type
141 */
142 protected void dropFewItems(boolean par1, int par2)
143 {
144 super.dropFewItems(par1, par2);
145
146 if (par1 && (this.rand.nextInt(3) == 0 || this.rand.nextInt(1 + par2) > 0))
147 {
148 this.dropItem(Item.spiderEye.shiftedIndex, 1);
149 }
150 }
151
152 /**
153 * returns true if this entity is by a ladder, false otherwise
154 */
155 public boolean isOnLadder()
156 {
157 return this.isBesideClimbableBlock();
158 }
159
160 /**
161 * Sets the Entity inside a web block.
162 */
163 public void setInWeb() {}
164
165 @SideOnly(Side.CLIENT)
166
167 /**
168 * How large the spider should be scaled.
169 */
170 public float spiderScaleAmount()
171 {
172 return 1.0F;
173 }
174
175 /**
176 * Get this Entity's EnumCreatureAttribute
177 */
178 public EnumCreatureAttribute getCreatureAttribute()
179 {
180 return EnumCreatureAttribute.ARTHROPOD;
181 }
182
183 public boolean isPotionApplicable(PotionEffect par1PotionEffect)
184 {
185 return par1PotionEffect.getPotionID() == Potion.poison.id ? false : super.isPotionApplicable(par1PotionEffect);
186 }
187
188 /**
189 * Returns true if the WatchableObject (Byte) is 0x01 otherwise returns false. The WatchableObject is updated using
190 * setBesideClimableBlock.
191 */
192 public boolean isBesideClimbableBlock()
193 {
194 return (this.dataWatcher.getWatchableObjectByte(16) & 1) != 0;
195 }
196
197 /**
198 * Updates the WatchableObject (Byte) created in entityInit(), setting it to 0x01 if par1 is true or 0x00 if it is
199 * false.
200 */
201 public void setBesideClimbableBlock(boolean par1)
202 {
203 byte var2 = this.dataWatcher.getWatchableObjectByte(16);
204
205 if (par1)
206 {
207 var2 = (byte)(var2 | 1);
208 }
209 else
210 {
211 var2 &= -2;
212 }
213
214 this.dataWatcher.updateObject(16, Byte.valueOf(var2));
215 }
216
217 /**
218 * Initialize this creature.
219 */
220 public void initCreature()
221 {
222 if (this.worldObj.rand.nextInt(100) == 0)
223 {
224 EntitySkeleton var1 = new EntitySkeleton(this.worldObj);
225 var1.setLocationAndAngles(this.posX, this.posY, this.posZ, this.rotationYaw, 0.0F);
226 var1.initCreature();
227 this.worldObj.spawnEntityInWorld(var1);
228 var1.mountEntity(this);
229 }
230 }
231 }