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    }