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