001package net.minecraft.entity.item; 002 003import net.minecraft.block.Block; 004import net.minecraft.entity.player.EntityPlayer; 005import net.minecraft.item.Item; 006import net.minecraft.item.ItemStack; 007import net.minecraft.nbt.NBTTagCompound; 008import net.minecraft.util.DamageSource; 009import net.minecraft.util.MathHelper; 010import net.minecraft.world.World; 011import net.minecraftforge.common.MinecraftForge; 012import net.minecraftforge.event.entity.minecart.MinecartInteractEvent; 013 014public class EntityMinecartFurnace extends EntityMinecart 015{ 016 private int fuel = 0; 017 public double pushX; 018 public double pushZ; 019 020 public EntityMinecartFurnace(World par1World) 021 { 022 super(par1World); 023 } 024 025 public EntityMinecartFurnace(World par1World, double par2, double par4, double par6) 026 { 027 super(par1World, par2, par4, par6); 028 } 029 030 public int getMinecartType() 031 { 032 return 2; 033 } 034 035 protected void entityInit() 036 { 037 super.entityInit(); 038 this.dataWatcher.addObject(16, new Byte((byte)0)); 039 } 040 041 /** 042 * Called to update the entity's position/logic. 043 */ 044 public void onUpdate() 045 { 046 super.onUpdate(); 047 048 if (this.fuel > 0) 049 { 050 --this.fuel; 051 } 052 053 if (this.fuel <= 0) 054 { 055 this.pushX = this.pushZ = 0.0D; 056 } 057 058 this.setMinecartPowered(this.fuel > 0); 059 060 if (this.isMinecartPowered() && this.rand.nextInt(4) == 0) 061 { 062 this.worldObj.spawnParticle("largesmoke", this.posX, this.posY + 0.8D, this.posZ, 0.0D, 0.0D, 0.0D); 063 } 064 } 065 066 public void killMinecart(DamageSource par1DamageSource) 067 { 068 super.killMinecart(par1DamageSource); 069 070 if (!par1DamageSource.isExplosion()) 071 { 072 this.entityDropItem(new ItemStack(Block.furnaceIdle, 1), 0.0F); 073 } 074 } 075 076 protected void updateOnTrack(int par1, int par2, int par3, double par4, double par6, int par8, int par9) 077 { 078 super.updateOnTrack(par1, par2, par3, par4, par6, par8, par9); 079 double d2 = this.pushX * this.pushX + this.pushZ * this.pushZ; 080 081 if (d2 > 1.0E-4D && this.motionX * this.motionX + this.motionZ * this.motionZ > 0.001D) 082 { 083 d2 = (double)MathHelper.sqrt_double(d2); 084 this.pushX /= d2; 085 this.pushZ /= d2; 086 087 if (this.pushX * this.motionX + this.pushZ * this.motionZ < 0.0D) 088 { 089 this.pushX = 0.0D; 090 this.pushZ = 0.0D; 091 } 092 else 093 { 094 this.pushX = this.motionX; 095 this.pushZ = this.motionZ; 096 } 097 } 098 } 099 100 protected void applyDrag() 101 { 102 double d0 = this.pushX * this.pushX + this.pushZ * this.pushZ; 103 104 if (d0 > 1.0E-4D) 105 { 106 d0 = (double)MathHelper.sqrt_double(d0); 107 this.pushX /= d0; 108 this.pushZ /= d0; 109 double d1 = 0.05D; 110 this.motionX *= 0.800000011920929D; 111 this.motionY *= 0.0D; 112 this.motionZ *= 0.800000011920929D; 113 this.motionX += this.pushX * d1; 114 this.motionZ += this.pushZ * d1; 115 } 116 else 117 { 118 this.motionX *= 0.9800000190734863D; 119 this.motionY *= 0.0D; 120 this.motionZ *= 0.9800000190734863D; 121 } 122 123 super.applyDrag(); 124 } 125 126 /** 127 * Called when a player interacts with a mob. e.g. gets milk from a cow, gets into the saddle on a pig. 128 */ 129 public boolean interact(EntityPlayer par1EntityPlayer) 130 { 131 if(MinecraftForge.EVENT_BUS.post(new MinecartInteractEvent(this, par1EntityPlayer))) 132 { 133 return true; 134 } 135 ItemStack itemstack = par1EntityPlayer.inventory.getCurrentItem(); 136 137 if (itemstack != null && itemstack.itemID == Item.coal.itemID) 138 { 139 if (--itemstack.stackSize == 0) 140 { 141 par1EntityPlayer.inventory.setInventorySlotContents(par1EntityPlayer.inventory.currentItem, (ItemStack)null); 142 } 143 144 this.fuel += 3600; 145 } 146 147 this.pushX = this.posX - par1EntityPlayer.posX; 148 this.pushZ = this.posZ - par1EntityPlayer.posZ; 149 return true; 150 } 151 152 /** 153 * (abstract) Protected helper method to write subclass entity data to NBT. 154 */ 155 protected void writeEntityToNBT(NBTTagCompound par1NBTTagCompound) 156 { 157 super.writeEntityToNBT(par1NBTTagCompound); 158 par1NBTTagCompound.setDouble("PushX", this.pushX); 159 par1NBTTagCompound.setDouble("PushZ", this.pushZ); 160 par1NBTTagCompound.setShort("Fuel", (short)this.fuel); 161 } 162 163 /** 164 * (abstract) Protected helper method to read subclass entity data from NBT. 165 */ 166 protected void readEntityFromNBT(NBTTagCompound par1NBTTagCompound) 167 { 168 super.readEntityFromNBT(par1NBTTagCompound); 169 this.pushX = par1NBTTagCompound.getDouble("PushX"); 170 this.pushZ = par1NBTTagCompound.getDouble("PushZ"); 171 this.fuel = par1NBTTagCompound.getShort("Fuel"); 172 } 173 174 protected boolean isMinecartPowered() 175 { 176 return (this.dataWatcher.getWatchableObjectByte(16) & 1) != 0; 177 } 178 179 protected void setMinecartPowered(boolean par1) 180 { 181 if (par1) 182 { 183 this.dataWatcher.updateObject(16, Byte.valueOf((byte)(this.dataWatcher.getWatchableObjectByte(16) | 1))); 184 } 185 else 186 { 187 this.dataWatcher.updateObject(16, Byte.valueOf((byte)(this.dataWatcher.getWatchableObjectByte(16) & -2))); 188 } 189 } 190 191 public Block getDefaultDisplayTile() 192 { 193 return Block.furnaceBurning; 194 } 195 196 public int getDefaultDisplayTileData() 197 { 198 return 2; 199 } 200}