re-implemented existing functionality in UI

- Correct player count is shown in server list
- Servers now advertise their capacity and number of players connected
- Players can click join on the servers in the server list
- Direct connect works
- Can set max players / server name in host dialog
- Server starts correctly when host clicked
- Implemented boat customization
- Implemented 'begin race button', and disabled it for players that aren't hosts
- Added countdown timer in lobby
- Fixed bug where app wouldn't close

Tags: #story[1245]
This commit is contained in:
Michael Rausch
2017-09-08 18:00:09 +12:00
parent b35126ff4e
commit cf4f8813d2
23 changed files with 509 additions and 346 deletions
@@ -23,7 +23,6 @@ import java.util.*;
* Created by wmu16 on 10/07/17.
*/
public class GameState implements Runnable {
@FunctionalInterface
interface NewMessageListener {
@@ -33,7 +32,6 @@ public class GameState implements Runnable {
private Logger logger = LoggerFactory.getLogger(GameState.class);
private static final Integer STATE_UPDATES_PER_SECOND = 60;
public static Integer MAX_PLAYERS = 8;
public static Double ROUNDING_DISTANCE = 50d; // TODO: 14/08/17 wmu16 - Look into this value further
public static final Double MARK_COLLISION_DISTANCE = 15d;
public static final Double YACHT_COLLISION_DISTANCE = 25.0;
@@ -56,6 +54,8 @@ public class GameState implements Runnable {
private static long startTime;
private static Set<Mark> marks;
private static List<Limit> courseLimit;
private static Integer maxPlayers = 8;
private static List<NewMessageListener> markListeners;
@@ -268,8 +268,6 @@ public class GameState implements Runnable {
checkForLegProgression(yacht);
raceFinished = false;
}
}
if (raceFinished) {
@@ -685,10 +683,23 @@ public class GameState implements Runnable {
customizationFlag = false;
}
public static Integer getSpacesLeft(){
Integer numberOfPlayers = GameState.getPlayers().size();
Integer maxPlayers = GameState.MAX_PLAYERS;
public static Integer getNumberOfPlayers(){
Integer numPlayers = 0;
return maxPlayers - numberOfPlayers - 1;
for(Player p : getPlayers()){
if(p.getSocket().isConnected()){
numPlayers++;
}
}
return numPlayers;
}
public static Integer getCapacity(){
return maxPlayers;
}
public static void setMaxPlayers(Integer newMax){
maxPlayers = newMax;
}
}
@@ -50,8 +50,9 @@ public class MainServerThread implements Runnable, ClientConnectionDelegate {
private ServerSocket serverSocket = null;
private ArrayList<ServerToClientThread> serverToClientThreads = new ArrayList<>();
private Logger logger = LoggerFactory.getLogger(MainServerThread.class);
private static Integer capacity;
private void startAdvertisingServer(){
private void startAdvertisingServer() {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db;
Document doc;
@@ -70,16 +71,19 @@ public class MainServerThread implements Runnable, ClientConnectionDelegate {
RegattaXMLData regattaXMLData = XMLParser.parseRegatta(doc);
Integer spacesLeft = GameState.getSpacesLeft();
Integer capacity = GameState.getCapacity();
Integer numPlayers = GameState.getNumberOfPlayers();
Integer spacesLeft = capacity - numPlayers;
// No spaces left on server
if (spacesLeft < 1){
if (spacesLeft < 1) {
return;
}
// Start advertising server
try{
ServerAdvertiser.getInstance().setMapName(regattaXMLData.getCourseName()).setSpacesLeft(spacesLeft);
try {
ServerAdvertiser.getInstance().setMapName(regattaXMLData.getCourseName()).setCapacity(capacity).setNumberOfPlayers(numPlayers);
ServerAdvertiser.getInstance().registerGame(PORT, regattaXMLData.getRegattaName());
} catch (IOException e) {
logger.warn("Could not register server");
@@ -229,7 +233,7 @@ public class MainServerThread implements Runnable, ClientConnectionDelegate {
serverToClientThread.addDisconnectListener(this::clientDisconnected);
try {
ServerAdvertiser.getInstance().setSpacesLeft(GameState.getSpacesLeft());
ServerAdvertiser.getInstance().setNumberOfPlayers(GameState.getNumberOfPlayers());
} catch (IOException e) {
logger.warn("Couldn't update advertisement");
}
@@ -261,7 +265,7 @@ public class MainServerThread implements Runnable, ClientConnectionDelegate {
serverToClientThreads.remove(closedConnection);
try {
ServerAdvertiser.getInstance().setSpacesLeft(GameState.getSpacesLeft());
ServerAdvertiser.getInstance().setNumberOfPlayers(GameState.getNumberOfPlayers());
} catch (IOException e) {
logger.warn("Couldn't update advertisement");
}
@@ -273,7 +277,7 @@ public class MainServerThread implements Runnable, ClientConnectionDelegate {
try {
ServerAdvertiser.getInstance().unregister();
} catch (IOException e) {
logger.warn("Error unregistered server");
logger.warn("Error unregistering server");
}
initialiseBoatPositions();
@@ -41,6 +41,8 @@ public class ServerAdvertiser {
props = new Hashtable<>();
props.put("map", "");
props.put("spacesLeft", "0");
props.put("capacity", "0");
props.put("players", "0");
}
/**
@@ -72,12 +74,27 @@ public class ServerAdvertiser {
}
/**
* Set the spaces left on the server and broadcast an update on the network
* @param spacesLeft The number of spaces left on the server
* Set the number of players on the server and broadcast an update on the network
* @param numPlayers The number of players on the server
* @return The current ServerAdvertiser instance
*/
public ServerAdvertiser setSpacesLeft(Integer spacesLeft){
props.replace("spacesLeft", spacesLeft.toString());
public ServerAdvertiser setNumberOfPlayers(Integer numPlayers){
props.replace("players", numPlayers.toString());
if (serviceInfo != null){
serviceInfo.setText(props);
}
return instance;
}
/**
* Set the max capacity of the server and broadcast an update on the network
* @param capacity The maximum capacity of the server
* @return The current ServerAdvertiser instance
*/
public ServerAdvertiser setCapacity(Integer capacity){
props.replace("capacity", capacity.toString());
if (serviceInfo != null){
serviceInfo.setText(props);
@@ -1,18 +1,20 @@
package seng302.gameServer;
public class ServerDescription {
private Integer capacity;
private String address;
private Integer portNum;
private String serverName;
private String mapName;
private Integer spacesLeft;
private Integer numPlayers;
public ServerDescription(String serverName, String mapName, Integer spacesLeft, String address, Integer portNum){
public ServerDescription(String serverName, String mapName, Integer numPlayers, Integer capacity, String address, Integer portNum){
this.serverName = serverName;
this.mapName = mapName;
this.spacesLeft = spacesLeft;
this.numPlayers = numPlayers;
this.address = address;
this.portNum = portNum;
this.capacity = capacity;
}
@@ -32,8 +34,12 @@ public class ServerDescription {
return address;
}
public Integer spacesLeft() {
return spacesLeft;
public Integer getNumPlayers() {
return numPlayers;
}
public Integer getCapacity(){
return capacity;
}
@Override
@@ -62,6 +68,10 @@ public class ServerDescription {
return false;
}
if (!this.getCapacity().equals(other.getCapacity())){
return false;
}
return true;
}
@@ -132,7 +132,7 @@ public class ServerToClientThread implements Runnable, Observer {
return;
}
if (GameState.getPlayers().size() >= GameState.MAX_PLAYERS){
if (GameState.getPlayers().size() >= GameState.getCapacity()){
RegistrationResponseMessage responseMessage = new RegistrationResponseMessage(0, RegistrationResponseStatus.FAILURE_FULL);
os.write(responseMessage.getBuffer());
return;