From 5dbc23866aac38f034e99f6a9f9d6777443e85a9 Mon Sep 17 00:00:00 2001 From: Calum Date: Wed, 11 Oct 2017 00:13:55 +1300 Subject: [PATCH] Fixed start line boat position algorithm. Fixed map limits and max players. Fixed concurrency bug on token creation and pickup. Fixed mini map arrows not rendering correctly for finish lines on maps other than the original. Removed System.gc() call after memory issues causing pauses could not be replicated. --- src/main/java/seng302/App.java | 18 +++++---------- .../java/seng302/gameServer/GameState.java | 7 +++--- .../seng302/gameServer/MainServerThread.java | 22 +++++++++---------- .../java/seng302/visualiser/MapPreview.java | 2 +- .../controllers/LobbyController.java | 8 ++----- .../fxObjects/MarkArrowFactory.java | 14 +++--------- .../seng302/visualiser/fxObjects/Marker.java | 3 +++ .../fxObjects/assets_2D/Marker2D.java | 9 ++++++++ .../fxObjects/assets_3D/Marker3D.java | 10 +++++++++ src/main/resources/maps/default.xml | 2 +- src/main/resources/maps/horseshoe.xml | 2 +- src/main/resources/maps/loop.xml | 2 +- src/main/resources/maps/madagascar.xml | 2 +- src/main/resources/maps/waiheke.xml | 16 +++++++------- src/main/resources/views/LobbyView.fxml | 17 ++------------ src/main/resources/views/ServerListView.fxml | 13 +---------- 16 files changed, 63 insertions(+), 84 deletions(-) diff --git a/src/main/java/seng302/App.java b/src/main/java/seng302/App.java index 2f8f4e4a..4ff9f82c 100644 --- a/src/main/java/seng302/App.java +++ b/src/main/java/seng302/App.java @@ -13,9 +13,6 @@ import org.slf4j.LoggerFactory; import seng302.discoveryServer.DiscoveryServer; import seng302.visualiser.controllers.ViewManager; -import java.util.Timer; -import java.util.TimerTask; - public class App extends Application { private static Logger logger = LoggerFactory.getLogger(App.class); @@ -95,15 +92,12 @@ public class App extends Application { } public static void main(String[] args) throws Exception { - /* - * Do not trust Java to do garbage collection - */ - new Timer().schedule(new TimerTask() { - @Override - public void run() { - System.gc(); - } - }, 0, 1_000); +// new Timer().schedule(new TimerTask() { +// @Override +// public void run() { +// System.gc(); +// } +// }, 0, 1_000); try { parseArgs(args); diff --git a/src/main/java/seng302/gameServer/GameState.java b/src/main/java/seng302/gameServer/GameState.java index c279c363..fadef0f8 100644 --- a/src/main/java/seng302/gameServer/GameState.java +++ b/src/main/java/seng302/gameServer/GameState.java @@ -11,6 +11,7 @@ import java.util.Random; import java.util.Set; import java.util.Timer; import java.util.TimerTask; +import java.util.concurrent.CopyOnWriteArrayList; import javafx.beans.property.ReadOnlyDoubleWrapper; import javafx.scene.paint.Color; import org.slf4j.Logger; @@ -98,7 +99,7 @@ public class GameState implements Runnable { private static long startTime; private static Set marks = new HashSet<>(); private static List courseLimit = new ArrayList<>(); - private static Integer maxPlayers = 8; + private static Integer maxPlayers = 12; private static List tokensInPlay; private static RandomSpawn randomSpawn; @@ -113,7 +114,7 @@ public class GameState implements Runnable { windDirectionProperty.set(windDirection); windSpeed = 10000d; yachts = new HashMap<>(); - tokensInPlay = new ArrayList<>(); + tokensInPlay = new CopyOnWriteArrayList<>(); players = new ArrayList<>(); customizationFlag = false; playerHasLeftFlag = false; @@ -123,7 +124,7 @@ public class GameState implements Runnable { newMessageListeners = new ArrayList<>(); resetStartTime(); - //setCourseLimit("/server_config/race.xml"); + new Thread(this, "GameState").start(); //Run the auto updates on the game state } diff --git a/src/main/java/seng302/gameServer/MainServerThread.java b/src/main/java/seng302/gameServer/MainServerThread.java index 63acf89a..e87cf128 100644 --- a/src/main/java/seng302/gameServer/MainServerThread.java +++ b/src/main/java/seng302/gameServer/MainServerThread.java @@ -284,13 +284,13 @@ public class MainServerThread implements Runnable, ClientConnectionDelegate { private void initialiseBoatPositions() { final double DISTANCE_TO_START = 75d; - final double YACHT_SEPARATION = 20d; + final double YACHT_SEPARATION = 35d; //Length of start line double startLineLength = GeoUtility.getDistance( GameState.getMarkOrder().getMarkOrder().get(0).getSubMark(1), GameState.getMarkOrder().getMarkOrder().get(0).getSubMark(2) - ); + ) - YACHT_SEPARATION; //How many yachts can fit along the start line int spacesAlongLine = (int) Math.round(startLineLength / YACHT_SEPARATION); @@ -312,7 +312,7 @@ public class MainServerThread implements Runnable, ClientConnectionDelegate { GameState.getMarkOrder().getMarkOrder().get(1).getMidPoint() ); - GeoPoint startingPoint = GeoUtility.getGeoCoordinate( + GeoPoint midPoint = GeoUtility.getGeoCoordinate( GameState.getMarkOrder().getMarkOrder().get(0).getMidPoint(), angleToStart, DISTANCE_TO_START ); @@ -321,26 +321,24 @@ public class MainServerThread implements Runnable, ClientConnectionDelegate { Collections.shuffle(randomisedYachts); while (randomisedYachts.size() > 0) { - int numYachtsInLine = - spacesAlongLine > randomisedYachts.size() ? randomisedYachts.size() - : spacesAlongLine; - double yachtSpace = numYachtsInLine * YACHT_SEPARATION / 2; + int numYachts = spacesAlongLine > randomisedYachts.size() ? randomisedYachts.size() : spacesAlongLine; + double yachtSpace = (numYachts - 1) * YACHT_SEPARATION / 2; GeoPoint firstYachtPoint = GeoUtility.getGeoCoordinate( - startingPoint, startMarkToMarkAngle + 180, yachtSpace + midPoint, startMarkToMarkAngle + 180, yachtSpace ); - for (int i = 0; i < numYachtsInLine; i++) { + for (int i = 0; i < numYachts; i++) { randomisedYachts.get(0).setHeading(angleFromStart); randomisedYachts.get(0).setLocation(firstYachtPoint); firstYachtPoint = GeoUtility.getGeoCoordinate( - firstYachtPoint, startMarkToMarkAngle, yachtSpace + firstYachtPoint, startMarkToMarkAngle, YACHT_SEPARATION ); randomisedYachts.remove(0); } - startingPoint = GeoUtility.getGeoCoordinate( - startingPoint, angleToStart, DISTANCE_TO_START + midPoint = GeoUtility.getGeoCoordinate( + midPoint, angleToStart, YACHT_SEPARATION * 1.5 ); } } diff --git a/src/main/java/seng302/visualiser/MapPreview.java b/src/main/java/seng302/visualiser/MapPreview.java index 9725e526..56bda7c7 100644 --- a/src/main/java/seng302/visualiser/MapPreview.java +++ b/src/main/java/seng302/visualiser/MapPreview.java @@ -206,7 +206,7 @@ public class MapPreview extends GameView { } GeoPoint secondToLastMarkAv = new GeoPoint(averageLat / numMarks, averageLng / numMarks); for (Mark mark : course.get(course.size()-1).getMarks()) { - markerObjects.get(mark).addArrows( + markerObjects.get(mark).addFinishArrow( mark.getRoundingSide() == RoundingSide.STARBOARD ? MarkArrowFactory.RoundingSide.STARBOARD : MarkArrowFactory.RoundingSide.PORT, GeoUtility.getBearing(secondToLastMarkAv, mark), GeoUtility.getBearing(mark, mark) diff --git a/src/main/java/seng302/visualiser/controllers/LobbyController.java b/src/main/java/seng302/visualiser/controllers/LobbyController.java index 9035085d..6ab3d9e4 100644 --- a/src/main/java/seng302/visualiser/controllers/LobbyController.java +++ b/src/main/java/seng302/visualiser/controllers/LobbyController.java @@ -5,14 +5,12 @@ import com.jfoenix.controls.JFXDialog; import java.io.IOException; import java.net.URL; import java.util.ArrayList; -import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.ResourceBundle; import javafx.application.Platform; import javafx.collections.ListChangeListener; -import javafx.event.EventHandler; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; import javafx.fxml.Initializable; @@ -20,7 +18,6 @@ import javafx.geometry.Point3D; import javafx.scene.Group; import javafx.scene.control.Label; import javafx.scene.control.ScrollPane; -import javafx.scene.input.MouseEvent; import javafx.scene.layout.AnchorPane; import javafx.scene.layout.Pane; import javafx.scene.layout.StackPane; @@ -43,7 +40,6 @@ import seng302.utilities.Sounds; import seng302.visualiser.MapPreview; import seng302.visualiser.controllers.cells.PlayerCell; import seng302.visualiser.controllers.dialogs.BoatCustomizeController; -import seng302.visualiser.controllers.dialogs.PopupDialogController; import seng302.visualiser.controllers.dialogs.TokenInfoDialogController; import seng302.visualiser.fxObjects.assets_3D.ModelFactory; import seng302.visualiser.fxObjects.assets_3D.ModelType; @@ -357,8 +353,8 @@ public class LobbyController implements Initializable { } /** - * - * @param raceState + * Updates the state of the race and changes the value + * @param raceState the new race state */ public void updateRaceState(RaceState raceState){ this.raceState = raceState; diff --git a/src/main/java/seng302/visualiser/fxObjects/MarkArrowFactory.java b/src/main/java/seng302/visualiser/fxObjects/MarkArrowFactory.java index a5d8175b..48fad862 100644 --- a/src/main/java/seng302/visualiser/fxObjects/MarkArrowFactory.java +++ b/src/main/java/seng302/visualiser/fxObjects/MarkArrowFactory.java @@ -86,16 +86,6 @@ public class MarkArrowFactory { */ public static Group constructEntryArrow (RoundingSide roundingSide, double angleOfEntry, double angleOfExit, Paint colour) { - // Check to see if the the angle around mark would take you inside of it. (less than 180) - // If so make interior angle. - if (roundingSide == RoundingSide.PORT && angleOfEntry < angleOfExit && - Math.abs(angleOfExit - angleOfEntry) < 180) { - return makeInteriorAngle(roundingSide, angleOfExit, angleOfEntry, colour); - - } else if (roundingSide == RoundingSide.STARBOARD && angleOfEntry > angleOfExit && - -Math.abs(angleOfEntry - angleOfExit) > -180) { - return makeInteriorAngle(roundingSide, angleOfExit, angleOfEntry, colour); - } //Create regular exit arrow. Group arrow = new Group(); Group exitSection = constructExitArrow(roundingSide, angleOfExit, colour); @@ -132,7 +122,9 @@ public class MarkArrowFactory { * @param colour colour of arrow * @return the arrow. */ - private static Group makeInteriorAngle (RoundingSide roundingSide, double angleOfExit, double angleOfEntry, Paint colour) { + public static Group constructInteriorArrow(RoundingSide roundingSide, double angleOfExit, + double angleOfEntry, Paint colour) { + Group arrow = new Group(); Polygon lineSegment; //Reverse angle of exit/entry to find position between them diff --git a/src/main/java/seng302/visualiser/fxObjects/Marker.java b/src/main/java/seng302/visualiser/fxObjects/Marker.java index 53dcda32..6c6a1280 100644 --- a/src/main/java/seng302/visualiser/fxObjects/Marker.java +++ b/src/main/java/seng302/visualiser/fxObjects/Marker.java @@ -16,6 +16,9 @@ public abstract class Marker extends Group{ protected int exitArrowIndex = 0; public abstract void addArrows(RoundingSide roundingSide, double entryAngle, double exitAngle); + + public abstract void addFinishArrow(RoundingSide roundingSide, double entryAngle, double exitAngle); + /** * Shows the next EnterArrow. Does nothing if there are no more enter arrows. Other arrows become hidden. */ diff --git a/src/main/java/seng302/visualiser/fxObjects/assets_2D/Marker2D.java b/src/main/java/seng302/visualiser/fxObjects/assets_2D/Marker2D.java index e32023dc..f8ffa5d5 100644 --- a/src/main/java/seng302/visualiser/fxObjects/assets_2D/Marker2D.java +++ b/src/main/java/seng302/visualiser/fxObjects/assets_2D/Marker2D.java @@ -7,6 +7,7 @@ import javafx.scene.paint.Color; import javafx.scene.paint.Paint; import javafx.scene.shape.Circle; import seng302.visualiser.fxObjects.MarkArrowFactory; +import seng302.visualiser.fxObjects.MarkArrowFactory.RoundingSide; import seng302.visualiser.fxObjects.Marker; /** @@ -57,6 +58,14 @@ public class Marker2D extends Marker { ); } + @Override + public void addFinishArrow(RoundingSide roundingSide, double entryAngle, double exitAngle){ + enterArrows.add( + MarkArrowFactory.constructInteriorArrow(roundingSide, entryAngle, exitAngle, Color.RED) + ); + exitArrows.add(new Group()); + } + /** * Shows the next EnterArrow. Does nothing if there are no more enter arrows. Other arrows * become hidden. diff --git a/src/main/java/seng302/visualiser/fxObjects/assets_3D/Marker3D.java b/src/main/java/seng302/visualiser/fxObjects/assets_3D/Marker3D.java index aa2420e1..8031cf41 100644 --- a/src/main/java/seng302/visualiser/fxObjects/assets_3D/Marker3D.java +++ b/src/main/java/seng302/visualiser/fxObjects/assets_3D/Marker3D.java @@ -55,6 +55,16 @@ public class Marker3D extends Marker { ); } + public void addFinishArrow(RoundingSide roundingSide, double entryAngle, + double exitAngle) { + enterArrows.add( + MarkArrowFactory.constructEntryArrow3D(roundingSide, entryAngle, ModelType.FINISH_ARROW).getAssets() + ); + exitArrows.add( + MarkArrowFactory.constructExitArrow3D(roundingSide, exitAngle, ModelType.FINISH_ARROW).getAssets() + ); + } + @Override protected void showArrow(List arrowList, int arrowListIndex) { if (arrowListIndex < arrowList.size()) { diff --git a/src/main/resources/maps/default.xml b/src/main/resources/maps/default.xml index 5d3da318..467bc0cf 100644 --- a/src/main/resources/maps/default.xml +++ b/src/main/resources/maps/default.xml @@ -6,7 +6,7 @@ 57.6679590 11.8503233 - 10 + 8 diff --git a/src/main/resources/maps/horseshoe.xml b/src/main/resources/maps/horseshoe.xml index e3124406..ec36ffa2 100644 --- a/src/main/resources/maps/horseshoe.xml +++ b/src/main/resources/maps/horseshoe.xml @@ -6,7 +6,7 @@ -14.6457 47.612855 - 5 + 8 diff --git a/src/main/resources/maps/loop.xml b/src/main/resources/maps/loop.xml index 008a58ce..fdc4368b 100644 --- a/src/main/resources/maps/loop.xml +++ b/src/main/resources/maps/loop.xml @@ -6,7 +6,7 @@ 57.6679590 11.8503233 - 5 + 8 diff --git a/src/main/resources/maps/madagascar.xml b/src/main/resources/maps/madagascar.xml index 37113567..e2cf893e 100644 --- a/src/main/resources/maps/madagascar.xml +++ b/src/main/resources/maps/madagascar.xml @@ -6,7 +6,7 @@ -15.67707 49.79338 - 10 + 5 diff --git a/src/main/resources/maps/waiheke.xml b/src/main/resources/maps/waiheke.xml index 41598416..5b009f55 100644 --- a/src/main/resources/maps/waiheke.xml +++ b/src/main/resources/maps/waiheke.xml @@ -6,7 +6,7 @@ -36.80008 175.012225 - 10 + 6 @@ -32,13 +32,13 @@ - + - - + + @@ -47,14 +47,14 @@ - - + + - - + + diff --git a/src/main/resources/views/LobbyView.fxml b/src/main/resources/views/LobbyView.fxml index 432fd4e7..fceb85bb 100644 --- a/src/main/resources/views/LobbyView.fxml +++ b/src/main/resources/views/LobbyView.fxml @@ -1,25 +1,12 @@ - - - + + - - - - - - - - - - - - diff --git a/src/main/resources/views/ServerListView.fxml b/src/main/resources/views/ServerListView.fxml index 966bd240..30713dab 100644 --- a/src/main/resources/views/ServerListView.fxml +++ b/src/main/resources/views/ServerListView.fxml @@ -6,18 +6,7 @@ - - - - - - - - - - - - +