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.addObjectByDataType(8, 5);
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 }