mirror of
https://github.com/michaelrausch/Party-Parrots-At-Sea.git
synced 2026-05-09 06:18:44 +00:00
Added a race importer. Added imported races to visualizer. Made it so that the host sets the race. Refactored server to no longer be dependant on a specific race. Tested functionality of map manually. Some bugs found and listed below.
#implement #testmanual #story[1275] Known bugs: * Can't move * Map is off center in lobby view. * 3D Map is off center
This commit is contained in:
@@ -1,23 +1,39 @@
|
|||||||
package seng302.gameServer;
|
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 javafx.scene.paint.Color;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.w3c.dom.Document;
|
import seng302.gameServer.messages.BoatAction;
|
||||||
import org.xml.sax.InputSource;
|
import seng302.gameServer.messages.BoatStatus;
|
||||||
import seng302.gameServer.messages.*;
|
import seng302.gameServer.messages.ChatterMessage;
|
||||||
import seng302.model.*;
|
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.CompoundMark;
|
||||||
import seng302.model.mark.Mark;
|
import seng302.model.mark.Mark;
|
||||||
import seng302.model.mark.MarkOrder;
|
import seng302.model.mark.MarkOrder;
|
||||||
|
import seng302.model.stream.xml.parser.RaceXMLData;
|
||||||
import seng302.model.token.Token;
|
import seng302.model.token.Token;
|
||||||
import seng302.model.token.TokenType;
|
import seng302.model.token.TokenType;
|
||||||
import seng302.utilities.GeoUtility;
|
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)
|
* 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 customizationFlag; // dirty flag to tell if a player has customized their boat.
|
||||||
private static Boolean playerHasLeftFlag;
|
private static Boolean playerHasLeftFlag;
|
||||||
|
|
||||||
private static String hostIpAddress;
|
|
||||||
private static List<Player> players;
|
private static List<Player> players;
|
||||||
private static Map<Integer, ServerYacht> yachts;
|
private static Map<Integer, ServerYacht> yachts;
|
||||||
private static Boolean isRaceStarted;
|
private static Boolean isRaceStarted;
|
||||||
@@ -75,14 +90,13 @@ public class GameState implements Runnable {
|
|||||||
|
|
||||||
private static Map<Player, String> playerStringMap = new HashMap<>();
|
private static Map<Player, String> playerStringMap = new HashMap<>();
|
||||||
|
|
||||||
public GameState(String hostIpAddress) {
|
public GameState() {
|
||||||
windDirection = 180d;
|
windDirection = 180d;
|
||||||
windSpeed = 10000d;
|
windSpeed = 10000d;
|
||||||
yachts = new HashMap<>();
|
yachts = new HashMap<>();
|
||||||
tokensInPlay = new ArrayList<>();
|
tokensInPlay = new ArrayList<>();
|
||||||
|
marks = new HashSet<>();
|
||||||
players = new ArrayList<>();
|
players = new ArrayList<>();
|
||||||
GameState.hostIpAddress = hostIpAddress;
|
|
||||||
customizationFlag = false;
|
customizationFlag = false;
|
||||||
playerHasLeftFlag = false;
|
playerHasLeftFlag = false;
|
||||||
speedMultiplier = 1.0;
|
speedMultiplier = 1.0;
|
||||||
@@ -90,34 +104,20 @@ public class GameState implements Runnable {
|
|||||||
isRaceStarted = false;
|
isRaceStarted = false;
|
||||||
//set this when game stage changes to prerace
|
//set this when game stage changes to prerace
|
||||||
previousUpdateTime = System.currentTimeMillis();
|
previousUpdateTime = System.currentTimeMillis();
|
||||||
markOrder = new MarkOrder(); //This could be instantiated at some point with a select map?
|
|
||||||
newMessageListeners = new ArrayList<>();
|
newMessageListeners = new ArrayList<>();
|
||||||
allTokens = makeTokens();
|
allTokens = makeTokens();
|
||||||
|
|
||||||
resetStartTime();
|
resetStartTime();
|
||||||
|
|
||||||
new Thread(this, "GameState").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();
|
|
||||||
setCourseLimit("/server_config/race.xml");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setCourseLimit(String url) {
|
public static void setRace(RaceXMLData raceXMLData) {
|
||||||
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
|
markOrder = new MarkOrder(raceXMLData);
|
||||||
documentBuilderFactory.setNamespaceAware(true);
|
for (CompoundMark compoundMark : raceXMLData.getCompoundMarks().values()){
|
||||||
DocumentBuilder documentBuilder;
|
marks.addAll(compoundMark.getMarks());
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
courseLimit = XMLParser.parseRace(document).getCourseLimit();
|
courseLimit = raceXMLData.getCourseLimit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Make a pre defined set of tokensInPlay. //TODO wmu16 - Should read from some file for each
|
* Make a pre defined set of tokensInPlay. //TODO wmu16 - Should read from some file for each
|
||||||
* race ideally
|
* race ideally
|
||||||
@@ -132,10 +132,6 @@ public class GameState implements Runnable {
|
|||||||
return new ArrayList<>(Arrays.asList(token1, token2, token3, token4));
|
return new ArrayList<>(Arrays.asList(token1, token2, token3, token4));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getHostIpAddress() {
|
|
||||||
return hostIpAddress;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Set<Mark> getMarks() {
|
public static Set<Mark> getMarks() {
|
||||||
return Collections.unmodifiableSet(marks);
|
return Collections.unmodifiableSet(marks);
|
||||||
}
|
}
|
||||||
@@ -241,10 +237,7 @@ public class GameState implements Runnable {
|
|||||||
System.out.println("[GameState] interrupted exception");
|
System.out.println("[GameState] interrupted exception");
|
||||||
}
|
}
|
||||||
if (currentStage == GameStages.PRE_RACE || currentStage == GameStages.RACING) {
|
if (currentStage == GameStages.PRE_RACE || currentStage == GameStages.RACING) {
|
||||||
update();
|
// System.out.println("update");
|
||||||
}
|
|
||||||
|
|
||||||
if (currentStage == GameStages.RACING) {
|
|
||||||
update();
|
update();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -450,6 +443,7 @@ public class GameState implements Runnable {
|
|||||||
Double trueWindAngle = Math.abs(windDirection - yacht.getHeading());
|
Double trueWindAngle = Math.abs(windDirection - yacht.getHeading());
|
||||||
Double boatSpeedInKnots = PolarTable.getBoatSpeed(getWindSpeedKnots(), trueWindAngle);
|
Double boatSpeedInKnots = PolarTable.getBoatSpeed(getWindSpeedKnots(), trueWindAngle);
|
||||||
Double maxBoatSpeed = GeoUtility.knotsToMMS(boatSpeedInKnots) * speedMultiplier;
|
Double maxBoatSpeed = GeoUtility.knotsToMMS(boatSpeedInKnots) * speedMultiplier;
|
||||||
|
System.out.println(maxBoatSpeed);
|
||||||
if (yacht.getPowerUp() != null) {
|
if (yacht.getPowerUp() != null) {
|
||||||
if (yacht.getPowerUp().equals(TokenType.BOOST)) {
|
if (yacht.getPowerUp().equals(TokenType.BOOST)) {
|
||||||
// TODO: 11/09/17 wmu16 CHANGE THIS TO MAGIC NUMBER
|
// TODO: 11/09/17 wmu16 CHANGE THIS TO MAGIC NUMBER
|
||||||
|
|||||||
@@ -1,30 +1,22 @@
|
|||||||
package seng302.gameServer;
|
package seng302.gameServer;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.StringReader;
|
|
||||||
import java.net.ServerSocket;
|
import java.net.ServerSocket;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
import java.util.Timer;
|
import java.util.Timer;
|
||||||
import java.util.TimerTask;
|
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.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
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.gameServer.messages.Message;
|
||||||
import seng302.model.GeoPoint;
|
import seng302.model.GeoPoint;
|
||||||
import seng302.model.Player;
|
import seng302.model.Player;
|
||||||
import seng302.model.PolarTable;
|
import seng302.model.PolarTable;
|
||||||
import seng302.model.ServerYacht;
|
import seng302.model.ServerYacht;
|
||||||
import seng302.model.mark.CompoundMark;
|
import seng302.model.mark.CompoundMark;
|
||||||
|
import seng302.model.stream.xml.parser.RaceXMLData;
|
||||||
import seng302.model.stream.xml.parser.RegattaXMLData;
|
import seng302.model.stream.xml.parser.RegattaXMLData;
|
||||||
import seng302.utilities.GeoUtility;
|
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
|
* 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 Thread thread;
|
||||||
|
|
||||||
private ServerSocket serverSocket = null;
|
private ServerSocket serverSocket = null;
|
||||||
private ArrayList<ServerToClientThread> serverToClientThreads = new ArrayList<>();;
|
private ArrayList<ServerToClientThread> serverToClientThreads = new ArrayList<>();
|
||||||
private static Integer capacity;
|
private static Integer capacity;
|
||||||
|
private RaceXMLData raceXMLData;
|
||||||
|
private RegattaXMLData regattaXMLData;
|
||||||
|
|
||||||
private void startAdvertisingServer() {
|
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 capacity = GameState.getCapacity();
|
||||||
Integer numPlayers = GameState.getNumberOfPlayers();
|
Integer numPlayers = GameState.getNumberOfPlayers();
|
||||||
Integer spacesLeft = capacity - numPlayers;
|
Integer spacesLeft = capacity - numPlayers;
|
||||||
@@ -79,33 +54,40 @@ public class MainServerThread implements Runnable, ClientConnectionDelegate {
|
|||||||
|
|
||||||
// Start advertising server
|
// Start advertising server
|
||||||
try {
|
try {
|
||||||
ServerAdvertiser.getInstance().setMapName(regattaXMLData.getCourseName()).setCapacity(capacity).setNumberOfPlayers(numPlayers);
|
ServerAdvertiser.getInstance()
|
||||||
ServerAdvertiser.getInstance().registerGame(PORT, regattaXMLData.getRegattaName());
|
.setMapName(regattaXMLData.getCourseName())
|
||||||
|
.setCapacity(capacity)
|
||||||
|
.setNumberOfPlayers(numPlayers)
|
||||||
|
.registerGame(PORT, regattaXMLData.getRegattaName());
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
logger.warn("Could not register server");
|
logger.warn("Could not register server");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public MainServerThread() {
|
public MainServerThread() {
|
||||||
new GameState("localhost");
|
new GameState();
|
||||||
try {
|
try {
|
||||||
serverSocket = new ServerSocket(PORT);
|
serverSocket = new ServerSocket(PORT);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
logger.trace("IO error in server thread handler upon trying to make new server socket",
|
logger.trace("IO error in server thread handler upon trying to make new server socket",
|
||||||
0);
|
0);
|
||||||
}
|
}
|
||||||
|
|
||||||
startAdvertisingServer();
|
|
||||||
|
|
||||||
PolarTable.parsePolarFile(getClass().getResourceAsStream("/server_config/acc_polars.csv"));
|
|
||||||
GameState.addMessageEventListener(this::broadcastMessage);
|
|
||||||
terminated = false;
|
terminated = false;
|
||||||
thread = new Thread(this, "MainServer");
|
thread = new Thread(this, "MainServer");
|
||||||
startUpdatingWind();
|
|
||||||
startSpawningTokens();
|
|
||||||
thread.start();
|
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() {
|
public void run() {
|
||||||
|
|
||||||
@@ -133,8 +115,8 @@ public class MainServerThread implements Runnable, ClientConnectionDelegate {
|
|||||||
} catch (InterruptedException e) {
|
} catch (InterruptedException e) {
|
||||||
logger.trace("Interrupted exception in Main Server Thread thread sleep", 1);
|
logger.trace("Interrupted exception in Main Server Thread thread sleep", 1);
|
||||||
}
|
}
|
||||||
if (GameState.getCurrentStage() == GameStages.LOBBYING && GameState
|
if (GameState.getCurrentStage() == GameStages.LOBBYING && GameState.getCustomizationFlag()) {
|
||||||
.getCustomizationFlag()) {
|
MessageFactory.updateBoats(new ArrayList<>(GameState.getYachts().values()));
|
||||||
sendSetupMessages();
|
sendSetupMessages();
|
||||||
GameState.resetCustomizationFlag();
|
GameState.resetCustomizationFlag();
|
||||||
}
|
}
|
||||||
@@ -254,11 +236,28 @@ public class MainServerThread implements Runnable, ClientConnectionDelegate {
|
|||||||
logger.debug("Player Connected From " + serverToClientThread.getThread().getName(), 0);
|
logger.debug("Player Connected From " + serverToClientThread.getThread().getName(), 0);
|
||||||
if (serverToClientThreads.size() == 0) { //Sets first client as host.
|
if (serverToClientThreads.size() == 0) { //Sets first client as host.
|
||||||
serverToClientThread.setAsHost();
|
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);
|
serverToClientThreads.add(serverToClientThread);
|
||||||
serverToClientThread.addConnectionListener(this::sendSetupMessages);
|
|
||||||
serverToClientThread.addDisconnectListener(this::clientDisconnected);
|
serverToClientThread.addDisconnectListener(this::clientDisconnected);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
ServerAdvertiser.getInstance().setNumberOfPlayers(GameState.getNumberOfPlayers());
|
ServerAdvertiser.getInstance().setNumberOfPlayers(GameState.getNumberOfPlayers());
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
|
|||||||
@@ -13,6 +13,10 @@ import seng302.gameServer.messages.XMLMessage;
|
|||||||
import seng302.gameServer.messages.XMLMessageSubType;
|
import seng302.gameServer.messages.XMLMessageSubType;
|
||||||
import seng302.model.Player;
|
import seng302.model.Player;
|
||||||
import seng302.model.ServerYacht;
|
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.model.token.Token;
|
||||||
import seng302.utilities.XMLGenerator;
|
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 {
|
public class MessageFactory {
|
||||||
|
|
||||||
private static XMLGenerator xmlGenerator = new XMLGenerator();
|
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<ServerYacht> yachts) {
|
||||||
|
xmlGenerator.getRace().setBoats(yachts);
|
||||||
|
String xmlStr = xmlGenerator.getBoatsAsXml();
|
||||||
|
MessageFactory.boats = new XMLMessage(xmlStr, XMLMessageSubType.BOAT, xmlStr.length());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void updateTokens(List<Token> tokens) {
|
||||||
|
xmlGenerator.getRace().setTokens(tokens);
|
||||||
|
String xmlStr = xmlGenerator.getRaceAsXml();
|
||||||
|
MessageFactory.race = new XMLMessage(xmlStr, XMLMessageSubType.RACE, xmlStr.length());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public static RaceStartStatusMessage getRaceStartStatusMessage() {
|
public static RaceStartStatusMessage getRaceStartStatusMessage() {
|
||||||
@@ -93,37 +138,14 @@ public class MessageFactory {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static XMLMessage getRaceXML() {
|
public static XMLMessage getRaceXML() {
|
||||||
List<ServerYacht> yachts = new ArrayList<>(GameState.getYachts().values());
|
return race;
|
||||||
List<Token> 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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static XMLMessage getRegattaXML() {
|
public static XMLMessage getRegattaXML() {
|
||||||
//@TODO calculate lat/lng values
|
return regatta;
|
||||||
|
|
||||||
return new XMLMessage(
|
|
||||||
xmlGenerator.getRegattaAsXml(),
|
|
||||||
XMLMessageSubType.REGATTA,
|
|
||||||
xmlGenerator.getRegattaAsXml().length());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static XMLMessage getBoatXML() {
|
public static XMLMessage getBoatXML() {
|
||||||
List<ServerYacht> yachts = new ArrayList<>(GameState.getYachts().values());
|
return boats;
|
||||||
List<Token> tokens = GameState.getTokensInPlay();
|
|
||||||
// RaceXMLTemplate raceXMLTemplate = new RaceXMLTemplate(yachts, tokens);
|
|
||||||
// xmlGenerator.setRaceTemplate(raceXMLTemplate);
|
|
||||||
|
|
||||||
return new XMLMessage(
|
|
||||||
xmlGenerator.getBoatsAsXml(),
|
|
||||||
XMLMessageSubType.BOAT,
|
|
||||||
xmlGenerator.getBoatsAsXml().length());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ import java.util.Arrays;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.zip.CRC32;
|
import java.util.zip.CRC32;
|
||||||
import java.util.zip.Checksum;
|
import java.util.zip.Checksum;
|
||||||
|
import javafx.beans.property.SimpleObjectProperty;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import seng302.gameServer.messages.BoatAction;
|
import seng302.gameServer.messages.BoatAction;
|
||||||
@@ -21,13 +22,15 @@ import seng302.gameServer.messages.CustomizeRequestType;
|
|||||||
import seng302.gameServer.messages.Message;
|
import seng302.gameServer.messages.Message;
|
||||||
import seng302.gameServer.messages.RegistrationResponseMessage;
|
import seng302.gameServer.messages.RegistrationResponseMessage;
|
||||||
import seng302.gameServer.messages.RegistrationResponseStatus;
|
import seng302.gameServer.messages.RegistrationResponseStatus;
|
||||||
import seng302.gameServer.messages.XMLMessage;
|
|
||||||
import seng302.gameServer.messages.XMLMessageSubType;
|
|
||||||
import seng302.model.Player;
|
import seng302.model.Player;
|
||||||
import seng302.model.ServerYacht;
|
import seng302.model.ServerYacht;
|
||||||
import seng302.model.stream.packets.PacketType;
|
import seng302.model.stream.packets.PacketType;
|
||||||
import seng302.model.stream.packets.StreamPacket;
|
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.XMLGenerator;
|
||||||
|
import seng302.utilities.XMLParser;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A class describing a single connection to a Client for the purposes of sending and receiving on
|
* 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 ServerYacht yacht;
|
||||||
private Player player;
|
private Player player;
|
||||||
|
|
||||||
|
private SimpleObjectProperty<RaceXMLData> raceXMLProperty = new SimpleObjectProperty<>();
|
||||||
|
private SimpleObjectProperty<RegattaXMLData> regattaXMLProperty = new SimpleObjectProperty<>();
|
||||||
|
|
||||||
public ServerToClientThread(Socket socket) {
|
public ServerToClientThread(Socket socket) {
|
||||||
this.socket = socket;
|
this.socket = socket;
|
||||||
seqNo = 0;
|
seqNo = 0;
|
||||||
@@ -158,37 +164,51 @@ public class ServerToClientThread implements Runnable {
|
|||||||
long computedCrc = checksum.getValue();
|
long computedCrc = checksum.getValue();
|
||||||
long packetCrc = Message.bytesToLong(getBytes(4));
|
long packetCrc = Message.bytesToLong(getBytes(4));
|
||||||
if (computedCrc == packetCrc) {
|
if (computedCrc == packetCrc) {
|
||||||
|
StreamPacket packet = new StreamPacket(type, payloadLength, timeStamp, payload);
|
||||||
switch (PacketType.assignPacketType(type, payload)) {
|
switch (PacketType.assignPacketType(type, payload)) {
|
||||||
case BOAT_ACTION:
|
case BOAT_ACTION:
|
||||||
BoatAction actionType = ServerPacketParser
|
BoatAction actionType = ServerPacketParser.extractBoatAction(packet);
|
||||||
.extractBoatAction(
|
|
||||||
new StreamPacket(type, payloadLength, timeStamp, payload));
|
|
||||||
GameState.updateBoat(sourceId, actionType);
|
GameState.updateBoat(sourceId, actionType);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case RACE_REGISTRATION_REQUEST:
|
case RACE_REGISTRATION_REQUEST:
|
||||||
ClientType requestedType = ServerPacketParser.extractClientType(
|
ClientType requestedType = ServerPacketParser
|
||||||
new StreamPacket(type, payloadLength, timeStamp, payload));
|
.extractClientType(packet);
|
||||||
|
|
||||||
completeRegistration(requestedType);
|
completeRegistration(requestedType);
|
||||||
break;
|
break;
|
||||||
case CHATTER_TEXT:
|
case CHATTER_TEXT:
|
||||||
ChatterMessage chatterMessage = ServerPacketParser
|
ChatterMessage chatterMessage = ServerPacketParser
|
||||||
.extractChatterText(
|
.extractChatterText(packet);
|
||||||
new StreamPacket(type, payloadLength, timeStamp, payload));
|
|
||||||
GameState.processChatter(chatterMessage, isHost);
|
GameState.processChatter(chatterMessage, isHost);
|
||||||
break;
|
break;
|
||||||
case RACE_CUSTOMIZATION_REQUEST:
|
case RACE_CUSTOMIZATION_REQUEST:
|
||||||
Long sourceID = Message
|
Long sourceID = Message.bytesToLong(
|
||||||
.bytesToLong(Arrays.copyOfRange(payload, 0, 3));
|
Arrays.copyOfRange(payload, 0, 3)
|
||||||
|
);
|
||||||
CustomizeRequestType requestType = ServerPacketParser
|
CustomizeRequestType requestType = ServerPacketParser
|
||||||
.extractCustomizationType(
|
.extractCustomizationType(packet);
|
||||||
new StreamPacket(type, payloadLength, timeStamp, payload));
|
|
||||||
GameState.customizePlayer(sourceID, requestType,
|
GameState.customizePlayer(sourceID, requestType,
|
||||||
Arrays.copyOfRange(payload, 6, payload.length));
|
Arrays.copyOfRange(payload, 6, payload.length)
|
||||||
|
);
|
||||||
GameState.setCustomizationFlag();
|
GameState.setCustomizationFlag();
|
||||||
// TODO: 17/08/2017 ajm412: Send a response packet here, not really necessary until we do shapes.
|
// TODO: 17/08/2017 ajm412: Send a response packet here, not really necessary until we do shapes.
|
||||||
break;
|
break;
|
||||||
|
case RACE_XML:
|
||||||
|
raceXMLProperty.set(
|
||||||
|
XMLParser.parseRace(
|
||||||
|
StreamParser.extractXmlMessage(packet)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
case REGATTA_XML:
|
||||||
|
regattaXMLProperty.set(
|
||||||
|
XMLParser.parseRegatta(
|
||||||
|
StreamParser.extractXmlMessage(packet)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
logger.warn("Packet has been dropped", 1);
|
logger.warn("Packet has been dropped", 1);
|
||||||
@@ -205,23 +225,9 @@ public class ServerToClientThread implements Runnable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void sendSetupMessages() {
|
public void sendSetupMessages() {
|
||||||
xmlGenerator = new XMLGenerator();
|
sendMessage(MessageFactory.getRegattaXML());
|
||||||
// RaceXMLTemplate race = new RaceXMLTemplate(new ArrayList<>(GameState.getYachts().values()), new ArrayList<>());
|
sendMessage(MessageFactory.getBoatXML());
|
||||||
|
sendMessage(MessageFactory.getRaceXML());
|
||||||
// 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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void closeSocket() {
|
private void closeSocket() {
|
||||||
@@ -317,4 +323,12 @@ public class ServerToClientThread implements Runnable {
|
|||||||
public void setAsHost() {
|
public void setAsHost() {
|
||||||
isHost = true;
|
isHost = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public SimpleObjectProperty<RaceXMLData> raceXMLProperty() {
|
||||||
|
return raceXMLProperty;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SimpleObjectProperty<RegattaXMLData> regattaXMLProperty() {
|
||||||
|
return regattaXMLProperty;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package seng302.model;
|
package seng302.model;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
import javafx.scene.paint.Color;
|
import javafx.scene.paint.Color;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
@@ -9,10 +10,6 @@ import seng302.model.mark.Mark;
|
|||||||
import seng302.model.token.TokenType;
|
import seng302.model.token.TokenType;
|
||||||
import seng302.utilities.GeoUtility;
|
import seng302.utilities.GeoUtility;
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Observable;
|
|
||||||
import java.util.Observer;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Yacht class for the racing boat. <p> Class created to store more variables (eg. boat statuses)
|
* Yacht class for the racing boat. <p> 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
|
* compared to the XMLParser boat class, also done outside Boat class because some old variables are
|
||||||
|
|||||||
@@ -1,25 +1,12 @@
|
|||||||
package seng302.model.mark;
|
package seng302.model.mark;
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.StringReader;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.List;
|
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.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
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.gameServer.messages.RoundingSide;
|
||||||
import seng302.model.stream.xml.parser.RaceXMLData;
|
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.
|
* Class to hold the order of the marks in the race.
|
||||||
@@ -27,10 +14,17 @@ import seng302.utilities.XMLParser;
|
|||||||
public class MarkOrder {
|
public class MarkOrder {
|
||||||
private List<CompoundMark> raceMarkOrder;
|
private List<CompoundMark> raceMarkOrder;
|
||||||
private Logger logger = LoggerFactory.getLogger(MarkOrder.class);
|
private Logger logger = LoggerFactory.getLogger(MarkOrder.class);
|
||||||
private Set<Mark> 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");
|
logger.warn("Race order accessed but not instantiated");
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
return Collections.unmodifiableList(raceMarkOrder);
|
return Collections.unmodifiableList(raceMarkOrder);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -76,71 +69,4 @@ public class MarkOrder {
|
|||||||
public CompoundMark getNextMark(Integer currentSeqID) throws IndexOutOfBoundsException {
|
public CompoundMark getNextMark(Integer currentSeqID) throws IndexOutOfBoundsException {
|
||||||
return raceMarkOrder.get(currentSeqID + 1);
|
return raceMarkOrder.get(currentSeqID + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Set<Mark> 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<CompoundMark> 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<Corner> corners = data.getMarkSequence();
|
|
||||||
Map<Integer, CompoundMark> marks = data.getCompoundMarks();
|
|
||||||
List<CompoundMark> 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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -75,4 +75,12 @@ public class RaceXMLTemplate {
|
|||||||
public String getRaceStartTime(){
|
public String getRaceStartTime(){
|
||||||
return startTime.toString();
|
return startTime.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setBoats(List<ServerYacht> boats) {
|
||||||
|
yachts = boats;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTokens(List<Token> tokens) {
|
||||||
|
this.tokens = tokens;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -179,4 +179,8 @@ public class XMLGenerator {
|
|||||||
public RegattaXMLTemplate getRegatta() {
|
public RegattaXMLTemplate getRegatta() {
|
||||||
return regatta;
|
return regatta;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public RaceXMLTemplate getRace() {
|
||||||
|
return race;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -191,7 +191,7 @@ public class XMLParser {
|
|||||||
public static RaceXMLData parseRace(Document doc) {
|
public static RaceXMLData parseRace(Document doc) {
|
||||||
Element docEle = doc.getDocumentElement();
|
Element docEle = doc.getDocumentElement();
|
||||||
return new RaceXMLData(
|
return new RaceXMLData(
|
||||||
extractParticpantIDs(docEle),
|
extractParticipantIDs(docEle),
|
||||||
extractTokens(docEle),
|
extractTokens(docEle),
|
||||||
extractCompoundMarks(docEle),
|
extractCompoundMarks(docEle),
|
||||||
extractMarkOrder(docEle),
|
extractMarkOrder(docEle),
|
||||||
@@ -263,7 +263,7 @@ public class XMLParser {
|
|||||||
/**
|
/**
|
||||||
* Extracts course participants data
|
* Extracts course participants data
|
||||||
*/
|
*/
|
||||||
private static List<Integer> extractParticpantIDs (Element docEle) {
|
private static List<Integer> extractParticipantIDs(Element docEle) {
|
||||||
List<Integer> boatIDs = new ArrayList<>();
|
List<Integer> boatIDs = new ArrayList<>();
|
||||||
NodeList pList = docEle.getElementsByTagName("Participants").item(0).getChildNodes();
|
NodeList pList = docEle.getElementsByTagName("Participants").item(0).getChildNodes();
|
||||||
for (int i = 0; i < pList.getLength(); i++) {
|
for (int i = 0; i < pList.getLength(); i++) {
|
||||||
@@ -328,17 +328,26 @@ public class XMLParser {
|
|||||||
return subMarks;
|
return subMarks;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Pair<String, String> 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<String, String> parseRaceDef(String url, String serverName, int repetitions) {
|
||||||
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
||||||
DocumentBuilder db;
|
DocumentBuilder db;
|
||||||
Document doc = null;
|
Document doc = null;
|
||||||
try {
|
try {
|
||||||
db = dbf.newDocumentBuilder();
|
db = dbf.newDocumentBuilder();
|
||||||
doc = db.parse(XMLParser.class.getResourceAsStream(url));
|
doc = db.parse(url);
|
||||||
} catch (ParserConfigurationException | IOException | SAXException e) {
|
} catch (ParserConfigurationException | IOException | SAXException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
Element docEle = doc.getDocumentElement();
|
Element docEle = doc.getDocumentElement();
|
||||||
|
|
||||||
RegattaXMLTemplate regattaXMLTemplate = new RegattaXMLTemplate(
|
RegattaXMLTemplate regattaXMLTemplate = new RegattaXMLTemplate(
|
||||||
serverName, XMLParser.getElementString(docEle, "CourseName"),
|
serverName, XMLParser.getElementString(docEle, "CourseName"),
|
||||||
XMLParser.getElementDouble(docEle, "CentralLat"),
|
XMLParser.getElementDouble(docEle, "CentralLat"),
|
||||||
@@ -346,28 +355,14 @@ public class XMLParser {
|
|||||||
);
|
);
|
||||||
XMLGenerator xmlGenerator = new XMLGenerator();
|
XMLGenerator xmlGenerator = new XMLGenerator();
|
||||||
xmlGenerator.setRegattaTemplate(regattaXMLTemplate);
|
xmlGenerator.setRegattaTemplate(regattaXMLTemplate);
|
||||||
System.out.println(xmlGenerator.getRegattaAsXml());
|
|
||||||
// List<Corner> markOrder = XMLParser.extractMarkOrderRaceDef(docEle, repitions);
|
|
||||||
// for (Corner c : markOrder) {
|
|
||||||
// System.out.println(c);
|
|
||||||
// }
|
|
||||||
// List<Limit> limits = XMLParser.extractCourseLimitRaceDef(docEle);
|
|
||||||
// for (Limit l : limits) {
|
|
||||||
// System.out.println(l);
|
|
||||||
// }
|
|
||||||
// List<CompoundMark> 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<>(),
|
RaceXMLTemplate raceXMLTemplate = new RaceXMLTemplate(new ArrayList<>(), new ArrayList<>(),
|
||||||
XMLParser.extractMarkOrderRaceDef(docEle, repitions),
|
XMLParser.extractMarkOrderRaceDef(docEle, repetitions),
|
||||||
XMLParser.extractCourseLimitRaceDef(docEle),
|
XMLParser.extractCourseLimitRaceDef(docEle),
|
||||||
XMLParser.extractCompoundMarksRaceDef(docEle)
|
XMLParser.extractCompoundMarksRaceDef(docEle)
|
||||||
);
|
);
|
||||||
xmlGenerator.setRaceTemplate(raceXMLTemplate);
|
xmlGenerator.setRaceTemplate(raceXMLTemplate);
|
||||||
System.out.println(xmlGenerator.getRaceAsXml());
|
return new Pair<>(xmlGenerator.getRegattaAsXml(), xmlGenerator.getRaceAsXml());
|
||||||
return new Pair<>(null, null);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static List<Corner> extractMarkOrderRaceDef(Element docEle, int repitions){
|
private static List<Corner> extractMarkOrderRaceDef(Element docEle, int repitions){
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ import java.util.TimerTask;
|
|||||||
import java.util.concurrent.ConcurrentLinkedQueue;
|
import java.util.concurrent.ConcurrentLinkedQueue;
|
||||||
import java.util.zip.CRC32;
|
import java.util.zip.CRC32;
|
||||||
import java.util.zip.Checksum;
|
import java.util.zip.Checksum;
|
||||||
|
import javafx.util.Pair;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import seng302.gameServer.messages.BoatAction;
|
import seng302.gameServer.messages.BoatAction;
|
||||||
@@ -25,8 +26,11 @@ import seng302.gameServer.messages.CustomizeRequestType;
|
|||||||
import seng302.gameServer.messages.Message;
|
import seng302.gameServer.messages.Message;
|
||||||
import seng302.gameServer.messages.RegistrationRequestMessage;
|
import seng302.gameServer.messages.RegistrationRequestMessage;
|
||||||
import seng302.gameServer.messages.RegistrationResponseStatus;
|
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.PacketType;
|
||||||
import seng302.model.stream.packets.StreamPacket;
|
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
|
* 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 () {
|
public int getClientId () {
|
||||||
return clientId;
|
return clientId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void sendXML(String path, String serverName, int legRepeats) {
|
||||||
|
Pair<String, String> 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()
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -117,18 +117,18 @@ public class GameClient {
|
|||||||
* @param ipAddress IP to connect to.
|
* @param ipAddress IP to connect to.
|
||||||
* @param portNumber Port 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);
|
XMLGenerator.setDefaultRaceName(serverName);
|
||||||
GameState.setMaxPlayers(maxPlayers);
|
|
||||||
|
|
||||||
server = new MainServerThread();
|
server = new MainServerThread();
|
||||||
|
GameState.setMaxPlayers(maxPlayers);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
startClientToServerThread(ipAddress, 4942);
|
startClientToServerThread(ipAddress, 4942);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
showConnectionError("Cannot connect to server as host");
|
showConnectionError("Cannot connect to server as host");
|
||||||
}
|
}
|
||||||
|
socketThread.sendXML(race, serverName, numLegs);
|
||||||
while (regattaData == null){
|
while (regattaData == null){
|
||||||
try {
|
try {
|
||||||
Thread.sleep(100);
|
Thread.sleep(100);
|
||||||
|
|||||||
@@ -48,7 +48,9 @@ public class GameView extends Pane {
|
|||||||
private ObservableList<Node> gameObjects;
|
private ObservableList<Node> gameObjects;
|
||||||
private Group markers = new Group();
|
private Group markers = new Group();
|
||||||
private Group tokens = new Group();
|
private Group tokens = new Group();
|
||||||
private List<CompoundMark> course = new ArrayList<>();
|
private List<CompoundMark> orderedMarks = new ArrayList<>();
|
||||||
|
private List<CompoundMark> compoundMarks = new ArrayList<>();
|
||||||
|
private List<Corner> courseOrder = new ArrayList<>();
|
||||||
|
|
||||||
private ImageView mapImage = new ImageView();
|
private ImageView mapImage = new ImageView();
|
||||||
|
|
||||||
@@ -57,32 +59,52 @@ public class GameView extends Pane {
|
|||||||
VERTICAL
|
VERTICAL
|
||||||
}
|
}
|
||||||
|
|
||||||
public GameView () {
|
public GameView (List<CompoundMark> marks, List<Corner> course, List<Limit> border) {
|
||||||
|
// updateBorder(border);
|
||||||
|
// updateCourse(marks, orderedMarks);
|
||||||
|
this.compoundMarks = marks;
|
||||||
|
this.courseOrder = course;
|
||||||
|
this.borderPoints = border;
|
||||||
gameObjects = this.getChildren();
|
gameObjects = this.getChildren();
|
||||||
gameObjects.addAll(mapImage, raceBorder, markers, tokens);
|
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
|
* Adds a orderedMarks to the GameView. The view is scaled accordingly unless a border is set in which
|
||||||
* case the course is added relative ot the border.
|
* 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
|
* @param sequence The sequence the marks travel through
|
||||||
*/
|
*/
|
||||||
public void updateCourse(List<CompoundMark> newCourse, List<Corner> sequence) {
|
public void updateCourse(List<CompoundMark> newCourse, List<Corner> 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) {
|
for (CompoundMark compoundMark : newCourse) {
|
||||||
if (corner.getCompoundMarkID() == compoundMark.getId()) {
|
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.
|
// TODO: 16/08/17 Updating mark roundings here. It should not happen here. Nor should it be done this way.
|
||||||
for (Corner corner : sequence){
|
for (Corner corner : sequence){
|
||||||
CompoundMark compoundMark = course.get(corner.getSeqID() - 1);
|
CompoundMark compoundMark = orderedMarks.get(corner.getSeqID() - 1);
|
||||||
compoundMark.setRoundingSide(
|
compoundMark.setRoundingSide(
|
||||||
RoundingSide.getRoundingSide(corner.getRounding())
|
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.
|
* added to the gameview.
|
||||||
* @param sequence The order in which marks are traversed.
|
* @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.
|
for (int i=1; i < sequence.size()-1; i++) { //General case.
|
||||||
double averageLat = 0;
|
double averageLat = 0;
|
||||||
double averageLng = 0;
|
double averageLng = 0;
|
||||||
int numMarks = course.get(i-1).getMarks().size();
|
int numMarks = orderedMarks.get(i-1).getMarks().size();
|
||||||
for (Mark mark : course.get(i-1).getMarks()) {
|
for (Mark mark : orderedMarks.get(i-1).getMarks()) {
|
||||||
averageLat += mark.getLat();
|
averageLat += mark.getLat();
|
||||||
averageLng += mark.getLng();
|
averageLng += mark.getLng();
|
||||||
}
|
}
|
||||||
GeoPoint lastMarkAv = new GeoPoint(averageLat / numMarks, averageLng / numMarks);
|
GeoPoint lastMarkAv = new GeoPoint(averageLat / numMarks, averageLng / numMarks);
|
||||||
numMarks = course.get(i+1).getMarks().size();
|
numMarks = orderedMarks.get(i+1).getMarks().size();
|
||||||
averageLat = 0;
|
averageLat = 0;
|
||||||
averageLng = 0;
|
averageLng = 0;
|
||||||
for (Mark mark : course.get(i+1).getMarks()) {
|
for (Mark mark : orderedMarks.get(i+1).getMarks()) {
|
||||||
averageLat += mark.getLat();
|
averageLat += mark.getLat();
|
||||||
averageLng += mark.getLng();
|
averageLng += mark.getLng();
|
||||||
}
|
}
|
||||||
GeoPoint nextMarkAv = new GeoPoint(averageLat / numMarks, averageLng / numMarks);
|
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.
|
// 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(
|
markerObjects.get(mark).addArrows(
|
||||||
mark.getRoundingSide() == RoundingSide.STARBOARD ? MarkArrowFactory.RoundingSide.STARBOARD : MarkArrowFactory.RoundingSide.PORT,
|
mark.getRoundingSide() == RoundingSide.STARBOARD ? MarkArrowFactory.RoundingSide.STARBOARD : MarkArrowFactory.RoundingSide.PORT,
|
||||||
GeoUtility.getBearing(lastMarkAv, mark),
|
GeoUtility.getBearing(lastMarkAv, mark),
|
||||||
@@ -176,13 +198,13 @@ public class GameView extends Pane {
|
|||||||
double averageLat = 0;
|
double averageLat = 0;
|
||||||
double averageLng = 0;
|
double averageLng = 0;
|
||||||
int numMarks = 0;
|
int numMarks = 0;
|
||||||
for (Mark mark : course.get(1).getMarks()) {
|
for (Mark mark : orderedMarks.get(1).getMarks()) {
|
||||||
numMarks += 1;
|
numMarks += 1;
|
||||||
averageLat += mark.getLat();
|
averageLat += mark.getLat();
|
||||||
averageLng += mark.getLng();
|
averageLng += mark.getLng();
|
||||||
}
|
}
|
||||||
GeoPoint firstMarkAv = new GeoPoint(averageLat / numMarks, averageLng / numMarks);
|
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(
|
markerObjects.get(mark).addArrows(
|
||||||
mark.getRoundingSide() == RoundingSide.STARBOARD ? MarkArrowFactory.RoundingSide.STARBOARD : MarkArrowFactory.RoundingSide.PORT,
|
mark.getRoundingSide() == RoundingSide.STARBOARD ? MarkArrowFactory.RoundingSide.STARBOARD : MarkArrowFactory.RoundingSide.PORT,
|
||||||
0d, //90
|
0d, //90
|
||||||
@@ -195,13 +217,13 @@ public class GameView extends Pane {
|
|||||||
double numMarks = 0;
|
double numMarks = 0;
|
||||||
double averageLat = 0;
|
double averageLat = 0;
|
||||||
double averageLng = 0;
|
double averageLng = 0;
|
||||||
for (Mark mark : course.get(course.size()-2).getMarks()) {
|
for (Mark mark : orderedMarks.get(orderedMarks.size()-2).getMarks()) {
|
||||||
numMarks += 1;
|
numMarks += 1;
|
||||||
averageLat += mark.getLat();
|
averageLat += mark.getLat();
|
||||||
averageLng += mark.getLng();
|
averageLng += mark.getLng();
|
||||||
}
|
}
|
||||||
GeoPoint secondToLastMarkAv = new GeoPoint(averageLat / numMarks, averageLng / numMarks);
|
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(
|
markerObjects.get(mark).addArrows(
|
||||||
mark.getRoundingSide() == RoundingSide.STARBOARD ? MarkArrowFactory.RoundingSide.STARBOARD : MarkArrowFactory.RoundingSide.PORT,
|
mark.getRoundingSide() == RoundingSide.STARBOARD ? MarkArrowFactory.RoundingSide.STARBOARD : MarkArrowFactory.RoundingSide.PORT,
|
||||||
GeoUtility.getBearing(secondToLastMarkAv, mark),
|
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
|
* 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.
|
* @param border the race border to be drawn.
|
||||||
*/
|
*/
|
||||||
public void updateBorder(List<Limit> border) {
|
public void updateBorder(List<Limit> border) {
|
||||||
if (borderPoints == null) {
|
if (border.size() == 0) {
|
||||||
borderPoints = border;
|
return;
|
||||||
rescaleRace(new ArrayList<>(borderPoints));
|
|
||||||
}
|
}
|
||||||
|
borderPoints = border;
|
||||||
rescaleRace(new ArrayList<>(border));
|
rescaleRace(new ArrayList<>(borderPoints));
|
||||||
|
|
||||||
List<Double> boundaryPoints = new ArrayList<>();
|
List<Double> boundaryPoints = new ArrayList<>();
|
||||||
for (Limit limit : border) {
|
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.
|
* @param limitingCoordinates the set of geo points that contains the extremities of the race.
|
||||||
*/
|
*/
|
||||||
public void rescaleRace(List<GeoPoint> limitingCoordinates) {
|
public void rescaleRace(List<? extends GeoPoint> limitingCoordinates) {
|
||||||
//Check is called once to avoid unnecessarily change the course limits once the race is running
|
//Check is called once to avoid unnecessarily change the orderedMarks limits once the race is running
|
||||||
findMinMaxPoint(limitingCoordinates);
|
findMinMaxPoint(limitingCoordinates);
|
||||||
double minLonToMaxLon = scaleRaceExtremities();
|
double minLonToMaxLon = scaleRaceExtremities();
|
||||||
calculateReferencePointLocation(minLonToMaxLon);
|
calculateReferencePointLocation(minLonToMaxLon);
|
||||||
@@ -292,7 +313,7 @@ public class GameView extends Pane {
|
|||||||
* the leftmost point, rightmost point, southern most point and northern most point
|
* the leftmost point, rightmost point, southern most point and northern most point
|
||||||
* respectively.
|
* respectively.
|
||||||
*/
|
*/
|
||||||
private void findMinMaxPoint(List<GeoPoint> points) {
|
private void findMinMaxPoint(List<? extends GeoPoint> points) {
|
||||||
List<GeoPoint> sortedPoints = new ArrayList<>(points);
|
List<GeoPoint> sortedPoints = new ArrayList<>(points);
|
||||||
sortedPoints.sort(Comparator.comparingDouble(GeoPoint::getLat));
|
sortedPoints.sort(Comparator.comparingDouble(GeoPoint::getLat));
|
||||||
minLatPoint = new GeoPoint(sortedPoints.get(0).getLat(), sortedPoints.get(0).getLng());
|
minLatPoint = new GeoPoint(sortedPoints.get(0).getLat(), sortedPoints.get(0).getLng());
|
||||||
|
|||||||
@@ -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<GameView> gameViews = new ArrayList<>();
|
||||||
|
private List<RaceXMLData> races = new ArrayList<>();
|
||||||
|
private List<RegattaXMLData> regattas = new ArrayList<>();
|
||||||
|
private List<String> 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<String, String> 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -153,7 +153,7 @@ public class LobbyController implements Initializable {
|
|||||||
* Initializes a top down preview of the race course map.
|
* Initializes a top down preview of the race course map.
|
||||||
*/
|
*/
|
||||||
private void initMapPreview() {
|
private void initMapPreview() {
|
||||||
gameView = new GameView();
|
gameView = new GameView(new ArrayList<>(), new ArrayList<>(), new ArrayList<>());
|
||||||
gameView.setHorizontalBuffer(330d);
|
gameView.setHorizontalBuffer(330d);
|
||||||
|
|
||||||
mapWidth = 770d;
|
mapWidth = 770d;
|
||||||
|
|||||||
@@ -123,6 +123,7 @@ public class ServerListController implements Initializable, ServerListenerDelega
|
|||||||
Sounds.playButtonClick();
|
Sounds.playButtonClick();
|
||||||
});
|
});
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
logger.warn("Could not create Server Creation Dialog.");
|
logger.warn("Could not create Server Creation Dialog.");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ import javafx.scene.input.MouseEvent;
|
|||||||
import javafx.scene.layout.AnchorPane;
|
import javafx.scene.layout.AnchorPane;
|
||||||
import seng302.gameServer.ServerDescription;
|
import seng302.gameServer.ServerDescription;
|
||||||
import seng302.utilities.Sounds;
|
import seng302.utilities.Sounds;
|
||||||
import seng302.utilities.XMLParser;
|
import seng302.visualiser.MapMaker;
|
||||||
import seng302.visualiser.controllers.ViewManager;
|
import seng302.visualiser.controllers.ViewManager;
|
||||||
import seng302.visualiser.validators.FieldLengthValidator;
|
import seng302.visualiser.validators.FieldLengthValidator;
|
||||||
import seng302.visualiser.validators.ValidationTools;
|
import seng302.visualiser.validators.ValidationTools;
|
||||||
@@ -45,6 +45,8 @@ public class ServerCreationController implements Initializable {
|
|||||||
@FXML
|
@FXML
|
||||||
private AnchorPane mapHolder;
|
private AnchorPane mapHolder;
|
||||||
|
|
||||||
|
private MapMaker mapMaker = MapMaker.getInstance();
|
||||||
|
|
||||||
//---------FXML END---------//
|
//---------FXML END---------//
|
||||||
|
|
||||||
public void initialize(URL location, ResourceBundle resources) {
|
public void initialize(URL location, ResourceBundle resources) {
|
||||||
@@ -81,7 +83,8 @@ public class ServerCreationController implements Initializable {
|
|||||||
lastMap();
|
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() {
|
private void createServer() {
|
||||||
ServerDescription serverDescription = ViewManager.getInstance().getGameClient()
|
ServerDescription serverDescription = ViewManager.getInstance().getGameClient()
|
||||||
.runAsHost("localhost", 4941, serverName.getText(), (int) maxPlayersSlider
|
.runAsHost("localhost", 4941, serverName.getText(), (int) maxPlayersSlider
|
||||||
.getValue());
|
.getValue(), mapMaker.getCurrentRacePath(), (int) legsSlider.getValue());
|
||||||
|
|
||||||
ViewManager.getInstance().setProperty("serverName", serverDescription.getName());
|
ViewManager.getInstance().setProperty("serverName", serverDescription.getName());
|
||||||
ViewManager.getInstance().setProperty("mapName", serverDescription.getMapName());
|
ViewManager.getInstance().setProperty("mapName", serverDescription.getMapName());
|
||||||
@@ -129,11 +132,15 @@ public class ServerCreationController implements Initializable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void nextMap() {
|
private void nextMap() {
|
||||||
|
mapMaker.next();
|
||||||
|
mapHolder.getChildren().setAll(mapMaker.getCurrentGameView());
|
||||||
|
mapNameLabel.setText(mapMaker.getCurrentRegatta().getCourseName());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void lastMap() {
|
private void lastMap() {
|
||||||
|
mapMaker.previous();
|
||||||
|
mapHolder.getChildren().setAll(mapMaker.getCurrentGameView());
|
||||||
|
mapNameLabel.setText(mapMaker.getCurrentRegatta().getCourseName());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,27 +1,20 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
|
||||||
<?import javafx.scene.text.*?>
|
|
||||||
<?import com.jfoenix.controls.*?>
|
|
||||||
<?import java.lang.*?>
|
|
||||||
<?import javafx.geometry.*?>
|
|
||||||
<?import javafx.scene.control.*?>
|
|
||||||
<?import javafx.scene.layout.*?>
|
|
||||||
<?import com.jfoenix.controls.JFXButton?>
|
<?import com.jfoenix.controls.JFXButton?>
|
||||||
<?import com.jfoenix.controls.JFXCheckBox?>
|
<?import com.jfoenix.controls.JFXCheckBox?>
|
||||||
<?import com.jfoenix.controls.JFXDialogLayout?>
|
<?import com.jfoenix.controls.JFXDialogLayout?>
|
||||||
<?import com.jfoenix.controls.JFXSlider?>
|
<?import com.jfoenix.controls.JFXSlider?>
|
||||||
<?import com.jfoenix.controls.JFXTextArea?>
|
|
||||||
<?import com.jfoenix.controls.JFXTextField?>
|
<?import com.jfoenix.controls.JFXTextField?>
|
||||||
<?import javafx.geometry.Insets?>
|
<?import javafx.geometry.Insets?>
|
||||||
<?import javafx.scene.control.Label?>
|
<?import javafx.scene.control.Label?>
|
||||||
|
<?import javafx.scene.layout.AnchorPane?>
|
||||||
<?import javafx.scene.layout.ColumnConstraints?>
|
<?import javafx.scene.layout.ColumnConstraints?>
|
||||||
<?import javafx.scene.layout.GridPane?>
|
<?import javafx.scene.layout.GridPane?>
|
||||||
<?import javafx.scene.layout.Pane?>
|
|
||||||
<?import javafx.scene.layout.RowConstraints?>
|
<?import javafx.scene.layout.RowConstraints?>
|
||||||
<?import javafx.scene.layout.VBox?>
|
<?import javafx.scene.layout.VBox?>
|
||||||
<?import javafx.scene.layout.AnchorPane?>
|
<?import javafx.scene.text.Font?>
|
||||||
|
|
||||||
<JFXDialogLayout maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="600.0" prefWidth="1000.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="seng302.visualiser.controllers.dialogs.ServerCreationController">
|
<JFXDialogLayout maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="600.0" prefWidth="1000.0" xmlns="http://javafx.com/javafx/8.0.112" xmlns:fx="http://javafx.com/fxml/1" fx:controller="seng302.visualiser.controllers.dialogs.ServerCreationController">
|
||||||
<children>
|
<children>
|
||||||
<GridPane>
|
<GridPane>
|
||||||
<children>
|
<children>
|
||||||
@@ -142,15 +135,15 @@
|
|||||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||||
</rowConstraints>
|
</rowConstraints>
|
||||||
<children>
|
<children>
|
||||||
<JFXButton fx:id="lastMapButton" maxHeight="300.0" minHeight="300.0" prefHeight="300.0" prefWidth="35.0" style="-fx-border-color: lightgrey;" text="<" textFill="#5b5b5b" GridPane.halignment="CENTER" GridPane.valignment="CENTER">
|
<JFXButton fx:id="lastMapButton" maxHeight="300.0" minHeight="300.0" prefHeight="300.0" prefWidth="35.0" style="-fx-border-color: lightgrey; -fx-border-radius: 5;" text="<" textFill="#5b5b5b" GridPane.halignment="CENTER" GridPane.valignment="CENTER">
|
||||||
<font>
|
<font>
|
||||||
<Font name="System Bold" size="13.0" />
|
<Font name="System Bold" size="13.0" />
|
||||||
</font></JFXButton>
|
</font></JFXButton>
|
||||||
<JFXButton fx:id="nextMapButton" maxHeight="300.0" minHeight="300.0" minWidth="35.0" prefHeight="300.0" style="-fx-border-color: lightgrey;" text=">" textFill="#5b5b5b" GridPane.columnIndex="2" GridPane.valignment="CENTER">
|
<JFXButton fx:id="nextMapButton" maxHeight="300.0" minHeight="300.0" minWidth="35.0" prefHeight="300.0" style="-fx-border-color: lightgrey; -fx-border-radius: 5;" text=">" textFill="#5b5b5b" GridPane.columnIndex="2" GridPane.valignment="CENTER">
|
||||||
<font>
|
<font>
|
||||||
<Font name="System Bold" size="13.0" />
|
<Font name="System Bold" size="13.0" />
|
||||||
</font></JFXButton>
|
</font></JFXButton>
|
||||||
<GridPane GridPane.columnIndex="1">
|
<GridPane style="-fx-background-color: lightblue; -fx-border-color: grey; -fx-border-radius: 5; -fx-background-radius: 5;" GridPane.columnIndex="1">
|
||||||
<columnConstraints>
|
<columnConstraints>
|
||||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||||
</columnConstraints>
|
</columnConstraints>
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ public class ChatCommandsTest {
|
|||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
dcSent = false;
|
dcSent = false;
|
||||||
new GameState("localhost");
|
new GameState();
|
||||||
mst = new MainServerThread();
|
mst = new MainServerThread();
|
||||||
host = new ClientToServerThread("localhost", 4942);
|
host = new ClientToServerThread("localhost", 4942);
|
||||||
host.addStreamObserver(() -> {
|
host.addStreamObserver(() -> {
|
||||||
@@ -85,7 +85,7 @@ public class ChatCommandsTest {
|
|||||||
} catch (InterruptedException ie) {
|
} catch (InterruptedException ie) {
|
||||||
ie.printStackTrace();
|
ie.printStackTrace();
|
||||||
}
|
}
|
||||||
new GameState("localhost");
|
new GameState();
|
||||||
mst = new MainServerThread();
|
mst = new MainServerThread();
|
||||||
host = null;
|
host = null;
|
||||||
try {
|
try {
|
||||||
@@ -129,7 +129,7 @@ public class ChatCommandsTest {
|
|||||||
} catch (InterruptedException ie) {
|
} catch (InterruptedException ie) {
|
||||||
ie.printStackTrace();
|
ie.printStackTrace();
|
||||||
}
|
}
|
||||||
new GameState("localhost");
|
new GameState();
|
||||||
mst = new MainServerThread();
|
mst = new MainServerThread();
|
||||||
host = null;
|
host = null;
|
||||||
try {
|
try {
|
||||||
@@ -212,7 +212,7 @@ public class ChatCommandsTest {
|
|||||||
} catch (InterruptedException ie) {
|
} catch (InterruptedException ie) {
|
||||||
ie.printStackTrace();
|
ie.printStackTrace();
|
||||||
}
|
}
|
||||||
new GameState("localhost");
|
new GameState();
|
||||||
dcSent = false;
|
dcSent = false;
|
||||||
mst = new MainServerThread();
|
mst = new MainServerThread();
|
||||||
host = null;
|
host = null;
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ public class UpdateYachtTest {
|
|||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUpRace() {
|
public void setUpRace() {
|
||||||
new GameState("");
|
new GameState();
|
||||||
GameState.addYacht(1, yacht1);
|
GameState.addYacht(1, yacht1);
|
||||||
GameState.addYacht(2, yacht2);
|
GameState.addYacht(2, yacht2);
|
||||||
PolarTable.parsePolarFile(getClass().getResourceAsStream("/server_config/acc_polars.csv"));
|
PolarTable.parsePolarFile(getClass().getResourceAsStream("/server_config/acc_polars.csv"));
|
||||||
|
|||||||
@@ -7,8 +7,12 @@ import static junit.framework.TestCase.assertTrue;
|
|||||||
import org.junit.AfterClass;
|
import org.junit.AfterClass;
|
||||||
import org.junit.BeforeClass;
|
import org.junit.BeforeClass;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
import seng302.gameServer.messages.XMLMessageSubType;
|
||||||
import seng302.model.mark.CompoundMark;
|
import seng302.model.mark.CompoundMark;
|
||||||
import seng302.model.mark.MarkOrder;
|
import seng302.model.mark.MarkOrder;
|
||||||
|
import seng302.model.stream.packets.StreamPacket;
|
||||||
|
import seng302.utilities.StreamParser;
|
||||||
|
import seng302.utilities.XMLParser;
|
||||||
|
|
||||||
public class MarkOrderTest {
|
public class MarkOrderTest {
|
||||||
private static MarkOrder markOrder;
|
private static MarkOrder markOrder;
|
||||||
@@ -16,7 +20,32 @@ public class MarkOrderTest {
|
|||||||
|
|
||||||
@BeforeClass
|
@BeforeClass
|
||||||
public static void setup(){
|
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;
|
currentSeqID = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,9 +16,9 @@ public class YachtTest {
|
|||||||
|
|
||||||
@BeforeClass
|
@BeforeClass
|
||||||
public static void setUp() {
|
public static void setUp() {
|
||||||
new GameState("localhost");
|
new GameState();
|
||||||
y1 = new ServerYacht("Yacht", 1, "Y1", "Y1", "Yacht 1", "C1");
|
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.
|
//Commented out until can fix the weird non-deterministic bug.
|
||||||
|
|||||||
@@ -1,15 +1,11 @@
|
|||||||
package seng302.visualiser.ClientToServerTests;
|
package seng302.visualiser.ClientToServerTests;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
import org.junit.Assert;
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import seng302.gameServer.GameStages;
|
import seng302.gameServer.GameStages;
|
||||||
import seng302.gameServer.GameState;
|
import seng302.gameServer.GameState;
|
||||||
import seng302.gameServer.MainServerThread;
|
import seng302.gameServer.MainServerThread;
|
||||||
import seng302.gameServer.messages.BoatAction;
|
|
||||||
import seng302.model.ServerYacht;
|
|
||||||
import seng302.visualiser.ClientToServerThread;
|
import seng302.visualiser.ClientToServerThread;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -22,7 +18,7 @@ public class RegularPacketsTest {
|
|||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setup() throws Exception {
|
public void setup() throws Exception {
|
||||||
new GameState("localhost");
|
new GameState();
|
||||||
serverThread = new MainServerThread();
|
serverThread = new MainServerThread();
|
||||||
clientThread = new ClientToServerThread("localhost", 4942);
|
clientThread = new ClientToServerThread("localhost", 4942);
|
||||||
GameState.setCurrentStage(GameStages.RACING);
|
GameState.setCurrentStage(GameStages.RACING);
|
||||||
|
|||||||
Reference in New Issue
Block a user