package rts.core.network;
import java.io.IOException;
import org.luawars.Log;
import rts.core.engine.Engine;
import rts.core.network.ig_tcp_container.CreateEntityState;
import rts.core.network.ig_tcp_container.DeleteEntityState;
import rts.core.network.ig_udp_containers.EntityState;
import rts.core.network.menu_tcp_containers.ClientState;
import rts.core.network.menu_tcp_containers.MessageState;
import rts.core.network.menu_tcp_containers.ServerState;
public class NetworkManager {
private Engine engine;
private NetworkPool pool;
private INetworkMenuListener menuListener;
private NetworkServerDiscover discover;
private boolean inGame;
private boolean isServer;
// Server
private ServerManager server;
private ServerState serverState;
// Client
private ClientState clientState;
private ClientManager clientManager;
public NetworkManager() {
pool = new NetworkPool();
discover = new NetworkServerDiscover(this);
}
public void update() {
if (engine != null && clientManager != null) {
// Receive
pool.updateReceive(engine);
// Send
pool.updateSend(engine, clientManager);
}
}
// Global methods
public MessageState sendMessage(String message) {
MessageState ms = new MessageState();
ms.name = clientState.name;
ms.color = clientState.color;
ms.message = message;
clientManager.sendTCP(ms);
return ms;
}
public void sendCreateEntity(int type, int playerId, int teamId, int life, float x, float y) {
CreateEntityState ces = new CreateEntityState();
ces.life = life;
ces.type = type;
ces.playerId = playerId;
ces.teamId = teamId;
ces.x = x;
ces.y = y;
pool.sendCreateEntityState(ces);
}
public void sendCreateEntity(int type, int playerId, int teamId, float x, float y) {
CreateEntityState ces = new CreateEntityState();
ces.type = type;
ces.playerId = playerId;
ces.teamId = teamId;
ces.x = x;
ces.y = y;
pool.sendCreateEntityState(ces);
}
public void sendCreateEntity(int type, int playerId, int teamId, int rx, int ry, float x, float y) {
CreateEntityState ces = new CreateEntityState();
ces.type = type;
ces.playerId = playerId;
ces.teamId = teamId;
ces.rx = rx;
ces.ry = ry;
ces.x = x;
ces.y = y;
pool.sendCreateEntityState(ces);
}
public void sendUpdateNPEntity(EntityState state) {
clientManager.sendTCP(state);
}
public void sendDeleteEntity(int networkId, int playerId, int layer) {
DeleteEntityState des = new DeleteEntityState();
des.networkId = networkId;
des.layer = layer;
pool.sendDeleteEntityState(des);
}
// Discover delegate methods
public void discover() throws IOException {
discover.discover();
}
public void launchClientListening(INetworkDiscoverListener l) {
discover.launchClientListening(l);
}
public void stopClientListening() {
discover.stopClientListening();
}
// Client methods
public void joinServer(String serverIp) throws IOException {
pool = new NetworkPool();
clientManager = new ClientManager(this);
clientState = new ClientState();
clientManager.connect(serverIp);
}
public void updateClientState() {
if (clientManager != null)
clientManager.refreshClientState();
}
public void stopClient() {
if (clientManager != null) {
inGame = false;
clientManager.stop();
}
}
public void sendMessageToGui(MessageState message) {
engine.getGui().addMessage(message);
}
public void serverClose() {
engine.serverClose();
}
// Server methods
public void createServer() throws IOException {
this.discover.launchServerListening();
this.server = new ServerManager(this);
this.serverState = new ServerState();
this.server.launch();
this.isServer = true;
}
public void stopServer() {
if (server != null) {
this.server.stop();
discover.stopServerListening();
}
this.isServer = false;
}
public void updateServerState() {
if (server != null) {
server.refreshServerState();
}
}
public void launchGame() {
Log.debug("lauchGame: " + (server != null ? server : "NULL"));
if (server != null)
server.launchGame();
}
// Getters and Setters
public NetworkPool getPool() {
return pool;
}
public ServerState getServerState() {
return serverState;
}
public ClientState getClientState() {
return clientState;
}
public void setEngine(Engine engine) {
this.engine = engine;
}
public void setMenuListener(INetworkMenuListener menuListener) {
this.menuListener = menuListener;
}
public INetworkMenuListener getMenuListener() {
return menuListener;
}
public boolean isInGame() {
return inGame;
}
public void setInGame(boolean inGame) {
this.inGame = inGame;
}
public boolean isServer() {
return isServer;
}
}