From 36d348dc1e554d706de439711f8a246a16e064b0 Mon Sep 17 00:00:00 2001 From: rubenpirreram Date: Mon, 25 May 2026 16:31:29 +0200 Subject: [PATCH 01/12] Changed: Now Disconnection request can be sent , (TUI,RMI,TCP) --- .../polimi/ingsw/gc14/ClientLauncherTUI.java | 17 ++++++++++++++- .../gc14/Controller/ClientController.java | 5 +++++ .../it/polimi/ingsw/gc14/Network/IClient.java | 3 +++ .../gc14/Network/RMI/Client/RMIClient.java | 12 ++++++++++- .../gc14/Network/RMI/Common/IGameServer.java | 2 ++ .../gc14/Network/RMI/Server/RMIHeartbeat.java | 2 +- .../gc14/Network/RMI/Server/RMIServer.java | 4 ++++ .../gc14/Network/TCP/Client/TCPClient.java | 21 +++++++++++++++++-- .../Network/TCP/Server/ClientHandler.java | 5 ++--- .../Network/TCP/Server/HeartbeatHandler.java | 10 +++++++-- .../it/polimi/ingsw/gc14/View/TUI/TUI.java | 1 + 11 files changed, 72 insertions(+), 10 deletions(-) diff --git a/src/main/java/it/polimi/ingsw/gc14/ClientLauncherTUI.java b/src/main/java/it/polimi/ingsw/gc14/ClientLauncherTUI.java index 78296bd..c402c87 100644 --- a/src/main/java/it/polimi/ingsw/gc14/ClientLauncherTUI.java +++ b/src/main/java/it/polimi/ingsw/gc14/ClientLauncherTUI.java @@ -1,5 +1,6 @@ package it.polimi.ingsw.gc14; import it.polimi.ingsw.gc14.Controller.ClientController; +import it.polimi.ingsw.gc14.Model.Cards.TribeCards.Character; import it.polimi.ingsw.gc14.Network.NetworkEvent; import it.polimi.ingsw.gc14.Network.RMI.Client.RMIClient; import it.polimi.ingsw.gc14.Network.TCP.Client.TCPClient; @@ -38,6 +39,7 @@ public class ClientLauncherTUI { */ public void main() throws InterruptedException { view = new TUI(null); + admissibleChar.add("0"); admissibleChar.add("1"); admissibleChar.add("2"); admissibleChar.add("3"); @@ -137,7 +139,16 @@ public class ClientLauncherTUI { if(admissibleChar.contains(action)) { - if (!action.equals("6") && !action.equals("A") && !action.equals("B") && !action.equals("C")&&!action.equals("a") && !action.equals("b") && !action.equals("c")) { + if(action.equals("0")) + { + System.out.println("Are you sure? Y/N"); + String c= scanner.next(); + if(!c.equals("Y") && !c.equals("y")) + { + view.render(); + return; + } + }else if (!action.equals("6") && !action.equals("A") && !action.equals("B") && !action.equals("C")&&!action.equals("a") && !action.equals("b") && !action.equals("c")) { try { System.out.println("Insert the required position:"); pos = scanner.nextInt(); @@ -147,6 +158,10 @@ public class ClientLauncherTUI { } } switch (action) { + case "0" -> { + controller.disconnect(); + System.exit(0); + } case "1" -> controller.slotChoice(username, pos); case "2" -> controller.drawUpperTribeCard(username, pos); case "3" -> controller.drawUpperBuildingCard(username, pos); diff --git a/src/main/java/it/polimi/ingsw/gc14/Controller/ClientController.java b/src/main/java/it/polimi/ingsw/gc14/Controller/ClientController.java index 13edbd4..e0af719 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Controller/ClientController.java +++ b/src/main/java/it/polimi/ingsw/gc14/Controller/ClientController.java @@ -195,4 +195,9 @@ public class ClientController { client.totemChoice(playerUsername, String.valueOf(miniModel.availableTotems.get(pos))); } } + + public void disconnect() + { + client.notifyDisconnection(); + } } \ No newline at end of file diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/IClient.java b/src/main/java/it/polimi/ingsw/gc14/Network/IClient.java index 43704e2..2bf79b9 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Network/IClient.java +++ b/src/main/java/it/polimi/ingsw/gc14/Network/IClient.java @@ -70,4 +70,7 @@ public interface IClient { * @param totem the name of the selected totem. */ void totemChoice(String playerUsername, String totem); + + //TODO + void notifyDisconnection(); } diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/RMI/Client/RMIClient.java b/src/main/java/it/polimi/ingsw/gc14/Network/RMI/Client/RMIClient.java index 44f425a..060da63 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Network/RMI/Client/RMIClient.java +++ b/src/main/java/it/polimi/ingsw/gc14/Network/RMI/Client/RMIClient.java @@ -124,7 +124,7 @@ public class RMIClient implements IClient { if (!running) return; running = false; if (pingSender != null) pingSender.shutdownNow(); - controller.view.showError("Connessione al server persa"); + controller.view.showError("Connection with server closed"); } @@ -235,5 +235,15 @@ public class RMIClient implements IClient { } } + public void notifyDisconnection() { + pingSender.shutdownNow(); + try{ + stub.disconnectPlayer(username); + } + catch (RemoteException e){ + System.out.println("Error during remote disconnection"); + } + } + } \ No newline at end of file diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/RMI/Common/IGameServer.java b/src/main/java/it/polimi/ingsw/gc14/Network/RMI/Common/IGameServer.java index aef508d..629f7ea 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Network/RMI/Common/IGameServer.java +++ b/src/main/java/it/polimi/ingsw/gc14/Network/RMI/Common/IGameServer.java @@ -93,4 +93,6 @@ public interface IGameServer extends Remote { * @throws RemoteException if an RMI communication error occurs. */ void ping(String username) throws RemoteException; + + void disconnectPlayer(String username) throws RemoteException; } \ No newline at end of file diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/RMI/Server/RMIHeartbeat.java b/src/main/java/it/polimi/ingsw/gc14/Network/RMI/Server/RMIHeartbeat.java index 4d29816..a1ca275 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Network/RMI/Server/RMIHeartbeat.java +++ b/src/main/java/it/polimi/ingsw/gc14/Network/RMI/Server/RMIHeartbeat.java @@ -89,7 +89,7 @@ public class RMIHeartbeat { * the associated RMI callback is removed, and a disconnection event is * added to the action queue for server-side processing. */ - private void disconnect() { + public void disconnect() { if (!running) return; running = false; watchdog.shutdownNow(); diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/RMI/Server/RMIServer.java b/src/main/java/it/polimi/ingsw/gc14/Network/RMI/Server/RMIServer.java index bca2e27..ee0d09c 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Network/RMI/Server/RMIServer.java +++ b/src/main/java/it/polimi/ingsw/gc14/Network/RMI/Server/RMIServer.java @@ -332,6 +332,10 @@ public class RMIServer extends UnicastRemoteObject implements IGameServer { watchdogs.put(username, wd); wd.start(); } + public void disconnectPlayer(String username) { + RMIHeartbeat wd = watchdogs.get(username); + wd.disconnect(); + } 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 67ae202..279d9b7 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 @@ -107,8 +107,12 @@ public class TCPClient implements IClient { ScheduledExecutorService sender = Executors.newSingleThreadScheduledExecutor(); sender.scheduleAtFixedRate(() -> { try { - heartbeatOut.write(PING); - heartbeatOut.flush(); + synchronized (heartbeatOut) + { + heartbeatOut.write(PING); + heartbeatOut.flush(); + } + } catch (IOException e) { sender.shutdownNow(); disconnect(); @@ -263,4 +267,17 @@ public class TCPClient implements IClient { public void totemChoice(String playerUsername,String totems) { doEvent(new TotemChoice(playerUsername,totems)); } + + public void notifyDisconnection() + { + synchronized (heartbeatOut) + { + try { + heartbeatOut.write(-1); + } catch (IOException e) { + disconnect(); + } + } + disconnect(); + } } \ No newline at end of file diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/TCP/Server/ClientHandler.java b/src/main/java/it/polimi/ingsw/gc14/Network/TCP/Server/ClientHandler.java index 8e36e01..bd8e2ae 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Network/TCP/Server/ClientHandler.java +++ b/src/main/java/it/polimi/ingsw/gc14/Network/TCP/Server/ClientHandler.java @@ -94,10 +94,9 @@ public class ClientHandler implements Runnable { } } } catch (IOException e) { - clientHandlers.remove(this); - e.printStackTrace(); + System.err.println("Error in incoming connection/disconnection"); } catch (ClassNotFoundException e) { - throw new RuntimeException(e); + System.err.println("Class not found"); } } diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/TCP/Server/HeartbeatHandler.java b/src/main/java/it/polimi/ingsw/gc14/Network/TCP/Server/HeartbeatHandler.java index fdf9f8e..6e477fe 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Network/TCP/Server/HeartbeatHandler.java +++ b/src/main/java/it/polimi/ingsw/gc14/Network/TCP/Server/HeartbeatHandler.java @@ -94,7 +94,13 @@ public class HeartbeatHandler implements Runnable { try { while (running) { int b = in.read(); // blocca finché non arriva un byte - if (b == -1) { disconnect(); break; } // stream chiusa + if (b == -1) { + synchronized (this) + { + out.write(-1); + } + disconnect(); break; + } // stream chiusa if (b == PING) { lastReceivedTime = System.currentTimeMillis(); out.write(PONG); @@ -127,7 +133,7 @@ public class HeartbeatHandler implements Runnable { *

The handler is stopped, the watchdog task is terminated, the main * {@link ClientHandler} is disconnected, and the heartbeat socket is closed. */ - private void disconnect() { + private synchronized void disconnect() { running = false; watchdog.shutdownNow(); mainHandler.disconnect(); // disconnette anche il socket principale 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 6b318fa..606f998 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 @@ -257,6 +257,7 @@ public class TUI implements IView { table.addRow(List.of("4-DrawLowerTribe(pos)", "")); table.addRow(List.of("5-DrawLowerBuilding(pos)", "")); table.addRow(List.of("6-SkipTurn", "")); + table.addRow(List.of("0-Disconnect", "")); return table.build(); } From 01dec853e203c3071fcddbc183f599f78ed514c4 Mon Sep 17 00:00:00 2001 From: AleandroPagani Date: Mon, 25 May 2026 17:29:40 +0200 Subject: [PATCH 02/12] Tests on different graphical settings --- .../polimi/ingsw/gc14/ClientLauncherGUI.java | 1 + .../it/polimi/ingsw/gc14/View/GUI/GUI.java | 25 ++++++++----------- .../gc14/View/GUI/MainFXMLController.java | 8 ++++-- .../gc14/View/GUI/TotemFXMLController.java | 6 ++--- src/main/resources/GUIScene/styles.css | 4 +-- 5 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/main/java/it/polimi/ingsw/gc14/ClientLauncherGUI.java b/src/main/java/it/polimi/ingsw/gc14/ClientLauncherGUI.java index 35db3ca..9757dc2 100644 --- a/src/main/java/it/polimi/ingsw/gc14/ClientLauncherGUI.java +++ b/src/main/java/it/polimi/ingsw/gc14/ClientLauncherGUI.java @@ -9,6 +9,7 @@ public class ClientLauncherGUI { public static void main(String[] args) { System.setProperty("glass.win.uiScale", "1.0"); + System.setProperty("glass.gtk.uiScale", "1.0"); Application.launch(GUIApp.class, args); } 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 550d582..e757382 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 @@ -62,23 +62,21 @@ public class GUI extends Application implements IView { loaderMain = new FXMLLoader(getClass().getResource("/GUIScene/main.fxml")); - loaderMain.setControllerFactory(clazz -> { - MainFXMLController controllerMain = new MainFXMLController(); - controllerMain.setController(controller); - return controllerMain; - }); + mainScene = new Scene(loaderMain.load()); + controllerMain = loaderMain.getController(); + controllerMain.setController(controller); loaderLeaderboard = new FXMLLoader(getClass().getResource("/GUIScene/standing.fxml")); leaderboardScene = new Scene(loaderLeaderboard.load()); controllerLeaderboard = loaderLeaderboard.getController(); controllerLeaderboard.setController(controller,primaryStage,loginScene); - mainScene = new Scene(loaderMain.load()); - controllerMain = loaderMain.getController(); - showLogin(); + + primaryStage.setScene(loginScene); + primaryStage.setMaximized(true); primaryStage.setTitle("Mesos"); primaryStage.setOnCloseRequest(e -> { Platform.exit(); @@ -87,10 +85,6 @@ public class GUI extends Application implements IView { primaryStage.show(); } - public void showLogin() throws IOException { - primaryStage.setScene(loginScene); - } - @Override public void setModel(MiniModel miniModel) { @@ -105,20 +99,20 @@ public class GUI extends Application implements IView { Platform.runLater(() -> { synchronized (miniModel) { if (controller.miniModel.currentState.getGameStage() == TOTEM_CHOICE) { - primaryStage.setScene(totemScene); controllerTotem.render(); + primaryStage.setScene(totemScene); } else if (controller.miniModel.currentState.getGameStage() == ENDED) { - primaryStage.setScene(leaderboardScene); controllerLeaderboard.render(); + primaryStage.setScene(leaderboardScene); } else { double w = primaryStage.getWidth(); double h = primaryStage.getHeight(); - primaryStage.setScene(mainScene); primaryStage.setWidth(w); primaryStage.setHeight(h); primaryStage.setMinHeight(h); primaryStage.setMinWidth(w); primaryStage.setResizable(false); + primaryStage.setScene(mainScene); controllerMain.render(); } } @@ -136,6 +130,7 @@ public class GUI extends Application implements IView { synchronized (miniModel) { controllerMain.isError = true; controllerMain.render(); + System.out.println("ERRORE PORCODIDODODODOD"); } }); } 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 3c6efce..6649d81 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 @@ -75,6 +75,7 @@ public class MainFXMLController { public void initialize() { Font.loadFont(getClass().getResourceAsStream("/Fonts/InknutAntiqua-Regular.ttf"), 14); + popup = new Popup(); mainHBox.sceneProperty().addListener((obs, oldScene, newScene) -> { if (newScene != null) { @@ -282,7 +283,7 @@ public class MainFXMLController { private void renderPlayer(Player player,VBox target) { VBox card = new VBox(3); - VBox.setMargin(card, new Insets(8,15,8,15)); + VBox.setMargin(card, new Insets(15,15,0,15)); card.getStyleClass().add("player-card"); card.setPadding(new Insets(4)); @@ -291,6 +292,8 @@ public class MainFXMLController { scaleUp.setToX(1.1); scaleUp.setToY(1.1); scaleUp.play(); + + card.setStyle("-fx-effect: dropshadow(gaussian, #fff8dc, 15, 0.10, 0, 0)"); } @@ -303,8 +306,9 @@ public class MainFXMLController { totem.setPreserveRatio(true); Label usernameLabel = new Label(player.getUserName()); usernameLabel.getStyleClass().add("label-medium"); + usernameLabel.setStyle("-fx-text-fill: #711423;"); if (player.getUserName().equals(controller.myUsername)) { - usernameLabel.setStyle("-fx-text-fill: #9d0208"); + usernameLabel.setText(usernameLabel.getText() + " (you)"); if(isError) { TranslateTransition tt = new TranslateTransition(Duration.millis(50), card); diff --git a/src/main/java/it/polimi/ingsw/gc14/View/GUI/TotemFXMLController.java b/src/main/java/it/polimi/ingsw/gc14/View/GUI/TotemFXMLController.java index c9bd7b9..ff98b03 100644 --- a/src/main/java/it/polimi/ingsw/gc14/View/GUI/TotemFXMLController.java +++ b/src/main/java/it/polimi/ingsw/gc14/View/GUI/TotemFXMLController.java @@ -36,9 +36,9 @@ public class TotemFXMLController { public void initialize() { Image img = new Image(getClass().getResourceAsStream("/GUIImages/Background.png")); backgroundImage.setImage(img); - Rectangle2D screenBounds = Screen.getPrimary().getBounds(); - backgroundImage.setFitWidth(screenBounds.getWidth()); - backgroundImage.setFitHeight(screenBounds.getHeight()); + //Rectangle2D screenBounds = Screen.getPrimary().getBounds(); + //backgroundImage.setFitWidth(screenBounds.getWidth()); + //backgroundImage.setFitHeight(screenBounds.getHeight()); } public void render() { diff --git a/src/main/resources/GUIScene/styles.css b/src/main/resources/GUIScene/styles.css index 84733f9..8962330 100644 --- a/src/main/resources/GUIScene/styles.css +++ b/src/main/resources/GUIScene/styles.css @@ -35,11 +35,11 @@ } .player-card { - -fx-border-color: #6a040f; + -fx-border-color: #711423; -fx-border-width: 2; -fx-border-radius: 15; -fx-background-radius: 15; - -fx-background-color: #f48c06; + -fx-background-color: #f18f1c; } .frame { From 1dc3052df1e1beef0fef93fd5cf0cea56669c234 Mon Sep 17 00:00:00 2001 From: rubenpirreram Date: Mon, 25 May 2026 18:09:19 +0200 Subject: [PATCH 03/12] Changed: Temp Fix Board Dim --- .../it/polimi/ingsw/gc14/View/GUI/GUI.java | 3 - .../gc14/View/GUI/MainFXMLController.java | 9 +- src/main/resources/GUIScene/main.fxml | 134 +++++++++--------- 3 files changed, 72 insertions(+), 74 deletions(-) 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 e757382..482df6b 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 @@ -109,9 +109,6 @@ public class GUI extends Application implements IView { double h = primaryStage.getHeight(); primaryStage.setWidth(w); primaryStage.setHeight(h); - primaryStage.setMinHeight(h); - primaryStage.setMinWidth(w); - primaryStage.setResizable(false); primaryStage.setScene(mainScene); controllerMain.render(); } 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 6649d81..6aec818 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 @@ -41,6 +41,7 @@ import java.util.*; public class MainFXMLController { + @FXML private GridPane leftGrid; @FXML private ScrollPane playerSide; @FXML private HBox mainHBox; @FXML private ImageView backgroundImage; @@ -157,7 +158,7 @@ public class MainFXMLController { // ==== ELEMENTS ==== private StackPane createOrder(String num) { ImageView img = new ImageView(loadImage("/GUIImages/Orders/order-" + num + ".png")); - img.fitHeightProperty().bind(board.heightProperty().multiply(0.94)); + img.fitHeightProperty().bind(board.sceneProperty().get().heightProperty().subtract(40).divide(4).multiply(0.94)); img.setPreserveRatio(true); addClip(img); return new StackPane(img); @@ -166,7 +167,7 @@ public class MainFXMLController { private StackPane createSlot(Slot slot, boolean withZoom, boolean withShadow) { ImageView img = new ImageView(loadImage("/GUIImages/Fronts/card-" + slot.getSlotId() + ".png")); img.setPreserveRatio(true); - img.fitHeightProperty().bind(board.heightProperty().multiply(0.94)); // TODO perchè è tutto moltiplicato per una costante ma in board facciamo -15? + img.fitHeightProperty().bind(board.sceneProperty().get().heightProperty().subtract(40).divide(4).multiply(0.94)); // TODO perchè è tutto moltiplicato per una costante ma in board facciamo -15? addClip(img); StackPane wrapper = new StackPane(img); @@ -188,7 +189,7 @@ public class MainFXMLController { private StackPane createCard(PlayableCard card, boolean withZoom, boolean withShadow, Region parent) { ImageView img = new ImageView(loadImage("/GUIImages/Fronts/card-" + card.getIdIMG() + ".png")); img.setPreserveRatio(true); - img.fitHeightProperty().bind(parent.heightProperty().multiply(0.90)); + img.fitHeightProperty().bind(parent.getScene().heightProperty().subtract(40).divide(4).multiply(0.90)); addClip(img); StackPane wrapper = new StackPane(img); if (withShadow) addShadow(wrapper); @@ -458,7 +459,7 @@ public class MainFXMLController { default -> "/GUIImages/Backs/back-001.png"; }; ImageView back = new ImageView(loadImage(path)); - back.fitHeightProperty().bind(board.heightProperty().multiply(0.94)); + back.fitHeightProperty().bind(board.sceneProperty().get().heightProperty().divide(4).multiply(0.94)); back.setPreserveRatio(true); addClip(back); addShadow(back); diff --git a/src/main/resources/GUIScene/main.fxml b/src/main/resources/GUIScene/main.fxml index 324e2ef..bff8d0a 100644 --- a/src/main/resources/GUIScene/main.fxml +++ b/src/main/resources/GUIScene/main.fxml @@ -13,78 +13,78 @@ fx:controller="it.polimi.ingsw.gc14.View.GUI.MainFXMLController" stylesheets="@styles.css"> - - - - - - - - - - - - + + + + + + + + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - - - - - - - - - - - - - - - - - - - -