mirror of
https://github.com/michaelrausch/Party-Parrots-At-Sea.git
synced 2026-05-09 14:28:43 +00:00
Added per map max player count. Handles case when map cannot fit players behind start mark. Added initial implementation for spacing out yachts.
#implement.
This commit is contained in:
@@ -3,6 +3,8 @@ package seng302.gameServer;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.net.ServerSocket;
|
import java.net.ServerSocket;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
import java.util.Timer;
|
import java.util.Timer;
|
||||||
import java.util.TimerTask;
|
import java.util.TimerTask;
|
||||||
@@ -13,7 +15,6 @@ 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.stream.xml.parser.RaceXMLData;
|
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;
|
||||||
@@ -329,39 +330,107 @@ public class MainServerThread implements Runnable, ClientConnectionDelegate {
|
|||||||
* Initialise boats to specific spaced out geopoints behind starting line.
|
* Initialise boats to specific spaced out geopoints behind starting line.
|
||||||
*/
|
*/
|
||||||
private void initialiseBoatPositions() {
|
private void initialiseBoatPositions() {
|
||||||
CompoundMark cm = GameState.getMarkOrder().getMarkOrder().get(0);
|
// CompoundMark cm = GameState.getMarkOrder().getMarkOrder().get(0);
|
||||||
GeoPoint startMark1 = cm.getSubMark(1);
|
// GeoPoint startMark1 = cm.getSubMark(1);
|
||||||
GeoPoint startMark2 = cm.getSubMark(2);
|
// GeoPoint startMark2 = cm.getSubMark(2);
|
||||||
|
//
|
||||||
|
// // Calculating midpoint
|
||||||
|
// Double perpendicularAngle = GeoUtility.getBearing(startMark1, startMark2);
|
||||||
|
// Double length = GeoUtility.getDistance(startMark1, startMark2);
|
||||||
|
// GeoPoint midpoint = GeoUtility.getGeoCoordinate(startMark1, perpendicularAngle, length / 2);
|
||||||
|
//
|
||||||
|
// // Setting each boats position side by side
|
||||||
|
// final double SEPARATION = 50.0; // distance apart in meters
|
||||||
|
//
|
||||||
|
// int boatIndex = 0;
|
||||||
|
// for (ServerYacht yacht : GameState.getYachts().values()) {
|
||||||
|
// int distanceApart = boatIndex / 2;
|
||||||
|
//
|
||||||
|
// if (boatIndex % 2 == 1 && boatIndex != 0) {
|
||||||
|
// distanceApart++;
|
||||||
|
// distanceApart *= -1;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// GeoPoint spawnMark = GeoUtility
|
||||||
|
// .getGeoCoordinate(midpoint, perpendicularAngle, distanceApart * SEPARATION);
|
||||||
|
//
|
||||||
|
// if (yacht.getHeading() < perpendicularAngle) {
|
||||||
|
// spawnMark = GeoUtility
|
||||||
|
// .getGeoCoordinate(spawnMark, perpendicularAngle + 90, SEPARATION);
|
||||||
|
// } else {
|
||||||
|
// spawnMark = GeoUtility
|
||||||
|
// .getGeoCoordinate(spawnMark, perpendicularAngle + 270, SEPARATION);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// yacht.setLocation(spawnMark);
|
||||||
|
// boatIndex++;
|
||||||
|
// }
|
||||||
|
|
||||||
// Calculating midpoint
|
final double SEPARATION = 50.0; // distance apart in meters
|
||||||
Double perpendicularAngle = GeoUtility.getBearing(startMark1, startMark2);
|
|
||||||
Double length = GeoUtility.getDistance(startMark1, startMark2);
|
|
||||||
GeoPoint midpoint = GeoUtility.getGeoCoordinate(startMark1, perpendicularAngle, length / 2);
|
|
||||||
|
|
||||||
// Setting each boats position side by side
|
//Reverse of the angle from start to first mark
|
||||||
double DISTANCE_FACTOR = 50.0; // distance apart in meters
|
double angleToFirstMark = 360 - GeoUtility.getBearing(
|
||||||
int boatIndex = 0;
|
GameState.getMarkOrder().getMarkOrder().get(0).getMidPoint(),
|
||||||
for (ServerYacht yacht : GameState.getYachts().values()) {
|
GameState.getMarkOrder().getMarkOrder().get(1).getMidPoint()
|
||||||
int distanceApart = boatIndex / 2;
|
);
|
||||||
|
|
||||||
if (boatIndex % 2 == 1 && boatIndex != 0) {
|
//Length of start line
|
||||||
distanceApart++;
|
double startLineLength = GeoUtility.getDistance(
|
||||||
distanceApart *= -1;
|
GameState.getMarkOrder().getMarkOrder().get(0).getSubMark(1),
|
||||||
}
|
GameState.getMarkOrder().getMarkOrder().get(0).getSubMark(2)
|
||||||
|
);
|
||||||
|
|
||||||
GeoPoint spawnMark = GeoUtility
|
//Angle of start line
|
||||||
.getGeoCoordinate(midpoint, perpendicularAngle, distanceApart * DISTANCE_FACTOR);
|
double startMarkToMarkAngle = GeoUtility.getBearing(
|
||||||
|
GameState.getMarkOrder().getMarkOrder().get(0).getSubMark(1),
|
||||||
|
GameState.getMarkOrder().getMarkOrder().get(0).getSubMark(2)
|
||||||
|
);
|
||||||
|
|
||||||
if (yacht.getHeading() < perpendicularAngle) {
|
//How many yachts can fit along the start line
|
||||||
spawnMark = GeoUtility
|
int spacesAlongLine = (int) Math.round(startLineLength / SEPARATION);
|
||||||
.getGeoCoordinate(spawnMark, perpendicularAngle + 90, DISTANCE_FACTOR);
|
//The free space left by the boats.
|
||||||
} else {
|
double buffer = (startLineLength % SEPARATION) / 2;
|
||||||
spawnMark = GeoUtility
|
|
||||||
.getGeoCoordinate(spawnMark, perpendicularAngle + 270, DISTANCE_FACTOR);
|
|
||||||
}
|
|
||||||
|
|
||||||
yacht.setLocation(spawnMark);
|
//Randomize starting order.
|
||||||
boatIndex++;
|
List<ServerYacht> serverYachtList = new ArrayList<>(GameState.getYachts().values());
|
||||||
|
Collections.shuffle(serverYachtList);
|
||||||
|
|
||||||
|
//set the starting point away from start line.
|
||||||
|
GeoPoint startingPoint = GeoUtility.getGeoCoordinate(
|
||||||
|
GameState.getMarkOrder().getMarkOrder().get(0).getSubMark(1),
|
||||||
|
angleToFirstMark, SEPARATION
|
||||||
|
);
|
||||||
|
|
||||||
|
//Move it along the start line
|
||||||
|
startingPoint = GeoUtility.getGeoCoordinate(
|
||||||
|
startingPoint, startMarkToMarkAngle, buffer
|
||||||
|
);
|
||||||
|
|
||||||
|
int yachtCount = 0;
|
||||||
|
int repeats = 0;
|
||||||
|
|
||||||
|
GeoPoint yachtLocation;
|
||||||
|
|
||||||
|
for (ServerYacht serverYacht : serverYachtList) {
|
||||||
|
|
||||||
|
//Move away from start line
|
||||||
|
yachtLocation = GeoUtility.getGeoCoordinate(
|
||||||
|
startingPoint, angleToFirstMark,repeats * SEPARATION
|
||||||
|
);
|
||||||
|
//Move along start line
|
||||||
|
yachtLocation = GeoUtility.getGeoCoordinate(
|
||||||
|
yachtLocation, startMarkToMarkAngle, yachtCount * SEPARATION
|
||||||
|
);
|
||||||
|
serverYacht.setLocation(yachtLocation);
|
||||||
|
serverYacht.setHeading(GeoUtility.getBearing(
|
||||||
|
yachtLocation, GameState.getMarkOrder().getMarkOrder().get(1).getMidPoint()
|
||||||
|
));
|
||||||
|
//Set location for next yacht
|
||||||
|
yachtCount++;
|
||||||
|
if (yachtCount > spacesAlongLine) {
|
||||||
|
yachtCount = 0;
|
||||||
|
repeats++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -56,7 +56,8 @@ public class MessageFactory {
|
|||||||
new ArrayList<>(),
|
new ArrayList<>(),
|
||||||
race.getMarkSequence(),
|
race.getMarkSequence(),
|
||||||
race.getCourseLimit(),
|
race.getCourseLimit(),
|
||||||
new ArrayList<>(race.getCompoundMarks().values())
|
new ArrayList<>(race.getCompoundMarks().values()),
|
||||||
|
GameState.getCapacity(), true
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
String xmlStr = xmlGenerator.getRaceAsXml();
|
String xmlStr = xmlGenerator.getRaceAsXml();
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import java.util.zip.Checksum;
|
|||||||
import javafx.beans.property.SimpleObjectProperty;
|
import javafx.beans.property.SimpleObjectProperty;
|
||||||
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 seng302.gameServer.messages.BoatAction;
|
||||||
import seng302.gameServer.messages.ChatterMessage;
|
import seng302.gameServer.messages.ChatterMessage;
|
||||||
import seng302.gameServer.messages.ClientType;
|
import seng302.gameServer.messages.ClientType;
|
||||||
@@ -196,11 +197,11 @@ public class ServerToClientThread implements Runnable {
|
|||||||
// 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:
|
case RACE_XML:
|
||||||
|
Document document = StreamParser.extractXmlMessage(packet);
|
||||||
raceXMLProperty.set(
|
raceXMLProperty.set(
|
||||||
XMLParser.parseRace(
|
XMLParser.parseRace(document)
|
||||||
StreamParser.extractXmlMessage(packet)
|
|
||||||
)
|
|
||||||
);
|
);
|
||||||
|
GameState.setMaxPlayers(XMLParser.getMaxPlayers(document));
|
||||||
break;
|
break;
|
||||||
case REGATTA_XML:
|
case REGATTA_XML:
|
||||||
regattaXMLProperty.set(
|
regattaXMLProperty.set(
|
||||||
|
|||||||
@@ -20,15 +20,19 @@ public class RaceXMLTemplate {
|
|||||||
private List<Corner> roundings;
|
private List<Corner> roundings;
|
||||||
private List<Limit> courseLimit;
|
private List<Limit> courseLimit;
|
||||||
private List<CompoundMark> course;
|
private List<CompoundMark> course;
|
||||||
|
private Integer maxPlayers;
|
||||||
|
private Boolean tokensEnabled;
|
||||||
|
|
||||||
public RaceXMLTemplate(List<ServerYacht> yachts, List<Token> tokens, List<Corner> roundings,
|
public RaceXMLTemplate(List<ServerYacht> yachts, List<Token> tokens, List<Corner> roundings,
|
||||||
List<Limit> limit, List<CompoundMark> course) {
|
List<Limit> limit, List<CompoundMark> course, Integer maxPlayers, Boolean tokensEnabled) {
|
||||||
this.yachts = yachts;
|
this.yachts = yachts;
|
||||||
this.tokens = tokens;
|
this.tokens = tokens;
|
||||||
this.roundings = roundings;
|
this.roundings = roundings;
|
||||||
this.courseLimit = limit;
|
this.courseLimit = limit;
|
||||||
this.course = course;
|
this.course = course;
|
||||||
startTime = LocalDateTime.now();
|
startTime = LocalDateTime.now();
|
||||||
|
this.maxPlayers = maxPlayers;
|
||||||
|
this.tokensEnabled = tokensEnabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -83,4 +87,12 @@ public class RaceXMLTemplate {
|
|||||||
public void setTokens(List<Token> tokens) {
|
public void setTokens(List<Token> tokens) {
|
||||||
this.tokens = tokens;
|
this.tokens = tokens;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getTokensEnabled() {
|
||||||
|
return tokensEnabled.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getMaxPlayers() {
|
||||||
|
return maxPlayers.toString();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ import javax.xml.parsers.DocumentBuilderFactory;
|
|||||||
import javax.xml.parsers.ParserConfigurationException;
|
import javax.xml.parsers.ParserConfigurationException;
|
||||||
import org.w3c.dom.Document;
|
import org.w3c.dom.Document;
|
||||||
import org.w3c.dom.Element;
|
import org.w3c.dom.Element;
|
||||||
|
import org.w3c.dom.NamedNodeMap;
|
||||||
import org.w3c.dom.Node;
|
import org.w3c.dom.Node;
|
||||||
import org.w3c.dom.NodeList;
|
import org.w3c.dom.NodeList;
|
||||||
import org.xml.sax.SAXException;
|
import org.xml.sax.SAXException;
|
||||||
@@ -35,6 +36,8 @@ import seng302.visualiser.fxObjects.assets_3D.BoatMeshType;
|
|||||||
*/
|
*/
|
||||||
public class XMLParser {
|
public class XMLParser {
|
||||||
|
|
||||||
|
private static final int MAX_PLAYERS = 8;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the text content of a given child element tag, assuming it exists, as an Integer.
|
* Returns the text content of a given child element tag, assuming it exists, as an Integer.
|
||||||
*
|
*
|
||||||
@@ -45,7 +48,7 @@ public class XMLParser {
|
|||||||
private static Integer getElementInt(Element ele, String tag) {
|
private static Integer getElementInt(Element ele, String tag) {
|
||||||
NodeList tagList = ele.getElementsByTagName(tag);
|
NodeList tagList = ele.getElementsByTagName(tag);
|
||||||
if (tagList.getLength() > 0) {
|
if (tagList.getLength() > 0) {
|
||||||
return Integer.parseInt(tagList.item(0).getTextContent());
|
return Integer.parseInt(tagList.item(0).getTextContent().replaceAll("\\s+",""));
|
||||||
} else {
|
} else {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -77,7 +80,7 @@ public class XMLParser {
|
|||||||
private static Double getElementDouble(Element ele, String tag) {
|
private static Double getElementDouble(Element ele, String tag) {
|
||||||
NodeList tagList = ele.getElementsByTagName(tag);
|
NodeList tagList = ele.getElementsByTagName(tag);
|
||||||
if (tagList.getLength() > 0) {
|
if (tagList.getLength() > 0) {
|
||||||
return Double.parseDouble(tagList.item(0).getTextContent());
|
return Double.parseDouble(tagList.item(0).getTextContent().replaceAll("\\s+",""));
|
||||||
} else {
|
} else {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -195,6 +198,31 @@ public class XMLParser {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Boolean tokensEnabled(Document doc) {
|
||||||
|
Element docEle = doc.getDocumentElement();
|
||||||
|
try {
|
||||||
|
Node tokenNode = docEle.getAttributeNode("Tokens");
|
||||||
|
return Boolean.valueOf(XMLParser.getNodeAttributeString(tokenNode, "Enabled"));
|
||||||
|
} catch (NullPointerException npe) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Integer getMaxPlayers(Document doc) {
|
||||||
|
Element docEle = doc.getDocumentElement();
|
||||||
|
try {
|
||||||
|
NamedNodeMap namedNodeMap = docEle.getElementsByTagName("Participants").item(0).getAttributes();
|
||||||
|
Node node = namedNodeMap.getNamedItem("MaxPlayers");
|
||||||
|
if (node != null) {
|
||||||
|
return Integer.parseInt(node.getNodeValue());
|
||||||
|
}
|
||||||
|
} catch (NullPointerException npe) {
|
||||||
|
npe.printStackTrace();
|
||||||
|
return MAX_PLAYERS;
|
||||||
|
}
|
||||||
|
return MAX_PLAYERS;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns an object containing the data extracted from the given xml formatted document
|
* Returns an object containing the data extracted from the given xml formatted document
|
||||||
*
|
*
|
||||||
@@ -350,9 +378,13 @@ public class XMLParser {
|
|||||||
* @param url the location of the race def file
|
* @param url the location of the race def file
|
||||||
* @param serverName the name of the server
|
* @param serverName the name of the server
|
||||||
* @param repetitions the repetitions of a segment of the race def file.
|
* @param repetitions the repetitions of a segment of the race def file.
|
||||||
|
* @param maxPlayers max number of players. uses the default race max if null or greater than the actual max.
|
||||||
|
* @param tokensEnabled if tokens are enabled
|
||||||
* @return a pair which contains regatta string, race string as key, value pair.
|
* @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) {
|
public static Pair<RegattaXMLTemplate, RaceXMLTemplate> parseRaceDef(
|
||||||
|
String url, String serverName, Integer repetitions, Integer maxPlayers, Boolean tokensEnabled
|
||||||
|
) {
|
||||||
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
||||||
DocumentBuilder db;
|
DocumentBuilder db;
|
||||||
Document doc = null;
|
Document doc = null;
|
||||||
@@ -369,16 +401,25 @@ public class XMLParser {
|
|||||||
XMLParser.getElementDouble(docEle, "CentralLat"),
|
XMLParser.getElementDouble(docEle, "CentralLat"),
|
||||||
XMLParser.getElementDouble(docEle, "CentralLng")
|
XMLParser.getElementDouble(docEle, "CentralLng")
|
||||||
);
|
);
|
||||||
|
|
||||||
XMLGenerator xmlGenerator = new XMLGenerator();
|
XMLGenerator xmlGenerator = new XMLGenerator();
|
||||||
xmlGenerator.setRegattaTemplate(regattaXMLTemplate);
|
xmlGenerator.setRegattaTemplate(regattaXMLTemplate);
|
||||||
|
|
||||||
RaceXMLTemplate raceXMLTemplate = new RaceXMLTemplate(new ArrayList<>(), new ArrayList<>(),
|
if (maxPlayers == null) {
|
||||||
|
maxPlayers = XMLParser.getElementInt(docEle, "MaxPlayers");
|
||||||
|
} else if (maxPlayers > XMLParser.getElementInt(docEle, "MaxPlayers")) {
|
||||||
|
maxPlayers = XMLParser.getElementInt(docEle, "MaxPlayers");
|
||||||
|
}
|
||||||
|
|
||||||
|
RaceXMLTemplate raceXMLTemplate = new RaceXMLTemplate(
|
||||||
|
new ArrayList<>(), new ArrayList<>(),
|
||||||
XMLParser.extractMarkOrderRaceDef(docEle, repetitions),
|
XMLParser.extractMarkOrderRaceDef(docEle, repetitions),
|
||||||
XMLParser.extractCourseLimitRaceDef(docEle),
|
XMLParser.extractCourseLimitRaceDef(docEle),
|
||||||
XMLParser.extractCompoundMarksRaceDef(docEle)
|
XMLParser.extractCompoundMarksRaceDef(docEle),
|
||||||
|
maxPlayers, tokensEnabled
|
||||||
);
|
);
|
||||||
xmlGenerator.setRaceTemplate(raceXMLTemplate);
|
xmlGenerator.setRaceTemplate(raceXMLTemplate);
|
||||||
return new Pair<>(xmlGenerator.getRegattaAsXml(), xmlGenerator.getRaceAsXml());
|
return new Pair<>(regattaXMLTemplate, raceXMLTemplate);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static List<Corner> extractMarkOrderRaceDef(Element docEle, int repitions){
|
private static List<Corner> extractMarkOrderRaceDef(Element docEle, int repitions){
|
||||||
|
|||||||
@@ -30,6 +30,9 @@ import seng302.gameServer.messages.XMLMessage;
|
|||||||
import seng302.gameServer.messages.XMLMessageSubType;
|
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.model.stream.xml.generator.RaceXMLTemplate;
|
||||||
|
import seng302.model.stream.xml.generator.RegattaXMLTemplate;
|
||||||
|
import seng302.utilities.XMLGenerator;
|
||||||
import seng302.utilities.XMLParser;
|
import seng302.utilities.XMLParser;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -373,18 +376,23 @@ public class ClientToServerThread implements Runnable {
|
|||||||
return clientId;
|
return clientId;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void sendXML(String path, String serverName, int legRepeats) {
|
public void sendXML(String path, String serverName, Integer legRepeats, Integer maxPlayers, Boolean tokensEnabled) {
|
||||||
Pair<String, String> regattaRace = XMLParser.parseRaceDef(path, serverName, legRepeats);
|
Pair<RegattaXMLTemplate, RaceXMLTemplate> regattaRace = XMLParser.parseRaceDef(
|
||||||
|
path, serverName, legRepeats, maxPlayers, tokensEnabled
|
||||||
|
);
|
||||||
|
XMLGenerator xmlGenerator = new XMLGenerator();
|
||||||
|
xmlGenerator.setRegattaTemplate(regattaRace.getKey());
|
||||||
|
xmlGenerator.setRaceTemplate(regattaRace.getValue());
|
||||||
|
String regatta = xmlGenerator.getRegattaAsXml();
|
||||||
|
String race = xmlGenerator.getRaceAsXml();
|
||||||
sendByteBuffer(
|
sendByteBuffer(
|
||||||
new XMLMessage(
|
new XMLMessage(
|
||||||
regattaRace.getKey(), XMLMessageSubType.REGATTA, regattaRace.getKey().length()
|
regatta, XMLMessageSubType.REGATTA, regatta.length()
|
||||||
).getBuffer()
|
).getBuffer()
|
||||||
);
|
);
|
||||||
|
|
||||||
sendByteBuffer(
|
sendByteBuffer(
|
||||||
new XMLMessage(
|
new XMLMessage(
|
||||||
regattaRace.getValue(), XMLMessageSubType.RACE, regattaRace.getValue().length()
|
race, XMLMessageSubType.RACE, race.length()
|
||||||
).getBuffer()
|
).getBuffer()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -122,18 +122,20 @@ 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, String race, Integer numLegs) {
|
public ServerDescription runAsHost(
|
||||||
|
String ipAddress, Integer portNumber, String serverName, Integer maxPlayers, String race,
|
||||||
|
Integer numLegs, Boolean tokensEnabled
|
||||||
|
) {
|
||||||
XMLGenerator.setDefaultRaceName(serverName);
|
XMLGenerator.setDefaultRaceName(serverName);
|
||||||
|
|
||||||
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);
|
socketThread.sendXML(race, serverName, numLegs, maxPlayers, tokensEnabled);
|
||||||
while (regattaData == null){
|
while (regattaData == null){
|
||||||
try {
|
try {
|
||||||
Thread.sleep(100);
|
Thread.sleep(100);
|
||||||
|
|||||||
@@ -13,8 +13,11 @@ import javax.xml.parsers.ParserConfigurationException;
|
|||||||
import org.w3c.dom.Document;
|
import org.w3c.dom.Document;
|
||||||
import org.xml.sax.InputSource;
|
import org.xml.sax.InputSource;
|
||||||
import org.xml.sax.SAXException;
|
import org.xml.sax.SAXException;
|
||||||
|
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.RaceXMLData;
|
||||||
import seng302.model.stream.xml.parser.RegattaXMLData;
|
import seng302.model.stream.xml.parser.RegattaXMLData;
|
||||||
|
import seng302.utilities.XMLGenerator;
|
||||||
import seng302.utilities.XMLParser;
|
import seng302.utilities.XMLParser;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -26,8 +29,10 @@ public class MapMaker {
|
|||||||
private List<RaceXMLData> races = new ArrayList<>();
|
private List<RaceXMLData> races = new ArrayList<>();
|
||||||
private List<RegattaXMLData> regattas = new ArrayList<>();
|
private List<RegattaXMLData> regattas = new ArrayList<>();
|
||||||
private List<String> filePaths = new ArrayList<>();
|
private List<String> filePaths = new ArrayList<>();
|
||||||
|
private List<Integer> maxPlayers = new ArrayList<>();
|
||||||
private static MapMaker instance;
|
private static MapMaker instance;
|
||||||
private int index = 0;
|
private int index = 0;
|
||||||
|
private XMLGenerator xmlGenerator = new XMLGenerator();
|
||||||
|
|
||||||
public static MapMaker getInstance() {
|
public static MapMaker getInstance() {
|
||||||
if (instance == null) {
|
if (instance == null) {
|
||||||
@@ -41,32 +46,39 @@ public class MapMaker {
|
|||||||
File[] directoryListing = dir.listFiles();
|
File[] directoryListing = dir.listFiles();
|
||||||
if (directoryListing != null) {
|
if (directoryListing != null) {
|
||||||
for (File child : directoryListing) {
|
for (File child : directoryListing) {
|
||||||
Pair<String, String> regattaRace = XMLParser.parseRaceDef(
|
Pair<RegattaXMLTemplate, RaceXMLTemplate> regattaRace = XMLParser.parseRaceDef(
|
||||||
child.getAbsolutePath(), "", 1
|
child.getAbsolutePath(), "", 1, null, false
|
||||||
);
|
);
|
||||||
filePaths.add(child.getAbsolutePath());
|
filePaths.add(child.getAbsolutePath());
|
||||||
|
RegattaXMLTemplate regattaTemplate = regattaRace.getKey();
|
||||||
|
regattas.add(new RegattaXMLData(
|
||||||
|
regattaTemplate.getRegattaId(),
|
||||||
|
regattaTemplate.getName(),
|
||||||
|
regattaTemplate.getCourseName(),
|
||||||
|
regattaTemplate.getLatitude(),
|
||||||
|
regattaTemplate.getLongitude(),
|
||||||
|
regattaTemplate.getUtcOffset()
|
||||||
|
));
|
||||||
|
|
||||||
|
RaceXMLTemplate raceTemplate = regattaRace.getValue();
|
||||||
|
xmlGenerator.setRaceTemplate(raceTemplate);
|
||||||
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(new InputSource(new StringReader(regattaRace.getKey())));
|
doc = db.parse(new InputSource(new StringReader(xmlGenerator.getRaceAsXml())));
|
||||||
} 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) {
|
} catch (ParserConfigurationException | IOException | SAXException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|
||||||
RaceXMLData race = XMLParser.parseRace(doc);
|
RaceXMLData race = XMLParser.parseRace(doc);
|
||||||
MapPreview mapPreview = new MapPreview(
|
maxPlayers.add(XMLParser.getMaxPlayers(doc));
|
||||||
|
|
||||||
|
mapPreviews.add(new MapPreview(
|
||||||
new ArrayList<>(race.getCompoundMarks().values()),
|
new ArrayList<>(race.getCompoundMarks().values()),
|
||||||
race.getMarkSequence(), race.getCourseLimit()
|
race.getMarkSequence(), race.getCourseLimit()
|
||||||
);
|
));
|
||||||
mapPreviews.add(mapPreview);
|
|
||||||
races.add(race);
|
races.add(race);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -101,4 +113,8 @@ public class MapMaker {
|
|||||||
public String getCurrentRacePath() {
|
public String getCurrentRacePath() {
|
||||||
return filePaths.get(index);
|
return filePaths.get(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Integer getMaxPlayers() {
|
||||||
|
return maxPlayers.get(index);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,7 +10,6 @@ import java.util.ResourceBundle;
|
|||||||
import javafx.fxml.FXML;
|
import javafx.fxml.FXML;
|
||||||
import javafx.fxml.Initializable;
|
import javafx.fxml.Initializable;
|
||||||
import javafx.scene.control.Label;
|
import javafx.scene.control.Label;
|
||||||
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;
|
||||||
@@ -50,13 +49,18 @@ public class ServerCreationController implements Initializable {
|
|||||||
//---------FXML END---------//
|
//---------FXML END---------//
|
||||||
|
|
||||||
public void initialize(URL location, ResourceBundle resources) {
|
public void initialize(URL location, ResourceBundle resources) {
|
||||||
legsSlider.setMax(10);
|
|
||||||
maxPlayersSlider.valueProperty().addListener(
|
maxPlayersSlider.valueProperty().addListener(
|
||||||
(observable, oldValue, newValue) -> updateMaxPlayerLabel()
|
(observable, oldValue, newValue) -> updateMaxPlayerLabel()
|
||||||
);
|
);
|
||||||
|
maxPlayersSlider.setMax(mapMaker.getMaxPlayers());
|
||||||
|
maxPlayersSlider.setValue(mapMaker.getMaxPlayers());
|
||||||
|
|
||||||
legsSlider.valueProperty().addListener(
|
legsSlider.valueProperty().addListener(
|
||||||
(obs, oldVal, newVal) -> updateLegSliderLabel()
|
(obs, oldVal, newVal) -> updateLegSliderLabel()
|
||||||
);
|
);
|
||||||
|
legsSlider.setMax(10);
|
||||||
|
|
||||||
updateMaxPlayerLabel();
|
updateMaxPlayerLabel();
|
||||||
updateLegSliderLabel();
|
updateLegSliderLabel();
|
||||||
|
|
||||||
@@ -105,7 +109,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(), mapMaker.getCurrentRacePath(), (int) legsSlider.getValue());
|
.getValue(), mapMaker.getCurrentRacePath(), (int) legsSlider.getValue(), pickupsCheckBox.isSelected());
|
||||||
|
|
||||||
ViewManager.getInstance().setProperty("serverName", serverDescription.getName());
|
ViewManager.getInstance().setProperty("serverName", serverDescription.getName());
|
||||||
ViewManager.getInstance().setProperty("mapName", serverDescription.getMapName());
|
ViewManager.getInstance().setProperty("mapName", serverDescription.getMapName());
|
||||||
@@ -127,20 +131,24 @@ public class ServerCreationController implements Initializable {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void playButtonHoverSound(MouseEvent mouseEvent) {
|
public void playButtonHoverSound() {
|
||||||
Sounds.playHoverSound();
|
Sounds.playHoverSound();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void nextMap() {
|
private void nextMap() {
|
||||||
mapMaker.next();
|
mapMaker.next();
|
||||||
mapHolder.getChildren().setAll(mapMaker.getCurrentGameView());
|
updateMap();
|
||||||
mapNameLabel.setText(mapMaker.getCurrentRegatta().getCourseName());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void lastMap() {
|
private void lastMap() {
|
||||||
mapMaker.previous();
|
mapMaker.previous();
|
||||||
mapHolder.getChildren().setAll(mapMaker.getCurrentGameView());
|
updateMap();
|
||||||
mapNameLabel.setText(mapMaker.getCurrentRegatta().getCourseName());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void updateMap() {
|
||||||
|
mapHolder.getChildren().setAll(mapMaker.getCurrentGameView());
|
||||||
|
mapNameLabel.setText(mapMaker.getCurrentRegatta().getCourseName());
|
||||||
|
maxPlayersSlider.setMax(mapMaker.getMaxPlayers());
|
||||||
|
maxPlayersSlider.setValue(mapMaker.getMaxPlayers());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,8 @@
|
|||||||
<CentralLat> 57.6679590 </CentralLat>
|
<CentralLat> 57.6679590 </CentralLat>
|
||||||
<CentralLng> 11.8503233 </CentralLng>
|
<CentralLng> 11.8503233 </CentralLng>
|
||||||
|
|
||||||
|
<MaxPlayers> 10 </MaxPlayers>
|
||||||
|
|
||||||
<Marks>
|
<Marks>
|
||||||
<CompoundMark CompoundMarkID="1">
|
<CompoundMark CompoundMarkID="1">
|
||||||
<Mark Lat="57.670603" Lng="11.828262"/>
|
<Mark Lat="57.670603" Lng="11.828262"/>
|
||||||
|
|||||||
@@ -6,6 +6,8 @@
|
|||||||
<CentralLat> -14.6457 </CentralLat>
|
<CentralLat> -14.6457 </CentralLat>
|
||||||
<CentralLng> 47.612855 </CentralLng>
|
<CentralLng> 47.612855 </CentralLng>
|
||||||
|
|
||||||
|
<MaxPlayers> 5 </MaxPlayers>
|
||||||
|
|
||||||
<Marks>
|
<Marks>
|
||||||
<CompoundMark CompoundMarkID="1">
|
<CompoundMark CompoundMarkID="1">
|
||||||
<Mark Lat="-14.071412" Lng="47.05756"/>
|
<Mark Lat="-14.071412" Lng="47.05756"/>
|
||||||
|
|||||||
@@ -5,13 +5,13 @@
|
|||||||
<RaceID>15082901</RaceID>
|
<RaceID>15082901</RaceID>
|
||||||
<RaceType>Fleet</RaceType>
|
<RaceType>Fleet</RaceType>
|
||||||
|
|
||||||
<Participants>
|
<Participants MaxPlayers="${maxPlayers}">
|
||||||
<#list boats as boat>
|
<#list boats as boat>
|
||||||
<Yacht SourceID="${boat.sourceId}"/>
|
<Yacht SourceID="${boat.sourceId}"/>
|
||||||
</#list>
|
</#list>
|
||||||
</Participants>
|
</Participants>
|
||||||
|
|
||||||
<Tokens>
|
<Tokens Enabled="${tokensEnabled}">
|
||||||
<#list tokens as token>
|
<#list tokens as token>
|
||||||
<Token TokenType="${token.tokenType}" TargetLat="${token.lat?c}" TargetLng="${token.lng?c}"/>
|
<Token TokenType="${token.tokenType}" TargetLat="${token.lat?c}" TargetLng="${token.lng?c}"/>
|
||||||
</#list>
|
</#list>
|
||||||
|
|||||||
@@ -4,14 +4,20 @@ import static junit.framework.TestCase.assertEquals;
|
|||||||
import static junit.framework.TestCase.assertFalse;
|
import static junit.framework.TestCase.assertFalse;
|
||||||
import static junit.framework.TestCase.assertTrue;
|
import static junit.framework.TestCase.assertTrue;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.StringReader;
|
||||||
|
import javax.xml.parsers.DocumentBuilder;
|
||||||
|
import javax.xml.parsers.DocumentBuilderFactory;
|
||||||
|
import javax.xml.parsers.ParserConfigurationException;
|
||||||
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 org.w3c.dom.Document;
|
||||||
|
import org.xml.sax.InputSource;
|
||||||
|
import org.xml.sax.SAXException;
|
||||||
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.XMLGenerator;
|
||||||
import seng302.utilities.StreamParser;
|
|
||||||
import seng302.utilities.XMLParser;
|
import seng302.utilities.XMLParser;
|
||||||
|
|
||||||
public class MarkOrderTest {
|
public class MarkOrderTest {
|
||||||
@@ -35,17 +41,22 @@ public class MarkOrderTest {
|
|||||||
///-( \' \\
|
///-( \' \\
|
||||||
|
|
||||||
*/
|
*/
|
||||||
markOrder = new MarkOrder(
|
XMLGenerator xmlGenerator = new XMLGenerator();
|
||||||
XMLParser.parseRace(
|
xmlGenerator.setRaceTemplate(
|
||||||
StreamParser.extractXmlMessage(
|
XMLParser.parseRaceDef(
|
||||||
new StreamPacket(
|
"/maps/default.xml", "test", 2, null, false
|
||||||
XMLMessageSubType.RACE.getType(),
|
).getValue()
|
||||||
XMLParser.parseRaceDef("/maps/default.xml", "test", 2).getValue().length(),
|
|
||||||
0, XMLParser.parseRaceDef("/maps/default.xml", "test", 2).getValue().getBytes()
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
);
|
);
|
||||||
|
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
||||||
|
DocumentBuilder db;
|
||||||
|
Document doc = null;
|
||||||
|
try {
|
||||||
|
db = dbf.newDocumentBuilder();
|
||||||
|
doc = db.parse(new InputSource(new StringReader(xmlGenerator.getRaceAsXml())));
|
||||||
|
} catch (ParserConfigurationException | IOException | SAXException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
markOrder = new MarkOrder(XMLParser.parseRace(doc));
|
||||||
currentSeqID = 0;
|
currentSeqID = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user