Program: 22160
Project: 22160
Buggy source:
@Override public void update(){
  int numHeaters=0;
  for (  EnumFacing dir2 : EnumFacing.VALUES) {
    BlockPos offsetPos=pos.offset(dir2);
    TileEntity tile=world.getTileEntity(offsetPos);
    if (tile != null && tile instanceof TileEntitySteamHeater && ((TileEntitySteamHeater)tile).getSteamShare() > 2 && world.getBlockState(offsetPos).getValue(BlockSteamHeater.FACING) == dir2.getOpposite()) {
      numHeaters++;
    }
  }
  numHeaters=Math.min(4,numHeaters);
  if (numHeaters == 0) {
    TileEntitySteamHeater.replaceWith(this,new TileEntityFurnace());
  }
  int furnaceBurnTime=super.getField(FURNACE_BURN_TIME_ID);
  boolean flag=furnaceBurnTime > 0;
  boolean flag1=false;
  if (furnaceBurnTime > 0) {
    super.setField(FURNACE_BURN_TIME_ID,furnaceBurnTime - 1);
    furnaceBurnTime--;
  }
  if (!world.isRemote) {
    if (furnaceBurnTime == 0 && canSmelt()) {
      ItemStack inSlot1=getStackInSlot(1);
      int currentItemBurnTime=furnaceBurnTime=getItemBurnTime(inSlot1);
      super.setField(CURRENT_ITEM_BURN_TIME_ID,currentItemBurnTime);
      super.setField(FURNACE_BURN_TIME_ID,furnaceBurnTime);
      if (furnaceBurnTime > 0) {
        flag1=true;
        if (inSlot1 != null) {
          ItemStack copy=inSlot1.copy();
          copy.shrink(1);
          setInventorySlotContents(1,copy);
          if (inSlot1.isEmpty()) {
            setInventorySlotContents(1,inSlot1.getItem().getContainerItem(inSlot1));
          }
        }
      }
    }
    int furnaceCookTime;
    if (isBurning() && canSmelt()) {
      furnaceCookTime=super.getField(COOK_TIME_ID);
      ++furnaceCookTime;
      super.setField(COOK_TIME_ID,furnaceCookTime);
      if (furnaceCookTime == 200) {
        furnaceCookTime=0;
        smeltItem();
        super.setField(COOK_TIME_ID,furnaceCookTime);
        flag1=true;
      }
    }
 else {
      furnaceCookTime=0;
      super.setField(COOK_TIME_ID,furnaceCookTime);
    }
    if (flag != furnaceBurnTime > 0) {
      flag1=true;
      BlockFurnace.setState(furnaceBurnTime > 0,world,pos);
    }
  }
  if (flag1) {
    markDirty();
  }
}

Fixed version (ground truth):
@Override public void update(){
  int numHeaters=0;
  for (  EnumFacing dir2 : EnumFacing.VALUES) {
    BlockPos offsetPos=pos.offset(dir2);
    TileEntity tile=world.getTileEntity(offsetPos);
    if (tile instanceof TileEntitySteamHeater && ((TileEntitySteamHeater)tile).getSteamShare() > 2 && world.getBlockState(offsetPos).getValue(BlockSteamHeater.FACING) == dir2.getOpposite()) {
      numHeaters++;
    }
  }
  numHeaters=Math.min(4,numHeaters);
  if (numHeaters == 0) {
    TileEntitySteamHeater.replaceWith(this,new TileEntityFurnace());
  }
  int furnaceBurnTime=getField(FURNACE_BURN_TIME_ID);
  boolean flag=furnaceBurnTime > 0;
  boolean flag1=false;
  if (furnaceBurnTime > 0) {
    setField(FURNACE_BURN_TIME_ID,furnaceBurnTime - 1);
    furnaceBurnTime--;
  }
  if (!world.isRemote) {
    if (furnaceBurnTime == 0 && canSmelt()) {
      ItemStack inSlot1=getStackInSlot(1);
      int currentItemBurnTime=furnaceBurnTime=getItemBurnTime(inSlot1);
      setField(CURRENT_ITEM_BURN_TIME_ID,currentItemBurnTime);
      setField(FURNACE_BURN_TIME_ID,furnaceBurnTime);
      if (furnaceBurnTime > 0) {
        flag1=true;
        ItemStack copy=inSlot1.copy();
        copy.shrink(1);
        setInventorySlotContents(1,copy);
        if (inSlot1.isEmpty()) {
          setInventorySlotContents(1,inSlot1.getItem().getContainerItem(inSlot1));
        }
      }
    }
    int furnaceCookTime;
    if (isBurning() && canSmelt()) {
      furnaceCookTime=getField(COOK_TIME_ID);
      ++furnaceCookTime;
      setField(COOK_TIME_ID,furnaceCookTime);
      if (furnaceCookTime == 200) {
        furnaceCookTime=0;
        smeltItem();
        setField(COOK_TIME_ID,furnaceCookTime);
        flag1=true;
      }
    }
 else {
      furnaceCookTime=0;
      setField(COOK_TIME_ID,furnaceCookTime);
    }
    if (flag != furnaceBurnTime > 0) {
      flag1=true;
      BlockFurnace.setState(furnaceBurnTime > 0,world,pos);
    }
  }
  if (flag1) {
    markDirty();
  }
}