package visualiser.Controllers; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.fxml.FXML; import javafx.scene.control.Button; import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; import javafx.scene.control.TextField; import javafx.scene.layout.AnchorPane; import network.Messages.HostGame; import visualiser.model.RaceConnection; import visualiser.network.MatchBrowserClientRunnable; import visualiser.network.MatchBrowserInterface; import visualiser.network.MatchBrowserLobbyInterface; import java.io.IOException; import java.net.DatagramSocket; import java.net.Socket; import java.net.SocketException; import java.net.URL; import java.util.Observable; import java.util.Observer; import java.util.ResourceBundle; /** * Controller for the Lobby for entering games */ public class LobbyController extends Controller { @FXML private AnchorPane lobbyWrapper; @FXML private TableView lobbyTable; @FXML private TableColumn gameNameColumn; @FXML private TableColumn hostNameColumn; @FXML private TableColumn statusColumn; @FXML private Button joinGameBtn; @FXML private TextField addressFld; @FXML private TextField portFld; private ObservableList connections; private ObservableList customConnections; //the socket for match browser private DatagramSocket udpSocket; private MatchBrowserLobbyInterface matchBrowserLobbyInterface; @Override public void initialize(URL location, ResourceBundle resources) { connections = FXCollections.observableArrayList(); customConnections = FXCollections.observableArrayList(); //connections.add(new RaceConnection("localhost", 4942, "Local Game")); lobbyTable.setItems(connections); gameNameColumn.setCellValueFactory(cellData -> cellData.getValue().gamenameProperty()); hostNameColumn.setCellValueFactory(cellData -> cellData.getValue().hostnameProperty()); statusColumn.setCellValueFactory(cellData -> cellData.getValue().statusProperty()); lobbyTable.getSelectionModel().selectedItemProperty().addListener((obs, prev, curr) -> { if (curr != null && curr.statusProperty().getValue().equals("Ready")) { joinGameBtn.setDisable(false); } else { joinGameBtn.setDisable(true); } }); joinGameBtn.setDisable(true); } /** * Refreshes the connections in the lobby */ public void refreshBtnPressed(){ addServerGames(); for(RaceConnection connection: connections) { connection.check(); } try { if (lobbyTable.getSelectionModel().getSelectedItem().statusProperty().getValue().equals("Ready")) { joinGameBtn.setDisable(false); } else { joinGameBtn.setDisable(true); } } catch (Exception e){} } /** * Connect to a connection. */ public void connectSocket() { try{ RaceConnection connection = lobbyTable.getSelectionModel().getSelectedItem(); Socket socket = new Socket(connection.getHostname(), connection.getPort()); lobbyWrapper.setVisible(false); parent.enterGameLobby(socket, false); } catch (IOException e) { /* Never reached */ e.printStackTrace(); } } public void menuBtnPressed(){ matchBrowserLobbyInterface.closeSocket(); lobbyWrapper.setVisible(false); parent.enterTitle(); } /** * adds a new connection */ public void addConnectionPressed(){ String hostName = addressFld.getText(); String portString = portFld.getText(); try{ int port = Integer.parseInt(portString); customConnections.add(new RaceConnection(hostName, port, "Boat Game")); connections.addAll(customConnections); addressFld.clear(); portFld.clear(); }catch(NumberFormatException e){ System.err.println("Port number entered is not a number"); } } public AnchorPane startWrapper(){ return lobbyWrapper; } /** * Enter the lobby page. */ public void enterLobby(DatagramSocket udpSocket){ lobbyWrapper.setVisible(true); this.udpSocket = udpSocket; matchBrowserLobbyInterface = new MatchBrowserLobbyInterface(); try { matchBrowserLobbyInterface.startReceivingHostData(new DatagramSocket(4941)); Observer o = new Observer() { @Override public void update(Observable o, Object arg) { refreshBtnPressed(); } }; matchBrowserLobbyInterface.addObserver(o); } catch (SocketException e) { System.err.println("Socket 4941 in use"); } } /** * Adds the games received from the server */ private void addServerGames() { connections.clear(); connections.addAll(customConnections); for (HostGame game : matchBrowserLobbyInterface.getGames()) { connections.add(new RaceConnection(game.getIp(), 4942, "Boat Game")); } } }