diff --git a/app/src/main/java/gui/menu/ConnexionStatusView.java b/app/src/main/java/gui/menu/ConnexionStatusView.java index 82cb12f..0182797 100644 --- a/app/src/main/java/gui/menu/ConnexionStatusView.java +++ b/app/src/main/java/gui/menu/ConnexionStatusView.java @@ -12,30 +12,68 @@ public class ConnexionStatusView extends BaseView { private Client client; private Server server; - public ConnexionStatusView(StateMachine stateMachine, String address, short port) throws UnknownHostException, IOException { - this(stateMachine, null, new Client(address, port)); + private String displayText = "Connecting ..."; + + public ConnexionStatusView(StateMachine stateMachine, String address, short port) + throws UnknownHostException, IOException { + super(stateMachine); + Thread t = new Thread(() -> { + try { + this.client = new Client(address, port); + bindListeners(); + } catch (IOException e) { + e.printStackTrace(); + onDisconnect(); + } + }); + t.start(); } public ConnexionStatusView(StateMachine stateMachine, short port) throws UnknownHostException, IOException { - this(stateMachine, new Server(port), new Client("localhost", port)); + super(stateMachine); + Thread t = new Thread(() -> { + try { + this.server = new Server(port); + this.client = new Client("localhost", port); + bindListeners(); + } catch (IOException e) { + e.printStackTrace(); + onDisconnect(); + } + }); + t.start(); + } + + private void bindListeners() { + this.client.onConnect.connect(this::onConnect); + this.client.onClosed.connect(this::onLeave); + this.client.onDisconnect.connect(this::onDisconnect); } private ConnexionStatusView(StateMachine stateMachine, Server server, Client client) { super(stateMachine); this.client = client; - this.client.onConnect.connect(this::onConnect); - this.client.onClosed.connect(this::onLeave); this.server = server; } public void onConnect() { - // System.out.println("Connecté"); this.stateMachine.pushState(new MultiPlayerView(stateMachine, client)); } + public void onDisconnect() { + if (client != null) { + String reason = client.getDisconnectReason(); + if (reason == null) + displayText = "Le serveur a fermé la connexion !"; + else + displayText = "Vous avez été déconnecté ! Raison : " + client.getDisconnectReason(); + } else { + displayText = "La connexion a échoué !"; + } + + } + public void onLeave() { - // System.out.println("Quitté !"); - this.client.onDisconnect.clear(); this.client = null; // on passe le menu de la connexion this.closeMenu(); @@ -43,7 +81,14 @@ public class ConnexionStatusView extends BaseView { @Override public void render() { - ImGui.text("Connecting ..."); + ImGui.text(displayText); + renderReturnButton(); + } + + @Override + public void closeMenu() { + super.closeMenu(); + cleanResources(); } @Override diff --git a/app/src/main/java/gui/menu/MultiMenu.java b/app/src/main/java/gui/menu/MultiMenu.java index 090f629..7b5dc86 100644 --- a/app/src/main/java/gui/menu/MultiMenu.java +++ b/app/src/main/java/gui/menu/MultiMenu.java @@ -14,6 +14,7 @@ public class MultiMenu extends BaseView { public MultiMenu(StateMachine stateMachine) { super(stateMachine); + address.resize(20); } private void renderCreate() { diff --git a/app/src/main/java/gui/menu/MultiPlayerView.java b/app/src/main/java/gui/menu/MultiPlayerView.java index a4d3e83..ec25b82 100644 --- a/app/src/main/java/gui/menu/MultiPlayerView.java +++ b/app/src/main/java/gui/menu/MultiPlayerView.java @@ -20,9 +20,7 @@ public class MultiPlayerView extends BaseView { } public void onDisconnect() { - // System.out.println("ohohohohohohoho"); this.stateMachine.popState(); - this.client.onDisconnect.clear(); } @Override diff --git a/app/src/main/java/network/client/Client.java b/app/src/main/java/network/client/Client.java index a6d8efc..6cdaa4b 100644 --- a/app/src/main/java/network/client/Client.java +++ b/app/src/main/java/network/client/Client.java @@ -16,6 +16,8 @@ public class Client { public final Signal onDisconnect = new Signal(); public final Signal onClosed = new Signal(); + String disconnectReason = null; + public Client(String address, short port) throws UnknownHostException, IOException { this.clientConnection = new ClientConnexion(address, port, this); this.game = new Game(); @@ -39,6 +41,10 @@ public class Client { return game; } + public String getDisconnectReason() { + return disconnectReason; + } + public void forceDisconnect() { this.onClosed.emit(); stop(); diff --git a/app/src/main/java/network/client/ClientConnexion.java b/app/src/main/java/network/client/ClientConnexion.java index 07ca721..ca8d6c5 100644 --- a/app/src/main/java/network/client/ClientConnexion.java +++ b/app/src/main/java/network/client/ClientConnexion.java @@ -45,6 +45,7 @@ public class ClientConnexion extends Connexion { @Override public void visitPacket(DisconnectPacket packet) { + this.client.disconnectReason = packet.getReason(); close(); } diff --git a/app/src/main/java/network/server/Server.java b/app/src/main/java/network/server/Server.java index a8d8765..18f0b4d 100644 --- a/app/src/main/java/network/server/Server.java +++ b/app/src/main/java/network/server/Server.java @@ -49,6 +49,7 @@ public class Server { this.acceptThread.cancel(); this.logicThread.cancel(); for (ServerConnexion connexion : this.connexions) { + connexion.nukeConnection(); connexion.close(); } } diff --git a/app/src/main/java/network/server/ServerConnexion.java b/app/src/main/java/network/server/ServerConnexion.java index a4eb568..a393408 100644 --- a/app/src/main/java/network/server/ServerConnexion.java +++ b/app/src/main/java/network/server/ServerConnexion.java @@ -33,7 +33,7 @@ public class ServerConnexion extends Connexion { public void nukeConnection() { if (player != null) { - sendPacket(new DisconnectPacket("Server stopped")); + sendPacket(new DisconnectPacket("Le serveur a été fermé !")); this.server.broadcastPacket(new PlayerLeavePacket(player.getId())); this.server.getGame().removePlayer(player.getId()); }