package net.fourbytes.shadow.network;
import com.badlogic.gdx.utils.ObjectMap.Entry;
import com.esotericsoftware.kryonet.Client;
import com.esotericsoftware.kryonet.Connection;
import com.esotericsoftware.kryonet.Listener;
import net.fourbytes.shadow.Shadow;
import net.fourbytes.shadow.mod.ModManager;
import java.io.IOException;
/**
* This class is a client class for networking. It is using KryoNet as underlying implementation.
*/
public class KryoNetClient extends KryoNetStream {
public static int bufferWrite = bufferObject*32;
public Client client;
public static int timeout = 10000;
public KryoNetClient() {
super();
client = new Client(bufferWrite, bufferObject);
register(client);
client.addListener(new Listener() {
@Override
public void connected(Connection con) {
KryoNetClient.this.connected(con);
//TODO Mod support
}
@Override
public void disconnected(Connection con) {
KryoNetClient.this.disconnected(con);
//TODO Mod support
}
@Override
public void received(Connection con, Object obj) {
if (!(obj instanceof Data)) {
return;
}
Entry entry = entries.getNext();
entry.key = con;
entry.value = obj;
queueHandle.add(entry);
//handled on main thread in #handle(...)
}
@Override
public void idle(Connection con) {
KryoNetClient.this.idle(con);
//TODO
}
});
client.start();
}
@Override
public void handle(Data data, Object target) {
if (ModManager.handleClient(data, target)) {
return;
}
if (!(target instanceof Connection)) {
return;
}
Connection c = (Connection) target;
if (Shadow.level instanceof ClientLevel) {
((ClientLevel)Shadow.level).handle(data, c);
}
//TODO
}
@Override
public void sendTCP(Data data, Object target) {
if (target != null) {
if (target instanceof Connection) {
((Connection)target).sendTCP(data);
return;
}
}
client.sendTCP(data);
}
@Override
public void sendUDP(Data data, Object target) {
if (target != null) {
if (target instanceof Connection) {
((Connection)target).sendUDP(data);
return;
}
}
client.sendUDP(data);
}
@Override
public void start() {
}
@Override
public void connect(String ip) {
int portTCP = NetStream.portTCP;
int portUDP = NetStream.portUDP;
int tcpIndex = ip.indexOf(":");
if (tcpIndex > 0) {
ip = ip.substring(0, tcpIndex);
int udpIndex = ip.indexOf("/");
if (udpIndex > 0) {
portUDP = Integer.parseInt(ip.substring(udpIndex));
} else {
udpIndex = ip.length();
}
portTCP = Integer.parseInt(ip.substring(tcpIndex), udpIndex);
}
try {
client.connect(timeout, ip, portTCP, portUDP);
client.start();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void disconnect() {
client.close();
}
@Override
public void connected(Connection con) {
client.sendTCP(new DataHandshake(Shadow.playerInfo));
}
@Override
public void disconnected(Connection con) {
//TODO
}
@Override
public void idle(Connection con) {
}
}