From acd0e790fe4627d31306a0963a8230a23fddd311 Mon Sep 17 00:00:00 2001 From: Michael Rausch Date: Thu, 14 Sep 2017 14:14:21 +1200 Subject: [PATCH 1/2] Added method to send server debug messages to players Tags: #story[1246] --- .../java/seng302/gameServer/GameState.java | 47 ++++++------------- .../controllers/LobbyController.java | 13 ++--- 2 files changed, 22 insertions(+), 38 deletions(-) diff --git a/src/main/java/seng302/gameServer/GameState.java b/src/main/java/seng302/gameServer/GameState.java index 961eb415..246ecd5e 100644 --- a/src/main/java/seng302/gameServer/GameState.java +++ b/src/main/java/seng302/gameServer/GameState.java @@ -1,35 +1,12 @@ package seng302.gameServer; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Random; -import java.util.Set; import javafx.scene.paint.Color; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.w3c.dom.Document; import org.xml.sax.InputSource; -import seng302.gameServer.messages.BoatAction; -import seng302.gameServer.messages.BoatStatus; -import seng302.gameServer.messages.ChatterMessage; -import seng302.gameServer.messages.CustomizeRequestType; -import seng302.gameServer.messages.MarkRoundingMessage; -import seng302.gameServer.messages.MarkType; -import seng302.gameServer.messages.Message; -import seng302.gameServer.messages.RoundingBoatStatus; -import seng302.gameServer.messages.YachtEventCodeMessage; -import seng302.gameServer.messages.YachtEventType; -import seng302.model.GeoPoint; -import seng302.model.Limit; -import seng302.model.Player; -import seng302.model.PolarTable; -import seng302.model.ServerYacht; +import seng302.gameServer.messages.*; +import seng302.model.*; import seng302.model.mark.CompoundMark; import seng302.model.mark.Mark; import seng302.model.mark.MarkOrder; @@ -38,6 +15,10 @@ import seng302.model.token.TokenType; import seng302.utilities.GeoUtility; import seng302.utilities.XMLParser; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import java.util.*; + /** * A Static class to hold information about the current state of the game (model) * Also contains logic for updating itself on regular time intervals on its own thread @@ -791,25 +772,27 @@ public class GameState implements Runnable { roundingMark.getSourceID())); } + public static void sendServerMessage(String message){ + notifyMessageListeners(new ChatterMessage( + 420, + "SERVER: " + message + )); + } public static void processChatter(ChatterMessage chatterMessage, boolean isHost) { String chatterText = chatterMessage.getMessage(); String[] words = chatterText.split("\\s+"); if (words.length > 2 && isHost) { switch (words[2].trim()) { - case ">speed": + case "/speed": try { - setSpeedMultiplier(Double.valueOf(words[3])); - notifyMessageListeners(new ChatterMessage( - chatterMessage.getMessage_type(), - "SERVER: Speed modifier set to x" + words[3] - )); + sendServerMessage("Speed modifier set to x" + words[3]); } catch (Exception e) { Logger logger = LoggerFactory.getLogger(GameState.class); logger.error("cannot parse >speed value"); } return; - case ">finish": + case "/finish": notifyMessageListeners(new ChatterMessage( chatterMessage.getMessage_type(), "SERVER: Game will now finish" diff --git a/src/main/java/seng302/visualiser/controllers/LobbyController.java b/src/main/java/seng302/visualiser/controllers/LobbyController.java index 23502bf6..6ca48af8 100644 --- a/src/main/java/seng302/visualiser/controllers/LobbyController.java +++ b/src/main/java/seng302/visualiser/controllers/LobbyController.java @@ -2,12 +2,6 @@ package seng302.visualiser.controllers; import com.jfoenix.controls.JFXButton; import com.jfoenix.controls.JFXDialog; -import java.io.IOException; -import java.net.URL; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.ResourceBundle; import javafx.application.Platform; import javafx.collections.ListChangeListener; import javafx.fxml.FXML; @@ -33,6 +27,13 @@ import seng302.visualiser.GameView; import seng302.visualiser.controllers.cells.PlayerCell; import seng302.visualiser.controllers.dialogs.BoatCustomizeController; +import java.io.IOException; +import java.net.URL; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.ResourceBundle; + public class LobbyController implements Initializable { //--------FXML BEGIN--------// From 3a41c27d8db2b449c3a26d75571df442420942ad Mon Sep 17 00:00:00 2001 From: Alistair McIntyre Date: Thu, 14 Sep 2017 14:42:25 +1200 Subject: [PATCH 2/2] - Race Finish Dialog showing up, unsure if its actually showing the correct ordering or not. tags : #story[1245] --- src/main/java/seng302/model/RaceState.java | 21 +- .../java/seng302/visualiser/GameClient.java | 45 +- .../controllers/LobbyController.java | 1 - .../controllers/RaceViewController.java | 33 +- .../visualiser/controllers/ViewManager.java | 4 +- .../dialogs/FinishDialogController.java | 13 +- src/main/resources/views/RaceView.fxml | 387 ++++++++++-------- .../views/dialogs/RaceFinishDialog.fxml | 41 ++ 8 files changed, 322 insertions(+), 223 deletions(-) create mode 100644 src/main/resources/views/dialogs/RaceFinishDialog.fxml diff --git a/src/main/java/seng302/model/RaceState.java b/src/main/java/seng302/model/RaceState.java index bab854b6..fcb86858 100644 --- a/src/main/java/seng302/model/RaceState.java +++ b/src/main/java/seng302/model/RaceState.java @@ -3,11 +3,8 @@ package seng302.model; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; -import java.util.List; import java.util.Collection; -import java.util.Comparator; import java.util.List; -import java.util.Observable; import java.util.TimeZone; import javafx.beans.property.ReadOnlyDoubleProperty; import javafx.beans.property.ReadOnlyDoubleWrapper; @@ -34,8 +31,9 @@ public class RaceState { private ReadOnlyDoubleWrapper windDirection = new ReadOnlyDoubleWrapper(); private long serverSystemTime; private long expectedStartTime; - private boolean isRaceStarted = false; + private boolean raceRunning = false; private boolean gunFired = false; + private boolean raceFinished = false; long timeTillStart; private ObservableList playerPositions; private List collisions = new ArrayList<>(); @@ -50,7 +48,7 @@ public class RaceState { this.windDirection.set(data.getWindDirection()); this.serverSystemTime = data.getCurrentTime(); this.expectedStartTime = data.getExpectedStartTime(); - this.isRaceStarted = data.isRaceStarted(); + this.raceRunning = data.isRaceStarted(); } public void setTimeZone (TimeZone timeZone) { @@ -95,9 +93,12 @@ public class RaceState { } public boolean isRaceStarted () { - return isRaceStarted; + return raceRunning; } + public void setRaceStarted(Boolean value) { + this.raceRunning = value; + } public void setBoats(Collection clientYachts) { playerPositions.setAll(clientYachts); } @@ -125,4 +126,12 @@ public class RaceState { public void removeCollisionListener(CollisionListener collisionListener) { collisionListeners.remove(collisionListener); } + + public void setRaceFinished() { + raceFinished = true; + } + + public Boolean getRaceFinished() { + return raceFinished; + } } diff --git a/src/main/java/seng302/visualiser/GameClient.java b/src/main/java/seng302/visualiser/GameClient.java index 445af5a7..87511a5a 100644 --- a/src/main/java/seng302/visualiser/GameClient.java +++ b/src/main/java/seng302/visualiser/GameClient.java @@ -14,7 +14,6 @@ import javafx.application.Platform; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.fxml.FXMLLoader; -import javafx.scene.Node; import javafx.scene.control.Alert; import javafx.scene.control.Alert.AlertType; import javafx.scene.input.KeyCode; @@ -42,7 +41,6 @@ import seng302.utilities.Sounds; import seng302.utilities.StreamParser; import seng302.utilities.XMLGenerator; import seng302.utilities.XMLParser; -import seng302.visualiser.controllers.FinishScreenViewController; import seng302.visualiser.controllers.LobbyController; import seng302.visualiser.controllers.RaceViewController; import seng302.visualiser.controllers.ViewManager; @@ -64,6 +62,7 @@ public class GameClient { private RaceXMLData courseData; private RaceState raceState = new RaceState(); private LobbyController lobbyController; + private RaceViewController raceViewController; private ArrayList finishedBoats = new ArrayList<>(); @@ -177,40 +176,8 @@ public class GameClient { socketThread.addStreamObserver(this::parsePackets); } - private void loadRaceView() { - FXMLLoader fxmlLoader = loadFXMLToHolder("/views/RaceView.fxml"); - holderPane.getScene().setOnKeyPressed(this::keyPressed); - holderPane.getScene().setOnKeyReleased(this::keyReleased); - raceView = fxmlLoader.getController(); - ClientYacht player = allBoatsMap.get(socketThread.getClientId()); - raceView.loadRace(allBoatsMap, courseData, raceState, player); - - } - - private void loadFinishScreenView() { - Sounds.stopMusic(); - Sounds.stopSoundEffects(); - Sounds.playFinishMusic(); - System.out.println("ITS WORKING HERE"); - FXMLLoader fxmlLoader = loadFXMLToHolder("/views/FinishScreenView.fxml"); - FinishScreenViewController controller = fxmlLoader.getController(); - controller.setFinishers(raceState.getPlayerPositions()); - } - - private FXMLLoader loadFXMLToHolder(String fxmlLocation) { - FXMLLoader fxmlLoader = new FXMLLoader( - getClass().getResource(fxmlLocation) - ); - try { - final Node fxmlLoaderFX = fxmlLoader.load(); - Platform.runLater(() -> { - holderPane.getChildren().clear(); - holderPane.getChildren().add(fxmlLoaderFX); - }); - } catch (IOException e) { - e.printStackTrace(); - } - return fxmlLoader; + public void setRaceViewController(RaceViewController controller) { + this.raceViewController = controller; } private void parsePackets() { @@ -374,10 +341,13 @@ public class GameClient { } if (raceFinished) { + System.out.println(raceViewController); + raceViewController.showFinishDialog(finishedBoats); Sounds.playFinishSound(); close(); - loadFinishScreenView(); + //loadFinishScreenView(); } + raceState.setRaceFinished(); } } @@ -392,7 +362,6 @@ public class GameClient { socketThread.setSocketToClose(); } - /** * Handle the key-pressed event from the text field. * @param e The key event triggering this call diff --git a/src/main/java/seng302/visualiser/controllers/LobbyController.java b/src/main/java/seng302/visualiser/controllers/LobbyController.java index 23502bf6..42c2b257 100644 --- a/src/main/java/seng302/visualiser/controllers/LobbyController.java +++ b/src/main/java/seng302/visualiser/controllers/LobbyController.java @@ -91,7 +91,6 @@ public class LobbyController implements Initializable { Platform.runLater(() -> { Integer playerId = ViewManager.getInstance().getGameClient().getServerThread().getClientId(); - String name = ViewManager.getInstance().getGameClient().getPlayerNames().get(playerId - 1); playersColor = Colors.getColor(playerId - 1); customizationDialog = createCustomizeDialog(); diff --git a/src/main/java/seng302/visualiser/controllers/RaceViewController.java b/src/main/java/seng302/visualiser/controllers/RaceViewController.java index 7b855f9e..7a5ac3b6 100644 --- a/src/main/java/seng302/visualiser/controllers/RaceViewController.java +++ b/src/main/java/seng302/visualiser/controllers/RaceViewController.java @@ -1,6 +1,7 @@ package seng302.visualiser.controllers; import com.jfoenix.controls.JFXButton; +import com.jfoenix.controls.JFXDialog; import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -55,9 +56,10 @@ import seng302.visualiser.GameView3D; import seng302.visualiser.controllers.annotations.ImportantAnnotationController; import seng302.visualiser.controllers.annotations.ImportantAnnotationDelegate; import seng302.visualiser.controllers.annotations.ImportantAnnotationsState; +import seng302.visualiser.controllers.dialogs.FinishDialogController; import seng302.visualiser.fxObjects.ChatHistory; -import seng302.visualiser.fxObjects.assets_3D.BoatObject; import seng302.visualiser.fxObjects.assets_2D.WindArrow; +import seng302.visualiser.fxObjects.assets_3D.BoatObject; /** * Controller class that manages the display of a race @@ -124,11 +126,15 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel private Polyline windArrow = new WindArrow(Color.LIGHTGRAY); private ObservableList selectionComboBoxList = FXCollections.observableArrayList(); private ClientYacht player; + private JFXDialog finishScreenDialog; + private FinishDialogController finishDialogController; public void initialize() { Sounds.stopMusic(); Sounds.playRaceMusic(); + finishScreenDialog = createFinishDialog(); + // Load a default important annotation state //importantAnnotations = new ImportantAnnotationsState(); @@ -191,6 +197,31 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel }); } + public void showFinishDialog(ArrayList finishedBoats) { + raceState.setRaceStarted(false); + finishDialogController.setFinishedBoats(finishedBoats); + ViewManager.getInstance().getGameClient().stopGame(); + finishScreenDialog.show(); + } + + private JFXDialog createFinishDialog() { + FXMLLoader dialog = new FXMLLoader( + getClass().getResource("/views/dialogs/RaceFinishDialog.fxml")); + + JFXDialog finishScreenDialog = null; + + try { + finishScreenDialog = new JFXDialog(contentAnchorPane, dialog.load(), + JFXDialog.DialogTransition.CENTER); + } catch (IOException e) { + e.printStackTrace(); + } + + finishDialogController = dialog.getController(); + + return finishScreenDialog; + } + public void loadRace ( Map participants, RaceXMLData raceData, RaceState raceState, ClientYacht player) { diff --git a/src/main/java/seng302/visualiser/controllers/ViewManager.java b/src/main/java/seng302/visualiser/controllers/ViewManager.java index dc83c08d..165d0c39 100644 --- a/src/main/java/seng302/visualiser/controllers/ViewManager.java +++ b/src/main/java/seng302/visualiser/controllers/ViewManager.java @@ -248,14 +248,12 @@ public class ViewManager { public RaceViewController loadRaceView() { FXMLLoader loader = loadFxml("/views/RaceView.fxml"); - // have to create a new stage and set the race view maximized as JFoenix decorator has // bug causes stage cannot be fully maximised. Platform.runLater(() -> { try { stage.close(); stage = new Stage(); - JFXDecorator decorator = new JFXDecorator(stage, loader.load(), false, true, true); decorator.setCustomMaximize(true); decorator.applyCss(); @@ -263,6 +261,8 @@ public class ViewManager { .add(getClass().getResource("/css/Master.css").toExternalForm()); setDecorator(decorator); Scene scene = new Scene(decorator); + RaceViewController raceViewController = loader.getController(); + gameClient.setRaceViewController(raceViewController); // set key press event to catch key stoke scene.setOnKeyPressed(gameClient::keyPressed); scene.setOnKeyReleased(gameClient::keyReleased); diff --git a/src/main/java/seng302/visualiser/controllers/dialogs/FinishDialogController.java b/src/main/java/seng302/visualiser/controllers/dialogs/FinishDialogController.java index 64358399..aad3b62d 100644 --- a/src/main/java/seng302/visualiser/controllers/dialogs/FinishDialogController.java +++ b/src/main/java/seng302/visualiser/controllers/dialogs/FinishDialogController.java @@ -3,11 +3,13 @@ package seng302.visualiser.controllers.dialogs; import com.jfoenix.controls.JFXButton; import com.jfoenix.controls.JFXListView; -import java.awt.Label; import java.net.URL; +import java.util.ArrayList; import java.util.ResourceBundle; import javafx.fxml.FXML; import javafx.fxml.Initializable; +import javafx.scene.control.Label; +import seng302.model.ClientYacht; import seng302.visualiser.controllers.ViewManager; public class FinishDialogController implements Initializable { @@ -16,7 +18,7 @@ public class FinishDialogController implements Initializable { @FXML private Label raceFinishLabel; @FXML - private JFXListView finishersList; + private JFXListView - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/views/dialogs/RaceFinishDialog.fxml b/src/main/resources/views/dialogs/RaceFinishDialog.fxml new file mode 100644 index 00000000..e8be2740 --- /dev/null +++ b/src/main/resources/views/dialogs/RaceFinishDialog.fxml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +