    001    package net.minecraft.entity.item;
    002
    003    import cpw.mods.fml.relauncher.Side;
    004    import cpw.mods.fml.relauncher.SideOnly;
    005    import net.minecraft.entity.Entity;
    006    import net.minecraft.item.ItemStack;
    007    import net.minecraft.nbt.NBTTagCompound;
    008    import net.minecraft.util.MathHelper;
    009    import net.minecraft.world.World;
    010
    011    public class EntityFireworkRocket extends Entity
    012    {
    013        private int field_92011_a;
    014        private int field_92010_b;
    015
    016        public EntityFireworkRocket(World par1World)
    017        {
    018            super(par1World);
    019            this.setSize(0.25F, 0.25F);
    020        }
    021
    022        protected void entityInit()
    023        {
    024            this.dataWatcher.addObject(8, new ItemStack(0, 0, 0));
    025        }
    026
    027        @SideOnly(Side.CLIENT)
    028
    029        /**
    030         * Checks if the entity is in range to render by using the past in distance and comparing it to its average edge
    031         * length * 64 * renderDistanceWeight Args: distance
    032         */
    033        public boolean isInRangeToRenderDist(double par1)
    034        {
    035            return par1 < 4096.0D;
    036        }
    037
    038        public EntityFireworkRocket(World par1World, double par2, double par4, double par6, ItemStack par8ItemStack)
    039        {
    040            super(par1World);
    041            this.field_92011_a = 0;
    042            this.setSize(0.25F, 0.25F);
    043            this.setPosition(par2, par4, par6);
    044            this.yOffset = 0.0F;
    045            int var9 = 1;
    046
    047            if (par8ItemStack != null && par8ItemStack.hasTagCompound())
    048            {
    049                this.dataWatcher.updateObject(8, par8ItemStack);
    050                NBTTagCompound var10 = par8ItemStack.getTagCompound();
    051                NBTTagCompound var11 = var10.getCompoundTag("Fireworks");
    052
    053                if (var11 != null)
    054                {
    055                    var9 += var11.getByte("Flight");
    056                }
    057            }
    058
    059            this.motionX = this.rand.nextGaussian() * 0.001D;
    060            this.motionZ = this.rand.nextGaussian() * 0.001D;
    061            this.motionY = 0.05D;
    062            this.field_92010_b = 10 * var9 + this.rand.nextInt(6) + this.rand.nextInt(7);
    063        }
    064
    065        @SideOnly(Side.CLIENT)
    066
    067        /**
    068         * Sets the velocity to the args. Args: x, y, z
    069         */
    070        public void setVelocity(double par1, double par3, double par5)
    071        {
    072            this.motionX = par1;
    073            this.motionY = par3;
    074            this.motionZ = par5;
    075
    076            if (this.prevRotationPitch == 0.0F && this.prevRotationYaw == 0.0F)
    077            {
    078                float var7 = MathHelper.sqrt_double(par1 * par1 + par5 * par5);
    079                this.prevRotationYaw = this.rotationYaw = (float)(Math.atan2(par1, par5) * 180.0D / Math.PI);
    080                this.prevRotationPitch = this.rotationPitch = (float)(Math.atan2(par3, (double)var7) * 180.0D / Math.PI);
    081            }
    082        }
    083
    084        /**
    085         * Called to update the entity's position/logic.
    086         */
    087        public void onUpdate()
    088        {
    089            this.lastTickPosX = this.posX;
    090            this.lastTickPosY = this.posY;
    091            this.lastTickPosZ = this.posZ;
    092            super.onUpdate();
    093            this.motionX *= 1.15D;
    094            this.motionZ *= 1.15D;
    095            this.motionY += 0.04D;
    096            this.moveEntity(this.motionX, this.motionY, this.motionZ);
    097            float var1 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ);
    098            this.rotationYaw = (float)(Math.atan2(this.motionX, this.motionZ) * 180.0D / Math.PI);
    099
    100            for (this.rotationPitch = (float)(Math.atan2(this.motionY, (double)var1) * 180.0D / Math.PI); this.rotationPitch - this.prevRotationPitch < -180.0F; this.prevRotationPitch -= 360.0F)
    101            {
    102                ;
    103            }
    104
    105            while (this.rotationPitch - this.prevRotationPitch >= 180.0F)
    106            {
    107                this.prevRotationPitch += 360.0F;
    108            }
    109
    110            while (this.rotationYaw - this.prevRotationYaw < -180.0F)
    111            {
    112                this.prevRotationYaw -= 360.0F;
    113            }
    114
    115            while (this.rotationYaw - this.prevRotationYaw >= 180.0F)
    116            {
    117                this.prevRotationYaw += 360.0F;
    118            }
    119
    120            this.rotationPitch = this.prevRotationPitch + (this.rotationPitch - this.prevRotationPitch) * 0.2F;
    121            this.rotationYaw = this.prevRotationYaw + (this.rotationYaw - this.prevRotationYaw) * 0.2F;
    122
    123            if (this.field_92011_a == 0)
    124            {
    125                this.worldObj.playSoundAtEntity(this, "fireworks.launch", 3.0F, 1.0F);
    126            }
    127
    128            ++this.field_92011_a;
    129
    130            if (this.worldObj.isRemote && this.field_92011_a % 2 < 2)
    131            {
    132                this.worldObj.spawnParticle("fireworksSpark", this.posX, this.posY - 0.3D, this.posZ, this.rand.nextGaussian() * 0.05D, -this.motionY * 0.5D, this.rand.nextGaussian() * 0.05D);
    133            }
    134
    135            if (!this.worldObj.isRemote && this.field_92011_a > this.field_92010_b)
    136            {
    137                this.worldObj.setEntityState(this, (byte)17);
    138                this.setDead();
    139            }
    140        }
    141
    142        @SideOnly(Side.CLIENT)
    143        public void handleHealthUpdate(byte par1)
    144        {
    145            if (par1 == 17 && this.worldObj.isRemote)
    146            {
    147                ItemStack var2 = this.dataWatcher.getWatchableObjectItemStack(8);
    148                NBTTagCompound var3 = null;
    149
    150                if (var2 != null && var2.hasTagCompound())
    151                {
    152                    var3 = var2.getTagCompound().getCompoundTag("Fireworks");
    153                }
    154
    155                this.worldObj.func_92088_a(this.posX, this.posY, this.posZ, this.motionX, this.motionY, this.motionZ, var3);
    156            }
    157
    158            super.handleHealthUpdate(par1);
    159        }
    160
    161        /**
    162         * (abstract) Protected helper method to write subclass entity data to NBT.
    163         */
    164        public void writeEntityToNBT(NBTTagCompound par1NBTTagCompound)
    165        {
    166            par1NBTTagCompound.setInteger("Life", this.field_92011_a);
    167            par1NBTTagCompound.setInteger("LifeTime", this.field_92010_b);
    168            ItemStack var2 = this.dataWatcher.getWatchableObjectItemStack(8);
    169
    170            if (var2 != null)
    171            {
    172                NBTTagCompound var3 = new NBTTagCompound();
    173                var2.writeToNBT(var3);
    174                par1NBTTagCompound.setCompoundTag("FireworksItem", var3);
    175            }
    176        }
    177
    178        /**
    179         * (abstract) Protected helper method to read subclass entity data from NBT.
    180         */
    181        public void readEntityFromNBT(NBTTagCompound par1NBTTagCompound)
    182        {
    183            this.field_92011_a = par1NBTTagCompound.getInteger("Life");
    184            this.field_92010_b = par1NBTTagCompound.getInteger("LifeTime");
    185            NBTTagCompound var2 = par1NBTTagCompound.getCompoundTag("FireworksItem");
    186
    187            if (var2 != null)
    188            {
    189                ItemStack var3 = ItemStack.loadItemStackFromNBT(var2);
    190
    191                if (var3 != null)
    192                {
    193                    this.dataWatcher.updateObject(8, var3);
    194                }
    195            }
    196        }
    197
    198        @SideOnly(Side.CLIENT)
    199        public float getShadowSize()
    200        {
    201            return 0.0F;
    202        }
    203
    204        /**
    205         * Gets how bright this entity is.
    206         */
    207        public float getBrightness(float par1)
    208        {
    209            return super.getBrightness(par1);
    210        }
    211
    212        @SideOnly(Side.CLIENT)
    213        public int getBrightnessForRender(float par1)
    214        {
    215            return super.getBrightnessForRender(par1);
    216        }
    217
    218        /**
    219         * If returns false, the item will not inflict any damage against entities.
    220         */
    221        public boolean canAttackWithItem()
    222        {
    223            return false;
    224        }
    225    }