package mods.eln.sixnode.wirelesssignal.source;
import mods.eln.misc.Coordonate;
import mods.eln.misc.Direction;
import mods.eln.misc.LRDU;
import mods.eln.misc.Utils;
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.sixnode.wirelesssignal.IWirelessSignalTx;
import mods.eln.sixnode.wirelesssignal.tx.WirelessSignalTxElement;
import mods.eln.sixnode.wirelesssignal.tx.WirelessSignalTxElement.LightningGlitchProcess;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.nbt.NBTTagCompound;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
public class WirelessSignalSourceElement extends SixNodeElement implements IWirelessSignalTx {
public static final HashMap<String, ArrayList<IWirelessSignalTx>> channelMap = new HashMap<String, ArrayList<IWirelessSignalTx>>();
WirelessSignalSourceDescriptor descriptor;
public AutoResetProcess autoResetProcess;
boolean state = false;
public String channel = "Default channel";
private LightningGlitchProcess lightningGlitchProcess;
public static final byte setChannelId = 1;
public WirelessSignalSourceElement(SixNode sixNode, Direction side, SixNodeDescriptor descriptor) {
super(sixNode, side, descriptor);
this.descriptor = (WirelessSignalSourceDescriptor) descriptor;
WirelessSignalTxElement.channelRegister(this);
slowProcessList.add(lightningGlitchProcess = new LightningGlitchProcess(getCoordonate()));
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) {
if (state) {
state = false;
needPublish();
}
}
timeout -= time;
}
}
void reset() {
timeout = timeoutDelay;
}
}
@Override
public ElectricalLoad getElectricalLoad(LRDU lrdu) {
return null;
}
@Override
public ThermalLoad getThermalLoad(LRDU lrdu) {
return null;
}
@Override
public int getConnectionMask(LRDU lrdu) {
return 0;
}
@Override
public String multiMeterString() {
return null;
}
@Override
public String thermoMeterString() {
return null;
}
@Override
public void initialize() {
}
@Override
public boolean onBlockActivated(EntityPlayer entityPlayer, Direction side, float vx, float vy, float vz) {
if (Utils.isPlayerUsingWrench(entityPlayer))
return false;
state = !state;
if (state && autoResetProcess != null) autoResetProcess.reset();
needPublish();
return true;
}
@Override
public void destroy(EntityPlayerMP entityPlayer) {
WirelessSignalTxElement.channelRemove(this);
super.destroy(entityPlayer);
}
@Override
public void writeToNBT(NBTTagCompound nbt) {
super.writeToNBT(nbt);
nbt.setString("channel", channel);
nbt.setBoolean("state", state);
}
@Override
public void readFromNBT(NBTTagCompound nbt) {
WirelessSignalTxElement.channelRemove(this);
super.readFromNBT(nbt);
channel = nbt.getString("channel");
state = nbt.getBoolean("state");
WirelessSignalTxElement.channelRegister(this);
}
@Override
public Coordonate getCoordonate() {
return sixNode.coordonate;
}
@Override
public int getRange() {
return descriptor.range;
}
@Override
public String getChannel() {
return channel;
}
@Override
public double getValue() {
return (state ? 1.0 : 0.0) + lightningGlitchProcess.glitchOffset;
}
@Override
public void networkUnserialize(DataInputStream stream) {
super.networkUnserialize(stream);
try {
switch (stream.readByte()) {
case setChannelId:
WirelessSignalTxElement.channelRemove(this);
channel = stream.readUTF();
needPublish();
WirelessSignalTxElement.channelRegister(this);
break;
}
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public boolean hasGui() {
return true;
}
@Override
public void networkSerialize(DataOutputStream stream) {
super.networkSerialize(stream);
try {
stream.writeUTF(channel);
stream.writeBoolean(state);
} catch (IOException e) {
e.printStackTrace();
}
}
}