From 32302c0dd348af4383d33a3e44592aa08fc8d71c Mon Sep 17 00:00:00 2001 From: EpicKnarvik97 Date: Sat, 18 Apr 2020 10:48:21 +0200 Subject: [PATCH] Legger til behandling av spillere som kobler seg ifra MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fjerner informasjon på serversiden om en spiller som kobler seg fra om den ikke lenger er med i spillet Sender en feilmelding som avslutter alle klienter om spilleren fortsatt er aktiv i spillet Endrer ErrorResponse til å si om en feil er kritisk eller ikke i stedet for å lagre en exception --- .../networking/RoboRallyClientListener.java | 3 +++ .../networking/RoboRallyServerListener.java | 20 +++++++++++++++---- .../networking/containers/ErrorResponse.java | 17 ++++++++-------- 3 files changed, 28 insertions(+), 12 deletions(-) diff --git a/src/main/java/inf112/fiasko/roborally/networking/RoboRallyClientListener.java b/src/main/java/inf112/fiasko/roborally/networking/RoboRallyClientListener.java index fd8aa8c..235920b 100644 --- a/src/main/java/inf112/fiasko/roborally/networking/RoboRallyClientListener.java +++ b/src/main/java/inf112/fiasko/roborally/networking/RoboRallyClientListener.java @@ -30,6 +30,9 @@ class RoboRallyClientListener extends Listener { public void received (Connection connection, Object object) { if (object instanceof ErrorResponse) { ErrorResponse errorResponse = (ErrorResponse) object; + if (errorResponse.isCritical()) { + wrapper.quit(errorResponse.getErrorMessage()); + } System.out.println(errorResponse.getErrorMessage()); } else if (object instanceof GameStartInfo) { GameStartInfo info = (GameStartInfo) object; diff --git a/src/main/java/inf112/fiasko/roborally/networking/RoboRallyServerListener.java b/src/main/java/inf112/fiasko/roborally/networking/RoboRallyServerListener.java index 1400d47..be1f295 100644 --- a/src/main/java/inf112/fiasko/roborally/networking/RoboRallyServerListener.java +++ b/src/main/java/inf112/fiasko/roborally/networking/RoboRallyServerListener.java @@ -25,8 +25,8 @@ class RoboRallyServerListener extends Listener { private final Map clients; private final Map playerNames; private final List deadPlayers; - private Map stayInPowerDown; - private Map programs; + private Map stayInPowerDown; + private Map programs; private final RoboRallyServer server; /** @@ -92,7 +92,7 @@ class RoboRallyServerListener extends Listener { private void receivedString(Connection connection, String playerName) { if (playerNames.containsValue(playerName)) { String errorMessage = "The player playerName send is already taken."; - connection.sendTCP(new ErrorResponse(errorMessage, new IllegalArgumentException(errorMessage))); + connection.sendTCP(new ErrorResponse(errorMessage)); } else { playerNames.put(connection, playerName); } @@ -155,7 +155,7 @@ class RoboRallyServerListener extends Listener { //Prevents more than 8 players from connecting at once if (clients.size() >= 8) { String errorMessage = "The server already has 8 players. You cannot join."; - connection.sendTCP(new ErrorResponse(errorMessage, new IOException(errorMessage))); + connection.sendTCP(new ErrorResponse(errorMessage)); connection.close(); return; } @@ -165,6 +165,18 @@ class RoboRallyServerListener extends Listener { @Override public void disconnected(Connection connection) { + if (deadPlayers.contains(connection)) { + //Remove all traces of the player ever existing + clients.remove(connection); + playerNames.remove(connection); + deadPlayers.remove(connection); + stayInPowerDown.remove(connection); + programs.remove(connection); + } else { + //Stop the game for all players + String errorMessage = "An active player disconnected from the game. Cannot continue. Shutting down."; + server.sendToAllClients(new ErrorResponse(errorMessage, true)); + } System.out.println(connection.getRemoteAddressTCP() + " disconnected"); } } \ No newline at end of file diff --git a/src/main/java/inf112/fiasko/roborally/networking/containers/ErrorResponse.java b/src/main/java/inf112/fiasko/roborally/networking/containers/ErrorResponse.java index 3220ba9..03960f9 100644 --- a/src/main/java/inf112/fiasko/roborally/networking/containers/ErrorResponse.java +++ b/src/main/java/inf112/fiasko/roborally/networking/containers/ErrorResponse.java @@ -5,7 +5,7 @@ package inf112.fiasko.roborally.networking.containers; */ public class ErrorResponse { private final String errorMessage; - private Exception thrownException; + private boolean critical; /** * Constructs a new error response @@ -13,16 +13,17 @@ public class ErrorResponse { */ public ErrorResponse(String errorMessage) { this.errorMessage = errorMessage; + this.critical = false; } /** * Constructs a new error response * @param errorMessage The error message describing the error - * @param thrownException The exception to throw + * @param critical Whether the error is critical */ - public ErrorResponse(String errorMessage, Exception thrownException) { + public ErrorResponse(String errorMessage, boolean critical) { this.errorMessage = errorMessage; - this.thrownException = thrownException; + this.critical = critical; } /** @@ -34,10 +35,10 @@ public class ErrorResponse { } /** - * Gets the exception attached to the error response - * @return An exception or null + * Gets whether the error is critical or not + * @return True if the error is critical. False otherwise */ - public Exception getThrownException() { - return this.thrownException; + public boolean isCritical() { + return this.critical; } }