From a655df2e41b8c965f0e182021b061e6b321bdbc1 Mon Sep 17 00:00:00 2001 From: Seraina Date: Sun, 1 May 2022 20:34:59 +0200 Subject: [PATCH] Added a way to list HighScore and added very simple textFlow view for LobbyDisplay, in case ListView wont work till tomorrow --- .../dbis/cs108/multiplayer/client/Client.java | 4 ++ .../gui/lounge/LoungeSceneViewController.java | 46 +++++++++++++++++++ .../multiplayer/helpers/GuiParameters.java | 9 ++++ .../multiplayer/server/ClientHandler.java | 40 ++++++++++++++++ .../server/JServerProtocolParser.java | 1 + .../client/gui/lounge/LoungeSceneView.fxml | 13 ++++-- 6 files changed, 109 insertions(+), 4 deletions(-) diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/Client.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/Client.java index 0ba20c5..abf56ec 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/Client.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/Client.java @@ -406,6 +406,10 @@ public class Client { case GuiParameters.updateHighScore: chatApp.getLoungeSceneViewController().addHighScore(data); break; + case GuiParameters.updatePrintLobby: + chatApp.getLoungeSceneViewController().clearLobbyPrint(); + chatApp.getLoungeSceneViewController().addLobbyPrint(data); + break; default: notificationTextDisplay(data); //TODO(Sebi,Seraina): should the gameController be in the Application just like the ChatController? diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/lounge/LoungeSceneViewController.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/lounge/LoungeSceneViewController.java index 9702821..c635feb 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/lounge/LoungeSceneViewController.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/lounge/LoungeSceneViewController.java @@ -49,9 +49,13 @@ public class LoungeSceneViewController implements Initializable { public static final Logger LOGGER = LogManager.getLogger(LoungeSceneViewController.class); public static final BudaLogConfig l = new BudaLogConfig(LOGGER); + + @FXML private TextFlow highScore; @FXML + public TextFlow lobbyPrint; + @FXML private SplitPane chatSplitPane; @FXML private AnchorPane chatAnchorPane; @@ -62,6 +66,8 @@ public class LoungeSceneViewController implements Initializable { @FXML private Button leaveLobbyButton; @FXML + private Button lobbyPrintButton; + @FXML private Button startGame; @FXML private Button newGameButton; @@ -495,6 +501,14 @@ public class LoungeSceneViewController implements Initializable { client.getClient().sendMsgToServer(Protocol.highScoreList); } + public void sendLilstle() { + client.getClient().sendMsgToServer(Protocol.listLobbies); + } + + /** + * Adds a String to the highScore Text Flow + * @param data the String to be added + */ public void addHighScore(String data) { String[] arguments = data.split("/n"); LOGGER.debug(arguments.length); @@ -511,5 +525,37 @@ public class LoungeSceneViewController implements Initializable { } }); } + + /** + * Adds a String to the lobbyPrint TextFlow + * @param data the String to be added + * */ + public void addLobbyPrint(String data) { + String[] arguments = data.split("/n"); + LOGGER.debug(arguments.length); + Platform.runLater(new Runnable() { + @Override + public void run() { + for(String argument : arguments) { + LOGGER.debug("HighScore " + argument); + Text text = new Text(argument + System.lineSeparator()); + text.setFill(Color.BLACK); + lobbyPrint.getChildren().add(text); + } + } + }); + } + + /** + * Clears the lobbyPrint TextFlow + */ + public void clearLobbyPrint() { + Platform.runLater(new Runnable() { + @Override + public void run() { + lobbyPrint.getChildren().clear(); + } + }); + } } diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/helpers/GuiParameters.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/helpers/GuiParameters.java index 19ffd3f..49a2ccc 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/helpers/GuiParameters.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/helpers/GuiParameters.java @@ -86,5 +86,14 @@ public class GuiParameters { */ public static final String removePlayerFromList = "RMVLST"; + /** + * Tells Gui to update its HighScore TextFlow according to the following data + */ public static final String updateHighScore = "HISCR"; + + /** + * Tells Gui to add a String to printLobby TextFlow - a provisory solution in case ListeView won't + * pan out + */ + public static final String updatePrintLobby = "PRLOBB"; } diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/ClientHandler.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/ClientHandler.java index 897792b..5326b77 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/ClientHandler.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/ClientHandler.java @@ -563,6 +563,46 @@ public class ClientHandler implements Runnable { } } + /** + * Lists all lobbies and their members, along with players outside lobbies to this clientHandler's + * client a GUI message in a form, the gui can decode. + */ + public void listLobbiesGuiFormat() { + StringBuilder stringBuilder = new StringBuilder(); + if (Lobby.lobbies.isEmpty()) { + stringBuilder.append("No Lobbies.").append("/n"); + } else { + for (Lobby l : Lobby.lobbies) { + String lobbyStatus = "closed"; + if (l.getLobbyIsOpen()) { + lobbyStatus = "open"; + } + stringBuilder.append("Lobby nr. " + l.getLobbyID() + ": (" + lobbyStatus + ")").append("/n"); + for (ClientHandler c : l.getLobbyClients()) { + if (c.equals(l.getAdmin())) { + stringBuilder.append(" -" + c.getClientUserName() + " (admin)").append("/n"); + } else { + stringBuilder.append(" -" + c.getClientUserName()).append("/n"); + } + } + } + } + boolean helper = false; //used to print "Clients not in lobbies" only once, if needed. + for (ClientHandler c : connectedClients) { + if (Lobby.clientIsInLobby(c) == -1) { + if (!helper) { + helper = true; + stringBuilder.append("Clients not in lobbies:").append("/n"); + } + stringBuilder.append(" -").append(c.getClientUserName()).append("/n"); + } + } + if (!helper) { + stringBuilder.append("No clients outside of lobbies").append("/n"); + } + sendMsgToClient(Protocol.printToGUI + "$" + GuiParameters.updatePrintLobby + "$" + stringBuilder.toString()); + } + /** * Lists all players in the client's lobby. If the client is not in a Lobby, it will say "You are * not in a lobby." diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/JServerProtocolParser.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/JServerProtocolParser.java index af4250d..e66bb16 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/JServerProtocolParser.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/JServerProtocolParser.java @@ -99,6 +99,7 @@ public class JServerProtocolParser { break; case Protocol.listLobbies: h.listLobbies(); + h.listLobbiesGuiFormat(); break; case Protocol.listPlayersInLobby: h.listPlayersInLobby(); diff --git a/src/main/resources/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/lounge/LoungeSceneView.fxml b/src/main/resources/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/lounge/LoungeSceneView.fxml index 2d686ec..14a3064 100644 --- a/src/main/resources/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/lounge/LoungeSceneView.fxml +++ b/src/main/resources/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/lounge/LoungeSceneView.fxml @@ -7,6 +7,7 @@ + @@ -16,16 +17,17 @@