Merge remote-tracking branch 'origin/Story1247_AutoDiscovery' into NewUI

# Conflicts:
#	pom.xml
#	src/main/java/seng302/App.java
#	src/main/java/seng302/visualiser/controllers/StartScreenController.java
#	src/main/resources/views/StartScreenView.fxml
This commit is contained in:
Michael Rausch
2017-09-07 16:36:30 +12:00
16 changed files with 607 additions and 90 deletions
@@ -142,6 +142,7 @@ public class GameClient {
}
private void loadStartScreen() {
socketThread.setSocketToClose();
if (server != null) {
server.terminate();
@@ -0,0 +1,113 @@
package seng302.visualiser;
import seng302.gameServer.ServerAdvertiser;
import seng302.gameServer.ServerDescription;
import javax.jmdns.JmDNS;
import javax.jmdns.ServiceEvent;
import javax.jmdns.ServiceListener;
import java.io.IOException;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;
import static seng302.gameServer.ServerAdvertiser.getLocalHostIp;
/**
* Listens for servers on the local network
*/
public class ServerListener{
private static ServerListener instance;
private ServerListenerDelegate delegate;
private JmDNS jmdns = null;
GameServeMonitor listener;
private class GameServeMonitor implements ServiceListener {
private Set<ServerDescription> servers;
GameServeMonitor(){
servers = new HashSet<>();
}
/**
* A Service has been detected but not resolved
* @param event The ServiceEvent
*/
@Override
public void serviceAdded(ServiceEvent event) {
}
/**
* A Service has been removed / unregistered
* @param event The ServiceEvent
*/
@Override
public void serviceRemoved(ServiceEvent event) {
String serverName = event.getInfo().getName();
ServerDescription toRemove = null;
for (ServerDescription server : servers){
if (server.getName().equals(serverName)){
toRemove = server;
}
}
if (toRemove != null){
servers.remove(toRemove);
}
delegate.serverRemoved(new ArrayList<ServerDescription>(servers));
// Get all other servers with the same name to respond if they are up
jmdns.requestServiceInfo(ServerAdvertiser.SERVICE_TYPE, serverName);
}
/**
* A Service has been added and resolved
* @param event The ServiceEvent
*/
@Override
public void serviceResolved(ServiceEvent event) {
String address = event.getInfo().getServer();
Integer portNum = event.getInfo().getPort();
String serverName = event.getInfo().getName();
String mapName = event.getInfo().getPropertyString("map");
Integer spacesLeft = Integer.parseInt(event.getInfo().getPropertyString("spacesLeft"));
ServerDescription serverDescription = new ServerDescription(serverName, mapName, spacesLeft, address, portNum);
servers.remove(serverDescription);
servers.add(serverDescription);
delegate.serverDetected(serverDescription, new ArrayList<ServerDescription>(servers));
}
}
private ServerListener() throws IOException {
jmdns = JmDNS.create(InetAddress.getByName(getLocalHostIp()));
listener = new GameServeMonitor();
jmdns.addServiceListener(ServerAdvertiser.SERVICE_TYPE, listener);
}
public static ServerListener getInstance() throws IOException {
if (instance == null){
instance = new ServerListener();
}
return instance;
}
/**
* Set the delegate to handle events
* @param delegate .
*/
public void setDelegate(ServerListenerDelegate delegate){
this.delegate = delegate;
}
}
@@ -0,0 +1,10 @@
package seng302.visualiser;
import seng302.gameServer.ServerDescription;
import java.util.List;
public interface ServerListenerDelegate {
void serverRemoved(List<ServerDescription> currentServers);
void serverDetected(ServerDescription serverDescription, List<ServerDescription> servers);
}
@@ -5,6 +5,7 @@ import com.jfoenix.controls.JFXButton;
import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.application.Platform;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
@@ -14,6 +15,26 @@ import javafx.scene.effect.DropShadow;
import javafx.scene.paint.Color;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
import javafx.scene.control.ListView;
import javafx.scene.control.TextField;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.GridPane;
import seng302.gameServer.ServerAdvertiser;
import seng302.gameServer.ServerDescription;
import seng302.visualiser.GameClient;
import seng302.visualiser.ServerListener;
import seng302.visualiser.ServerListenerDelegate;
import java.io.IOException;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.URL;
import java.util.Enumeration;
import java.util.List;
import java.util.ResourceBundle;
public class StartScreenController implements Initializable {
@@ -26,6 +47,38 @@ public class StartScreenController implements Initializable {
private Node serverList;
private Logger logger = LoggerFactory.getLogger(StartScreenController.class);
public void initialize(URL url, ResourceBundle resourceBundle) {
// gameClient = new GameClient(holder);
try {
ServerListener.getInstance().setDelegate(this);
} catch (IOException e) {
e.printStackTrace();
}
joinLobbyButton.setOnAction(event -> joinLobbyClicked());
}
//
// /**
// * Loads the fxml content into the parent pane
// * @param jfxUrl
// * @return the controller of the fxml
// */
// private Object setContentPane(String jfxUrl) {
// try {
// AnchorPane contentPane = (AnchorPane) startScreen2.getParent();
// contentPane.getChildren().removeAll();
// contentPane.getChildren().clear();
// contentPane.getStylesheets().add(getClass().getResource("/css/master.css").toString());
// FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource(jfxUrl));
// contentPane.getChildren().addAll((Pane) fxmlLoader.load());
//
// return fxmlLoader.getController();
// } catch (IOException e) {
// e.printStackTrace();
// }
// return null;
// }
private void setInitialDropShadow(){
DropShadow dropShadow = new DropShadow();
@@ -1,7 +1,5 @@
package seng302.visualiser.fxObjects;
import java.util.ArrayList;
import java.util.List;
import javafx.application.Platform;
import javafx.geometry.Point2D;
import javafx.scene.Group;
@@ -14,6 +12,9 @@ import javafx.scene.shape.Polyline;
import javafx.scene.shape.StrokeLineCap;
import javafx.scene.transform.Rotate;
import java.util.ArrayList;
import java.util.List;
/**
* BoatGroup is a javafx group that by default contains a graphical objects for representing a 2
* dimensional boat. It contains a single polygon for the boat, a group of lines to show it's path,
@@ -130,6 +131,7 @@ public class BoatObject extends Group {
* @param rotation The rotation by which the boat moves
* @param velocity The velocity the boat is moving
* @param sailIn Boolean to toggle sail state.
* @param windDir .
*/
public void moveTo(double x, double y, double rotation, double velocity, Boolean sailIn, double windDir) {
Double dx = Math.abs(boatPoly.getLayoutX() - x);