diff --git a/src/main/java/seng302/gameServer/GameState.java b/src/main/java/seng302/gameServer/GameState.java index fc29f446..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; + } } @@ -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 691ccda3..bd22063c 100644 --- a/src/main/java/seng302/gameServer/MainServerThread.java +++ b/src/main/java/seng302/gameServer/MainServerThread.java @@ -1,12 +1,18 @@ package seng302.gameServer; +import gherkin.lexer.Fi; 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; @@ -43,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(); } @@ -77,7 +83,7 @@ public class MainServerThread implements Runnable, ClientConnectionDelegate { //FINISHED else if (GameState.getCurrentStage() == GameStages.FINISHED) { - + terminate(); } } @@ -159,14 +165,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..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(); } @@ -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/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/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/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",