mirror of
https://github.com/michaelrausch/Party-Parrots-At-Sea.git
synced 2026-05-09 14:28:43 +00:00
Fixed discovery bug, implemented server list, added server parameters
- Resolved DNS bug by updating to a newer version of JmDNS - Added server list, this is populated with new servers as they are discovered - Added map name and spaces remaining to server advertisement Tags: #story[1247]
This commit is contained in:
@@ -142,6 +142,7 @@ public class GameClient {
|
||||
}
|
||||
|
||||
private void loadStartScreen() {
|
||||
|
||||
socketThread.setSocketToClose();
|
||||
if (server != null) {
|
||||
server.terminate();
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package seng302.visualiser;
|
||||
|
||||
import seng302.gameServer.ServerAdvertiser;
|
||||
import seng302.gameServer.ServerDescription;
|
||||
|
||||
import javax.jmdns.JmDNS;
|
||||
import javax.jmdns.ServiceEvent;
|
||||
@@ -8,36 +9,67 @@ import javax.jmdns.ServiceListener;
|
||||
import java.io.IOException;
|
||||
import java.net.InetAddress;
|
||||
import java.net.UnknownHostException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
public class ServerListener{
|
||||
private static ServerListener instance;
|
||||
private ServerListenerDelegate delegate;
|
||||
private JmDNS jmdns = null;
|
||||
GameServeMonitor listener;
|
||||
|
||||
private class GameServerListener implements ServiceListener {
|
||||
GameServerListener(){
|
||||
System.out.println("Created GSL instance");
|
||||
private class GameServeMonitor implements ServiceListener {
|
||||
private List<ServerDescription> servers;
|
||||
|
||||
GameServeMonitor(){
|
||||
servers = new ArrayList<>();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void serviceAdded(ServiceEvent event) {
|
||||
delegate.serverDetected(event.getName(), "", 123, event.getInfo().getInet4Addresses().toString());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void serviceRemoved(ServiceEvent event) {
|
||||
delegate.serverRemoved(event.getName());
|
||||
Integer serverId = -1;
|
||||
|
||||
for (int i = 0; i < servers.size(); i++){
|
||||
ServerDescription server = servers.get(i);
|
||||
if (server.getName().equals(event.getInfo().getName())){
|
||||
serverId = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (serverId > 0){
|
||||
servers.remove(serverId);
|
||||
}
|
||||
|
||||
delegate.serverRemoved(servers);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void serviceResolved(ServiceEvent event) {
|
||||
// Do nothing
|
||||
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.add(serverDescription);
|
||||
|
||||
delegate.serverDetected(serverDescription, Collections.unmodifiableList(servers));
|
||||
}
|
||||
}
|
||||
|
||||
private ServerListener() throws IOException {
|
||||
jmdns = JmDNS.create(InetAddress.getLocalHost());
|
||||
jmdns.addServiceListener(ServerAdvertiser.SERVICE_TYPE, new GameServerListener());
|
||||
listener = new GameServeMonitor();
|
||||
jmdns.addServiceListener(ServerAdvertiser.SERVICE_TYPE, listener);
|
||||
}
|
||||
|
||||
public static ServerListener getInstance() throws IOException {
|
||||
|
||||
@@ -1,6 +1,10 @@
|
||||
package seng302.visualiser;
|
||||
|
||||
import seng302.gameServer.ServerDescription;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface ServerListenerDelegate {
|
||||
void serverDetected(String serverName, String mapName, Integer placesLeft, String serverAddress);
|
||||
void serverRemoved(String serverName);
|
||||
void serverRemoved(List<ServerDescription> currentServers);
|
||||
void serverDetected(ServerDescription serverDescription, List<ServerDescription> servers);
|
||||
}
|
||||
|
||||
@@ -1,24 +1,33 @@
|
||||
package seng302.visualiser.controllers;
|
||||
|
||||
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.ResourceBundle;
|
||||
import java.util.*;
|
||||
|
||||
import com.sun.security.ntlm.Server;
|
||||
import cucumber.api.java.en.But;
|
||||
import javafx.fxml.FXML;
|
||||
import javafx.fxml.Initializable;
|
||||
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.GameState;
|
||||
import seng302.gameServer.ServerDescription;
|
||||
import seng302.visualiser.GameClient;
|
||||
import seng302.visualiser.ServerListener;
|
||||
import seng302.visualiser.ServerListenerDelegate;
|
||||
|
||||
/**
|
||||
* A Class describing the actions of the start screen controller
|
||||
* Created by wmu16 on 10/07/17.
|
||||
*/
|
||||
public class StartScreenController implements Initializable {
|
||||
public class StartScreenController implements Initializable, ServerListenerDelegate{
|
||||
|
||||
@FXML
|
||||
private TextField ipTextField;
|
||||
@@ -29,10 +38,27 @@ public class StartScreenController implements Initializable {
|
||||
@FXML
|
||||
private AnchorPane holder;
|
||||
|
||||
@FXML
|
||||
private Button joinLobbyButton;
|
||||
|
||||
@FXML
|
||||
private ListView serverList;
|
||||
|
||||
private List<ServerDescription> servers = null;
|
||||
private boolean serverListDirty = false;
|
||||
|
||||
GameClient gameClient;
|
||||
|
||||
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());
|
||||
}
|
||||
//
|
||||
// /**
|
||||
@@ -165,4 +191,41 @@ public class StartScreenController implements Initializable {
|
||||
// ClientState.setHostIp(ipAddress);
|
||||
return ipAddress;
|
||||
}
|
||||
|
||||
private void refreshServerList(List<ServerDescription> servers){
|
||||
this.serverList.getItems().clear();
|
||||
|
||||
for (ServerDescription server : servers){
|
||||
serverList.getItems().add(server.getName() + " - " + server.getMapName() + " - " + server.spacesLeft() + " spaces left");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void serverRemoved(List<ServerDescription> currentServers) {
|
||||
this.servers = currentServers;
|
||||
|
||||
refreshServerList(currentServers);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void serverDetected(ServerDescription serverDescription, List<ServerDescription> servers) {
|
||||
this.servers = servers;
|
||||
|
||||
refreshServerList(servers);
|
||||
}
|
||||
|
||||
private void joinLobbyClicked() {
|
||||
Integer selectedServer = serverList.getSelectionModel().getSelectedIndex();
|
||||
|
||||
if (this.servers == null || selectedServer >= this.servers.size()){
|
||||
Alert alert = new Alert(Alert.AlertType.ERROR, "Invalid server selected");
|
||||
alert.showAndWait();
|
||||
return;
|
||||
}
|
||||
|
||||
ServerDescription server = servers.get(selectedServer);
|
||||
|
||||
gameClient = new GameClient(holder);
|
||||
gameClient.runAsClient(server.getAddress().trim().toLowerCase(), server.portNumber());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user