package mods.eln.sixnode.electricalswitch;
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.mna.component.Resistor;
import mods.eln.sim.mna.component.ResistorSwitch;
import mods.eln.sim.nbt.NbtElectricalLoad;
import mods.eln.sim.process.destruct.VoltageStateWatchDog;
import mods.eln.sim.process.destruct.WorldExplosion;
import mods.eln.sound.SoundCommand;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class ElectricalSwitchElement extends SixNodeElement {
public ElectricalSwitchDescriptor descriptor;
public NbtElectricalLoad aLoad = new NbtElectricalLoad("aLoad");
public NbtElectricalLoad bLoad = new NbtElectricalLoad("bLoad");
public ResistorSwitch switchResistor = new ResistorSwitch("switchRes", aLoad, bLoad);
VoltageStateWatchDog voltageWatchDogA = new VoltageStateWatchDog();
VoltageStateWatchDog voltageWatchDogB = new VoltageStateWatchDog();
// ResistorCurrentWatchdog currentWatchDog = new ResistorCurrentWatchdog();
boolean switchState = false;
public ElectricalSwitchElement(SixNode sixNode, Direction side, SixNodeDescriptor descriptor) {
super(sixNode, side, descriptor);
switchResistor.mustUseUltraImpedance();
electricalLoadList.add(aLoad);
electricalLoadList.add(bLoad);
electricalComponentList.add(switchResistor);
electricalComponentList.add(new Resistor(bLoad, null).pullDown());
electricalComponentList.add(new Resistor(aLoad, null).pullDown());
this.descriptor = (ElectricalSwitchDescriptor) descriptor;
WorldExplosion exp = new WorldExplosion(this).cableExplosion();
// slowProcessList.add(currentWatchDog);
slowProcessList.add(voltageWatchDogA);
slowProcessList.add(voltageWatchDogB);
//currentWatchDog.set(switchResistor).setIAbsMax(this.descriptor.maximalPower/this.descriptor.nominalVoltage).set(exp);
voltageWatchDogA.set(aLoad).setUNominalMirror(this.descriptor.nominalVoltage).set(exp);
voltageWatchDogB.set(bLoad).setUNominalMirror(this.descriptor.nominalVoltage).set(exp);
}
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);
switchState = nbt.getBoolean("switchState");
}
@Override
public void writeToNBT(NBTTagCompound nbt) {
super.writeToNBT(nbt);
nbt.setByte("front", (byte) (front.toInt() << 0));
nbt.setBoolean("switchState", switchState);
}
@Override
public ElectricalLoad getElectricalLoad(LRDU lrdu) {
if (front == lrdu) return aLoad;
if (front.inverse() == lrdu) return bLoad;
return null;
}
@Override
public ThermalLoad getThermalLoad(LRDU lrdu) {
//return thermalLoad;
return null;
}
@Override
public int getConnectionMask(LRDU lrdu) {
if (front == lrdu) return descriptor.getNodeMask();
if (front.inverse() == lrdu) return descriptor.getNodeMask();
return 0;
}
@Override
public String multiMeterString() {
return Utils.plotVolt("Ua:", aLoad.getU()) + Utils.plotVolt("Ub:", bLoad.getU()) + Utils.plotAmpere("I:", aLoad.getCurrent());
}
@Override
public Map<String, String> getWaila() {
Map<String, String> info = new HashMap<String, String>();
info.put(I18N.tr("Position"), switchState ? I18N.tr("Closed") : I18N.tr("Open"));
info.put(I18N.tr("Current"), Utils.plotAmpere("", aLoad.getCurrent()));
if (Eln.wailaEasyMode) {
info.put(I18N.tr("Voltages"), Utils.plotVolt("", aLoad.getU()) + Utils.plotVolt(" ", bLoad.getU()));
}
return info;
}
@Override
public String thermoMeterString() {
//return Utils.plotCelsius("T:",thermalLoad.Tc);
return "";
}
@Override
public void networkSerialize(DataOutputStream stream) {
super.networkSerialize(stream);
try {
stream.writeBoolean(switchState);
stream.writeShort((short) (aLoad.getU() * NodeBase.networkSerializeUFactor));
stream.writeShort((short) (bLoad.getU() * NodeBase.networkSerializeUFactor));
stream.writeShort((short) (aLoad.getCurrent() * NodeBase.networkSerializeIFactor));
//stream.writeShort((short)(thermalLoad.Tc * NodeBase.networkSerializeTFactor));
stream.writeShort(0);
} catch (IOException e) {
e.printStackTrace();
}
}
public void setSwitchState(boolean state) {
switchState = state;
switchResistor.setState(state);
needPublish();
}
@Override
public void initialize() {
//descriptor.thermal.applyTo(thermalLoad);
descriptor.applyTo(aLoad);
descriptor.applyTo(bLoad);
switchResistor.setR(descriptor.electricalRs);
setSwitchState(switchState);
}
@Override
public boolean onBlockActivated(EntityPlayer entityPlayer, Direction side, float vx, float vy, float vz) {
if (onBlockActivatedRotate(entityPlayer)) return true;
ItemStack currentItemStack = entityPlayer.getCurrentEquippedItem();
if (Eln.multiMeterElement.checkSameItemStack(entityPlayer.getCurrentEquippedItem())) {
return false;
}
if (Eln.thermometerElement.checkSameItemStack(entityPlayer.getCurrentEquippedItem())) {
return false;
}
if (Eln.allMeterElement.checkSameItemStack(entityPlayer.getCurrentEquippedItem())) {
return false;
} else {
setSwitchState(!switchState);
//playSoundEffect("random.click", 0.3F, 0.6F);
play(new SoundCommand("random.click").mulVolume(0.3F, 0.6f).smallRange());
return true;
}
//front = LRDU.fromInt((front.toInt()+1)&3);
}
}