From 000d562ffeef4c30d7b30db9c9941fe31bc21113 Mon Sep 17 00:00:00 2001 From: William Muir Date: Wed, 16 Aug 2017 11:27:46 +1200 Subject: [PATCH 1/3] SailIn / out animation on client is now correct again --- src/main/java/seng302/visualiser/GameView.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/seng302/visualiser/GameView.java b/src/main/java/seng302/visualiser/GameView.java index e743dace..cf8ecd95 100644 --- a/src/main/java/seng302/visualiser/GameView.java +++ b/src/main/java/seng302/visualiser/GameView.java @@ -630,7 +630,6 @@ public class GameView extends Pane { public void setBoatAsPlayer (ClientYacht playerYacht) { this.playerYacht = playerYacht; - this.playerYacht.toggleSail(); boatObjects.get(playerYacht).setAsPlayer(); annotations.get(playerYacht).addAnnotation( "velocity", From 76a750a764ae310f0cc8a3319770174b997246b3 Mon Sep 17 00:00:00 2001 From: William Muir Date: Wed, 16 Aug 2017 11:53:29 +1200 Subject: [PATCH 2/3] Moved sendRaceStatus Message out of S2C Thread into MS Thread (minor refactor) --- .../java/seng302/gameServer/GameState.java | 2 +- .../seng302/gameServer/MainServerThread.java | 36 ++++++++++++++++--- .../gameServer/ServerToClientThread.java | 25 ------------- .../java/seng302/visualiser/GameClient.java | 1 + .../server_config/xml_templates/race.ftlh | 8 ----- 5 files changed, 34 insertions(+), 38 deletions(-) diff --git a/src/main/java/seng302/gameServer/GameState.java b/src/main/java/seng302/gameServer/GameState.java index fc29f446..e8d858a4 100644 --- a/src/main/java/seng302/gameServer/GameState.java +++ b/src/main/java/seng302/gameServer/GameState.java @@ -283,7 +283,7 @@ public class GameState implements Runnable { Double velocity = yacht.getCurrentVelocity(); Double trueWindAngle = Math.abs(windDirection - yacht.getHeading()); Double boatSpeedInKnots = PolarTable.getBoatSpeed(getWindSpeedKnots(), trueWindAngle); - Double maxBoatSpeed = GeoUtility.knotsToMMS(boatSpeedInKnots); + Double maxBoatSpeed = GeoUtility.knotsToMMS(boatSpeedInKnots) * 3; // TODO: 15/08/17 remove magic numbers from these equations. if (yacht.getSailIn()) { if (velocity < maxBoatSpeed - 500) { diff --git a/src/main/java/seng302/gameServer/MainServerThread.java b/src/main/java/seng302/gameServer/MainServerThread.java index 691ccda3..8965839d 100644 --- a/src/main/java/seng302/gameServer/MainServerThread.java +++ b/src/main/java/seng302/gameServer/MainServerThread.java @@ -4,9 +4,14 @@ import java.io.IOException; import java.net.ServerSocket; import java.time.LocalDateTime; import java.util.ArrayList; +import java.util.List; import java.util.Timer; import java.util.TimerTask; +import seng302.gameServer.server.messages.BoatSubMessage; import seng302.gameServer.server.messages.Message; +import seng302.gameServer.server.messages.RaceStatus; +import seng302.gameServer.server.messages.RaceStatusMessage; +import seng302.gameServer.server.messages.RaceType; import seng302.model.GeoPoint; import seng302.model.Player; import seng302.model.PolarTable; @@ -159,14 +164,37 @@ public class MainServerThread implements Runnable, ClientConnectionDelegate { t.schedule(new TimerTask() { @Override public void run() { - - for (ServerToClientThread serverToClientThread : serverToClientThreads) { - serverToClientThread.sendRaceStatusMessage(); - } + broadcastMessage(makeRaceStatusMessage()); } }, 0, 500); } + private RaceStatusMessage makeRaceStatusMessage() { + // variables taken from GameServerThread + + List boatSubMessages = new ArrayList<>(); + RaceStatus raceStatus; + + for (Player player : GameState.getPlayers()) { + ServerYacht y = player.getYacht(); + BoatSubMessage m = new BoatSubMessage(y.getSourceId(), y.getBoatStatus(), 0, + 0, 0, 1234L, + 1234L); + boatSubMessages.add(m); + } + + if (GameState.getCurrentStage() == GameStages.RACING) { + raceStatus = RaceStatus.STARTED; + } else { + raceStatus = RaceStatus.WARNING; + } + + return new RaceStatusMessage(1, raceStatus, GameState.getStartTime(), + GameState.getWindDirection(), + GameState.getWindSpeedMMS().longValue(), GameState.getPlayers().size(), + RaceType.MATCH_RACE, 1, boatSubMessages); + } + public void terminate() { terminated = true; } diff --git a/src/main/java/seng302/gameServer/ServerToClientThread.java b/src/main/java/seng302/gameServer/ServerToClientThread.java index bbe7053c..c8a1e3b5 100644 --- a/src/main/java/seng302/gameServer/ServerToClientThread.java +++ b/src/main/java/seng302/gameServer/ServerToClientThread.java @@ -318,31 +318,6 @@ public class ServerToClientThread implements Runnable, Observer { return thread; } - public void sendRaceStatusMessage() { - // variables taken from GameServerThread - - List boatSubMessages = new ArrayList<>(); - RaceStatus raceStatus; - - for (Player player : GameState.getPlayers()) { - ServerYacht y = player.getYacht(); - BoatSubMessage m = new BoatSubMessage(y.getSourceId(), y.getBoatStatus(), 0, - 0, 0, 1234L, - 1234L); - boatSubMessages.add(m); - } - - if (GameState.getCurrentStage() == GameStages.RACING) { - raceStatus = RaceStatus.STARTED; - } else { - raceStatus = RaceStatus.WARNING; - } - - sendMessage(new RaceStatusMessage(1, raceStatus, GameState.getStartTime(), GameState.getWindDirection(), - GameState.getWindSpeedMMS().longValue(), GameState.getPlayers().size(), - RaceType.MATCH_RACE, 1, boatSubMessages)); - } - public Socket getSocket() { return socket; } diff --git a/src/main/java/seng302/visualiser/GameClient.java b/src/main/java/seng302/visualiser/GameClient.java index bd702a47..8acf2c46 100644 --- a/src/main/java/seng302/visualiser/GameClient.java +++ b/src/main/java/seng302/visualiser/GameClient.java @@ -290,6 +290,7 @@ public class GameClient { } } if (raceFinished == true) { + close(); loadFinishScreenView(); } diff --git a/src/main/resources/server_config/xml_templates/race.ftlh b/src/main/resources/server_config/xml_templates/race.ftlh index e38bf0b7..08d148e2 100644 --- a/src/main/resources/server_config/xml_templates/race.ftlh +++ b/src/main/resources/server_config/xml_templates/race.ftlh @@ -35,14 +35,6 @@ - - - - - - - - From bf016356a6c3b58f73c61d26eaaa503c9f971819 Mon Sep 17 00:00:00 2001 From: William Muir Date: Wed, 16 Aug 2017 13:04:34 +1200 Subject: [PATCH 3/3] Finish screen now displays correctly on finishing. GameState update now checks for finishing the race Can now go back to main menu from finish screen Labeled all threads for better debugging Still need to implement race list ordering and finish screen ordering --- src/main/java/seng302/gameServer/GameState.java | 17 ++++++++++++----- .../seng302/gameServer/MainServerThread.java | 5 +++-- .../gameServer/ServerToClientThread.java | 2 +- src/main/java/seng302/model/ServerYacht.java | 14 ++------------ .../server_config/xml_templates/race.ftlh | 8 ++++++++ 5 files changed, 26 insertions(+), 20 deletions(-) diff --git a/src/main/java/seng302/gameServer/GameState.java b/src/main/java/seng302/gameServer/GameState.java index e8d858a4..a6716807 100644 --- a/src/main/java/seng302/gameServer/GameState.java +++ b/src/main/java/seng302/gameServer/GameState.java @@ -89,7 +89,7 @@ public class GameState implements Runnable { markOrder = new MarkOrder(); //This could be instantiated at some point with a select map? markListeners = new ArrayList<>(); - new Thread(this).start(); //Run the auto updates on the game state + new Thread(this, "GameState").start(); //Run the auto updates on the game state marks = new MarkOrder().getAllMarks(); } @@ -184,7 +184,7 @@ public class GameState implements Runnable { @Override public void run() { - while (true) { + while (currentStage != GameStages.FINISHED) { try { Thread.sleep(1000 / STATE_UPDATES_PER_SECOND); } catch (InterruptedException e) { @@ -229,17 +229,24 @@ public class GameState implements Runnable { * Called periodically in this GameState thread to update the GameState values */ public void update() { + Boolean raceFinished = true; + Double timeInterval = (System.currentTimeMillis() - previousUpdateTime) / 1000000.0; previousUpdateTime = System.currentTimeMillis(); for (ServerYacht yacht : yachts.values()) { updateVelocity(yacht); yacht.runAutoPilot(); yacht.updateLocation(timeInterval); - if (!yacht.getFinishedRace()) { + if (yacht.getBoatStatus() != BoatStatus.FINISHED) { checkForCollision(yacht); checkForLegProgression(yacht); + raceFinished = false; } } + + if (raceFinished) { + currentStage = GameStages.FINISHED; + } } @@ -283,7 +290,7 @@ public class GameState implements Runnable { Double velocity = yacht.getCurrentVelocity(); Double trueWindAngle = Math.abs(windDirection - yacht.getHeading()); Double boatSpeedInKnots = PolarTable.getBoatSpeed(getWindSpeedKnots(), trueWindAngle); - Double maxBoatSpeed = GeoUtility.knotsToMMS(boatSpeedInKnots) * 3; + Double maxBoatSpeed = GeoUtility.knotsToMMS(boatSpeedInKnots); // TODO: 15/08/17 remove magic numbers from these equations. if (yacht.getSailIn()) { if (velocity < maxBoatSpeed - 500) { @@ -345,6 +352,7 @@ public class GameState implements Runnable { private void checkForLegProgression(ServerYacht yacht) { Integer currentMarkSeqID = yacht.getCurrentMarkSeqID(); CompoundMark currentMark = markOrder.getCurrentMark(currentMarkSeqID); +// System.out.println(yacht.getCurrentMarkSeqID()); Boolean hasProgressed; if (currentMarkSeqID == 0) { @@ -493,7 +501,6 @@ public class GameState implements Runnable { Boolean isClockwiseCross = GeoUtility.isClockwise(mark1, mark2, prevMark.getMidPoint()); if (crossedLine == 1 && isClockwiseCross || crossedLine == 2 && !isClockwiseCross) { yacht.setClosestCurrentMark(mark1); - yacht.setIsFinished(true); yacht.setBoatStatus(BoatStatus.FINISHED); return true; } diff --git a/src/main/java/seng302/gameServer/MainServerThread.java b/src/main/java/seng302/gameServer/MainServerThread.java index 8965839d..bd22063c 100644 --- a/src/main/java/seng302/gameServer/MainServerThread.java +++ b/src/main/java/seng302/gameServer/MainServerThread.java @@ -1,5 +1,6 @@ package seng302.gameServer; +import gherkin.lexer.Fi; import java.io.IOException; import java.net.ServerSocket; import java.time.LocalDateTime; @@ -48,7 +49,7 @@ public class MainServerThread implements Runnable, ClientConnectionDelegate { PolarTable.parsePolarFile(getClass().getResourceAsStream("/config/acc_polars.csv")); GameState.addMarkPassListener(this::broadcastMessage); terminated = false; - thread = new Thread(this); + thread = new Thread(this, "MainServer"); thread.start(); } @@ -82,7 +83,7 @@ public class MainServerThread implements Runnable, ClientConnectionDelegate { //FINISHED else if (GameState.getCurrentStage() == GameStages.FINISHED) { - + terminate(); } } diff --git a/src/main/java/seng302/gameServer/ServerToClientThread.java b/src/main/java/seng302/gameServer/ServerToClientThread.java index c8a1e3b5..bae4216c 100644 --- a/src/main/java/seng302/gameServer/ServerToClientThread.java +++ b/src/main/java/seng302/gameServer/ServerToClientThread.java @@ -88,7 +88,7 @@ public class ServerToClientThread implements Runnable, Observer { return; } - thread = new Thread(this); + thread = new Thread(this, "ServerToClient"); thread.start(); } diff --git a/src/main/java/seng302/model/ServerYacht.java b/src/main/java/seng302/model/ServerYacht.java index 2a8a8935..2f10929c 100644 --- a/src/main/java/seng302/model/ServerYacht.java +++ b/src/main/java/seng302/model/ServerYacht.java @@ -42,12 +42,11 @@ public class ServerYacht extends Observable { private Double autoHeading; //Mark Rounding - private Integer currentMarkSeqID = 0; + private Integer currentMarkSeqID; private Boolean hasEnteredRoundingZone; private Mark closestCurrentMark; private Boolean hasPassedLine; private Boolean hasPassedThroughGate; - private Boolean finishedRace; public ServerYacht(String boatType, Integer sourceId, String hullID, String shortName, @@ -65,11 +64,11 @@ public class ServerYacht extends Observable { this.lastLocation = location; this.heading = 120.0; //In degrees this.currentVelocity = 0d; //in mms-1 + this.currentMarkSeqID = 0; this.hasEnteredRoundingZone = false; this.hasPassedLine = false; this.hasPassedThroughGate = false; - this.finishedRace = false; } @@ -322,15 +321,6 @@ public class ServerYacht extends Observable { return boatName; } - - public void setIsFinished(Boolean isFinished) { - finishedRace = isFinished; - } - - public Boolean getFinishedRace() { - return finishedRace; - } - public Double getCurrentVelocity() { return currentVelocity; } diff --git a/src/main/resources/server_config/xml_templates/race.ftlh b/src/main/resources/server_config/xml_templates/race.ftlh index 08d148e2..e38bf0b7 100644 --- a/src/main/resources/server_config/xml_templates/race.ftlh +++ b/src/main/resources/server_config/xml_templates/race.ftlh @@ -35,6 +35,14 @@ + + + + + + + +