package mods.eln.sixnode.electricalgatesource;
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.IProcess;
import mods.eln.sim.ThermalLoad;
import mods.eln.sim.nbt.NbtElectricalGateOutputProcess;
import mods.eln.sim.nbt.NbtElectricalLoad;
import mods.eln.sound.SoundCommand;
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 ElectricalGateSourceElement extends SixNodeElement {
public ElectricalGateSourceDescriptor descriptor;
public NbtElectricalLoad outputGate = new NbtElectricalLoad("outputGate");
public NbtElectricalGateOutputProcess outputGateProcess = new NbtElectricalGateOutputProcess("outputGateProcess", outputGate);
public AutoResetProcess autoResetProcess;
public static final byte setVoltagerId = 1;
public ElectricalGateSourceElement(SixNode sixNode, Direction side, SixNodeDescriptor descriptor) {
super(sixNode, side, descriptor);
this.descriptor = (ElectricalGateSourceDescriptor) descriptor;
electricalLoadList.add(outputGate);
electricalComponentList.add(outputGateProcess);
if (this.descriptor.autoReset) {
slowProcessList.add(autoResetProcess = new AutoResetProcess());
autoResetProcess.reset();
}
}
class AutoResetProcess implements IProcess {
double timeout = 0;
double timeoutDelay = 0.21;
@Override
public void process(double time) {
if (timeout > 0) {
if (timeout - time < 0) {
outputGateProcess.setOutputNormalized(0);
needPublish();
}
timeout -= time;
}
}
void reset() {
timeout = timeoutDelay;
}
}
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);
}
@Override
public void writeToNBT(NBTTagCompound nbt) {
super.writeToNBT(nbt);
nbt.setByte("front", (byte) ((front.toInt() << 0)));
}
@Override
public ElectricalLoad getElectricalLoad(LRDU lrdu) {
if (front == lrdu) return outputGate;
return null;
}
@Override
public ThermalLoad getThermalLoad(LRDU lrdu) {
return null;
}
@Override
public int getConnectionMask(LRDU lrdu) {
if (front == lrdu) return NodeBase.maskElectricalOutputGate;
return 0;
}
@Override
public String multiMeterString() {
return Utils.plotUIP(outputGate.getU(), outputGate.getCurrent());
}
@Override
public Map<String, String> getWaila() {
Map<String, String> info = new HashMap<String, String>();
info.put(I18N.tr("Output voltage"), Utils.plotVolt("", outputGate.getU()));
return info;
}
@Override
public String thermoMeterString() {
return "";
}
@Override
public void networkSerialize(DataOutputStream stream) {
super.networkSerialize(stream);
try {
stream.writeByte(front.toInt() << 4);
stream.writeFloat((float) outputGateProcess.getU());
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void initialize() {
Eln.instance.signalCableDescriptor.applyTo(outputGate);
computeElectricalLoad();
}
@Override
protected void inventoryChanged() {
computeElectricalLoad();
}
public void computeElectricalLoad() {
}
@Override
public boolean onBlockActivated(EntityPlayer entityPlayer, Direction side, float vx, float vy, float vz) {
ItemStack currentItemStack = entityPlayer.getCurrentEquippedItem();
if (onBlockActivatedRotate(entityPlayer)) {
return true;
} else if (!Utils.playerHasMeter(entityPlayer) && descriptor.onOffOnly) {
outputGateProcess.state(!outputGateProcess.getOutputOnOff());
play(new SoundCommand("random.click").mulVolume(0.3F, 0.6F).smallRange());
if (autoResetProcess != null)
autoResetProcess.reset();
needPublish();
return true;
}
// front = LRDU.fromInt((front.toInt() + 1)&3);
return false;
}
@Override
public void networkUnserialize(DataInputStream stream) {
super.networkUnserialize(stream);
try {
switch (stream.readByte()) {
case setVoltagerId:
outputGateProcess.setU(stream.readFloat());
needPublish();
break;
}
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public boolean hasGui() {
return !descriptor.onOffOnly;
}
}