/** * Copyright (c) 2011-2015, SpaceToad and the BuildCraft Team * http://www.mod-buildcraft.com * <p/> * BuildCraft is distributed under the terms of the Minecraft Mod Public * License 1.0, or MMPL. Please check the contents of the license located in * http://www.mod-buildcraft.com/MMPL-1.0.txt */ package buildcraft.energy; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Items; import net.minecraft.inventory.Container; import net.minecraft.inventory.ICrafting; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntityFurnace; import net.minecraftforge.common.util.ForgeDirection; import buildcraft.BuildCraftEnergy; import buildcraft.core.GuiIds; import buildcraft.core.lib.engines.TileEngineWithInventory; import buildcraft.core.lib.inventory.InvUtils; import buildcraft.core.lib.utils.MathUtils; public class TileEngineStone extends TileEngineWithInventory { static final float MAX_OUTPUT = 10; static final float MIN_OUTPUT = MAX_OUTPUT / 3; static final float TARGET_OUTPUT = .375f; final float kp = 1f; final float ki = 0.05f; final double eLimit = (MAX_OUTPUT - MIN_OUTPUT) / ki; int burnTime = 0; int totalBurnTime = 0; ItemStack burnItem; double esum = 0; public TileEngineStone() { super(1); } @Override public int getCurrentOutputLimit() { return (int) Math.floor((float) getIdealOutput() * heat / IDEAL_HEAT); } @Override public boolean onBlockActivated(EntityPlayer player, ForgeDirection side) { if (super.onBlockActivated(player, side)) { return true; } if (!worldObj.isRemote) { player.openGui(BuildCraftEnergy.instance, GuiIds.ENGINE_STONE, worldObj, xCoord, yCoord, zCoord); } return true; } @Override public boolean isBurning() { return burnTime > 0; } @Override public void overheat() { super.overheat(); burnTime = 0; } @Override public void burn() { if (burnTime > 0) { burnTime--; if (isRedstonePowered) { currentOutput = getIdealOutput(); addEnergy(currentOutput); } } else { currentOutput = 0; } if (burnTime == 0 && isRedstonePowered) { burnTime = totalBurnTime = getItemBurnTime(getStackInSlot(0)); if (burnTime > 0) { burnItem = getStackInSlot(0); setInventorySlotContents(0, InvUtils.consumeItem(getStackInSlot(0))); } } } public int getScaledBurnTime(int i) { return (int) (((float) burnTime / (float) totalBurnTime) * i); } private int getItemBurnTime(ItemStack itemstack) { if (itemstack == null) { return 0; } else if (itemstack.getItem() == Items.paper) { return 400; } else { return TileEntityFurnace.getItemBurnTime(itemstack); } } /* SAVING & LOADING */ @Override public void readFromNBT(NBTTagCompound data) { super.readFromNBT(data); burnTime = data.getInteger("burnTime"); totalBurnTime = data.getInteger("totalBurnTime"); } @Override public void writeToNBT(NBTTagCompound data) { super.writeToNBT(data); data.setInteger("burnTime", burnTime); data.setInteger("totalBurnTime", totalBurnTime); } @Override public void getGUINetworkData(int id, int value) { super.getGUINetworkData(id, value); switch (id) { case 15: burnTime = value; break; case 16: totalBurnTime = value; break; } } @Override public void sendGUINetworkData(Container containerEngine, ICrafting iCrafting) { super.sendGUINetworkData(containerEngine, iCrafting); iCrafting.sendProgressBarUpdate(containerEngine, 15, burnTime); iCrafting.sendProgressBarUpdate(containerEngine, 16, totalBurnTime); } @Override public int getMaxEnergy() { return 10000; } @Override public int getIdealOutput() { if (burnItem != null && burnItem.getItem() == Items.paper) { return 1; } double e = TARGET_OUTPUT * getMaxEnergy() - energy; esum = MathUtils.clamp(esum + e, -eLimit, eLimit); return (int) Math.round(MathUtils.clamp(e * kp + esum * ki, MIN_OUTPUT, MAX_OUTPUT)); } @Override public boolean hasCustomInventoryName() { return false; } }