Merge remote-tracking branch 'origin/Story1055_Send_Race_Status_When_Host_Ready' into develop

# Conflicts:
#	src/main/java/seng302/controllers/LobbyController.java
This commit is contained in:
Zhi You Tan
2017-07-25 00:03:58 +12:00
8 changed files with 97 additions and 29 deletions
@@ -215,6 +215,11 @@ public class ClientPacketParser {
clientBoat.setEstimateTimeAtNextMark(estTimeAtNextMark); clientBoat.setEstimateTimeAtNextMark(estTimeAtNextMark);
clientBoat.setEstimateTimeAtFinish(estTimeAtFinish); clientBoat.setEstimateTimeAtFinish(estTimeAtFinish);
} }
// 3 is race started
if (raceStatus == 3) {
ClientState.setRaceStarted(true);
}
} }
private static void setBoatLegPosition(Yacht updatingBoat, Integer leg){ private static void setBoatLegPosition(Yacht updatingBoat, Integer leg){
@@ -15,10 +15,6 @@ public class ClientStateQueryingRunnable extends Observable implements Runnable
@Override @Override
public void run() { public void run() {
while(!terminate) { while(!terminate) {
// if (ClientState.isRaceStarted() && ClientState.isConnectedToHost()) {
// setChanged();
// notifyObservers();
// }
// Sleeping the thread so it will respond to the if statement below // Sleeping the thread so it will respond to the if statement below
// if you know a better fix, pls tell me :) -ryan // if you know a better fix, pls tell me :) -ryan
try { try {
@@ -26,9 +22,16 @@ public class ClientStateQueryingRunnable extends Observable implements Runnable
} catch (InterruptedException e) { } catch (InterruptedException e) {
e.printStackTrace(); e.printStackTrace();
} }
if (ClientState.isRaceStarted() && ClientState.isConnectedToHost()) {
setChanged();
notifyObservers("game started");
terminate();
}
if (ClientState.isDirtyState()) { if (ClientState.isDirtyState()) {
setChanged(); setChanged();
notifyObservers(); notifyObservers("update players");
ClientState.setDirtyState(false); ClientState.setDirtyState(false);
} }
} }
@@ -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!?!? // 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)); // packetBufferDelegate.addToBuffer(new StreamPacket(type, payloadLength, timeStamp, payload));
} else { } else {
System.err.println("Packet has been dropped"); clientLog("Packet has been dropped", 1);
} }
} }
} catch (Exception e) { } catch (Exception e) {
closeSocket(); closeSocket();
e.printStackTrace(); e.printStackTrace();
@@ -14,6 +14,7 @@ import javafx.collections.ObservableList;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader; import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable; import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.ListView; import javafx.scene.control.ListView;
import javafx.scene.image.Image; import javafx.scene.image.Image;
import javafx.scene.image.ImageView; import javafx.scene.image.ImageView;
@@ -27,19 +28,20 @@ import seng302.client.ClientState;
import seng302.client.ClientStateQueryingRunnable; import seng302.client.ClientStateQueryingRunnable;
import seng302.gameServer.GameStages; import seng302.gameServer.GameStages;
import seng302.gameServer.GameState; import seng302.gameServer.GameState;
import seng302.gameServer.MainServerThread;
/** /**
* A class describing the actions of the lobby screen * A class describing the actions of the lobby screen
* Created by wmu16 on 10/07/17. * Created by wmu16 on 10/07/17.
*/ */
public class LobbyController implements Initializable, Observer{ public class LobbyController implements Initializable, Observer{
@FXML @FXML
private GridPane lobbyScreen; private GridPane lobbyScreen;
@FXML @FXML
private Text lobbyIpText; private Text lobbyIpText;
@FXML @FXML
private Button readyButton;
@FXML
private ListView firstListView; private ListView firstListView;
@FXML @FXML
private ListView secondListView; private ListView secondListView;
@@ -83,6 +85,9 @@ public class LobbyController implements Initializable, Observer{
private static ObservableList<String> eighthCompetitor = FXCollections.observableArrayList(); private static ObservableList<String> eighthCompetitor = FXCollections.observableArrayList();
private ClientStateQueryingRunnable clientStateQueryingRunnable; private ClientStateQueryingRunnable clientStateQueryingRunnable;
private Boolean switchedPane = false;
private MainServerThread mainServerThread;
private void setContentPane(String jfxUrl) { private void setContentPane(String jfxUrl) {
try { try {
AnchorPane contentPane = (AnchorPane) lobbyScreen.getParent(); AnchorPane contentPane = (AnchorPane) lobbyScreen.getParent();
@@ -100,10 +105,14 @@ public class LobbyController implements Initializable, Observer{
@Override @Override
public void initialize(URL location, ResourceBundle resources) { public void initialize(URL location, ResourceBundle resources) {
if (ClientState.isHost()) if (ClientState.isHost()) {
lobbyIpText.setText("Lobby Host IP: " + ClientState.getHostIp()); lobbyIpText.setText("Lobby Host IP: " + ClientState.getHostIp());
else readyButton.setDisable(false);
}
else {
lobbyIpText.setText("Connected to IP: "); lobbyIpText.setText("Connected to IP: ");
readyButton.setDisable(true);
}
initialiseListView(); initialiseListView();
// initialiseLobbyControllerThread(); // initialiseLobbyControllerThread();
// initialiseImageView(); // parrot gif init // initialiseImageView(); // parrot gif init
@@ -122,9 +131,12 @@ public class LobbyController implements Initializable, Observer{
Platform.runLater(new Runnable() { Platform.runLater(new Runnable() {
@Override @Override
public void run() { public void run() {
// switchToRaceView(); if (arg.equals("game started") && !switchedPane) {
switchToRaceView();
}
if (arg.equals(("update players"))) {
initialiseListView(); initialiseListView();
// clientStateQueryingRunnable.terminate(); }
} }
}); });
} }
@@ -161,8 +173,6 @@ public class LobbyController implements Initializable, Observer{
} }
} }
firstListView.setItems(firstCompetitor); firstListView.setItems(firstCompetitor);
secondListView.setItems(secondCompetitor); secondListView.setItems(secondCompetitor);
thirdListView.setItems(thirdCompetitor); thirdListView.setItems(thirdCompetitor);
@@ -218,9 +228,10 @@ public class LobbyController implements Initializable, Observer{
@FXML @FXML
public void readyButtonPressed() { public void readyButtonPressed() {
// setContentPane("/views/RaceView.fxml");
playTheme(); playTheme();
setContentPane("/views/RaceView.fxml");
GameState.setCurrentStage(GameStages.RACING); GameState.setCurrentStage(GameStages.RACING);
mainServerThread.startGame();
} }
@@ -242,6 +253,13 @@ public class LobbyController implements Initializable, Observer{
} }
private void switchToRaceView() { private void switchToRaceView() {
if (!switchedPane) {
switchedPane = true;
setContentPane("/views/RaceView.fxml"); setContentPane("/views/RaceView.fxml");
} }
}
public void setMainServerThread(MainServerThread mainServerThread) {
this.mainServerThread = mainServerThread;
}
} }
@@ -72,14 +72,15 @@ public class StartScreenController {
String ipAddress = InetAddress.getLocalHost().getHostAddress(); String ipAddress = InetAddress.getLocalHost().getHostAddress();
// get the lobby controller so that we can pass the game server thread to it // get the lobby controller so that we can pass the game server thread to it
new GameState(getLocalHostIp()); new GameState(getLocalHostIp());
new MainServerThread(); MainServerThread mainServerThread = new MainServerThread();
ClientState.setHost(true); ClientState.setHost(true);
// host will connect and handshake to itself after setting up the server // 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? // TODO: 24/07/17 wmu16 - Make port number some static global type constant?
ClientToServerThread clientToServerThread = new ClientToServerThread(ClientState.getHostIp(), 4942); ClientToServerThread clientToServerThread = new ClientToServerThread(ClientState.getHostIp(), 4942);
ClientState.setConnectedToHost(true); ClientState.setConnectedToHost(true);
controller.setClientToServerThread(clientToServerThread); controller.setClientToServerThread(clientToServerThread);
setContentPane("/views/LobbyView.fxml"); LobbyController lobbyController = (LobbyController) setContentPane("/views/LobbyView.fxml");
lobbyController.setMainServerThread(mainServerThread);
} catch (Exception e) { } catch (Exception e) {
Alert alert = new Alert(AlertType.ERROR); Alert alert = new Alert(AlertType.ERROR);
alert.setHeaderText("Cannot host"); alert.setHeaderText("Cannot host");
@@ -99,9 +99,6 @@ public class MainServerThread extends Observable implements Runnable, PacketBuff
} }
} }
public void updateClients() { public void updateClients() {
for (ServerToClientThread serverToClientThread : serverToClientThreads) { for (ServerToClientThread serverToClientThread : serverToClientThreads) {
serverToClientThread.updateClient(); serverToClientThread.updateClient();
@@ -146,4 +143,9 @@ public class MainServerThread extends Observable implements Runnable, PacketBuff
// sendXml(); // sendXml();
} }
public void startGame() {
for (ServerToClientThread serverToClientThread : serverToClientThreads) {
serverToClientThread.sendRaceStatusMessage();
}
}
} }
@@ -7,6 +7,7 @@ import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.net.Socket; import java.net.Socket;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List;
import java.util.Observable; import java.util.Observable;
import java.util.Observer; import java.util.Observer;
import java.util.Random; import java.util.Random;
@@ -22,12 +23,18 @@ import seng302.models.xml.Regatta;
import seng302.models.xml.XMLGenerator; import seng302.models.xml.XMLGenerator;
import seng302.server.messages.BoatActionType; import seng302.server.messages.BoatActionType;
import seng302.server.messages.BoatLocationMessage; import seng302.server.messages.BoatLocationMessage;
import seng302.server.messages.BoatStatus;
import seng302.server.messages.BoatSubMessage;
import seng302.server.messages.Message; import seng302.server.messages.Message;
import java.io.*; import java.io.*;
import java.net.Socket; import java.net.Socket;
import java.util.zip.CRC32; import java.util.zip.CRC32;
import java.util.zip.Checksum; 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.XMLMessage;
import seng302.server.messages.XMLMessageSubType; import seng302.server.messages.XMLMessageSubType;
import seng302.server.messages.XMLMessage; import seng302.server.messages.XMLMessage;
@@ -171,6 +178,8 @@ public class ServerToClientThread implements Runnable, Observer {
// message = new XMLMessage(xml, XMLMessageSubType.BOAT, 0); // message = new XMLMessage(xml, XMLMessageSubType.BOAT, 0);
// sendMessage(message); // sendMessage(message);
// System.out.println("[server] send message 4 " + message); // System.out.println("[server] send message 4 " + message);
// sendMessage(getRaceStatusMessage());
// System.out.println("sent race status");
//------- //-------
while(true) { while(true) {
@@ -221,7 +230,7 @@ public class ServerToClientThread implements Runnable, Observer {
break; break;
} }
} else { } else {
System.err.println("Packet has been dropped"); serverLog("Packet has been dropped", 1);
} }
} }
} catch (Exception e) { } catch (Exception e) {
@@ -366,10 +375,42 @@ public class ServerToClientThread implements Runnable, Observer {
} }
} }
public Thread getThread() { public Thread getThread() {
return thread; 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<BoatSubMessage> 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));
}
} }
+1 -1
View File
@@ -38,7 +38,7 @@
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
</rowConstraints> </rowConstraints>
<children> <children>
<Button focusTraversable="false" mnemonicParsing="false" onAction="#readyButtonPressed" prefWidth="101.0" text="Ready" GridPane.halignment="CENTER" /> <Button fx:id="readyButton" focusTraversable="false" mnemonicParsing="false" onAction="#readyButtonPressed" prefWidth="101.0" text="Ready" GridPane.halignment="CENTER" />
<Button focusTraversable="false" mnemonicParsing="false" onAction="#leaveLobbyButtonPressed" text="Leave Lobby" GridPane.columnIndex="1" GridPane.halignment="CENTER" /> <Button focusTraversable="false" mnemonicParsing="false" onAction="#leaveLobbyButtonPressed" text="Leave Lobby" GridPane.columnIndex="1" GridPane.halignment="CENTER" />
</children> </children>
</GridPane> </GridPane>