From ff94a9fca891f4d6bc0581b8d300837634f9925d Mon Sep 17 00:00:00 2001 From: rubenpirreram Date: Fri, 15 May 2026 19:16:43 +0200 Subject: [PATCH] Some fixes (Concurrent List GUI) --- .../java/it/polimi/ingsw/gc14/Model/Game.java | 6 +- .../RMI/Client/ClientCallbackImpl.java | 13 +- .../gc14/Network/TCP/Client/TCPClient.java | 1 + .../it/polimi/ingsw/gc14/ServerLauncher.java | 46 ++++--- .../it/polimi/ingsw/gc14/View/GUI/GUI.java | 16 ++- .../gc14/View/GUI/MainFXMLController.java | 122 +++++++++--------- .../it/polimi/ingsw/gc14/View/TUI/TUI.java | 39 +++--- 7 files changed, 126 insertions(+), 117 deletions(-) diff --git a/src/main/java/it/polimi/ingsw/gc14/Model/Game.java b/src/main/java/it/polimi/ingsw/gc14/Model/Game.java index aaf68e6..8fefc33 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Model/Game.java +++ b/src/main/java/it/polimi/ingsw/gc14/Model/Game.java @@ -956,7 +956,7 @@ public class Game implements Serializable { ); currentState.GameStageUpdate(GameStages.ENDED); playerStanding=new ArrayList<>(playersList); - playersList.sort((x,y)->x.getPrestigeValue()==y.getPrestigeValue()?Integer.compare(x.getFoodValue(),y.getFoodValue()):Integer.compare(x.getPrestigeValue(),y.getPrestigeValue())); + playerStanding.sort((y,x)->x.getPrestigeValue()==y.getPrestigeValue()?Integer.compare(x.getFoodValue(),y.getFoodValue()):Integer.compare(x.getPrestigeValue(),y.getPrestigeValue())); } @@ -996,8 +996,8 @@ public class Game implements Serializable { currentState.GameStageUpdate(GameStages.ENDED); playerStanding=new ArrayList<>(playersList); playerStanding.remove(winner); - playersList.sort((x,y)->x.getPrestigeValue()==y.getPrestigeValue()?Integer.compare(x.getFoodValue(),y.getFoodValue()):Integer.compare(x.getPrestigeValue(),y.getPrestigeValue())); - playersList.addLast(winner); + playerStanding.sort((y,x)->x.getPrestigeValue()==y.getPrestigeValue()?Integer.compare(x.getFoodValue(),y.getFoodValue()):Integer.compare(x.getPrestigeValue(),y.getPrestigeValue())); + playerStanding.addFirst(winner); } diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/RMI/Client/ClientCallbackImpl.java b/src/main/java/it/polimi/ingsw/gc14/Network/RMI/Client/ClientCallbackImpl.java index 02b3d08..d434fac 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Network/RMI/Client/ClientCallbackImpl.java +++ b/src/main/java/it/polimi/ingsw/gc14/Network/RMI/Client/ClientCallbackImpl.java @@ -53,14 +53,15 @@ public class ClientCallbackImpl extends UnicastRemoteObject implements IClientCa */ @Override public void onAction(NetworkEvent event) throws RemoteException { - synchronized (clientController) - { - if(event.getIsError()) { - clientController.view.showError(event.toString()); - } else { + if(event.getIsError()) { + clientController.view.showError(event.toString()); + } else { + synchronized (clientController) + { event.apply(clientController.miniModel); - clientController.view.render(); } + clientController.view.render(); + } } } diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/TCP/Client/TCPClient.java b/src/main/java/it/polimi/ingsw/gc14/Network/TCP/Client/TCPClient.java index 3e77626..0499fb5 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Network/TCP/Client/TCPClient.java +++ b/src/main/java/it/polimi/ingsw/gc14/Network/TCP/Client/TCPClient.java @@ -165,6 +165,7 @@ public class TCPClient implements IClient { event.apply(controller.miniModel); } controller.view.render(); + } } else if (read instanceof MiniModel model) { diff --git a/src/main/java/it/polimi/ingsw/gc14/ServerLauncher.java b/src/main/java/it/polimi/ingsw/gc14/ServerLauncher.java index 10a06b4..bf9224b 100644 --- a/src/main/java/it/polimi/ingsw/gc14/ServerLauncher.java +++ b/src/main/java/it/polimi/ingsw/gc14/ServerLauncher.java @@ -120,33 +120,17 @@ public class ServerLauncher { Game game=gameController.getModel(); if(!event.getIsError()) { - if(game.getCurrentState().getGameStage().equals(GameStages.ENDED)) + if(event.getEventType().equals(EventType.DISCONNECTED_PLAYER)&& game.getCurrentState().getGameStage().equals(GameStages.WAITING)) { - actionQueue.offer(new EndedGame(game.getSlotMap(), game.orderLogicCard, game.getCurrentState(),game.getPlayerStanding())); - } - else { - if(event.getEventType().equals(EventType.DISCONNECTED_PLAYER)&& game.getCurrentState().getGameStage().equals(GameStages.WAITING)) - { + playerList.remove(event.getUsername()); + }else { + event.setData(game.getSlotMap(), game.orderLogicCard, game.getCurrentState(), game.getPlayerByUsername(event.getUsername())); + if (event.getEventType().equals(EventType.TOTEM_CHOICE)) { + ((TotemChoice) event).setAvailableTotems(gameController.getModel().getAvailableTotems()); + } else if (event.getEventType().equals(EventType.DISCONNECTED_PLAYER) && game.getCurrentState().equals(GameStages.WAITING)) { playerList.remove(event.getUsername()); - }else { - event.setData(game.getSlotMap(), game.orderLogicCard, game.getCurrentState(), game.getPlayerByUsername(event.getUsername())); - if (event.getEventType().equals(EventType.TOTEM_CHOICE)) { - ((TotemChoice) event).setAvailableTotems(gameController.getModel().getAvailableTotems()); - } else if (event.getEventType().equals(EventType.DISCONNECTED_PLAYER) && game.getCurrentState().equals(GameStages.WAITING)) { - playerList.remove(event.getUsername()); - } } } - } - serverRMI.notifyAll(event); - serverTCP.notifyAll(event); - if(game.getCurrentState().getRound()!=roundPrev) - { - ApplyNextRound nextRound=new ApplyNextRound(game.getSlotMap(), game.orderLogicCard, game.getCurrentState(),game.getPlayers()); - serverRMI.notifyAll(nextRound); - serverTCP.notifyAll(nextRound); - } - if(!event.getIsError()){ if(game.getCurrentState().getGameStage() == GameStages.ENDED){ if(!this.deleteSave()){ System.out.println("\n!!! Couldn't delete save !!!\n"); @@ -162,6 +146,19 @@ public class ServerLauncher { System.out.println("\n!!! Save failed !!!\n"); } } + serverRMI.notifyAll(event); + serverTCP.notifyAll(event); + if(game.getCurrentState().getRound()!=roundPrev) + { + ApplyNextRound nextRound=new ApplyNextRound(game.getSlotMap(), game.orderLogicCard, game.getCurrentState(),game.getPlayers()); + serverRMI.notifyAll(nextRound); + serverTCP.notifyAll(nextRound); + } + else if(game.getCurrentState().getGameStage().equals(GameStages.ENDED)) + { + serverRMI.notifyAll(new EndedGame(game.getSlotMap(), game.orderLogicCard, game.getCurrentState(),game.getPlayerStanding())); + serverTCP.notifyAll(new EndedGame(game.getSlotMap(), game.orderLogicCard, game.getCurrentState(),game.getPlayerStanding())); + } if (event.getEventType().equals(EventType.DISCONNECTED_PLAYER) && playerList.values().stream().filter(x -> x).count() == 1&& game.getCurrentState().getGameStage() != GameStages.ENDED) { if (disconnectionTimer != null && !disconnectionTimer.isDone()) { disconnectionTimer.cancel(false); @@ -246,7 +243,8 @@ public class ServerLauncher { launcher.run(); } catch (Exception e) { - System.out.println("Generic exception occurred"+e.getMessage()); + System.out.println("Generic exception occurred"); + e.printStackTrace(); } }).start(); diff --git a/src/main/java/it/polimi/ingsw/gc14/View/GUI/GUI.java b/src/main/java/it/polimi/ingsw/gc14/View/GUI/GUI.java index 9dd099e..f1b14b3 100644 --- a/src/main/java/it/polimi/ingsw/gc14/View/GUI/GUI.java +++ b/src/main/java/it/polimi/ingsw/gc14/View/GUI/GUI.java @@ -82,15 +82,19 @@ public class GUI extends Application implements IView { public void render() { if(controller.miniModel.currentState.getGameStage()==TOTEM_CHOICE) { Platform.runLater(() -> { - controllerTotem.render(); - primaryStage.setScene(totemScene); - primaryStage.setFullScreen(true); + synchronized (this) { + controllerTotem.render(); + primaryStage.setScene(totemScene); + primaryStage.setFullScreen(true); + } }); } else { Platform.runLater(() -> { - controllerMain.render(); - primaryStage.setScene(mainScene); - primaryStage.setFullScreen(true); + synchronized (this) { + controllerMain.render(); + primaryStage.setScene(mainScene); + primaryStage.setFullScreen(true); + } }); } } 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 e32a6af..e05577b 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 @@ -86,40 +86,36 @@ public class MainFXMLController { - public void render() { - - synchronized (controller) - { - if (old_state_stage==null) { - renderBackground(); - renderUpper(); - renderBoard(); - renderLower(); + public synchronized void render() { + if (old_state_stage==null) { + renderBackground(); + renderUpper(); + renderBoard(); + renderLower(); + renderMyHand(); + renderSidePanel(); + } else if (old_state_stage==SLOT_CHOICE ) { + System.out.println("OLD: "+old_state_stage+", NEW: "+controller.miniModel.currentState.getGameStage()); + System.out.println("RIDISEGNO BOARD\n"); + renderBoard(); + } else if (old_state_stage==RES_ACTIONS) { + System.out.println("OLD: "+old_state_stage+", NEW: "+controller.miniModel.currentState.getGameStage()); + System.out.println("RIDISEGNO TUTTO. USERNAME: "+old_state_username); + renderUpper(); + renderBoard(); + renderLower(); + renderSidePanel(); + if (Objects.equals(old_state_username, controller.myUsername)) { renderMyHand(); - renderSidePanel(); - } else if (old_state_stage==SLOT_CHOICE ) { - System.out.println("OLD: "+old_state_stage+", NEW: "+controller.miniModel.currentState.getGameStage()); - System.out.println("RIDISEGNO BOARD\n"); - renderBoard(); - } else if (old_state_stage==RES_ACTIONS) { - System.out.println("OLD: "+old_state_stage+", NEW: "+controller.miniModel.currentState.getGameStage()); - System.out.println("RIDISEGNO TUTTO. USERNAME: "+old_state_username); - renderUpper(); - renderBoard(); - renderLower(); - renderSidePanel(); - if (Objects.equals(old_state_username, controller.myUsername)) { - renderMyHand(); - } - - // TODO: se sono io a pescare renderizzo myHand, altrimenti no (non è scontato) - } else { - System.out.println("NON GESTITO!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); } - old_state_stage=controller.miniModel.currentState.getGameStage(); - old_state_username=controller.miniModel.currentState.getCurrentPlayer().getUserName(); + // TODO: se sono io a pescare renderizzo myHand, altrimenti no (non è scontato) + } else { + System.out.println("NON GESTITO!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); } + + old_state_stage=controller.miniModel.currentState.getGameStage(); + old_state_username=controller.miniModel.currentState.getCurrentPlayer().getUserName(); // TODO: le info in sidepanel non vengono aggiornate sempre aggiornate, bisogna prima capire dove metterle } @@ -272,21 +268,24 @@ public class MainFXMLController { upperList.setAlignment(Pos.CENTER); upperList.getChildren().clear(); - int i = 0; - for (TribeCard card : controller.miniModel.board.upperListTribe) { - final int index = i; - StackPane img = createCard(card, true, true); - img.setOnMouseClicked(e -> controller.drawUpperTribeCard(controller.myUsername, index)); - upperList.getChildren().add(img); - i++; - } - i = 0; - for (BuildingCard card : controller.miniModel.board.upperListBuilding) { - final int index = i; - StackPane img = createCard(card, true, true); - img.setOnMouseClicked(e -> controller.drawUpperBuildingCard(controller.myUsername, index)); - upperList.getChildren().add(img); - i++; + synchronized (controller) + { + int i = 0; + for (TribeCard card : controller.miniModel.board.upperListTribe) { + final int index = i; + StackPane img = createCard(card, true, true); + img.setOnMouseClicked(e -> controller.drawUpperTribeCard(controller.myUsername, index)); + upperList.getChildren().add(img); + i++; + } + i = 0; + for (BuildingCard card : controller.miniModel.board.upperListBuilding) { + final int index = i; + StackPane img = createCard(card, true, true); + img.setOnMouseClicked(e -> controller.drawUpperBuildingCard(controller.myUsername, index)); + upperList.getChildren().add(img); + i++; + } } } private void renderLower() { @@ -294,21 +293,24 @@ public class MainFXMLController { lowerList.setAlignment(Pos.CENTER); lowerList.getChildren().clear(); - int i = 0; - for (TribeCard card : controller.miniModel.board.lowerListTribe) { - final int index = i; - StackPane img = createCard(card, true, true); - img.setOnMouseClicked(e -> controller.drawLowerTribeCard(controller.myUsername, index)); - lowerList.getChildren().add(img); - i++; - } - i = 0; - for (BuildingCard card : controller.miniModel.board.lowerListBuilding) { - final int index = i; - StackPane img = createCard(card, true, true); - img.setOnMouseClicked(e -> controller.drawLowerBuildingCard(controller.myUsername, index)); - lowerList.getChildren().add(img); - i++; + synchronized (controller) + { + int i = 0; + for (TribeCard card : controller.miniModel.board.lowerListTribe) { + final int index = i; + StackPane img = createCard(card, true, true); + img.setOnMouseClicked(e -> controller.drawLowerTribeCard(controller.myUsername, index)); + lowerList.getChildren().add(img); + i++; + } + i = 0; + for (BuildingCard card : controller.miniModel.board.lowerListBuilding) { + final int index = i; + StackPane img = createCard(card, true, true); + img.setOnMouseClicked(e -> controller.drawLowerBuildingCard(controller.myUsername, index)); + lowerList.getChildren().add(img); + i++; + } } } private void renderDeck() { diff --git a/src/main/java/it/polimi/ingsw/gc14/View/TUI/TUI.java b/src/main/java/it/polimi/ingsw/gc14/View/TUI/TUI.java index adc1ce9..deed706 100644 --- a/src/main/java/it/polimi/ingsw/gc14/View/TUI/TUI.java +++ b/src/main/java/it/polimi/ingsw/gc14/View/TUI/TUI.java @@ -89,7 +89,7 @@ public class TUI implements IView { * Delegates to {@link #renderBoard()}. */ @Override - public void render() { + public synchronized void render() { if(model != null) { if(model.currentState.getGameStage().equals(GameStages.TOTEM_CHOICE)) @@ -99,6 +99,7 @@ public class TUI implements IView { else if(model.currentState.getGameStage().equals(GameStages.ENDED)) { renderStanding(); + return; } else { @@ -109,25 +110,27 @@ public class TUI implements IView { } private void renderStanding() { - StringBuilder stringBuilder=new StringBuilder(); - ArrayList playersList=new ArrayList<>(model.players.values()); - for(int i = 0; i< model.players.size()/2; i++) + if(model.standingPlayers!=null) { - stringBuilder.append(AsciiTable.sideBySide(List.of(playersList.get((i*2)).toString().split("\n")),List.of(playersList.get((i*2+1)).toString().split("\n")),2)); - } - stringBuilder.append("\n"); - if(playersList.size()%2!=0) - { - stringBuilder.append(playersList.get(playersList.size()-1).toString()); + StringBuilder stringBuilder=new StringBuilder(); + for(int i = 0; i< model.standingPlayers.size()/2; i++) + { + stringBuilder.append(AsciiTable.sideBySide(List.of(model.standingPlayers.get((i*2)).toString().split("\n")),List.of(model.standingPlayers.get((i*2+1)).toString().split("\n")),2)); + } stringBuilder.append("\n"); - } - System.out.println(stringBuilder); - if(playersList.get(0).getUserName().equals(username)) - { - System.out.println("!!!YOU WON!!!"); - } - else { - System.out.println("!!!YOU LOST!!!"); + if(model.standingPlayers.size()%2!=0) + { + stringBuilder.append(model.standingPlayers.get(model.standingPlayers.size()-1).toString()); + stringBuilder.append("\n"); + } + System.out.println(stringBuilder); + if(model.standingPlayers.get(0).getUserName().equals(username)) + { + System.out.println("GAME ENDED: !!!YOU WON!!!"); + } + else { + System.out.println("GAME ENDED: !!!YOU LOST!!!"); + } } }