package mods.eln.sixnode.hub; import mods.eln.Eln; 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.node.six.SixNodeElementInventory; import mods.eln.sim.ElectricalLoad; import mods.eln.sim.ThermalLoad; import mods.eln.sim.mna.component.Component; import mods.eln.sim.mna.component.Resistor; import mods.eln.sim.nbt.NbtElectricalLoad; import mods.eln.sim.process.destruct.VoltageStateWatchDog; import mods.eln.sim.process.destruct.WorldExplosion; import mods.eln.sixnode.electricalcable.ElectricalCableDescriptor; 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.Map; public class HubElement extends SixNodeElement { NbtElectricalLoad[] electricalLoad = new NbtElectricalLoad[4]; boolean[] connectionGrid = new boolean[]{false, false, false, false, true, true}; SixNodeElementInventory inventory = new SixNodeElementInventory(4, 64, this); public static final byte clientConnectionGridToggle = 1; public HubElement(SixNode sixNode, Direction side, SixNodeDescriptor descriptor) { super(sixNode, side, descriptor); for (int idx = 0; idx < 4; idx++) { electricalLoad[idx] = new NbtElectricalLoad("electricalLoad" + idx); electricalLoadList.add(electricalLoad[idx]); } } @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); for (int idx = 0; idx < 6; idx++) { connectionGrid[idx] = nbt.getBoolean("connectionGrid" + idx); } } @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); for (int idx = 0; idx < 6; idx++) { nbt.setBoolean("connectionGrid" + idx, connectionGrid[idx]); } } @Override public IInventory getInventory() { return inventory; } @Override public ElectricalLoad getElectricalLoad(LRDU lrdu) { if (inventory.getStackInSlot(HubContainer.cableSlotId + lrdu.toInt()) != null) return electricalLoad[lrdu.toInt()]; return null; } @Override public ThermalLoad getThermalLoad(LRDU lrdu) { return null; } @Override public int getConnectionMask(LRDU lrdu) { if (getElectricalLoad(lrdu) != null) return NodeBase.maskElectricalAll; return 0; } @Override public String multiMeterString() { return "";// Utils.plotVolt("U:", electricalLoad.Uc) + // Utils.plotAmpere("I:", electricalLoad.getCurrent()); } @Override public Map<String, String> getWaila() { return null; } @Override public String thermoMeterString() { return ""; } @Override public void networkSerialize(DataOutputStream stream) { super.networkSerialize(stream); try { for (int idx = 0; idx < 4; idx++) { Utils.serialiseItemStack(stream, inventory.getStackInSlot(HubContainer.cableSlotId + idx)); } for (int idx = 0; idx < 6; idx++) { stream.writeBoolean(connectionGrid[idx]); } } catch (IOException e) { e.printStackTrace(); } } @Override public void initialize() { setup(); for (int idx = 0; idx < 4; idx++) { Eln.applySmallRs(electricalLoad[idx]); } } @Override protected void inventoryChanged() { super.inventoryChanged(); sixNode.disconnect(); setup(); sixNode.connect(); } void setup() { slowProcessList.clear(); WorldExplosion exp = new WorldExplosion(this); exp.cableExplosion(); for (Component c : electricalComponentList) { Resistor r = (Resistor) c; r.breakConnection(); } electricalComponentList.clear(); for (LRDU lrdu : LRDU.values()) { ElectricalCableDescriptor d = getCableDescriptorFromLrdu(lrdu); if (d == null) continue; VoltageStateWatchDog watchdog = new VoltageStateWatchDog(); slowProcessList.add(watchdog); watchdog .setUNominal(d.electricalNominalVoltage) .set(electricalLoad[lrdu.toInt()]) .set(exp); } for (int idx = 0; idx < 6; idx++) { if (connectionGrid[idx]) { LRDU[] lrdu = connectionIdToSide(idx); if (inventory.getStackInSlot(HubContainer.cableSlotId + lrdu[0].toInt()) != null && inventory.getStackInSlot(HubContainer.cableSlotId + lrdu[1].toInt()) != null) { Resistor r = new Resistor(electricalLoad[lrdu[0].toInt()], electricalLoad[lrdu[1].toInt()]); r.setR(getCableDescriptorFromLrdu(lrdu[0]).electricalRs + getCableDescriptorFromLrdu(lrdu[1]).electricalRs); electricalComponentList.add(r); //ResistorCurrentWatchdog watchdog = new ResistorCurrentWatchdog(); //slowProcessList.add(watchdog); /*watchdog .set(r) .setIAbsMax(Math.min(getCableDescriptorFromLrdu(lrdu[0]).electricalMaximalCurrent, getCableDescriptorFromLrdu(lrdu[1]).electricalMaximalCurrent)) .set(exp);*/ } } } } ElectricalCableDescriptor getCableDescriptorFromLrdu(LRDU lrdu) { ElectricalCableDescriptor cableDescriptor; ItemStack cable; cable = inventory.getStackInSlot(HubContainer.cableSlotId + lrdu.toInt()); cableDescriptor = (ElectricalCableDescriptor) Eln.sixNodeItem.getDescriptor(cable); return cableDescriptor; } static LRDU[] connectionIdToSide(int id) { switch (id) { case 0: return new LRDU[]{LRDU.Left, LRDU.Down}; case 1: return new LRDU[]{LRDU.Right, LRDU.Up}; case 2: return new LRDU[]{LRDU.Down, LRDU.Right}; case 3: return new LRDU[]{LRDU.Up, LRDU.Left}; case 4: return new LRDU[]{LRDU.Left, LRDU.Right}; case 5: return new LRDU[]{LRDU.Down, LRDU.Up}; } return null; } @Override public boolean hasGui() { return true; } @Override public Container newContainer(Direction side, EntityPlayer player) { return new HubContainer(player, inventory); } @Override public boolean onBlockActivated(EntityPlayer entityPlayer, Direction side, float vx, float vy, float vz) { return false; } @Override public void networkUnserialize(DataInputStream stream) { super.networkUnserialize(stream); try { switch (stream.readByte()) { case clientConnectionGridToggle: int id = stream.readByte(); connectionGrid[id] = !connectionGrid[id]; sixNode.disconnect(); setup(); sixNode.connect(); needPublish(); break; } } catch (IOException e) { e.printStackTrace(); } } }