From 7fb5e7388ab6765d1a27325d93f277af8e05fa13 Mon Sep 17 00:00:00 2001 From: rubenpirreram Date: Wed, 27 May 2026 20:48:14 +0200 Subject: [PATCH] Changed: Now Displays When a player is disconnected in GUI --- .../NetworkEvents/DisconnectedPlayer.java | 9 ++++ .../NetworkEvents/ReconnectPlayer.java | 8 ++- .../it/polimi/ingsw/gc14/ServerLauncher.java | 50 ++++++++++++------- .../gc14/View/GUI/MainFXMLController.java | 2 +- src/main/resources/GUIScene/styles.css | 7 +++ 5 files changed, 56 insertions(+), 20 deletions(-) diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/DisconnectedPlayer.java b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/DisconnectedPlayer.java index d774916..f0acee5 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/DisconnectedPlayer.java +++ b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/DisconnectedPlayer.java @@ -6,13 +6,20 @@ import it.polimi.ingsw.gc14.Model.MiniModel; import it.polimi.ingsw.gc14.Network.EventType; import it.polimi.ingsw.gc14.Network.NetworkEvent; +import javax.smartcardio.Card; import java.io.Serializable; +import java.util.ArrayList; /** * NetworkEvent to avoid drawing a card from the lower card list */ public class DisconnectedPlayer extends NetworkEvent implements Serializable{ + private ArrayList disconnectedPlayers; + public void setDisconnected(ArrayList players) + { + this.disconnectedPlayers=players; + } /** * Class constructor. * Initializes all the attributes. @@ -22,6 +29,7 @@ public class DisconnectedPlayer extends NetworkEvent implements Serializable{ super(username, EventType.DISCONNECTED_PLAYER, false, ErrorType.GENERIC_ERROR); } + /** * @param gameController the Game Controller on which to apply the event * @return true if the player could skipTheTurn, false otherwise @@ -42,6 +50,7 @@ public class DisconnectedPlayer extends NetworkEvent implements Serializable{ miniModel.setOrderLogicCard(orderLogicCard); miniModel.setCurrentState(currentState); miniModel.setSlotPlayerMap(slotPlayerMap); + miniModel.setDisconnectedPlayers(disconnectedPlayers); } return true; } diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/ReconnectPlayer.java b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/ReconnectPlayer.java index bb4e809..c4448d3 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/ReconnectPlayer.java +++ b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/ReconnectPlayer.java @@ -7,12 +7,17 @@ import it.polimi.ingsw.gc14.Network.EventType; import it.polimi.ingsw.gc14.Network.NetworkEvent; import java.io.Serializable; +import java.util.ArrayList; /** * Network event used to notify that a player has reconnected to the game. */ public class ReconnectPlayer extends NetworkEvent implements Serializable { - + private ArrayList disconnectedPlayers; + public void setDisconnected(ArrayList players) + { + this.disconnectedPlayers=players; + } /** * Constructs a reconnection event for the specified player. * @@ -55,6 +60,7 @@ public class ReconnectPlayer extends NetworkEvent implements Serializable { miniModel.setOrderLogicCard(orderLogicCard); miniModel.setCurrentState(currentState); miniModel.setSlotPlayerMap(slotPlayerMap); + miniModel.setDisconnectedPlayers(disconnectedPlayers); } return true; diff --git a/src/main/java/it/polimi/ingsw/gc14/ServerLauncher.java b/src/main/java/it/polimi/ingsw/gc14/ServerLauncher.java index cacbeb7..53e123a 100644 --- a/src/main/java/it/polimi/ingsw/gc14/ServerLauncher.java +++ b/src/main/java/it/polimi/ingsw/gc14/ServerLauncher.java @@ -9,9 +9,7 @@ import it.polimi.ingsw.gc14.Model.Player; import it.polimi.ingsw.gc14.Model.Totems; import it.polimi.ingsw.gc14.Network.EventType; import it.polimi.ingsw.gc14.Network.NetworkEvent; -import it.polimi.ingsw.gc14.Network.NetworkEvents.ApplyNextRound; -import it.polimi.ingsw.gc14.Network.NetworkEvents.EndedGame; -import it.polimi.ingsw.gc14.Network.NetworkEvents.TotemChoice; +import it.polimi.ingsw.gc14.Network.NetworkEvents.*; import it.polimi.ingsw.gc14.Network.RMI.Server.RMIServer; import it.polimi.ingsw.gc14.Network.TCP.Server.TCPServer; import it.polimi.ingsw.gc14.View.TUI.TUI; @@ -111,19 +109,25 @@ public class ServerLauncher { if(gameController.getModel()!=null && gameController.getModel().getCurrentState().getGameStage()!=GameStages.ENDED) { //if there is only one player ignore every event different by reconnection - if(disconnectionTimer!=null && event.getEventType() != EventType.RECONNECT_PLAYER) + if(disconnectionTimer!=null ) { - event.setIsError(true); - serverRMI.notifyAll(event); - serverTCP.notifyAll(event); - return false; + if(event.getEventType() != EventType.RECONNECT_PLAYER) + { + event.setIsError(true); + serverRMI.notifyAll(event); + serverTCP.notifyAll(event); + return false; + }else if(event.getEventType() != EventType.DISCONNECTED_PLAYER) + { + disconnectionTimer.cancel(true); + disconnectionTimer = null; + playerList.clear(); + gameController.setModel(null); + System.out.println("\n!!! Player list is now empty, ready for a new game init !!!\n"); + return true; + } } - //Cancel the timer if another player is reconnected , so there are more than one player - if (event.getEventType() == EventType.RECONNECT_PLAYER && disconnectionTimer != null && !disconnectionTimer.isDone()) { - disconnectionTimer.cancel(false); - disconnectionTimer = null; - } synchronized(gameController){ int roundPrev=gameController.getModel().getCurrentState().getRound(); //applies the event and set if is an error @@ -132,19 +136,29 @@ public class ServerLauncher { //if the event wasn't an error , it will be sent to players if(!event.getIsError()) { + //Cancel the timer if another player is reconnected , so there are more than one player + if (event.getEventType() == EventType.RECONNECT_PLAYER && disconnectionTimer != null && !disconnectionTimer.isDone()) { + disconnectionTimer.cancel(false); + disconnectionTimer = null; + } if(!this.gameSave() ){ System.out.println("\n!!! Save failed !!!\n"); } if(event.getEventType().equals(EventType.DISCONNECTED_PLAYER)&& game.getCurrentState().getGameStage().equals(GameStages.WAITING)) { playerList.remove(event.getUsername()); + return true; }else { event.setData(game.getSlotMap(), game.orderLogicCard, game.getCurrentState(), game.getPlayers()); - if (event.getEventType().equals(EventType.TOTEM_CHOICE)) { - ((TotemChoice) event).setAvailableTotems(gameController.getModel().getAvailableTotems()); - } else if (event.getEventType().equals(EventType.DISCONNECTED_PLAYER) && game.getCurrentState().getGameStage().equals(GameStages.WAITING)) { - playerList.remove(event.getUsername()); - } + } + if (event.getEventType().equals(EventType.TOTEM_CHOICE)) { + ((TotemChoice) event).setAvailableTotems(gameController.getModel().getAvailableTotems()); + }else if (event.getEventType().equals(EventType.RECONNECT_PLAYER)) + { + ((ReconnectPlayer) event).setDisconnected(game.disconnetedPlayers.entrySet().stream().filter(Map.Entry::getValue).map(x -> x.getKey().getUserName()).collect(Collectors.toCollection(ArrayList::new))); + }else if (event.getEventType().equals(EventType.DISCONNECTED_PLAYER)) + { + ((DisconnectedPlayer) event).setDisconnected(game.disconnetedPlayers.entrySet().stream().filter(Map.Entry::getValue).map(x -> x.getKey().getUserName()).collect(Collectors.toCollection(ArrayList::new))); } //if there is only one player the game will be suspended and starts the forfeit timer if (event.getEventType().equals(EventType.DISCONNECTED_PLAYER) && playerList.values().stream().filter(x -> x).count() == 1&& game.getCurrentState().getGameStage() != GameStages.ENDED) { diff --git a/src/main/java/it/polimi/ingsw/gc14/View/GUI/MainFXMLController.java b/src/main/java/it/polimi/ingsw/gc14/View/GUI/MainFXMLController.java index 6136c01..cd563f5 100644 --- a/src/main/java/it/polimi/ingsw/gc14/View/GUI/MainFXMLController.java +++ b/src/main/java/it/polimi/ingsw/gc14/View/GUI/MainFXMLController.java @@ -325,7 +325,7 @@ public class MainFXMLController { } } if (controller.miniModel.disconnectedPlayers.contains(player.getUserName())) { - usernameLabel.setText(usernameLabel.getText() + " (crash)"); + card.getStyleClass().add("player-card-crashed"); } headerRow.getChildren().addAll(totem, usernameLabel); diff --git a/src/main/resources/GUIScene/styles.css b/src/main/resources/GUIScene/styles.css index 8962330..8a979fd 100644 --- a/src/main/resources/GUIScene/styles.css +++ b/src/main/resources/GUIScene/styles.css @@ -41,6 +41,13 @@ -fx-background-radius: 15; -fx-background-color: #f18f1c; } +.player-card-crashed { + -fx-border-color: #711423; + -fx-border-width: 2; + -fx-border-radius: 15; + -fx-background-radius: 15; + -fx-background-color: #8C8C8CFF; +} .frame { -fx-background-color: rgba(255,255,255,0.35);