diff --git a/src/main/java/seng302/client/ClientPacketParser.java b/src/main/java/seng302/client/ClientPacketParser.java index e6b51190..06b22818 100644 --- a/src/main/java/seng302/client/ClientPacketParser.java +++ b/src/main/java/seng302/client/ClientPacketParser.java @@ -215,6 +215,11 @@ public class ClientPacketParser { clientBoat.setEstimateTimeAtNextMark(estTimeAtNextMark); clientBoat.setEstimateTimeAtFinish(estTimeAtFinish); } + + // 3 is race started + if (raceStatus == 3) { + ClientState.setRaceStarted(true); + } } private static void setBoatLegPosition(Yacht updatingBoat, Integer leg){ diff --git a/src/main/java/seng302/client/ClientStateQueryingRunnable.java b/src/main/java/seng302/client/ClientStateQueryingRunnable.java index a71d045b..67cf1dbf 100644 --- a/src/main/java/seng302/client/ClientStateQueryingRunnable.java +++ b/src/main/java/seng302/client/ClientStateQueryingRunnable.java @@ -15,10 +15,6 @@ public class ClientStateQueryingRunnable extends Observable implements Runnable @Override public void run() { while(!terminate) { -// if (ClientState.isRaceStarted() && ClientState.isConnectedToHost()) { -// setChanged(); -// notifyObservers(); -// } // Sleeping the thread so it will respond to the if statement below // if you know a better fix, pls tell me :) -ryan try { @@ -26,9 +22,16 @@ public class ClientStateQueryingRunnable extends Observable implements Runnable } catch (InterruptedException e) { e.printStackTrace(); } + + if (ClientState.isRaceStarted() && ClientState.isConnectedToHost()) { + setChanged(); + notifyObservers("game started"); + terminate(); + } + if (ClientState.isDirtyState()) { setChanged(); - notifyObservers(); + notifyObservers("update players"); ClientState.setDirtyState(false); } } diff --git a/src/main/java/seng302/client/ClientToServerThread.java b/src/main/java/seng302/client/ClientToServerThread.java index 0f405819..649ef2de 100644 --- a/src/main/java/seng302/client/ClientToServerThread.java +++ b/src/main/java/seng302/client/ClientToServerThread.java @@ -95,11 +95,9 @@ public class ClientToServerThread implements Runnable { // TODO: 17/07/17 wmu16 - Fix this or maybe we dont need to go through the main server at all!?!? // packetBufferDelegate.addToBuffer(new StreamPacket(type, payloadLength, timeStamp, payload)); } else { - System.err.println("Packet has been dropped"); + clientLog("Packet has been dropped", 1); } - } - } catch (Exception e) { closeSocket(); e.printStackTrace(); diff --git a/src/main/java/seng302/controllers/LobbyController.java b/src/main/java/seng302/controllers/LobbyController.java index 34b6b549..a1eaadb6 100644 --- a/src/main/java/seng302/controllers/LobbyController.java +++ b/src/main/java/seng302/controllers/LobbyController.java @@ -14,6 +14,7 @@ import javafx.collections.ObservableList; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; import javafx.fxml.Initializable; +import javafx.scene.control.Button; import javafx.scene.control.ListView; import javafx.scene.image.Image; import javafx.scene.image.ImageView; @@ -27,19 +28,20 @@ import seng302.client.ClientState; import seng302.client.ClientStateQueryingRunnable; import seng302.gameServer.GameStages; import seng302.gameServer.GameState; +import seng302.gameServer.MainServerThread; /** * A class describing the actions of the lobby screen * Created by wmu16 on 10/07/17. */ public class LobbyController implements Initializable, Observer{ - - @FXML private GridPane lobbyScreen; @FXML private Text lobbyIpText; @FXML + private Button readyButton; + @FXML private ListView firstListView; @FXML private ListView secondListView; @@ -83,6 +85,9 @@ public class LobbyController implements Initializable, Observer{ private static ObservableList eighthCompetitor = FXCollections.observableArrayList(); private ClientStateQueryingRunnable clientStateQueryingRunnable; + private Boolean switchedPane = false; + private MainServerThread mainServerThread; + private void setContentPane(String jfxUrl) { try { AnchorPane contentPane = (AnchorPane) lobbyScreen.getParent(); @@ -100,10 +105,14 @@ public class LobbyController implements Initializable, Observer{ @Override public void initialize(URL location, ResourceBundle resources) { - if (ClientState.isHost()) + if (ClientState.isHost()) { lobbyIpText.setText("Lobby Host IP: " + ClientState.getHostIp()); - else + readyButton.setDisable(false); + } + else { lobbyIpText.setText("Connected to IP: "); + readyButton.setDisable(true); + } initialiseListView(); // initialiseLobbyControllerThread(); // initialiseImageView(); // parrot gif init @@ -122,9 +131,12 @@ public class LobbyController implements Initializable, Observer{ Platform.runLater(new Runnable() { @Override public void run() { -// switchToRaceView(); - initialiseListView(); -// clientStateQueryingRunnable.terminate(); + if (arg.equals("game started") && !switchedPane) { + switchToRaceView(); + } + if (arg.equals(("update players"))) { + initialiseListView(); + } } }); } @@ -161,8 +173,6 @@ public class LobbyController implements Initializable, Observer{ } } - - firstListView.setItems(firstCompetitor); secondListView.setItems(secondCompetitor); thirdListView.setItems(thirdCompetitor); @@ -218,9 +228,10 @@ public class LobbyController implements Initializable, Observer{ @FXML public void readyButtonPressed() { +// setContentPane("/views/RaceView.fxml"); playTheme(); - setContentPane("/views/RaceView.fxml"); GameState.setCurrentStage(GameStages.RACING); + mainServerThread.startGame(); } @@ -242,6 +253,13 @@ public class LobbyController implements Initializable, Observer{ } private void switchToRaceView() { - setContentPane("/views/RaceView.fxml"); + if (!switchedPane) { + switchedPane = true; + setContentPane("/views/RaceView.fxml"); + } + } + + public void setMainServerThread(MainServerThread mainServerThread) { + this.mainServerThread = mainServerThread; } } diff --git a/src/main/java/seng302/controllers/StartScreenController.java b/src/main/java/seng302/controllers/StartScreenController.java index 5cfceeca..b2503027 100644 --- a/src/main/java/seng302/controllers/StartScreenController.java +++ b/src/main/java/seng302/controllers/StartScreenController.java @@ -72,14 +72,15 @@ public class StartScreenController { String ipAddress = InetAddress.getLocalHost().getHostAddress(); // get the lobby controller so that we can pass the game server thread to it new GameState(getLocalHostIp()); - new MainServerThread(); + MainServerThread mainServerThread = new MainServerThread(); ClientState.setHost(true); // host will connect and handshake to itself after setting up the server // TODO: 24/07/17 wmu16 - Make port number some static global type constant? ClientToServerThread clientToServerThread = new ClientToServerThread(ClientState.getHostIp(), 4942); ClientState.setConnectedToHost(true); controller.setClientToServerThread(clientToServerThread); - setContentPane("/views/LobbyView.fxml"); + LobbyController lobbyController = (LobbyController) setContentPane("/views/LobbyView.fxml"); + lobbyController.setMainServerThread(mainServerThread); } catch (Exception e) { Alert alert = new Alert(AlertType.ERROR); alert.setHeaderText("Cannot host"); diff --git a/src/main/java/seng302/gameServer/MainServerThread.java b/src/main/java/seng302/gameServer/MainServerThread.java index f61c18ea..793cc6f0 100644 --- a/src/main/java/seng302/gameServer/MainServerThread.java +++ b/src/main/java/seng302/gameServer/MainServerThread.java @@ -99,9 +99,6 @@ public class MainServerThread extends Observable implements Runnable, PacketBuff } } - - - public void updateClients() { for (ServerToClientThread serverToClientThread : serverToClientThreads) { serverToClientThread.updateClient(); @@ -146,4 +143,9 @@ public class MainServerThread extends Observable implements Runnable, PacketBuff // sendXml(); } + public void startGame() { + for (ServerToClientThread serverToClientThread : serverToClientThreads) { + serverToClientThread.sendRaceStatusMessage(); + } + } } diff --git a/src/main/java/seng302/gameServer/ServerToClientThread.java b/src/main/java/seng302/gameServer/ServerToClientThread.java index cdeaf374..106ec27f 100644 --- a/src/main/java/seng302/gameServer/ServerToClientThread.java +++ b/src/main/java/seng302/gameServer/ServerToClientThread.java @@ -7,6 +7,7 @@ import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import java.util.ArrayList; +import java.util.List; import java.util.Observable; import java.util.Observer; import java.util.Random; @@ -22,12 +23,18 @@ import seng302.models.xml.Regatta; import seng302.models.xml.XMLGenerator; import seng302.server.messages.BoatActionType; import seng302.server.messages.BoatLocationMessage; +import seng302.server.messages.BoatStatus; +import seng302.server.messages.BoatSubMessage; import seng302.server.messages.Message; import java.io.*; import java.net.Socket; import java.util.zip.CRC32; import java.util.zip.Checksum; +import seng302.server.messages.RaceStatus; +import seng302.server.messages.RaceStatusMessage; +import seng302.server.messages.RaceType; +import seng302.server.messages.WindDirection; import seng302.server.messages.XMLMessage; import seng302.server.messages.XMLMessageSubType; import seng302.server.messages.XMLMessage; @@ -171,6 +178,8 @@ public class ServerToClientThread implements Runnable, Observer { // message = new XMLMessage(xml, XMLMessageSubType.BOAT, 0); // sendMessage(message); // System.out.println("[server] send message 4 " + message); +// sendMessage(getRaceStatusMessage()); +// System.out.println("sent race status"); //------- while(true) { @@ -221,7 +230,7 @@ public class ServerToClientThread implements Runnable, Observer { break; } } else { - System.err.println("Packet has been dropped"); + serverLog("Packet has been dropped", 1); } } } catch (Exception e) { @@ -366,10 +375,42 @@ public class ServerToClientThread implements Runnable, Observer { } } - - - public Thread getThread() { return thread; } + + public void sendRaceStatusMessage(){ + // variables taken from GameServerThread + int TIME_TILL_RACE_START = 20*1000; + long startTime = System.currentTimeMillis() + TIME_TILL_RACE_START; + + List boatSubMessages = new ArrayList<>(); + BoatStatus boatStatus; + RaceStatus raceStatus; + + for (Player player : GameState.getPlayers()){ + Yacht y = player.getYacht(); + + if (GameState.getCurrentStage() == GameStages.PRE_RACE){ + boatStatus = BoatStatus.PRESTART; + } + else if(GameState.getCurrentStage() == GameStages.RACING){ + boatStatus = BoatStatus.RACING; + } else { + boatStatus = BoatStatus.UNDEFINED; + } + + BoatSubMessage m = new BoatSubMessage(y.getSourceId(), boatStatus, 0, 0, 0, 1234l, 1234l); + boatSubMessages.add(m); + } + + if (GameState.getCurrentStage() == GameStages.RACING){ + raceStatus = RaceStatus.STARTED; + } else { + raceStatus = RaceStatus.WARNING; + } + + sendMessage(new RaceStatusMessage(1, raceStatus, startTime, WindDirection.SOUTH, + 100, GameState.getPlayers().size(), RaceType.MATCH_RACE, 1, boatSubMessages)); + } } diff --git a/src/main/resources/views/LobbyView.fxml b/src/main/resources/views/LobbyView.fxml index 1c327227..e867a519 100644 --- a/src/main/resources/views/LobbyView.fxml +++ b/src/main/resources/views/LobbyView.fxml @@ -38,7 +38,7 @@ -