package mods.eln.sixnode.electricaltimeout; import mods.eln.Eln; import mods.eln.i18n.I18N; import mods.eln.misc.Direction; import mods.eln.misc.LRDU; import mods.eln.misc.Utils; import mods.eln.node.NodeBase; import mods.eln.node.six.SixNode; import mods.eln.node.six.SixNodeDescriptor; import mods.eln.node.six.SixNodeElement; import mods.eln.sim.ElectricalLoad; import mods.eln.sim.ThermalLoad; import mods.eln.sim.nbt.NbtElectricalGateInput; import mods.eln.sim.nbt.NbtElectricalGateOutput; import mods.eln.sim.nbt.NbtElectricalGateOutputProcess; import net.minecraft.entity.player.EntityPlayer; 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; public class ElectricalTimeoutElement extends SixNodeElement { public ElectricalTimeoutDescriptor descriptor; public NbtElectricalGateInput inputGate = new NbtElectricalGateInput("inputGate"); public NbtElectricalGateOutput outputGate = new NbtElectricalGateOutput("outputGate"); public NbtElectricalGateOutputProcess outputGateProcess = new NbtElectricalGateOutputProcess("outputGateProcess", outputGate); public ElectricalTimeoutProcess slowProcess = new ElectricalTimeoutProcess(this); double timeOutCounter = 0, timeOutValue = 2; public static final byte resetId = 1; public static final byte setTimeOutValueId = 2; public static final byte setId = 3; public ElectricalTimeoutElement(SixNode sixNode, Direction side, SixNodeDescriptor descriptor) { super(sixNode, side, descriptor); electricalLoadList.add(inputGate); electricalLoadList.add(outputGate); electricalComponentList.add(outputGateProcess); thermalProcessList.add(slowProcess); this.descriptor = (ElectricalTimeoutDescriptor) descriptor; } public static boolean canBePlacedOnSide(Direction side, int type) { return true; } @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); byte value = nbt.getByte("front"); front = LRDU.fromInt((value >> 0) & 0x3); timeOutValue = nbt.getFloat("timeOutValue"); timeOutCounter = nbt.getFloat("timeOutCounter"); } @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); nbt.setByte("front", (byte) (front.toInt() << 0)); nbt.setFloat("timeOutValue", (float) timeOutValue); nbt.setFloat("timeOutCounter", (float) timeOutCounter); } @Override public ElectricalLoad getElectricalLoad(LRDU lrdu) { if (front == lrdu) return inputGate; if (front.inverse() == lrdu) return outputGate; return null; } @Override public ThermalLoad getThermalLoad(LRDU lrdu) { return null; } @Override public int getConnectionMask(LRDU lrdu) { if (front == lrdu) return NodeBase.maskElectricalInputGate; if (front.inverse() == lrdu) return NodeBase.maskElectricalOutputGate; return 0; } @Override public String multiMeterString() { return inputGate.plot("Input:") + outputGate.plot("Output:"); } @Override public Map<String, String> getWaila() { Map<String, String> info = new HashMap<String, String>(); info.put(I18N.tr("Input"), inputGate.stateHigh() ? I18N.tr("ON") : I18N.tr("OFF")); info.put(I18N.tr("Output"), timeOutCounter > 0 ? I18N.tr("ON") : I18N.tr("OFF")); if (Eln.wailaEasyMode) { info.put(I18N.tr("Remaining"), Utils.plotValue(timeOutCounter, "s")); } return info; } @Override public String thermoMeterString() { return ""; } @Override public void networkSerialize(DataOutputStream stream) { super.networkSerialize(stream); try { stream.writeFloat((float) timeOutValue); stream.writeFloat((float) timeOutCounter); stream.writeBoolean(slowProcess.inputState); } catch (IOException e) { e.printStackTrace(); } } @Override public void initialize() { } void set() { timeOutCounter = timeOutValue; needPublish(); } void reset() { timeOutCounter = 0.0; needPublish(); } @Override public void networkUnserialize(DataInputStream stream) { super.networkUnserialize(stream); try { switch (stream.readByte()) { case resetId: reset(); break; case setId: set(); break; case setTimeOutValueId: timeOutValue = stream.readFloat(); needPublish(); break; } } catch (IOException e) { e.printStackTrace(); } } @Override public boolean hasGui() { return true; } }