package mods.eln.transparentnode.computercraftio;
import dan200.computercraft.api.lua.ILuaContext;
import dan200.computercraft.api.lua.LuaException;
import dan200.computercraft.api.peripheral.IComputerAccess;
import dan200.computercraft.api.peripheral.IPeripheral;
import mods.eln.misc.Coordonate;
import mods.eln.misc.Direction;
import mods.eln.misc.LRDU;
import mods.eln.node.NodeBase;
import mods.eln.node.NodeManager;
import mods.eln.node.transparent.TransparentNode;
import mods.eln.node.transparent.TransparentNodeDescriptor;
import mods.eln.node.transparent.TransparentNodeElement;
import mods.eln.sim.ElectricalLoad;
import mods.eln.sim.ThermalLoad;
import mods.eln.sim.nbt.NbtElectricalGateInputOutput;
import mods.eln.sim.nbt.NbtElectricalGateOutputProcess;
import net.minecraft.entity.player.EntityPlayer;
import java.util.Map;
public class ComputerCraftIoElement extends TransparentNodeElement implements IPeripheral {
public NbtElectricalGateInputOutput[] ioGate = new NbtElectricalGateInputOutput[4];
public NbtElectricalGateOutputProcess[] ioGateProcess = new NbtElectricalGateOutputProcess[4];
ComputerCraftIoDescriptor descriptor;
public ComputerCraftIoElement(TransparentNode transparentNode, TransparentNodeDescriptor descriptor) {
super(transparentNode, descriptor);
for (int idx = 0; idx < 4; idx++) {
ioGate[idx] = new NbtElectricalGateInputOutput("ioGate" + idx);
ioGateProcess[idx] = new NbtElectricalGateOutputProcess("ioGateProcess" + idx, ioGate[idx]);
electricalLoadList.add(ioGate[idx]);
electricalComponentList.add(ioGateProcess[idx]);
ioGateProcess[idx].setHighImpedance(true);
}
this.descriptor = (ComputerCraftIoDescriptor) descriptor;
}
@Override
public ElectricalLoad getElectricalLoad(Direction side, LRDU lrdu) {
if (lrdu != LRDU.Down || side.isY()) return null;
return ioGate[side.getHorizontalIndex()];
}
@Override
public ThermalLoad getThermalLoad(Direction side, LRDU lrdu) {
return null;
}
@Override
public int getConnectionMask(Direction side, LRDU lrdu) {
if (lrdu == lrdu.Down && side.isNotY()) {
return NodeBase.maskElectricalGate;
}
return 0;
}
@Override
public String multiMeterString(Direction side) {
return null;
//Utils.plotUIP(powerLoad.Uc, powerLoad.getCurrent());
}
@Override
public String thermoMeterString(Direction side) {
return null;
}
@Override
public void initialize() {
connect();
}
@Override
public boolean onBlockActivated(EntityPlayer entityPlayer, Direction side, float vx, float vy, float vz) {
return false;
}
public String getType() {
return "EAProbe";
}
@Override
public String[] getMethodNames() {
return new String[]{"writeDirection", "readDirection", "writeOutput", "readOutput", "readInput"};
}
@Override
public Object[] callMethod(IComputerAccess computer, ILuaContext context,
int method, Object[] arguments) throws LuaException, InterruptedException {
int id = -1;
if (arguments.length < 1) return null;
if (!(arguments[0] instanceof String)) return null;
String arg0 = (String) arguments[0];
if (arg0.length() < 2) return null;
String sideStr = arg0.substring(0, 2);
String remaineStr = arg0.substring(2, arg0.length());
//Utils.println(sideStr + " " + remaineStr);
if (sideStr.equals("XN")) id = 0;
if (sideStr.equals("XP")) id = 1;
if (sideStr.equals("ZN")) id = 2;
if (sideStr.equals("ZP")) id = 3;
if (id == -1) return null;
if (remaineStr.length() != 0) {
Coordonate c = new Coordonate(this.node.coordonate);
Direction side = Direction.fromHorizontalIndex(id);
c.move(side);
//Utils.println("SUB probe ! " + side + " " + c);
NodeBase n = NodeManager.instance.getNodeFromCoordonate(c);
if (n == null) return null;
//Utils.println(" NodeBase");
if (!(n instanceof TransparentNode)) return null;
//Utils.println(" TransparentNode");
TransparentNode tn = (TransparentNode) n;
if (!(tn.element instanceof ComputerCraftIoElement)) return null;
//Utils.println(" ComputerCraftIoElement");
ComputerCraftIoElement e = (ComputerCraftIoElement) tn.element;
Object[] argumentsCopy = arguments.clone();
argumentsCopy[0] = remaineStr;
return e.callMethod(computer, context, method, argumentsCopy);
}
switch (method) {
case 0:
if (arguments.length < 2) return null;
ioGateProcess[id].setHighImpedance(arguments[1].equals("in"));
break;
case 1:
return new Object[]{ioGateProcess[id].isHighImpedance() ? "in" : "out"};
case 2:
if (arguments.length < 2) return null;
ioGateProcess[id].setOutputNormalized((Double) arguments[1]);
break;
case 3:
return new Object[]{ioGateProcess[id].getOutputNormalized()};
case 4:
return new Object[]{ioGate[id].getInputNormalized()};
default:
break;
}
return null;
}
@Override
public void attach(IComputerAccess computer) {
}
@Override
public void detach(IComputerAccess computer) {
}
@Override
public boolean equals(IPeripheral other) {
return other == this;
}
@Override
public Map<String, String> getWaila() {
return null;
}
}