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 EntityBlaze extends EntityMob
007 {
008 /** Random offset used in floating behaviour */
009 private float heightOffset = 0.5F;
010
011 /** ticks until heightOffset is randomized */
012 private int heightOffsetUpdateTime;
013 private int field_70846_g;
014
015 public EntityBlaze(World par1World)
016 {
017 super(par1World);
018 this.texture = "/mob/fire.png";
019 this.isImmuneToFire = true;
020 this.experienceValue = 10;
021 }
022
023 public int getMaxHealth()
024 {
025 return 20;
026 }
027
028 protected void entityInit()
029 {
030 super.entityInit();
031 this.dataWatcher.addObject(16, new Byte((byte)0));
032 }
033
034 /**
035 * Returns the sound this mob makes while it's alive.
036 */
037 protected String getLivingSound()
038 {
039 return "mob.blaze.breathe";
040 }
041
042 /**
043 * Returns the sound this mob makes when it is hurt.
044 */
045 protected String getHurtSound()
046 {
047 return "mob.blaze.hit";
048 }
049
050 /**
051 * Returns the sound this mob makes on death.
052 */
053 protected String getDeathSound()
054 {
055 return "mob.blaze.death";
056 }
057
058 @SideOnly(Side.CLIENT)
059 public int getBrightnessForRender(float par1)
060 {
061 return 15728880;
062 }
063
064 /**
065 * Gets how bright this entity is.
066 */
067 public float getBrightness(float par1)
068 {
069 return 1.0F;
070 }
071
072 /**
073 * Called frequently so the entity can update its state every tick as required. For example, zombies and skeletons
074 * use this to react to sunlight and start to burn.
075 */
076 public void onLivingUpdate()
077 {
078 if (!this.worldObj.isRemote)
079 {
080 if (this.isWet())
081 {
082 this.attackEntityFrom(DamageSource.drown, 1);
083 }
084
085 --this.heightOffsetUpdateTime;
086
087 if (this.heightOffsetUpdateTime <= 0)
088 {
089 this.heightOffsetUpdateTime = 100;
090 this.heightOffset = 0.5F + (float)this.rand.nextGaussian() * 3.0F;
091 }
092
093 if (this.getEntityToAttack() != null && this.getEntityToAttack().posY + (double)this.getEntityToAttack().getEyeHeight() > this.posY + (double)this.getEyeHeight() + (double)this.heightOffset)
094 {
095 this.motionY += (0.30000001192092896D - this.motionY) * 0.30000001192092896D;
096 }
097 }
098
099 if (this.rand.nextInt(24) == 0)
100 {
101 this.worldObj.playSoundEffect(this.posX + 0.5D, this.posY + 0.5D, this.posZ + 0.5D, "fire.fire", 1.0F + this.rand.nextFloat(), this.rand.nextFloat() * 0.7F + 0.3F);
102 }
103
104 if (!this.onGround && this.motionY < 0.0D)
105 {
106 this.motionY *= 0.6D;
107 }
108
109 for (int var1 = 0; var1 < 2; ++var1)
110 {
111 this.worldObj.spawnParticle("largesmoke", this.posX + (this.rand.nextDouble() - 0.5D) * (double)this.width, this.posY + this.rand.nextDouble() * (double)this.height, this.posZ + (this.rand.nextDouble() - 0.5D) * (double)this.width, 0.0D, 0.0D, 0.0D);
112 }
113
114 super.onLivingUpdate();
115 }
116
117 /**
118 * Basic mob attack. Default to touch of death in EntityCreature. Overridden by each mob to define their attack.
119 */
120 protected void attackEntity(Entity par1Entity, float par2)
121 {
122 if (this.attackTime <= 0 && par2 < 2.0F && par1Entity.boundingBox.maxY > this.boundingBox.minY && par1Entity.boundingBox.minY < this.boundingBox.maxY)
123 {
124 this.attackTime = 20;
125 this.attackEntityAsMob(par1Entity);
126 }
127 else if (par2 < 30.0F)
128 {
129 double var3 = par1Entity.posX - this.posX;
130 double var5 = par1Entity.boundingBox.minY + (double)(par1Entity.height / 2.0F) - (this.posY + (double)(this.height / 2.0F));
131 double var7 = par1Entity.posZ - this.posZ;
132
133 if (this.attackTime == 0)
134 {
135 ++this.field_70846_g;
136
137 if (this.field_70846_g == 1)
138 {
139 this.attackTime = 60;
140 this.func_70844_e(true);
141 }
142 else if (this.field_70846_g <= 4)
143 {
144 this.attackTime = 6;
145 }
146 else
147 {
148 this.attackTime = 100;
149 this.field_70846_g = 0;
150 this.func_70844_e(false);
151 }
152
153 if (this.field_70846_g > 1)
154 {
155 float var9 = MathHelper.sqrt_float(par2) * 0.5F;
156 this.worldObj.playAuxSFXAtEntity((EntityPlayer)null, 1009, (int)this.posX, (int)this.posY, (int)this.posZ, 0);
157
158 for (int var10 = 0; var10 < 1; ++var10)
159 {
160 EntitySmallFireball var11 = new EntitySmallFireball(this.worldObj, this, var3 + this.rand.nextGaussian() * (double)var9, var5, var7 + this.rand.nextGaussian() * (double)var9);
161 var11.posY = this.posY + (double)(this.height / 2.0F) + 0.5D;
162 this.worldObj.spawnEntityInWorld(var11);
163 }
164 }
165 }
166
167 this.rotationYaw = (float)(Math.atan2(var7, var3) * 180.0D / Math.PI) - 90.0F;
168 this.hasAttacked = true;
169 }
170 }
171
172 /**
173 * Called when the mob is falling. Calculates and applies fall damage.
174 */
175 protected void fall(float par1) {}
176
177 /**
178 * Returns the item ID for the item the mob drops on death.
179 */
180 protected int getDropItemId()
181 {
182 return Item.blazeRod.shiftedIndex;
183 }
184
185 /**
186 * Returns true if the entity is on fire. Used by render to add the fire effect on rendering.
187 */
188 public boolean isBurning()
189 {
190 return this.func_70845_n();
191 }
192
193 /**
194 * Drop 0-2 items of this living's type
195 */
196 protected void dropFewItems(boolean par1, int par2)
197 {
198 if (par1)
199 {
200 int var3 = this.rand.nextInt(2 + par2);
201
202 for (int var4 = 0; var4 < var3; ++var4)
203 {
204 this.dropItem(Item.blazeRod.shiftedIndex, 1);
205 }
206 }
207 }
208
209 public boolean func_70845_n()
210 {
211 return (this.dataWatcher.getWatchableObjectByte(16) & 1) != 0;
212 }
213
214 public void func_70844_e(boolean par1)
215 {
216 byte var2 = this.dataWatcher.getWatchableObjectByte(16);
217
218 if (par1)
219 {
220 var2 = (byte)(var2 | 1);
221 }
222 else
223 {
224 var2 &= -2;
225 }
226
227 this.dataWatcher.updateObject(16, Byte.valueOf(var2));
228 }
229
230 /**
231 * Checks to make sure the light is not too bright where the mob is spawning
232 */
233 protected boolean isValidLightLevel()
234 {
235 return true;
236 }
237
238 public int func_82193_c(Entity par1Entity)
239 {
240 return 6;
241 }
242 }