package rts.core.network; import java.io.IOException; import com.esotericsoftware.kryonet.Client; import com.esotericsoftware.kryonet.Connection; import com.esotericsoftware.kryonet.Listener; import rts.core.engine.Player; import rts.core.network.ig_tcp_container.CreateEntityState; import rts.core.network.ig_tcp_container.DeleteAllEntityState; import rts.core.network.ig_tcp_container.DeleteEntityState; import rts.core.network.ig_udp_containers.EntitiesStatePacket; import rts.core.network.ig_udp_containers.EntityState; import rts.core.network.menu_tcp_containers.AllClientState; import rts.core.network.menu_tcp_containers.CRMessageState; import rts.core.network.menu_tcp_containers.LoadGameMessage; import rts.core.network.menu_tcp_containers.MessageState; import rts.core.network.menu_tcp_containers.ServerState; import rts.core.network.menu_tcp_containers.SwitchToGameMessage; import rts.utils.Configuration; public class ClientManager { private NetworkManager manager; private Client client; public ClientManager(NetworkManager manager) { this.manager = manager; this.client = new Client(); this.client.addListener(new ClientListener()); } public void refreshClientState() { client.sendTCP(manager.getClientState()); } public void connect(String serverIp) throws IOException { ClassRegister.register(client.getKryo()); client.start(); client.connect(5000, serverIp, Configuration.getTcpPort(), Configuration.getUdpPort()); } public void stop() { client.stop(); } public int sendTCP(Object object) { return client.sendTCP(object); } public int sendUDP(Object object) { return client.sendUDP(object); } private class ClientListener extends Listener { @Override public void connected(Connection connection) { super.connected(connection); manager.getClientState().connectionId = connection.getID(); manager.getClientState().name = Configuration.getPseudo(); if (manager.getMenuListener() != null) { manager.getMenuListener().connectionSuccess(); } refreshClientState(); } @Override public void disconnected(Connection connection) { super.disconnected(connection); if (manager.isInGame()) { manager.serverClose(); } else { if (manager.getMenuListener() != null) { manager.getMenuListener().disconnected(); } } } @Override public void received(Connection connection, Object object) { super.received(connection, object); if (manager.isInGame()) { receiveInGameMessage(connection, object); } else { if (manager.getMenuListener() != null) { if (object instanceof AllClientState) { manager.getMenuListener().clientsInfosChange(((AllClientState) object).clientStates); } else { if (object instanceof ServerState) { manager.getMenuListener().serverInfosChange((ServerState) object); } else { if (object instanceof CRMessageState) { manager.getClientState().isReady = false; } else { if (object instanceof MessageState) { manager.getMenuListener().receiveMessage((MessageState) object); } else { if (object instanceof LoadGameMessage) { manager.getMenuListener().loadGame(((LoadGameMessage) object).state); } else { if (object instanceof SwitchToGameMessage) { manager.setInGame(true); manager.getMenuListener().switchToGame(); } } } } } } } } } private void receiveInGameMessage(Connection connection, Object object) { if (object instanceof Player) { manager.getPool().receivePlayerState((Player) object); } else { if (object instanceof EntitiesStatePacket) { manager.getPool().receiveEntitiesStatePacket((EntitiesStatePacket) object); } else { if (object instanceof EntityState) { manager.getPool().receiveEntityState((EntityState) object); } else { if (object instanceof CreateEntityState) { manager.getPool().receiveCreateEntityState((CreateEntityState) object); } else { if (object instanceof DeleteEntityState) { manager.getPool().receiveDeleteEntityState((DeleteEntityState) object); } else { if (object instanceof DeleteAllEntityState) { manager.getPool().receiveDeleteAllEntityState((DeleteAllEntityState) object); } else { if (object instanceof MessageState) { manager.sendMessageToGui((MessageState) object); } } } } } } } } } }