diff --git a/src/main/java/seng302/gameServer/GameState.java b/src/main/java/seng302/gameServer/GameState.java index 0b495a8e..bc3fb188 100644 --- a/src/main/java/seng302/gameServer/GameState.java +++ b/src/main/java/seng302/gameServer/GameState.java @@ -1,23 +1,39 @@ package seng302.gameServer; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Random; +import java.util.Set; import javafx.scene.paint.Color; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.w3c.dom.Document; -import org.xml.sax.InputSource; -import seng302.gameServer.messages.*; -import seng302.model.*; +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.model.mark.CompoundMark; import seng302.model.mark.Mark; import seng302.model.mark.MarkOrder; +import seng302.model.stream.xml.parser.RaceXMLData; import seng302.model.token.Token; 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) @@ -56,7 +72,6 @@ public class GameState implements Runnable { private static Boolean customizationFlag; // dirty flag to tell if a player has customized their boat. private static Boolean playerHasLeftFlag; - private static String hostIpAddress; private static List players; private static Map yachts; private static Boolean isRaceStarted; @@ -75,14 +90,13 @@ public class GameState implements Runnable { private static Map playerStringMap = new HashMap<>(); - public GameState(String hostIpAddress) { + public GameState() { windDirection = 180d; windSpeed = 10000d; yachts = new HashMap<>(); tokensInPlay = new ArrayList<>(); - + marks = new HashSet<>(); players = new ArrayList<>(); - GameState.hostIpAddress = hostIpAddress; customizationFlag = false; playerHasLeftFlag = false; speedMultiplier = 1.0; @@ -90,34 +104,20 @@ public class GameState implements Runnable { isRaceStarted = false; //set this when game stage changes to prerace previousUpdateTime = System.currentTimeMillis(); - markOrder = new MarkOrder(); //This could be instantiated at some point with a select map? newMessageListeners = new ArrayList<>(); allTokens = makeTokens(); - resetStartTime(); - new Thread(this, "GameState").start(); //Run the auto updates on the game state - - marks = new MarkOrder().getAllMarks(); - setCourseLimit("/server_config/race.xml"); } - private void setCourseLimit(String url) { - DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); - documentBuilderFactory.setNamespaceAware(true); - DocumentBuilder documentBuilder; - Document document = null; - try { - documentBuilder = documentBuilderFactory.newDocumentBuilder(); - document = documentBuilder.parse(new InputSource(getClass().getResourceAsStream(url))); - } catch (Exception e) { - // sorry, we have to catch general one, otherwise we have to catch five different exceptions. - logger.trace("Failed to load course limit for boundary collision detection.", e); + public static void setRace(RaceXMLData raceXMLData) { + markOrder = new MarkOrder(raceXMLData); + for (CompoundMark compoundMark : raceXMLData.getCompoundMarks().values()){ + marks.addAll(compoundMark.getMarks()); } - courseLimit = XMLParser.parseRace(document).getCourseLimit(); + courseLimit = raceXMLData.getCourseLimit(); } - /** * Make a pre defined set of tokensInPlay. //TODO wmu16 - Should read from some file for each * race ideally @@ -132,10 +132,6 @@ public class GameState implements Runnable { return new ArrayList<>(Arrays.asList(token1, token2, token3, token4)); } - public static String getHostIpAddress() { - return hostIpAddress; - } - public static Set getMarks() { return Collections.unmodifiableSet(marks); } @@ -241,10 +237,7 @@ public class GameState implements Runnable { System.out.println("[GameState] interrupted exception"); } if (currentStage == GameStages.PRE_RACE || currentStage == GameStages.RACING) { - update(); - } - - if (currentStage == GameStages.RACING) { +// System.out.println("update"); update(); } } @@ -450,6 +443,7 @@ public class GameState implements Runnable { Double trueWindAngle = Math.abs(windDirection - yacht.getHeading()); Double boatSpeedInKnots = PolarTable.getBoatSpeed(getWindSpeedKnots(), trueWindAngle); Double maxBoatSpeed = GeoUtility.knotsToMMS(boatSpeedInKnots) * speedMultiplier; + System.out.println(maxBoatSpeed); if (yacht.getPowerUp() != null) { if (yacht.getPowerUp().equals(TokenType.BOOST)) { // TODO: 11/09/17 wmu16 CHANGE THIS TO MAGIC NUMBER diff --git a/src/main/java/seng302/gameServer/MainServerThread.java b/src/main/java/seng302/gameServer/MainServerThread.java index caa55f15..677659ec 100644 --- a/src/main/java/seng302/gameServer/MainServerThread.java +++ b/src/main/java/seng302/gameServer/MainServerThread.java @@ -1,30 +1,22 @@ package seng302.gameServer; import java.io.IOException; -import java.io.StringReader; import java.net.ServerSocket; import java.util.ArrayList; import java.util.Random; import java.util.Timer; import java.util.TimerTask; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.w3c.dom.Document; -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; import seng302.gameServer.messages.Message; import seng302.model.GeoPoint; import seng302.model.Player; import seng302.model.PolarTable; import seng302.model.ServerYacht; import seng302.model.mark.CompoundMark; +import seng302.model.stream.xml.parser.RaceXMLData; import seng302.model.stream.xml.parser.RegattaXMLData; import seng302.utilities.GeoUtility; -import seng302.utilities.XMLGenerator; -import seng302.utilities.XMLParser; /** * A class describing the overall server, which creates and collects server threads for each client @@ -45,29 +37,12 @@ public class MainServerThread implements Runnable, ClientConnectionDelegate { private Thread thread; private ServerSocket serverSocket = null; - private ArrayList serverToClientThreads = new ArrayList<>();; + private ArrayList serverToClientThreads = new ArrayList<>(); private static Integer capacity; + private RaceXMLData raceXMLData; + private RegattaXMLData regattaXMLData; private void startAdvertisingServer() { - DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); - DocumentBuilder db; - Document doc; - XMLGenerator generator = new XMLGenerator(); - - try { - db = dbf.newDocumentBuilder(); - String regatta = generator.getRegattaAsXml(); - StringReader stringReader = new StringReader(regatta); - InputSource is = new InputSource(stringReader); - doc = db.parse(is); - } catch (ParserConfigurationException | IOException | SAXException e) { - logger.warn("Couldn't load race regatta"); - return; - } - - RegattaXMLData regattaXMLData = XMLParser.parseRegatta(doc); - - Integer capacity = GameState.getCapacity(); Integer numPlayers = GameState.getNumberOfPlayers(); Integer spacesLeft = capacity - numPlayers; @@ -79,33 +54,40 @@ public class MainServerThread implements Runnable, ClientConnectionDelegate { // Start advertising server try { - ServerAdvertiser.getInstance().setMapName(regattaXMLData.getCourseName()).setCapacity(capacity).setNumberOfPlayers(numPlayers); - ServerAdvertiser.getInstance().registerGame(PORT, regattaXMLData.getRegattaName()); + ServerAdvertiser.getInstance() + .setMapName(regattaXMLData.getCourseName()) + .setCapacity(capacity) + .setNumberOfPlayers(numPlayers) + .registerGame(PORT, regattaXMLData.getRegattaName()); } catch (IOException e) { logger.warn("Could not register server"); } } public MainServerThread() { - new GameState("localhost"); + new GameState(); try { serverSocket = new ServerSocket(PORT); } catch (IOException e) { logger.trace("IO error in server thread handler upon trying to make new server socket", 0); } - - startAdvertisingServer(); - - PolarTable.parsePolarFile(getClass().getResourceAsStream("/server_config/acc_polars.csv")); - GameState.addMessageEventListener(this::broadcastMessage); terminated = false; thread = new Thread(this, "MainServer"); - startUpdatingWind(); - startSpawningTokens(); thread.start(); } + private void startServer() { + MessageFactory.updateXMLGenerator(raceXMLData, regattaXMLData); + GameState.setRace(raceXMLData); + MessageFactory.updateBoats(new ArrayList<>(GameState.getYachts().values())); + startAdvertisingServer(); + PolarTable.parsePolarFile(getClass().getResourceAsStream("/server_config/acc_polars.csv")); + GameState.addMessageEventListener(this::broadcastMessage); + startUpdatingWind(); + startSpawningTokens(); + sendSetupMessages(); + } public void run() { @@ -133,8 +115,8 @@ public class MainServerThread implements Runnable, ClientConnectionDelegate { } catch (InterruptedException e) { logger.trace("Interrupted exception in Main Server Thread thread sleep", 1); } - if (GameState.getCurrentStage() == GameStages.LOBBYING && GameState - .getCustomizationFlag()) { + if (GameState.getCurrentStage() == GameStages.LOBBYING && GameState.getCustomizationFlag()) { + MessageFactory.updateBoats(new ArrayList<>(GameState.getYachts().values())); sendSetupMessages(); GameState.resetCustomizationFlag(); } @@ -254,11 +236,28 @@ public class MainServerThread implements Runnable, ClientConnectionDelegate { logger.debug("Player Connected From " + serverToClientThread.getThread().getName(), 0); if (serverToClientThreads.size() == 0) { //Sets first client as host. serverToClientThread.setAsHost(); + serverToClientThread.raceXMLProperty().addListener((obs, oldVal, race) -> { + if (race != null) { + raceXMLData = race; + } + if (regattaXMLData != null) { + startServer(); + } + }); + serverToClientThread.regattaXMLProperty().addListener((obs, oldVal, regatta) -> { + if (regatta != null) { + regattaXMLData = regatta; + } + if (raceXMLData != null) { + startServer(); + } + }); + } else { + serverToClientThread.addConnectionListener(this::sendSetupMessages); + MessageFactory.updateBoats(new ArrayList<>(GameState.getYachts().values())); } serverToClientThreads.add(serverToClientThread); - serverToClientThread.addConnectionListener(this::sendSetupMessages); serverToClientThread.addDisconnectListener(this::clientDisconnected); - try { ServerAdvertiser.getInstance().setNumberOfPlayers(GameState.getNumberOfPlayers()); } catch (IOException e) { diff --git a/src/main/java/seng302/gameServer/MessageFactory.java b/src/main/java/seng302/gameServer/MessageFactory.java index 26c08bc2..bd30f897 100644 --- a/src/main/java/seng302/gameServer/MessageFactory.java +++ b/src/main/java/seng302/gameServer/MessageFactory.java @@ -13,6 +13,10 @@ import seng302.gameServer.messages.XMLMessage; import seng302.gameServer.messages.XMLMessageSubType; import seng302.model.Player; import seng302.model.ServerYacht; +import seng302.model.stream.xml.generator.RaceXMLTemplate; +import seng302.model.stream.xml.generator.RegattaXMLTemplate; +import seng302.model.stream.xml.parser.RaceXMLData; +import seng302.model.stream.xml.parser.RegattaXMLData; import seng302.model.token.Token; import seng302.utilities.XMLGenerator; @@ -33,6 +37,47 @@ Ideally this class would be created with an instance of the GameState (I tried i public class MessageFactory { private static XMLGenerator xmlGenerator = new XMLGenerator(); + private static XMLMessage race; + private static XMLMessage regatta; + private static XMLMessage boats; + + public static void updateXMLGenerator(RaceXMLData race, RegattaXMLData regatta) { + xmlGenerator.setRegattaTemplate( + new RegattaXMLTemplate( + regatta.getRegattaName(), + regatta.getCourseName(), + regatta.getCentralLat(), + regatta.getCentralLng() + ) + ); + xmlGenerator.setRaceTemplate( + new RaceXMLTemplate( + new ArrayList<>(), + new ArrayList<>(), + race.getMarkSequence(), + race.getCourseLimit(), + new ArrayList<>(race.getCompoundMarks().values()) + ) + ); + String xmlStr = xmlGenerator.getRaceAsXml(); + MessageFactory.race = new XMLMessage(xmlStr, XMLMessageSubType.RACE, xmlStr.length()); + xmlStr = xmlGenerator.getRegattaAsXml(); + MessageFactory.regatta = new XMLMessage(xmlStr, XMLMessageSubType.REGATTA, xmlStr.length()); + xmlStr = xmlGenerator.getBoatsAsXml(); + MessageFactory.boats = new XMLMessage(xmlStr, XMLMessageSubType.BOAT, xmlStr.length()); + } + + public static void updateBoats(List yachts) { + xmlGenerator.getRace().setBoats(yachts); + String xmlStr = xmlGenerator.getBoatsAsXml(); + MessageFactory.boats = new XMLMessage(xmlStr, XMLMessageSubType.BOAT, xmlStr.length()); + } + + public static void updateTokens(List tokens) { + xmlGenerator.getRace().setTokens(tokens); + String xmlStr = xmlGenerator.getRaceAsXml(); + MessageFactory.race = new XMLMessage(xmlStr, XMLMessageSubType.RACE, xmlStr.length()); + } public static RaceStartStatusMessage getRaceStartStatusMessage() { @@ -93,37 +138,14 @@ public class MessageFactory { } public static XMLMessage getRaceXML() { - List yachts = new ArrayList<>(GameState.getYachts().values()); - List tokens = GameState.getTokensInPlay(); -// RaceXMLTemplate raceXMLTemplate = new RaceXMLTemplate(yachts, tokens); -// xmlGenerator.setRaceTemplate(raceXMLTemplate); - - XMLMessage raceXMLMessage = new XMLMessage( - xmlGenerator.getRaceAsXml(), - XMLMessageSubType.RACE, - xmlGenerator.getRaceAsXml().length()); - - return raceXMLMessage; + return race; } public static XMLMessage getRegattaXML() { - //@TODO calculate lat/lng values - - return new XMLMessage( - xmlGenerator.getRegattaAsXml(), - XMLMessageSubType.REGATTA, - xmlGenerator.getRegattaAsXml().length()); + return regatta; } public static XMLMessage getBoatXML() { - List yachts = new ArrayList<>(GameState.getYachts().values()); - List tokens = GameState.getTokensInPlay(); -// RaceXMLTemplate raceXMLTemplate = new RaceXMLTemplate(yachts, tokens); -// xmlGenerator.setRaceTemplate(raceXMLTemplate); - - return new XMLMessage( - xmlGenerator.getBoatsAsXml(), - XMLMessageSubType.BOAT, - xmlGenerator.getBoatsAsXml().length()); + return boats; } } diff --git a/src/main/java/seng302/gameServer/ServerToClientThread.java b/src/main/java/seng302/gameServer/ServerToClientThread.java index 362a9e35..60bbb9e4 100644 --- a/src/main/java/seng302/gameServer/ServerToClientThread.java +++ b/src/main/java/seng302/gameServer/ServerToClientThread.java @@ -12,6 +12,7 @@ import java.util.Arrays; import java.util.List; import java.util.zip.CRC32; import java.util.zip.Checksum; +import javafx.beans.property.SimpleObjectProperty; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import seng302.gameServer.messages.BoatAction; @@ -21,13 +22,15 @@ import seng302.gameServer.messages.CustomizeRequestType; import seng302.gameServer.messages.Message; import seng302.gameServer.messages.RegistrationResponseMessage; import seng302.gameServer.messages.RegistrationResponseStatus; -import seng302.gameServer.messages.XMLMessage; -import seng302.gameServer.messages.XMLMessageSubType; import seng302.model.Player; import seng302.model.ServerYacht; import seng302.model.stream.packets.PacketType; import seng302.model.stream.packets.StreamPacket; +import seng302.model.stream.xml.parser.RaceXMLData; +import seng302.model.stream.xml.parser.RegattaXMLData; +import seng302.utilities.StreamParser; import seng302.utilities.XMLGenerator; +import seng302.utilities.XMLParser; /** * A class describing a single connection to a Client for the purposes of sending and receiving on @@ -75,6 +78,9 @@ public class ServerToClientThread implements Runnable { private ServerYacht yacht; private Player player; + private SimpleObjectProperty raceXMLProperty = new SimpleObjectProperty<>(); + private SimpleObjectProperty regattaXMLProperty = new SimpleObjectProperty<>(); + public ServerToClientThread(Socket socket) { this.socket = socket; seqNo = 0; @@ -158,37 +164,51 @@ public class ServerToClientThread implements Runnable { long computedCrc = checksum.getValue(); long packetCrc = Message.bytesToLong(getBytes(4)); if (computedCrc == packetCrc) { + StreamPacket packet = new StreamPacket(type, payloadLength, timeStamp, payload); switch (PacketType.assignPacketType(type, payload)) { case BOAT_ACTION: - BoatAction actionType = ServerPacketParser - .extractBoatAction( - new StreamPacket(type, payloadLength, timeStamp, payload)); + BoatAction actionType = ServerPacketParser.extractBoatAction(packet); GameState.updateBoat(sourceId, actionType); break; case RACE_REGISTRATION_REQUEST: - ClientType requestedType = ServerPacketParser.extractClientType( - new StreamPacket(type, payloadLength, timeStamp, payload)); - + ClientType requestedType = ServerPacketParser + .extractClientType(packet); completeRegistration(requestedType); break; case CHATTER_TEXT: ChatterMessage chatterMessage = ServerPacketParser - .extractChatterText( - new StreamPacket(type, payloadLength, timeStamp, payload)); + .extractChatterText(packet); GameState.processChatter(chatterMessage, isHost); break; case RACE_CUSTOMIZATION_REQUEST: - Long sourceID = Message - .bytesToLong(Arrays.copyOfRange(payload, 0, 3)); + Long sourceID = Message.bytesToLong( + Arrays.copyOfRange(payload, 0, 3) + ); CustomizeRequestType requestType = ServerPacketParser - .extractCustomizationType( - new StreamPacket(type, payloadLength, timeStamp, payload)); + .extractCustomizationType(packet); + GameState.customizePlayer(sourceID, requestType, - Arrays.copyOfRange(payload, 6, payload.length)); + Arrays.copyOfRange(payload, 6, payload.length) + ); GameState.setCustomizationFlag(); // TODO: 17/08/2017 ajm412: Send a response packet here, not really necessary until we do shapes. break; + case RACE_XML: + raceXMLProperty.set( + XMLParser.parseRace( + StreamParser.extractXmlMessage(packet) + ) + ); + break; + case REGATTA_XML: + regattaXMLProperty.set( + XMLParser.parseRegatta( + StreamParser.extractXmlMessage(packet) + ) + ); + break; + } } else { logger.warn("Packet has been dropped", 1); @@ -205,23 +225,9 @@ public class ServerToClientThread implements Runnable { } public void sendSetupMessages() { - xmlGenerator = new XMLGenerator(); -// RaceXMLTemplate race = new RaceXMLTemplate(new ArrayList<>(GameState.getYachts().values()), new ArrayList<>()); - -// xmlGenerator.setRaceTemplate(race); - - XMLMessage xmlMessage; - xmlMessage = new XMLMessage(xmlGenerator.getRegattaAsXml(), XMLMessageSubType.REGATTA, - xmlGenerator.getRegattaAsXml().length()); - sendMessage(xmlMessage); - - xmlMessage = new XMLMessage(xmlGenerator.getBoatsAsXml(), XMLMessageSubType.BOAT, - xmlGenerator.getBoatsAsXml().length()); - sendMessage(xmlMessage); - - xmlMessage = new XMLMessage(xmlGenerator.getRaceAsXml(), XMLMessageSubType.RACE, - xmlGenerator.getRaceAsXml().length()); - sendMessage(xmlMessage); + sendMessage(MessageFactory.getRegattaXML()); + sendMessage(MessageFactory.getBoatXML()); + sendMessage(MessageFactory.getRaceXML()); } private void closeSocket() { @@ -317,4 +323,12 @@ public class ServerToClientThread implements Runnable { public void setAsHost() { isHost = true; } + + public SimpleObjectProperty raceXMLProperty() { + return raceXMLProperty; + } + + public SimpleObjectProperty regattaXMLProperty() { + return regattaXMLProperty; + } } diff --git a/src/main/java/seng302/model/ServerYacht.java b/src/main/java/seng302/model/ServerYacht.java index f2d54538..3f9545c1 100644 --- a/src/main/java/seng302/model/ServerYacht.java +++ b/src/main/java/seng302/model/ServerYacht.java @@ -1,5 +1,6 @@ package seng302.model; +import java.util.HashMap; import javafx.scene.paint.Color; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -9,10 +10,6 @@ import seng302.model.mark.Mark; import seng302.model.token.TokenType; import seng302.utilities.GeoUtility; -import java.util.HashMap; -import java.util.Observable; -import java.util.Observer; - /** * Yacht class for the racing boat.

Class created to store more variables (eg. boat statuses) * compared to the XMLParser boat class, also done outside Boat class because some old variables are diff --git a/src/main/java/seng302/model/mark/MarkOrder.java b/src/main/java/seng302/model/mark/MarkOrder.java index bbcd8899..bfcffc58 100644 --- a/src/main/java/seng302/model/mark/MarkOrder.java +++ b/src/main/java/seng302/model/mark/MarkOrder.java @@ -1,25 +1,12 @@ package seng302.model.mark; -import java.io.IOException; -import java.io.StringReader; import java.util.ArrayList; import java.util.Collections; -import java.util.HashSet; import java.util.List; -import java.util.Map; -import java.util.Set; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.w3c.dom.Document; -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; import seng302.gameServer.messages.RoundingSide; import seng302.model.stream.xml.parser.RaceXMLData; -import seng302.utilities.XMLGenerator; -import seng302.utilities.XMLParser; /** * Class to hold the order of the marks in the race. @@ -27,10 +14,17 @@ import seng302.utilities.XMLParser; public class MarkOrder { private List raceMarkOrder; private Logger logger = LoggerFactory.getLogger(MarkOrder.class); - private Set allMarks; - public MarkOrder(){ - loadRaceProperties(); + + public MarkOrder(RaceXMLData raceXMLData){ + raceMarkOrder = new ArrayList<>(); + for (Corner corner : raceXMLData.getMarkSequence()){ + CompoundMark compoundMark = raceXMLData.getCompoundMarks().get(corner.getCompoundMarkID()); + compoundMark.setRoundingSide( + RoundingSide.getRoundingSide(corner.getRounding()) + ); + raceMarkOrder.add(compoundMark); + } } /** @@ -42,7 +36,6 @@ public class MarkOrder { logger.warn("Race order accessed but not instantiated"); return null; } - return Collections.unmodifiableList(raceMarkOrder); } @@ -76,71 +69,4 @@ public class MarkOrder { public CompoundMark getNextMark(Integer currentSeqID) throws IndexOutOfBoundsException { return raceMarkOrder.get(currentSeqID + 1); } - - public Set getAllMarks(){ - return Collections.unmodifiableSet(allMarks); - } - - /** - * Loads the race order from an XML string - * @param xml An AC35 RaceXML - * @return An ordered list of marks in the race - */ - private List loadRaceOrderFromXML(String xml) { - - DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); - DocumentBuilder db; - Document doc; - allMarks = new HashSet<>(); - - try { - db = dbf.newDocumentBuilder(); - doc = db.parse(new InputSource(new StringReader(xml))); - } catch (ParserConfigurationException | IOException | SAXException e) { - logger.error("Failed to read generated race XML"); - return null; - } - - RaceXMLData data = XMLParser.parseRace(doc); - - if (data != null){ - logger.debug("Loaded RaceXML for mark order"); - List corners = data.getMarkSequence(); - Map marks = data.getCompoundMarks(); - List course = new ArrayList<>(); - for (Corner corner : corners){ - CompoundMark compoundMark = marks.get(corner.getCompoundMarkID()); - compoundMark.setRoundingSide( - RoundingSide.getRoundingSide(corner.getRounding()) - ); - course.add(compoundMark); - allMarks.addAll(compoundMark.getMarks()); - } - - return course; - } - - return null; - } - - /** - * Load the raceXML and mark order - */ - private void loadRaceProperties(){ - XMLGenerator generator = new XMLGenerator(); - -// // TODO: 29/08/17 wmu16 - This is terrible, having to make a template just to receive constant data -// generator.setRaceTemplate(new RaceXMLTemplate( -// new ArrayList<>(), -// new ArrayList<>()) -// ); - - String raceXML = generator.getRaceAsXml(); - - if (raceXML == null){ - logger.error("Failed to generate raceXML (for race properties)"); - return; - } - raceMarkOrder = loadRaceOrderFromXML(raceXML); - } } \ No newline at end of file diff --git a/src/main/java/seng302/model/stream/xml/generator/RaceXMLTemplate.java b/src/main/java/seng302/model/stream/xml/generator/RaceXMLTemplate.java index cc677dea..aa958b03 100644 --- a/src/main/java/seng302/model/stream/xml/generator/RaceXMLTemplate.java +++ b/src/main/java/seng302/model/stream/xml/generator/RaceXMLTemplate.java @@ -75,4 +75,12 @@ public class RaceXMLTemplate { public String getRaceStartTime(){ return startTime.toString(); } + + public void setBoats(List boats) { + yachts = boats; + } + + public void setTokens(List tokens) { + this.tokens = tokens; + } } diff --git a/src/main/java/seng302/utilities/XMLGenerator.java b/src/main/java/seng302/utilities/XMLGenerator.java index 5bcde1cc..1c8eb3a4 100644 --- a/src/main/java/seng302/utilities/XMLGenerator.java +++ b/src/main/java/seng302/utilities/XMLGenerator.java @@ -179,4 +179,8 @@ public class XMLGenerator { public RegattaXMLTemplate getRegatta() { return regatta; } + + public RaceXMLTemplate getRace() { + return race; + } } \ No newline at end of file diff --git a/src/main/java/seng302/utilities/XMLParser.java b/src/main/java/seng302/utilities/XMLParser.java index a2b10508..755fde3b 100644 --- a/src/main/java/seng302/utilities/XMLParser.java +++ b/src/main/java/seng302/utilities/XMLParser.java @@ -191,7 +191,7 @@ public class XMLParser { public static RaceXMLData parseRace(Document doc) { Element docEle = doc.getDocumentElement(); return new RaceXMLData( - extractParticpantIDs(docEle), + extractParticipantIDs(docEle), extractTokens(docEle), extractCompoundMarks(docEle), extractMarkOrder(docEle), @@ -263,7 +263,7 @@ public class XMLParser { /** * Extracts course participants data */ - private static List extractParticpantIDs (Element docEle) { + private static List extractParticipantIDs(Element docEle) { List boatIDs = new ArrayList<>(); NodeList pList = docEle.getElementsByTagName("Participants").item(0).getChildNodes(); for (int i = 0; i < pList.getLength(); i++) { @@ -328,17 +328,26 @@ public class XMLParser { return subMarks; } - public static Pair parseRaceDef(String url, String serverName, int repitions) { + /** + * This ungodly combination of existing methods and code blocks parses a race definition file. + * Look upon it and despair. + * @param url the location of the race def file + * @param serverName the name of the server + * @param repetitions the repetitions of a segment of the race def file. + * @return a pair which contains regatta string, race string as key, value pair. + */ + public static Pair parseRaceDef(String url, String serverName, int repetitions) { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db; Document doc = null; try { db = dbf.newDocumentBuilder(); - doc = db.parse(XMLParser.class.getResourceAsStream(url)); + doc = db.parse(url); } catch (ParserConfigurationException | IOException | SAXException e) { e.printStackTrace(); } Element docEle = doc.getDocumentElement(); + RegattaXMLTemplate regattaXMLTemplate = new RegattaXMLTemplate( serverName, XMLParser.getElementString(docEle, "CourseName"), XMLParser.getElementDouble(docEle, "CentralLat"), @@ -346,28 +355,14 @@ public class XMLParser { ); XMLGenerator xmlGenerator = new XMLGenerator(); xmlGenerator.setRegattaTemplate(regattaXMLTemplate); - System.out.println(xmlGenerator.getRegattaAsXml()); -// List markOrder = XMLParser.extractMarkOrderRaceDef(docEle, repitions); -// for (Corner c : markOrder) { -// System.out.println(c); -// } -// List limits = XMLParser.extractCourseLimitRaceDef(docEle); -// for (Limit l : limits) { -// System.out.println(l); -// } -// List course = XMLParser.extractCompoundMarkRaceDef(docEle); -// System.out.println(course.size()); -// for (CompoundMark compoundMark : course) { -// System.out.println(compoundMark); -// } + RaceXMLTemplate raceXMLTemplate = new RaceXMLTemplate(new ArrayList<>(), new ArrayList<>(), - XMLParser.extractMarkOrderRaceDef(docEle, repitions), + XMLParser.extractMarkOrderRaceDef(docEle, repetitions), XMLParser.extractCourseLimitRaceDef(docEle), XMLParser.extractCompoundMarksRaceDef(docEle) ); xmlGenerator.setRaceTemplate(raceXMLTemplate); - System.out.println(xmlGenerator.getRaceAsXml()); - return new Pair<>(null, null); + return new Pair<>(xmlGenerator.getRegattaAsXml(), xmlGenerator.getRaceAsXml()); } private static List extractMarkOrderRaceDef(Element docEle, int repitions){ diff --git a/src/main/java/seng302/visualiser/ClientToServerThread.java b/src/main/java/seng302/visualiser/ClientToServerThread.java index e53aed22..b0b79606 100644 --- a/src/main/java/seng302/visualiser/ClientToServerThread.java +++ b/src/main/java/seng302/visualiser/ClientToServerThread.java @@ -14,6 +14,7 @@ import java.util.TimerTask; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.zip.CRC32; import java.util.zip.Checksum; +import javafx.util.Pair; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import seng302.gameServer.messages.BoatAction; @@ -25,8 +26,11 @@ import seng302.gameServer.messages.CustomizeRequestType; import seng302.gameServer.messages.Message; import seng302.gameServer.messages.RegistrationRequestMessage; import seng302.gameServer.messages.RegistrationResponseStatus; +import seng302.gameServer.messages.XMLMessage; +import seng302.gameServer.messages.XMLMessageSubType; import seng302.model.stream.packets.PacketType; import seng302.model.stream.packets.StreamPacket; +import seng302.utilities.XMLParser; /** * A class describing a single connection to a Server for the purposes of sending and receiving on @@ -369,4 +373,20 @@ public class ClientToServerThread implements Runnable { public int getClientId () { return clientId; } + + public void sendXML(String path, String serverName, int legRepeats) { + Pair regattaRace = XMLParser.parseRaceDef(path, serverName, legRepeats); + + sendByteBuffer( + new XMLMessage( + regattaRace.getKey(), XMLMessageSubType.REGATTA, regattaRace.getKey().length() + ).getBuffer() + ); + + sendByteBuffer( + new XMLMessage( + regattaRace.getValue(), XMLMessageSubType.RACE, regattaRace.getValue().length() + ).getBuffer() + ); + } } diff --git a/src/main/java/seng302/visualiser/GameClient.java b/src/main/java/seng302/visualiser/GameClient.java index 7040d7ee..6a857d70 100644 --- a/src/main/java/seng302/visualiser/GameClient.java +++ b/src/main/java/seng302/visualiser/GameClient.java @@ -117,18 +117,18 @@ public class GameClient { * @param ipAddress IP to connect to. * @param portNumber Port to connect to. */ - public ServerDescription runAsHost(String ipAddress, Integer portNumber, String serverName, Integer maxPlayers) { + public ServerDescription runAsHost(String ipAddress, Integer portNumber, String serverName, Integer maxPlayers, String race, Integer numLegs) { XMLGenerator.setDefaultRaceName(serverName); - GameState.setMaxPlayers(maxPlayers); server = new MainServerThread(); + GameState.setMaxPlayers(maxPlayers); try { startClientToServerThread(ipAddress, 4942); } catch (IOException e) { showConnectionError("Cannot connect to server as host"); } - + socketThread.sendXML(race, serverName, numLegs); while (regattaData == null){ try { Thread.sleep(100); diff --git a/src/main/java/seng302/visualiser/GameView.java b/src/main/java/seng302/visualiser/GameView.java index 0c1d4092..207f1b64 100644 --- a/src/main/java/seng302/visualiser/GameView.java +++ b/src/main/java/seng302/visualiser/GameView.java @@ -48,7 +48,9 @@ public class GameView extends Pane { private ObservableList gameObjects; private Group markers = new Group(); private Group tokens = new Group(); - private List course = new ArrayList<>(); + private List orderedMarks = new ArrayList<>(); + private List compoundMarks = new ArrayList<>(); + private List courseOrder = new ArrayList<>(); private ImageView mapImage = new ImageView(); @@ -57,32 +59,52 @@ public class GameView extends Pane { VERTICAL } - public GameView () { + public GameView (List marks, List course, List border) { +// updateBorder(border); +// updateCourse(marks, orderedMarks); + this.compoundMarks = marks; + this.courseOrder = course; + this.borderPoints = border; gameObjects = this.getChildren(); gameObjects.addAll(mapImage, raceBorder, markers, tokens); + this.parentProperty().addListener((obs, old, parent) -> { + if (parent != null) { + canvasWidth = parent.prefWidth(0) * 2; + canvasHeight = parent.prefHeight(0) * 2; +// rescaleRace(borderPoints); + updateBorder(borderPoints); + updateCourse(compoundMarks, courseOrder); + } + }); } /** - * Adds a course to the GameView. The view is scaled accordingly unless a border is set in which - * case the course is added relative ot the border. + * Adds a orderedMarks to the GameView. The view is scaled accordingly unless a border is set in which + * case the orderedMarks is added relative ot the border. * - * @param newCourse the mark objects that make up the course. + * @param newCourse the mark objects that make up the orderedMarks. * @param sequence The sequence the marks travel through */ public void updateCourse(List newCourse, List sequence) { - markerObjects = new HashMap<>(); - for (Corner corner : sequence) { //Makes course out of all compound marks. + if (newCourse.size() == 0) { + return; + } + compoundMarks = newCourse; + markerObjects = new HashMap<>(); + courseOrder = sequence; + + for (Corner corner : courseOrder) { //Makes orderedMarks out of all compound marks. for (CompoundMark compoundMark : newCourse) { if (corner.getCompoundMarkID() == compoundMark.getId()) { - course.add(compoundMark); + orderedMarks.add(compoundMark); } } } // TODO: 16/08/17 Updating mark roundings here. It should not happen here. Nor should it be done this way. for (Corner corner : sequence){ - CompoundMark compoundMark = course.get(corner.getSeqID() - 1); + CompoundMark compoundMark = orderedMarks.get(corner.getSeqID() - 1); compoundMark.setRoundingSide( RoundingSide.getRoundingSide(corner.getRounding()) ); @@ -137,7 +159,7 @@ public class GameView extends Pane { } /** - * Calculates all the data needed for to create mark arrows. Requires that a course has been + * Calculates all the data needed for to create mark arrows. Requires that a orderedMarks has been * added to the gameview. * @param sequence The order in which marks are traversed. */ @@ -145,22 +167,22 @@ public class GameView extends Pane { for (int i=1; i < sequence.size()-1; i++) { //General case. double averageLat = 0; double averageLng = 0; - int numMarks = course.get(i-1).getMarks().size(); - for (Mark mark : course.get(i-1).getMarks()) { + int numMarks = orderedMarks.get(i-1).getMarks().size(); + for (Mark mark : orderedMarks.get(i-1).getMarks()) { averageLat += mark.getLat(); averageLng += mark.getLng(); } GeoPoint lastMarkAv = new GeoPoint(averageLat / numMarks, averageLng / numMarks); - numMarks = course.get(i+1).getMarks().size(); + numMarks = orderedMarks.get(i+1).getMarks().size(); averageLat = 0; averageLng = 0; - for (Mark mark : course.get(i+1).getMarks()) { + for (Mark mark : orderedMarks.get(i+1).getMarks()) { averageLat += mark.getLat(); averageLng += mark.getLng(); } GeoPoint nextMarkAv = new GeoPoint(averageLat / numMarks, averageLng / numMarks); // TODO: 16/08/17 This comparison doesn't need to exist but the alternative is to user server enum client side. - for (Mark mark : course.get(i).getMarks()) { + for (Mark mark : orderedMarks.get(i).getMarks()) { markerObjects.get(mark).addArrows( mark.getRoundingSide() == RoundingSide.STARBOARD ? MarkArrowFactory.RoundingSide.STARBOARD : MarkArrowFactory.RoundingSide.PORT, GeoUtility.getBearing(lastMarkAv, mark), @@ -176,13 +198,13 @@ public class GameView extends Pane { double averageLat = 0; double averageLng = 0; int numMarks = 0; - for (Mark mark : course.get(1).getMarks()) { + for (Mark mark : orderedMarks.get(1).getMarks()) { numMarks += 1; averageLat += mark.getLat(); averageLng += mark.getLng(); } GeoPoint firstMarkAv = new GeoPoint(averageLat / numMarks, averageLng / numMarks); - for (Mark mark : course.get(0).getMarks()) { + for (Mark mark : orderedMarks.get(0).getMarks()) { markerObjects.get(mark).addArrows( mark.getRoundingSide() == RoundingSide.STARBOARD ? MarkArrowFactory.RoundingSide.STARBOARD : MarkArrowFactory.RoundingSide.PORT, 0d, //90 @@ -195,13 +217,13 @@ public class GameView extends Pane { double numMarks = 0; double averageLat = 0; double averageLng = 0; - for (Mark mark : course.get(course.size()-2).getMarks()) { + for (Mark mark : orderedMarks.get(orderedMarks.size()-2).getMarks()) { numMarks += 1; averageLat += mark.getLat(); averageLng += mark.getLng(); } GeoPoint secondToLastMarkAv = new GeoPoint(averageLat / numMarks, averageLng / numMarks); - for (Mark mark : course.get(course.size()-1).getMarks()) { + for (Mark mark : orderedMarks.get(orderedMarks.size()-1).getMarks()) { markerObjects.get(mark).addArrows( mark.getRoundingSide() == RoundingSide.STARBOARD ? MarkArrowFactory.RoundingSide.STARBOARD : MarkArrowFactory.RoundingSide.PORT, GeoUtility.getBearing(secondToLastMarkAv, mark), @@ -254,17 +276,16 @@ public class GameView extends Pane { /** * Adds a border to the GameView and rescales to the size of the border, does not rescale if a - * border already exists. Assumes the border is larger than the course. + * border already exists. Assumes the border is larger than the orderedMarks. * * @param border the race border to be drawn. */ public void updateBorder(List border) { - if (borderPoints == null) { - borderPoints = border; - rescaleRace(new ArrayList<>(borderPoints)); + if (border.size() == 0) { + return; } - - rescaleRace(new ArrayList<>(border)); + borderPoints = border; + rescaleRace(new ArrayList<>(borderPoints)); List boundaryPoints = new ArrayList<>(); for (Limit limit : border) { @@ -280,8 +301,8 @@ public class GameView extends Pane { * * @param limitingCoordinates the set of geo points that contains the extremities of the race. */ - public void rescaleRace(List limitingCoordinates) { - //Check is called once to avoid unnecessarily change the course limits once the race is running + public void rescaleRace(List limitingCoordinates) { + //Check is called once to avoid unnecessarily change the orderedMarks limits once the race is running findMinMaxPoint(limitingCoordinates); double minLonToMaxLon = scaleRaceExtremities(); calculateReferencePointLocation(minLonToMaxLon); @@ -292,7 +313,7 @@ public class GameView extends Pane { * the leftmost point, rightmost point, southern most point and northern most point * respectively. */ - private void findMinMaxPoint(List points) { + private void findMinMaxPoint(List points) { List sortedPoints = new ArrayList<>(points); sortedPoints.sort(Comparator.comparingDouble(GeoPoint::getLat)); minLatPoint = new GeoPoint(sortedPoints.get(0).getLat(), sortedPoints.get(0).getLng()); diff --git a/src/main/java/seng302/visualiser/MapMaker.java b/src/main/java/seng302/visualiser/MapMaker.java new file mode 100644 index 00000000..954f392c --- /dev/null +++ b/src/main/java/seng302/visualiser/MapMaker.java @@ -0,0 +1,103 @@ +package seng302.visualiser; + +import java.io.File; +import java.io.IOException; +import java.io.StringReader; +import java.util.ArrayList; +import java.util.List; +import javafx.util.Pair; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import org.w3c.dom.Document; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import seng302.model.stream.xml.parser.RaceXMLData; +import seng302.model.stream.xml.parser.RegattaXMLData; +import seng302.utilities.XMLParser; + +/** + * Created by cir27 on 23/09/17. + */ +public class MapMaker { + + private List gameViews = new ArrayList<>(); + private List races = new ArrayList<>(); + private List regattas = new ArrayList<>(); + private List filePaths = new ArrayList<>(); + private static MapMaker instance; + private int index = 0; + + public static MapMaker getInstance() { + if (instance == null) { + instance = new MapMaker(); + } + return instance; + } + + private MapMaker() { + File dir = new File(MapMaker.class.getResource("/maps/").getPath()); + File[] directoryListing = dir.listFiles(); + if (directoryListing != null) { + for (File child : directoryListing) { + Pair regattaRace = XMLParser.parseRaceDef( + child.getAbsolutePath(), "", 1 + ); + filePaths.add(child.getAbsolutePath()); + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + DocumentBuilder db; + Document doc = null; + try { + db = dbf.newDocumentBuilder(); + doc = db.parse(new InputSource(new StringReader(regattaRace.getKey()))); + } catch (ParserConfigurationException | IOException | SAXException e) { + e.printStackTrace(); + } + regattas.add(XMLParser.parseRegatta(doc)); + try { + db = dbf.newDocumentBuilder(); + doc = db.parse(new InputSource(new StringReader(regattaRace.getValue()))); + } catch (ParserConfigurationException | IOException | SAXException e) { + e.printStackTrace(); + } + RaceXMLData race = XMLParser.parseRace(doc); + GameView gameView = new GameView( + new ArrayList<>(race.getCompoundMarks().values()), + race.getMarkSequence(), race.getCourseLimit() + ); + gameViews.add(gameView); + races.add(race); + } + } + } + + public void next() { + index += 1; + if (index >= gameViews.size()) { + index = 0; + } + } + + public void previous() { + index -= 1; + if (index < 0) { + index = gameViews.size() - 1; + } + } + + public GameView getCurrentGameView() { + return gameViews.get(index); + } + + public RaceXMLData getCurrentRace() { + return races.get(index); + } + + public RegattaXMLData getCurrentRegatta() { + return regattas.get(index); + } + + public String getCurrentRacePath() { + return filePaths.get(index); + } +} diff --git a/src/main/java/seng302/visualiser/controllers/LobbyController.java b/src/main/java/seng302/visualiser/controllers/LobbyController.java index bbb39f75..3ef6bf60 100644 --- a/src/main/java/seng302/visualiser/controllers/LobbyController.java +++ b/src/main/java/seng302/visualiser/controllers/LobbyController.java @@ -153,7 +153,7 @@ public class LobbyController implements Initializable { * Initializes a top down preview of the race course map. */ private void initMapPreview() { - gameView = new GameView(); + gameView = new GameView(new ArrayList<>(), new ArrayList<>(), new ArrayList<>()); gameView.setHorizontalBuffer(330d); mapWidth = 770d; diff --git a/src/main/java/seng302/visualiser/controllers/ServerListController.java b/src/main/java/seng302/visualiser/controllers/ServerListController.java index 3d457bd4..5c13d4f8 100644 --- a/src/main/java/seng302/visualiser/controllers/ServerListController.java +++ b/src/main/java/seng302/visualiser/controllers/ServerListController.java @@ -123,6 +123,7 @@ public class ServerListController implements Initializable, ServerListenerDelega Sounds.playButtonClick(); }); } catch (IOException e) { + e.printStackTrace(); logger.warn("Could not create Server Creation Dialog."); } }); diff --git a/src/main/java/seng302/visualiser/controllers/dialogs/ServerCreationController.java b/src/main/java/seng302/visualiser/controllers/dialogs/ServerCreationController.java index 8f211af3..a6d2f1d0 100644 --- a/src/main/java/seng302/visualiser/controllers/dialogs/ServerCreationController.java +++ b/src/main/java/seng302/visualiser/controllers/dialogs/ServerCreationController.java @@ -14,7 +14,7 @@ import javafx.scene.input.MouseEvent; import javafx.scene.layout.AnchorPane; import seng302.gameServer.ServerDescription; import seng302.utilities.Sounds; -import seng302.utilities.XMLParser; +import seng302.visualiser.MapMaker; import seng302.visualiser.controllers.ViewManager; import seng302.visualiser.validators.FieldLengthValidator; import seng302.visualiser.validators.ValidationTools; @@ -45,6 +45,8 @@ public class ServerCreationController implements Initializable { @FXML private AnchorPane mapHolder; + private MapMaker mapMaker = MapMaker.getInstance(); + //---------FXML END---------// public void initialize(URL location, ResourceBundle resources) { @@ -81,7 +83,8 @@ public class ServerCreationController implements Initializable { lastMap(); }); - XMLParser.parseRaceDef("/maps/horseshoe.xml", "test", 2); + mapHolder.getChildren().setAll(mapMaker.getCurrentGameView()); + mapNameLabel.setText(mapMaker.getCurrentRegatta().getCourseName()); } /** @@ -102,7 +105,7 @@ public class ServerCreationController implements Initializable { private void createServer() { ServerDescription serverDescription = ViewManager.getInstance().getGameClient() .runAsHost("localhost", 4941, serverName.getText(), (int) maxPlayersSlider - .getValue()); + .getValue(), mapMaker.getCurrentRacePath(), (int) legsSlider.getValue()); ViewManager.getInstance().setProperty("serverName", serverDescription.getName()); ViewManager.getInstance().setProperty("mapName", serverDescription.getMapName()); @@ -129,11 +132,15 @@ public class ServerCreationController implements Initializable { } private void nextMap() { - + mapMaker.next(); + mapHolder.getChildren().setAll(mapMaker.getCurrentGameView()); + mapNameLabel.setText(mapMaker.getCurrentRegatta().getCourseName()); } private void lastMap() { - + mapMaker.previous(); + mapHolder.getChildren().setAll(mapMaker.getCurrentGameView()); + mapNameLabel.setText(mapMaker.getCurrentRegatta().getCourseName()); } } diff --git a/src/main/java/seng302/visualiser/test3d.java b/src/main/java/seng302/visualiser/test3d.java deleted file mode 100644 index 6440e563..00000000 --- a/src/main/java/seng302/visualiser/test3d.java +++ /dev/null @@ -1,108 +0,0 @@ -package seng302.visualiser; - -import com.interactivemesh.jfx.importer.stl.StlMeshImporter; -import javafx.animation.AnimationTimer; -import javafx.application.Application; -import javafx.geometry.Point3D; -import javafx.scene.Camera; -import javafx.scene.Group; -import javafx.scene.PerspectiveCamera; -import javafx.scene.Scene; -import javafx.scene.SceneAntialiasing; -import javafx.scene.paint.Color; -import javafx.scene.paint.PhongMaterial; -import javafx.scene.shape.MeshView; -import javafx.scene.transform.Rotate; -import javafx.scene.transform.Scale; -import javafx.scene.transform.Translate; -import javafx.stage.Stage; - -/** - * Created by cir27 on 7/09/17. - */ -public class test3d extends Application { - - Group root = new Group(); - Scene scene; - - @Override - public void start(Stage primaryStage) throws Exception { -// camera = new PerspectiveCamera(); -// gameObjects = new Group(); -// root3D = new Group(camera, gameObjects); - scene = new Scene( - root, 1000, 1000, true, SceneAntialiasing.BALANCED - ); - gameView3DTest(); - primaryStage.setScene(scene); - primaryStage.show(); -// scene.setCamera(camera); -// primaryStage.setScene(scene); -// primaryStage.show(); -// -// StlMeshImporter importer = new StlMeshImporter(); -// importer.read(test3d.class.getResource("/meshes/dinghy_hull.stl").toString()); -// MeshView boat = new MeshView(importer.getImport()); -// boat.setMaterial(new PhongMaterial(Color.GREENYELLOW)); -// -// importer = new StlMeshImporter(); -// importer.read(getClass().getResource("/meshes/dinghy_mast.stl").toString()); -// MeshView mast = new MeshView(importer.getImport()); -// mast.setMaterial(new PhongMaterial(Color.GREENYELLOW)); -// -// importer = new StlMeshImporter(); -// importer.read(getClass().getResource("/meshes/dinghy_sail.stl").toString()); -// MeshView sail = new MeshView(importer.getImport()); -// sail.setMaterial(new PhongMaterial(Color.LIGHTGREY)); -// -// gameObjects.getChildren().addAll(boat, mast, sail); -// -// gameObjects.getTransforms().add(new Scale(25, 25,25)); -// gameObjects.getTransforms().add(new Translate(15, 20,0)); -// gameObjects.getTransforms().addAll( -// new Rotate(90, new Point3D(0,0,1)), -// new Rotate(90, new Point3D(0, 1, 0)) -// ); -// -//// PointLight light = new PointLight(); -//// light.setLightOn(true); -//// light.getTransforms().add(new Translate(15, 20, 0)); -//// -//// PointLight light2 = new PointLight(); -//// light2.setLightOn(true); -//// light2.getTransforms().add(new Translate(30, 40, 0)); -// -//// root3D.getChildren().addAll(light); -// -// scene.setOnKeyPressed(event -> { -// switch (event.getCode()) { -// case UP: -// gameObjects.getTransforms().add(new Rotate(5, new Point3D(0,0,1))); -// break; -// case DOWN: -// gameObjects.getTransforms().add(new Rotate(-5, new Point3D(0,0,1))); -// break; -// case LEFT: -// gameObjects.getTransforms().add(new Rotate(-5, new Point3D(0,1,0))); -// break; -// case RIGHT: -// gameObjects.getTransforms().add(new Rotate(5, new Point3D(0,1,0))); -// break; -// } -// }); -// -// AnimationTimer animationTimer = new AnimationTimer() { -// @Override -// public void handle(long now) { -// sail.getTransforms().add(new Rotate(0.5, 0, -1.36653, 0, new Point3D(0, 0, 1))); -// } -// }; -// -//// animationTimer.start(); - } - - private void gameView3DTest() { - GameView3D gameView3D = new GameView3D(); - root.getChildren().add(gameView3D.getAssets()); - } -} diff --git a/src/main/resources/views/dialogs/ServerCreationDialog.fxml b/src/main/resources/views/dialogs/ServerCreationDialog.fxml index 68580e33..6a3da30a 100644 --- a/src/main/resources/views/dialogs/ServerCreationDialog.fxml +++ b/src/main/resources/views/dialogs/ServerCreationDialog.fxml @@ -1,27 +1,20 @@ - - - - - - - + - - + - + @@ -142,15 +135,15 @@ - + - + - + diff --git a/src/test/java/seng302/gameServer/server/ChatCommandsTest.java b/src/test/java/seng302/gameServer/server/ChatCommandsTest.java index cb0bc930..ae273d08 100644 --- a/src/test/java/seng302/gameServer/server/ChatCommandsTest.java +++ b/src/test/java/seng302/gameServer/server/ChatCommandsTest.java @@ -31,7 +31,7 @@ public class ChatCommandsTest { } try { dcSent = false; - new GameState("localhost"); + new GameState(); mst = new MainServerThread(); host = new ClientToServerThread("localhost", 4942); host.addStreamObserver(() -> { @@ -85,7 +85,7 @@ public class ChatCommandsTest { } catch (InterruptedException ie) { ie.printStackTrace(); } - new GameState("localhost"); + new GameState(); mst = new MainServerThread(); host = null; try { @@ -129,7 +129,7 @@ public class ChatCommandsTest { } catch (InterruptedException ie) { ie.printStackTrace(); } - new GameState("localhost"); + new GameState(); mst = new MainServerThread(); host = null; try { @@ -212,7 +212,7 @@ public class ChatCommandsTest { } catch (InterruptedException ie) { ie.printStackTrace(); } - new GameState("localhost"); + new GameState(); dcSent = false; mst = new MainServerThread(); host = null; diff --git a/src/test/java/seng302/model/UpdateYachtTest.java b/src/test/java/seng302/model/UpdateYachtTest.java index a93cb080..6c0b1550 100644 --- a/src/test/java/seng302/model/UpdateYachtTest.java +++ b/src/test/java/seng302/model/UpdateYachtTest.java @@ -21,7 +21,7 @@ public class UpdateYachtTest { @Before public void setUpRace() { - new GameState(""); + new GameState(); GameState.addYacht(1, yacht1); GameState.addYacht(2, yacht2); PolarTable.parsePolarFile(getClass().getResourceAsStream("/server_config/acc_polars.csv")); diff --git a/src/test/java/seng302/models/MarkOrderTest.java b/src/test/java/seng302/models/MarkOrderTest.java index 92bbc664..13473604 100644 --- a/src/test/java/seng302/models/MarkOrderTest.java +++ b/src/test/java/seng302/models/MarkOrderTest.java @@ -7,8 +7,12 @@ import static junit.framework.TestCase.assertTrue; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; +import seng302.gameServer.messages.XMLMessageSubType; import seng302.model.mark.CompoundMark; import seng302.model.mark.MarkOrder; +import seng302.model.stream.packets.StreamPacket; +import seng302.utilities.StreamParser; +import seng302.utilities.XMLParser; public class MarkOrderTest { private static MarkOrder markOrder; @@ -16,7 +20,32 @@ public class MarkOrderTest { @BeforeClass public static void setup(){ - markOrder = new MarkOrder(); + /* + %%%%%% + %%%% = = + %%C > + _)' _( .' , + __/ |_/\ " *. o + /` \_\ \/ %`= '_ . + / ) \/| .^',*. , + /' /- o/ - " % '_ + /\_/ < = , ^ ~ . + )_o|----'| .` ' + ___// (_ - (\ + ///-( \' \\ + + */ + markOrder = new MarkOrder( + XMLParser.parseRace( + StreamParser.extractXmlMessage( + new StreamPacket( + XMLMessageSubType.RACE.getType(), + XMLParser.parseRaceDef("/maps/default.xml", "test", 2).getValue().length(), + 0, XMLParser.parseRaceDef("/maps/default.xml", "test", 2).getValue().getBytes() + ) + ) + ) + ); currentSeqID = 0; } diff --git a/src/test/java/seng302/models/YachtTest.java b/src/test/java/seng302/models/YachtTest.java index 3f342ff5..a1000402 100644 --- a/src/test/java/seng302/models/YachtTest.java +++ b/src/test/java/seng302/models/YachtTest.java @@ -16,9 +16,9 @@ public class YachtTest { @BeforeClass public static void setUp() { - new GameState("localhost"); + new GameState(); y1 = new ServerYacht("Yacht", 1, "Y1", "Y1", "Yacht 1", "C1"); - gs = new GameState("localhost"); + gs = new GameState(); } //Commented out until can fix the weird non-deterministic bug. diff --git a/src/test/java/seng302/visualiser/ClientToServerTests/RegularPacketsTest.java b/src/test/java/seng302/visualiser/ClientToServerTests/RegularPacketsTest.java index bca019f3..9dc6fd30 100644 --- a/src/test/java/seng302/visualiser/ClientToServerTests/RegularPacketsTest.java +++ b/src/test/java/seng302/visualiser/ClientToServerTests/RegularPacketsTest.java @@ -1,15 +1,11 @@ package seng302.visualiser.ClientToServerTests; -import java.util.ArrayList; import org.junit.After; -import org.junit.Assert; import org.junit.Before; import org.junit.Test; import seng302.gameServer.GameStages; import seng302.gameServer.GameState; import seng302.gameServer.MainServerThread; -import seng302.gameServer.messages.BoatAction; -import seng302.model.ServerYacht; import seng302.visualiser.ClientToServerThread; /** @@ -22,7 +18,7 @@ public class RegularPacketsTest { @Before public void setup() throws Exception { - new GameState("localhost"); + new GameState(); serverThread = new MainServerThread(); clientThread = new ClientToServerThread("localhost", 4942); GameState.setCurrentStage(GameStages.RACING);