content: package net.minecraft.entity.item;
  
  import net.minecraft.block.BlockFurnace;
  import net.minecraft.block.state.IBlockState;
  import net.minecraft.entity.player.EntityPlayer;
  import net.minecraft.init.Blocks;
  import net.minecraft.init.Items;
  import net.minecraft.item.ItemStack;
  import net.minecraft.nbt.NBTTagCompound;
  import net.minecraft.util.*;
  import net.minecraft.world.World;
  
  public class EntityMinecartFurnace extends EntityMinecart {
      private int fuel;
      public double pushX;
      public double pushZ;
  
      public EntityMinecartFurnace(World worldIn) {
          super(worldIn);
      }
  
      public EntityMinecartFurnace(World worldIn, double x, double y, double z) {
          super(worldIn, x, y, z);
      }
  
      public EntityMinecart.EnumMinecartType getMinecartType() {
          return EntityMinecart.EnumMinecartType.FURNACE;
      }
  
      protected void entityInit() {
          super.entityInit();
          this.dataWatcher.addObject(16, new Byte((byte) 0));
      }
  
      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(EnumParticleTypes.SMOKE_LARGE, this.posX, this.posY + 0.8D, this.posZ, 0.0D, 0.0D, 0.0D);
          }
      }
  
      protected double getMaximumSpeed() {
          return 0.2D;
      }
  
      public void killMinecart(DamageSource source) {
          super.killMinecart(source);
  
          if (!source.isExplosion() && this.worldObj.getGameRules().getBoolean("doEntityDrops")) {
              this.entityDropItem(new ItemStack(Blocks.furnace, 1), 0.0F);
          }
      }
  
      protected void func_180460_a(BlockPos p_180460_1_, IBlockState p_180460_2_) {
          super.func_180460_a(p_180460_1_, p_180460_2_);
          double d0 = this.pushX * this.pushX + this.pushZ * this.pushZ;
  
          if (d0 > 1.0E-4D && this.motionX * this.motionX + this.motionZ * this.motionZ > 0.001D) {
              d0 = MathHelper.sqrt_double(d0);
              this.pushX /= d0;
              this.pushZ /= d0;
  
              if (this.pushX * this.motionX + this.pushZ * this.motionZ < 0.0D) {
                  this.pushX = 0.0D;
                  this.pushZ = 0.0D;
              } else {
                  double d1 = d0 / this.getMaximumSpeed();
                  this.pushX *= d1;
                  this.pushZ *= d1;
              }
          }
      }
  
      protected void applyDrag() {
          double d0 = this.pushX * this.pushX + this.pushZ * this.pushZ;
  
          if (d0 > 1.0E-4D) {
              d0 = MathHelper.sqrt_double(d0);
              this.pushX /= d0;
              this.pushZ /= d0;
              double d1 = 1.0D;
              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();
      }
  
      public boolean interactFirst(EntityPlayer playerIn) {
          ItemStack itemstack = playerIn.inventory.getCurrentItem();
  
          if (itemstack != null && itemstack.getItem() == Items.coal) {
              if (!playerIn.capabilities.isCreativeMode && --itemstack.stackSize == 0) {
                  playerIn.inventory.setInventorySlotContents(playerIn.inventory.currentItem, null);
              }
  
              this.fuel += 3600;
          }
  
          this.pushX = this.posX - playerIn.posX;
          this.pushZ = this.posZ - playerIn.posZ;
          return true;
      }
  
      protected void writeEntityToNBT(NBTTagCompound tagCompound) {
          super.writeEntityToNBT(tagCompound);
          tagCompound.setDouble("PushX", this.pushX);
          tagCompound.setDouble("PushZ", this.pushZ);
          tagCompound.setShort("Fuel", (short) this.fuel);
      }
  
      protected void readEntityFromNBT(NBTTagCompound tagCompund) {
          super.readEntityFromNBT(tagCompund);
          this.pushX = tagCompund.getDouble("PushX");
          this.pushZ = tagCompund.getDouble("PushZ");
          this.fuel = tagCompund.getShort("Fuel");
      }
  
      protected boolean isMinecartPowered() {
          return (this.dataWatcher.getWatchableObjectByte(16) & 1) != 0;
      }
  
      protected void setMinecartPowered(boolean p_94107_1_) {
          if (p_94107_1_) {
              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 IBlockState getDefaultDisplayTile() {
          return (this.isMinecartPowered() ? Blocks.lit_furnace : Blocks.furnace).getDefaultState().withProperty(BlockFurnace.FACING, EnumFacing.NORTH);
      }
  }
  