Merge branch '1273_Skybox' into 'develop'

1273 skybox

Server Discovery:
 - Created server discovery server.
 - Implemented protocols to support matchmaking & room code connection
 - Improved error handling for server disconnections

Skybox:
 - Added a skybox
 - Added a terrain mesh

See merge request !79
This commit is contained in:
William Muir
2017-09-27 21:52:34 +13:00
90 changed files with 4390 additions and 2137 deletions
+38 -47
View File
@@ -1,29 +1,12 @@
package seng302.gameServer;
import java.util.ArrayList;
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 java.util.Timer;
import java.util.TimerTask;
import java.io.IOException;
import java.util.*;
import javafx.scene.paint.Color;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
import seng302.gameServer.messages.BoatAction;
import seng302.gameServer.messages.BoatStatus;
import seng302.gameServer.messages.ChatterMessage;
import seng302.gameServer.messages.CustomizeRequestType;
import seng302.gameServer.messages.MarkRoundingMessage;
import seng302.gameServer.messages.MarkType;
import seng302.gameServer.messages.Message;
import seng302.gameServer.messages.RoundingBoatStatus;
import seng302.gameServer.messages.*;
import seng302.model.GeoPoint;
import seng302.model.Limit;
import seng302.model.Player;
@@ -32,6 +15,7 @@ import seng302.model.ServerYacht;
import seng302.model.mark.CompoundMark;
import seng302.model.mark.Mark;
import seng302.model.mark.MarkOrder;
import seng302.model.stream.xml.parser.RaceXMLData;
import seng302.model.token.Token;
import seng302.model.token.TokenType;
import seng302.utilities.GeoUtility;
@@ -96,8 +80,8 @@ public class GameState implements Runnable {
private static GameStages currentStage;
private static MarkOrder markOrder;
private static long startTime;
private static List<Mark> marks;
private static List<Limit> courseLimit;
private static Set<Mark> marks = new HashSet<>();
private static List<Limit> courseLimit = new ArrayList<>();
private static Integer maxPlayers = 8;
private static List<Token> tokensInPlay;
@@ -106,46 +90,33 @@ public class GameState implements Runnable {
private static List<NewMessageListener> newMessageListeners;
private static Map<Player, String> playerStringMap = new HashMap<>();
private static boolean tokensEnabled = false;
public GameState(String hostIpAddress) {
public GameState() {
windDirection = 180d;
windSpeed = 10000d;
yachts = new HashMap<>();
tokensInPlay = new ArrayList<>();
players = new ArrayList<>();
GameState.hostIpAddress = hostIpAddress;
customizationFlag = false;
playerHasLeftFlag = false;
serverSpeedMultiplier = 1.0;
currentStage = GameStages.LOBBYING;
previousUpdateTime = System.currentTimeMillis();
markOrder = new MarkOrder(); //This could be instantiated at some point with a select map?
newMessageListeners = new ArrayList<>();
marks = new MarkOrder().getAllMarks();
randomSpawn = new RandomSpawn(markOrder.getOrderedUniqueCompoundMarks());
resetStartTime();
setCourseLimit("/server_config/race.xml");
//setCourseLimit("/server_config/race.xml");
new Thread(this, "GameState").start(); //Run the auto updates on the game state
}
private void setCourseLimit(String url) {
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
documentBuilderFactory.setNamespaceAware(true);
DocumentBuilder documentBuilder;
Document document = null;
try {
documentBuilder = documentBuilderFactory.newDocumentBuilder();
document = documentBuilder.parse(new InputSource(getClass().getResourceAsStream(url)));
} catch (Exception e) {
// sorry, we have to catch general one, otherwise we have to catch five different exceptions.
logger.trace("Failed to load course limit for boundary collision detection.", e);
public static void setRace(RaceXMLData raceXMLData) {
markOrder = new MarkOrder(raceXMLData);
for (CompoundMark compoundMark : raceXMLData.getCompoundMarks().values()){
marks.addAll(compoundMark.getMarks());
}
courseLimit = XMLParser.parseRace(document).getCourseLimit();
}
public static String getHostIpAddress() {
return hostIpAddress;
randomSpawn = new RandomSpawn(markOrder.getOrderedUniqueCompoundMarks());
courseLimit = raceXMLData.getCourseLimit();
}
public static List<Player> getPlayers() {
@@ -156,6 +127,10 @@ public class GameState implements Runnable {
return tokensInPlay;
}
public static Set<Mark> getMarks() {
return Collections.unmodifiableSet(marks);
}
public static void addPlayer(Player player) {
players.add(player);
String playerText = player.getYacht().getSourceId() + " " + player.getYacht().getBoatName()
@@ -266,8 +241,10 @@ public class GameState implements Runnable {
timer.schedule(new TimerTask() {
@Override
public void run() {
spawnNewToken();
notifyMessageListeners(MessageFactory.getRaceXML());
if (tokensEnabled) {
spawnNewToken();
notifyMessageListeners(MessageFactory.getRaceXML());
}
}
}, 0, TOKEN_SPAWN_TIME);
}
@@ -353,6 +330,7 @@ public class GameState implements Runnable {
// token.assignType(TokenType.RANDOM);
logger.debug("Spawned token of type " + token.getTokenType());
tokensInPlay.add(token);
MessageFactory.updateTokens(tokensInPlay);
}
/**
@@ -399,6 +377,8 @@ public class GameState implements Runnable {
if (collidedToken != null) {
tokensInPlay.remove(collidedToken);
powerUpYacht(yacht, collidedToken);
MessageFactory.updateTokens(tokensInPlay);
notifyMessageListeners(MessageFactory.getRaceXML());
}
checkPowerUpTimeout(yacht);
@@ -531,6 +511,7 @@ public class GameState implements Runnable {
return true;
}
}
if (GeoUtility.checkCrossedLine(courseLimit.get(courseLimit.size() - 1), courseLimit.get(0),
yacht.getLastLocation(), yacht.getLocation()) != 0) {
return true;
@@ -1043,6 +1024,12 @@ public class GameState implements Runnable {
public static void setMaxPlayers(Integer newMax){
maxPlayers = newMax;
try {
ServerAdvertiser.getInstance().setCapacity(newMax);
} catch (IOException e) {
logger.warn("Couldn't update max players");
}
}
public static void endRace () {
@@ -1053,4 +1040,8 @@ public class GameState implements Runnable {
public static double getServerSpeedMultiplier() {
return serverSpeedMultiplier;
}
public static void setTokensEnabled (boolean tokensEnabled) {
GameState.tokensEnabled = tokensEnabled;
}
}