package mods.eln.transparentnode.electricalantennatx;
import mods.eln.Eln;
import mods.eln.i18n.I18N;
import mods.eln.misc.Coordonate;
import mods.eln.misc.Direction;
import mods.eln.misc.LRDU;
import mods.eln.misc.Utils;
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.mna.misc.MnaConst;
import mods.eln.sim.nbt.*;
import mods.eln.transparentnode.electricalantennarx.ElectricalAntennaRxElement;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.nbt.NBTTagCompound;
import java.io.DataOutputStream;
import java.util.HashMap;
import java.util.Map;
public class ElectricalAntennaTxElement extends TransparentNodeElement {
ElectricalAntennaTxSlowProcess slowProcess = new ElectricalAntennaTxSlowProcess(this);
NbtElectricalLoad powerIn = new NbtElectricalLoad("powerIn");
NbtElectricalGateInput commandIn = new NbtElectricalGateInput("commandIn");
NbtElectricalGateOutput signalOut = new NbtElectricalGateOutput("signalOut");
NbtElectricalGateOutputProcess signalOutProcess = new NbtElectricalGateOutputProcess("signalOutProcess", signalOut);
NbtResistor powerResistor = new NbtResistor("powerResistor", powerIn, null);
ElectricalAntennaTxElectricalProcess electricalProcess = new ElectricalAntennaTxElectricalProcess(this);
LRDU rot = LRDU.Down;
boolean placeBoot = true;
ElectricalAntennaTxDescriptor descriptor;
Coordonate rxCoord = null;
ElectricalAntennaRxElement rxElement = null;
double powerEfficency = 0.0;
public ElectricalAntennaTxElement(TransparentNode transparentNode, TransparentNodeDescriptor descriptor) {
super(transparentNode, descriptor);
powerIn.setAsPrivate();
slowProcessList.add(slowProcess);
electricalLoadList.add(powerIn);
electricalLoadList.add(commandIn);
electricalLoadList.add(signalOut);
electricalComponentList.add(signalOutProcess);
electricalComponentList.add(powerResistor);
electricalProcessList.add(electricalProcess);
this.descriptor = (ElectricalAntennaTxDescriptor) descriptor;
}
public void txDisconnect() {
ElectricalAntennaRxElement rx = getRxElement();
if (rx != null) rx.rxDisconnect();
rxCoord = null;
rxElement = null;
}
ElectricalAntennaRxElement getRxElement() {
if (rxCoord == null) return null;
if (rxElement == null) {
NodeBase node = NodeManager.instance.getNodeFromCoordonate(rxCoord);
if (node != null && node instanceof TransparentNode && ((TransparentNode) node).element instanceof ElectricalAntennaRxElement)
rxElement = (ElectricalAntennaRxElement) ((TransparentNode) node).element;
else {
rxCoord = null;
Utils.println("ASSERT ElectricalAntennaRxElement getRxElement()");
}
}
return rxElement;
}
@Override
public ElectricalLoad getElectricalLoad(Direction side, LRDU lrdu) {
if (front.getInverse() != side.applyLRDU(lrdu)) return null;
if (side == front.applyLRDU(rot)) return powerIn;
if (side == front.applyLRDU(rot.left())) return signalOut;
if (side == front.applyLRDU(rot.right())) return commandIn;
return null;
}
@Override
public ThermalLoad getThermalLoad(Direction side, LRDU lrdu) {
return null;
}
@Override
public int getConnectionMask(Direction side, LRDU lrdu) {
if (front.getInverse() != side.applyLRDU(lrdu)) return 0;
if (side == front.applyLRDU(rot)) return NodeBase.maskElectricalPower;
if (side == front.applyLRDU(rot.left())) return NodeBase.maskElectricalOutputGate;
if (side == front.applyLRDU(rot.right())) return NodeBase.maskElectricalInputGate;
return 0;
}
@Override
public String multiMeterString(Direction side) {
return "";
}
@Override
public String thermoMeterString(Direction side) {
return "";
}
void calculatePowerInRp() {
double cmd = commandIn.getNormalized();
if (cmd == 0.0)
powerResistor.setR(MnaConst.highImpedance);
else
powerResistor.setR(descriptor.electricalNominalInputR / cmd);
}
@Override
public void initialize() {
descriptor.cable.applyTo(powerIn);
calculatePowerInRp();
connect();
}
@Override
public boolean onBlockActivated(EntityPlayer entityPlayer, Direction side, float vx, float vy, float vz) {
if (Utils.isPlayerUsingWrench(entityPlayer)) {
rot = rot.getNextClockwise();
node.reconnect();
return true;
}
return false;
}
@Override
public void readFromNBT(NBTTagCompound nbt) {
super.readFromNBT(nbt);
if (nbt.getBoolean("rxCoordValid")) {
rxCoord = new Coordonate();
rxCoord.readFromNBT(nbt, "rxCoord");
}
rot = LRDU.readFromNBT(nbt, "rot");
placeBoot = false;
}
@Override
public void writeToNBT(NBTTagCompound nbt) {
super.writeToNBT(nbt);
if (rxCoord == null)
nbt.setBoolean("rxCoordValid", false);
else {
nbt.setBoolean("rxCoordValid", true);
rxCoord.writeToNBT(nbt, "rxCoord");
}
rot.writeToNBT(nbt, "rot");
}
@Override
public void onBreakElement() {
txDisconnect();
super.onBreakElement();
}
public boolean mustHaveFloor() {
return false;
}
public boolean mustHaveCeiling() {
return false;
}
public boolean mustHaveWall() {
return false;
}
public boolean mustHaveWallFrontInverse() {
return true;
}
@Override
public void networkSerialize(DataOutputStream stream) {
super.networkSerialize(stream);
rot.serialize(stream);
node.lrduCubeMask.getTranslate(front.getInverse()).serialize(stream);
}
@Override
public Map<String, String> getWaila() {
Map<String, String> info = new HashMap<String, String>();
info.put(I18N.tr("Transmitting"), commandIn.getNormalized() > 0 ? "Yes" : "No");
info.put(I18N.tr("Efficiency"), Utils.plotPercent("", powerEfficency));
if (Eln.wailaEasyMode) {
info.put(I18N.tr("Power"), Utils.plotPower("", powerIn.getI() * powerIn.getU()));
}
return info;
}
}