package net.minecraft.entity.item; import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.DamageSource; import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.entity.minecart.MinecartInteractEvent; public class EntityMinecartFurnace extends EntityMinecart { private int fuel = 0; public double pushX; public double pushZ; public EntityMinecartFurnace(World par1World) { super(par1World); } public EntityMinecartFurnace(World par1World, double par2, double par4, double par6) { super(par1World, par2, par4, par6); } public int getMinecartType() { return 2; } protected void entityInit() { super.entityInit(); this.dataWatcher.addObject(16, new Byte((byte)0)); } /** * Called to update the entity's position/logic. */ public void onUpdate() { super.onUpdate(); if (this.fuel > 0) { --this.fuel; } if (this.fuel <= 0) { this.pushX = this.pushZ = 0.0D; } this.setMinecartPowered(this.fuel > 0); if (this.isMinecartPowered() && this.rand.nextInt(4) == 0) { this.worldObj.spawnParticle("largesmoke", this.posX, this.posY + 0.8D, this.posZ, 0.0D, 0.0D, 0.0D); } } public void killMinecart(DamageSource par1DamageSource) { super.killMinecart(par1DamageSource); if (!par1DamageSource.isExplosion()) { this.entityDropItem(new ItemStack(Block.furnaceIdle, 1), 0.0F); } } protected void updateOnTrack(int par1, int par2, int par3, double par4, double par6, int par8, int par9) { super.updateOnTrack(par1, par2, par3, par4, par6, par8, par9); double d2 = this.pushX * this.pushX + this.pushZ * this.pushZ; if (d2 > 1.0E-4D && this.motionX * this.motionX + this.motionZ * this.motionZ > 0.001D) { d2 = (double)MathHelper.sqrt_double(d2); this.pushX /= d2; this.pushZ /= d2; if (this.pushX * this.motionX + this.pushZ * this.motionZ < 0.0D) { this.pushX = 0.0D; this.pushZ = 0.0D; } else { this.pushX = this.motionX; this.pushZ = this.motionZ; } } } protected void applyDrag() { double d0 = this.pushX * this.pushX + this.pushZ * this.pushZ; if (d0 > 1.0E-4D) { d0 = (double)MathHelper.sqrt_double(d0); this.pushX /= d0; this.pushZ /= d0; double d1 = 0.05D; this.motionX *= 0.800000011920929D; this.motionY *= 0.0D; this.motionZ *= 0.800000011920929D; this.motionX += this.pushX * d1; this.motionZ += this.pushZ * d1; } else { this.motionX *= 0.9800000190734863D; this.motionY *= 0.0D; this.motionZ *= 0.9800000190734863D; } super.applyDrag(); } /** * Called when a player interacts with a mob. e.g. gets milk from a cow, gets into the saddle on a pig. */ public boolean interact(EntityPlayer par1EntityPlayer) { if(MinecraftForge.EVENT_BUS.post(new MinecartInteractEvent(this, par1EntityPlayer))) { return true; } ItemStack itemstack = par1EntityPlayer.inventory.getCurrentItem(); if (itemstack != null && itemstack.itemID == Item.coal.itemID) { if (--itemstack.stackSize == 0) { par1EntityPlayer.inventory.setInventorySlotContents(par1EntityPlayer.inventory.currentItem, (ItemStack)null); } this.fuel += 3600; } this.pushX = this.posX - par1EntityPlayer.posX; this.pushZ = this.posZ - par1EntityPlayer.posZ; return true; } /** * (abstract) Protected helper method to write subclass entity data to NBT. */ protected void writeEntityToNBT(NBTTagCompound par1NBTTagCompound) { super.writeEntityToNBT(par1NBTTagCompound); par1NBTTagCompound.setDouble("PushX", this.pushX); par1NBTTagCompound.setDouble("PushZ", this.pushZ); par1NBTTagCompound.setShort("Fuel", (short)this.fuel); } /** * (abstract) Protected helper method to read subclass entity data from NBT. */ protected void readEntityFromNBT(NBTTagCompound par1NBTTagCompound) { super.readEntityFromNBT(par1NBTTagCompound); this.pushX = par1NBTTagCompound.getDouble("PushX"); this.pushZ = par1NBTTagCompound.getDouble("PushZ"); this.fuel = par1NBTTagCompound.getShort("Fuel"); } protected boolean isMinecartPowered() { return (this.dataWatcher.getWatchableObjectByte(16) & 1) != 0; } protected void setMinecartPowered(boolean par1) { if (par1) { this.dataWatcher.updateObject(16, Byte.valueOf((byte)(this.dataWatcher.getWatchableObjectByte(16) | 1))); } else { this.dataWatcher.updateObject(16, Byte.valueOf((byte)(this.dataWatcher.getWatchableObjectByte(16) & -2))); } } public Block getDefaultDisplayTile() { return Block.furnaceBurning; } public int getDefaultDisplayTileData() { return 2; } }