package mods.eln.transparentnode.heatfurnace; import mods.eln.i18n.I18N; import mods.eln.item.regulator.IRegulatorDescriptor; import mods.eln.misc.Direction; import mods.eln.misc.LRDU; import mods.eln.misc.Utils; import mods.eln.node.NodeBase; import mods.eln.node.NodePeriodicPublishProcess; import mods.eln.node.transparent.TransparentNode; import mods.eln.node.transparent.TransparentNodeDescriptor; import mods.eln.node.transparent.TransparentNodeElement; import mods.eln.node.transparent.TransparentNodeElementInventory; import mods.eln.sim.ElectricalLoad; import mods.eln.sim.ThermalLoad; import mods.eln.sim.nbt.NbtElectricalGateInput; import mods.eln.sim.nbt.NbtFurnaceProcess; import mods.eln.sim.nbt.NbtThermalLoad; import mods.eln.sim.process.destruct.ThermalLoadWatchDog; import mods.eln.sim.process.destruct.WorldExplosion; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.util.HashMap; import java.util.Map; /* 5s/item @ 500 C */ public class HeatFurnaceElement extends TransparentNodeElement { public NbtElectricalGateInput electricalCmdLoad = new NbtElectricalGateInput("electricalCmdLoad"); //public SignalRp electricalCmdRp = new SignalRp(electricalCmdLoad); public NbtThermalLoad thermalLoad = new NbtThermalLoad("thermalLoad"); public NbtFurnaceProcess furnaceProcess = new NbtFurnaceProcess("furnaceProcess", thermalLoad); public HeatFurnaceInventoryProcess inventoryProcess = new HeatFurnaceInventoryProcess(this); TransparentNodeElementInventory inventory = new HeatFurnaceInventory(4, 64, this); HeatFurnaceThermalProcess regulator = new HeatFurnaceThermalProcess("regulator", furnaceProcess, this); HeatFurnaceDescriptor descriptor; ThermalLoadWatchDog thermalWatchdog = new ThermalLoadWatchDog(); public static final byte unserializeGain = 1; public static final byte unserializeTemperatureTarget = 2; public static final byte unserializeToogleControlExternalId = 3; public static final byte unserializeToogleTakeFuelId = 4; public boolean controlExternal = false, takeFuel = false; public HeatFurnaceElement(TransparentNode transparentNode, TransparentNodeDescriptor descriptor) { super(transparentNode, descriptor); //this.descriptor.alphaClose = 0; this.descriptor = (HeatFurnaceDescriptor) descriptor; furnaceProcess.setGainMin(0.1); thermalLoadList.add(thermalLoad); thermalFastProcessList.add(furnaceProcess); slowProcessList.add(inventoryProcess); thermalFastProcessList.add(regulator); electricalLoadList.add(electricalCmdLoad); //electricalComponentList.add(electricalCmdRp); slowProcessList.add(new NodePeriodicPublishProcess(transparentNode, 2.0, 1.0)); slowProcessList.add(thermalWatchdog); thermalWatchdog .set(thermalLoad) .setLimit(this.descriptor.thermal) .set(new WorldExplosion(this).machineExplosion()); } @Override public ElectricalLoad getElectricalLoad(Direction side, LRDU lrdu) { return electricalCmdLoad; } @Override public ThermalLoad getThermalLoad(Direction side, LRDU lrdu) { if (side == front.getInverse() && lrdu == LRDU.Down) return thermalLoad; return null; } @Override public int getConnectionMask(Direction side, LRDU lrdu) { if ((side == front.left() || side == front.right()) && lrdu == LRDU.Down) return NodeBase.maskElectricalInputGate; if (side == front.getInverse() && lrdu == LRDU.Down) return NodeBase.maskThermal; return 0; } @Override public String multiMeterString(Direction side) { return ""; } @Override public String thermoMeterString(Direction side) { return Utils.plotCelsius("T:", thermalLoad.Tc); } @Override public void initialize() { descriptor.applyTo(thermalLoad); descriptor.applyTo(furnaceProcess); computeInventory(); connect(); inventoryProcess.process(1 / 20.0); } @Override public boolean onBlockActivated(EntityPlayer entityPlayer, Direction side, float vx, float vy, float vz) { return false; } @Override public void networkSerialize(DataOutputStream stream) { super.networkSerialize(stream); try { stream.writeBoolean(getControlExternal()); stream.writeBoolean(getTakeFuel()); stream.writeShort((short) (thermalLoad.Tc * NodeBase.networkSerializeTFactor)); stream.writeFloat((float) furnaceProcess.getGain()); stream.writeFloat((float) regulator.getTarget()); stream.writeShort((int) furnaceProcess.getP()); serialiseItemStack(stream, inventory.getStackInSlot(HeatFurnaceContainer.combustibleId)); } catch (IOException e) { e.printStackTrace(); } } @Override public boolean hasGui() { return true; } @Override public Container newContainer(Direction side, EntityPlayer player) { return new HeatFurnaceContainer(node, player, inventory, descriptor); } @Override public IInventory getInventory() { return inventory; } @Override public byte networkUnserialize(DataInputStream stream) { byte packetType = super.networkUnserialize(stream); try { switch (packetType) { case unserializeGain: if (inventory.getStackInSlot(HeatFurnaceContainer.regulatorId) == null) { furnaceProcess.setGain(stream.readFloat()); } needPublish(); break; case unserializeTemperatureTarget: //if(inventory.getStackInSlot(HeatFurnaceContainer.regulatorId) == null) { regulator.setTarget(stream.readFloat()); } needPublish(); break; case unserializeToogleControlExternalId: regulator.setTarget(0); setControlExternal(!getControlExternal()); break; case unserializeToogleTakeFuelId: setTakeFuel(!getTakeFuel()); break; default: return packetType; } } catch (IOException e) { e.printStackTrace(); } return unserializeNulldId; } public boolean getControlExternal() { return controlExternal; } public void setControlExternal(boolean value) { if (value != controlExternal) needPublish(); controlExternal = value; computeInventory(); } public boolean getTakeFuel() { return takeFuel; } public void setTakeFuel(boolean value) { if (value != takeFuel) needPublish(); takeFuel = value; } @Override public void inventoryChange(IInventory inventory) { super.inventoryChange(inventory); computeInventory(); needPublish(); } void computeInventory() { ItemStack regulatorStack = inventory.getStackInSlot(HeatFurnaceContainer.regulatorId); if (regulatorStack != null && !controlExternal) { IRegulatorDescriptor regulator = (IRegulatorDescriptor) Utils.getItemObject(regulatorStack); regulator.applyTo(this.regulator, 500.0, 10.0, 0.1, 0.1); // furnace.regulator.target = 240; } else { regulator.setManual(); } } @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); nbt.setBoolean("takeFuel", takeFuel); nbt.setBoolean("controlExternal", controlExternal); } @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); takeFuel = nbt.getBoolean("takeFuel"); controlExternal = nbt.getBoolean("controlExternal"); } @Override public Map<String, String> getWaila() { Map<String, String> info = new HashMap<String, String>(); info.put(I18N.tr("Temperature"), Utils.plotCelsius("", thermalLoad.Tc)); info.put(I18N.tr("Set temperature"), Utils.plotCelsius("", regulator.getTarget())); return info; } }