Compare commits

...

3 Commits

Author SHA1 Message Date
Calum 09c02d5c54 Finish screen not appearing. Start screen opened simultanously. 2017-09-28 12:35:47 +13:00
Calum 08c34a0b1e Finish arrow not spawning fix. 2017-09-28 09:54:03 +13:00
Michael Rausch 8b7407bf89 Various bug fixes
- Closed socket when discovery server crashes, so it can be restarted
- Flattened water on terrain mesh
- Added checks to ensure server is started before connecting
- Added a check to ensure client has started  before connecting to the server
- Fixed concurrency issue in server-> client thread list

Tags: #story[1281]
2017-09-28 01:58:49 +13:00
14 changed files with 330 additions and 236 deletions
+8 -6
View File
@@ -80,12 +80,14 @@ public class App extends Application {
ViewManager.getInstance().initialiseSplashScreen(primaryStage);
}
private static void runDiscoveryServer(){
try{
new DiscoveryServer();
}
catch (Exception e){
runDiscoveryServer();
private static void runDiscoveryServer() throws Exception {
while (true){
try {
new DiscoveryServer();
}
catch (Exception ignored){
;
}
}
}
@@ -11,11 +11,13 @@ import seng302.discoveryServer.util.ServerRepoStreamParser;
import seng302.discoveryServer.util.ServerTable;
import seng302.visualiser.ServerListener;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
import java.util.Timer;
public class DiscoveryServer {
public static final String ANSI_GREEN = "\u001B[32m";
@@ -27,6 +29,7 @@ public class DiscoveryServer {
private ServerTable serverTable;
public static final Integer PORT_NUMBER = 9969;
private ServerSocket serverSocket;
private final Logger logger = LoggerFactory.getLogger(DiscoveryServer.class);
@@ -56,8 +59,6 @@ public class DiscoveryServer {
displayHeader();
serverTable = new ServerTable();
ServerSocket serverSocket;
try{
serverSocket = new ServerSocket(PORT_NUMBER);
}
@@ -69,12 +70,17 @@ public class DiscoveryServer {
logger.info("Started successfully - Now accepting connections");
while (true){
Socket clientSocket = serverSocket.accept();
try{
while (true){
Socket clientSocket = serverSocket.accept();
parseRequest(clientSocket);
parseRequest(clientSocket);
clientSocket.close();
clientSocket.close();
}
}
catch (Exception e){
close();
}
}
@@ -147,6 +153,18 @@ public class DiscoveryServer {
tries++;
}
if (serverToJoin != null && serverToJoin.isMaxPlayersReached()){
return null;
}
return serverToJoin;
}
public void close(){
try {
serverSocket.close();
} catch (IOException ignored) {
;
}
}
}
@@ -40,6 +40,7 @@ public class MainServerThread implements Runnable, ClientConnectionDelegate {
private boolean terminated;
private Thread thread;
private boolean hasStarted = false;
private ServerSocket serverSocket = null;
private ArrayList<ServerToClientThread> serverToClientThreads = new ArrayList<>();
@@ -98,6 +99,8 @@ public class MainServerThread implements Runnable, ClientConnectionDelegate {
new HeartbeatThread(this);
new ServerListenThread(serverSocket, this);
hasStarted = true;
//You should handle interrupts in some way, so that the thread won't keep on forever if you exit the app.
while (!terminated) {
if (GameState.getPlayerHasLeftFlag()) {
@@ -146,8 +149,10 @@ public class MainServerThread implements Runnable, ClientConnectionDelegate {
}
}
try {
for (ServerToClientThread serverToClientThread : serverToClientThreads) {
serverToClientThread.terminate();
synchronized (this){
for (ServerToClientThread serverToClientThread : serverToClientThreads) {
serverToClientThread.terminate();
}
}
serverSocket.close();
} catch (IOException e) {
@@ -450,4 +455,8 @@ public class MainServerThread implements Runnable, ClientConnectionDelegate {
);
}
}
public boolean hasStarted() {
return hasStarted;
}
}
@@ -14,6 +14,7 @@ import java.util.TimerTask;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.zip.CRC32;
import java.util.zip.Checksum;
import javafx.application.Platform;
import javafx.util.Pair;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -42,6 +43,8 @@ import seng302.visualiser.controllers.ViewManager;
*/
public class ClientToServerThread implements Runnable {
private boolean isStarted = false;
/**
* Functional interface for receiving packets from client socket.
*/
@@ -88,6 +91,7 @@ public class ClientToServerThread implements Runnable {
private ByteArrayOutputStream crcBuffer;
private boolean socketOpen = true;
private boolean ignoreDC = false;
/**
* Constructor for ClientToServerThread which takes in ipAddress and portNumber and attempts to
@@ -117,6 +121,8 @@ public class ClientToServerThread implements Runnable {
* variable is false.
*/
public void run() {
isStarted = true;
int sync1;
int sync2;
// TODO: 14/07/17 wmu16 - Work out how to fix this while loop
@@ -167,8 +173,12 @@ public class ClientToServerThread implements Runnable {
notifyDisconnectListeners("Connection to server was terminated");
closeSocket();
ViewManager.getInstance().goToStartView();
ViewManager.getInstance().showErrorSnackBar("Server rejected connection.");
Platform.runLater(() -> {
if (ignoreDC) {
ViewManager.getInstance().showErrorSnackBar("Server rejected connection.");
ViewManager.getInstance().goToStartView();
}
});
}
public void sendCustomizationRequest(CustomizeRequestType reqType, byte[] payload) {
@@ -183,7 +193,7 @@ public class ClientToServerThread implements Runnable {
}
private void notifyDisconnectListeners (String message) {
if (socketOpen) {
if (socketOpen && !ignoreDC) {
for (DisconnectedFromHostListener listener : disconnectionListeners) {
listener.notifyDisconnection(message);
}
@@ -194,12 +204,6 @@ public class ClientToServerThread implements Runnable {
if (connectionErrorListener != null){
connectionErrorListener.notifyConnectionError(message);
}
try {
this.socket.close();
} catch (IOException e) {
logger.error("Couldn't close socket");
}
}
/**
@@ -390,9 +394,9 @@ public class ClientToServerThread implements Runnable {
}
if (currentByte == -1) {
notifyDisconnectListeners("Cannot read from server.");
closeSocket();
logger.warn("InputStream reach end of stream", 1);
handleConnectionError("Could not connect to server. Server is no longer available.");
closeSocket();
}
return currentByte;
}
@@ -435,4 +439,12 @@ public class ClientToServerThread implements Runnable {
).getBuffer()
);
}
public boolean hasStarted() {
return isStarted;
}
public void ignoreDC() {
ignoreDC = true;
}
}
@@ -49,12 +49,6 @@ import seng302.visualiser.controllers.RaceViewController;
import seng302.visualiser.controllers.ViewManager;
import seng302.visualiser.controllers.dialogs.PopupDialogController;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.util.*;
/**
* This class is a client side instance of a yacht racing game in JavaFX. The game is instantiated
* with a JavaFX Pane to insert itself into.
@@ -119,7 +113,7 @@ public class GameClient {
getServerThread().setConnectionErrorListener((eMessage) -> {
ViewManager.getInstance().showErrorSnackBar(eMessage);
destroyClientToServerThread();
//destroyClientToServerThread();
});
this.lobbyController = ViewManager.getInstance().goToLobby(true);
@@ -147,18 +141,45 @@ public class GameClient {
server = new MainServerThread();
while (!server.hasStarted()){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
startClientToServerThread(ipAddress, 4942);
} catch (IOException e) {
showConnectionError("Cannot connect to server as host");
}
// Wait for C2S thread
while (!socketThread.hasStarted()){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
socketThread.sendXML(race, serverName, numLegs, maxPlayers, tokensEnabled);
while (regattaData == null){
int triesLeft = 15;
while (regattaData == null && triesLeft > 0){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
triesLeft--;
}
if (triesLeft <= 0){
showConnectionError("Could not launch server");
return null;
}
this.lobbyController = ViewManager.getInstance().goToLobby(false);
@@ -183,7 +204,11 @@ public class GameClient {
controller.setContent(message);
controller.setOptionButtonText("GO HOME");
controller
.setOptionButtonEventHandler(event -> ViewManager.getInstance().goToStartView());
.setOptionButtonEventHandler(event -> {
System.out.println("inShowConnectionError");
ViewManager.getInstance().goToStartView();
});
});
}
@@ -2,7 +2,6 @@ package seng302.visualiser;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -24,7 +23,11 @@ import javafx.scene.transform.Scale;
import javafx.scene.transform.Translate;
import org.fxyz3d.scene.Skybox;
import seng302.gameServer.messages.RoundingSide;
import seng302.model.*;
import seng302.model.ClientYacht;
import seng302.model.GameKeyBind;
import seng302.model.KeyAction;
import seng302.model.Limit;
import seng302.model.ScaledPoint;
import seng302.model.mark.CompoundMark;
import seng302.model.mark.Corner;
import seng302.model.mark.Mark;
@@ -51,7 +54,7 @@ public class GameView3D extends GameView{
private final double FOV = 60;
private final double DEFAULT_CAMERA_X = 0;
private final double DEFAULT_CAMERA_Y = 100;
private final double DEFAULT_CAMERA_Y = 160;
private Group root3D;
private SubScene view;
@@ -164,6 +167,7 @@ public class GameView3D extends GameView{
}
createMarkArrows();
course.get(0).getMarks().forEach((mark -> markerObjects.get(mark).showNextExitArrow()));
//Scale race to markers if there is no border.
if (borderPoints == null) {
@@ -505,7 +509,7 @@ public class GameView3D extends GameView{
private void updateMarkArrows (ClientYacht yacht, int legNumber) {
CompoundMark compoundMark;
if (legNumber - 1 >= 0) {
if (legNumber - 1 >= 0 && legNumber-1 < course.size()) {
Sounds.playMarkRoundingSound();
compoundMark = course.get(legNumber-1);
for (Mark mark : compoundMark.getMarks()) {
@@ -513,7 +517,7 @@ public class GameView3D extends GameView{
}
}
CompoundMark nextMark = null;
if (legNumber < course.size() - 1) {
if (legNumber < course.size()) {
Sounds.playMarkRoundingSound();
nextMark = course.get(legNumber);
for (Mark mark : nextMark.getMarks()) {
@@ -16,8 +16,8 @@ public class IsometricCamera extends PerspectiveCamera implements RaceCamera {
private final Double MAX_Y = 170.0;
private final Double PAN_LIMIT = 160.0;
private final Double NEAR_ZOOM_LIMIT = -50.0;
private final Double FAR_ZOOM_LIMIT = -160.0;
private final Double NEAR_ZOOM_LIMIT = -30.0;
private final Double FAR_ZOOM_LIMIT = -180.0;
private Double horizontalPan;
private Double verticalPan;
@@ -29,7 +29,8 @@ public class IsometricCamera extends PerspectiveCamera implements RaceCamera {
super(true);
transforms = this.getTransforms();
zoomFactor = (FAR_ZOOM_LIMIT + NEAR_ZOOM_LIMIT) / 2.0;
// zoomFactor = (FAR_ZOOM_LIMIT + NEAR_ZOOM_LIMIT) / 2.0;
zoomFactor = FAR_ZOOM_LIMIT;
horizontalPan = cameraStartX;
verticalPan = cameraStartY;
@@ -11,9 +11,9 @@ import seng302.visualiser.fxObjects.assets_3D.BoatObject;
public class TopDownCamera extends PerspectiveCamera implements RaceCamera {
private final Double PAN_LIMIT = 30.0;
private final Double NEAR_ZOOM_LIMIT = -30.0;
private final Double FAR_ZOOM_LIMIT = -130.0;
private final Double PAN_LIMIT = 40d;
private final Double NEAR_ZOOM_LIMIT = -35d;
private final Double FAR_ZOOM_LIMIT = -145d;
private final Double ZOOM_STEP = 2.5;
private ObservableList<Transform> transforms;
@@ -225,7 +225,7 @@ public class LobbyController implements Initializable {
}
private void leaveLobby() {
System.out.println("LEFT LOBBY");
ViewManager.getInstance().getGameClient().stopGame();
ViewManager.getInstance().goToStartView();
}
@@ -197,7 +197,9 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel
}
public void showFinishDialog(ArrayList<ClientYacht> finishedBoats) {
System.out.println("called");
raceState.setRaceStarted(false);
ViewManager.getInstance().getGameClient().getServerThread().ignoreDC();
createFinishDialog(finishedBoats);
}
@@ -5,7 +5,6 @@ import com.jfoenix.controls.JFXButton;
import com.jfoenix.controls.JFXListView;
import java.net.URL;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
@@ -26,7 +25,10 @@ public class FinishDialogController implements Initializable {
@Override
public void initialize(URL location, ResourceBundle resources) {
playAgain.setOnAction(event -> ViewManager.getInstance().goToStartView());
playAgain.setOnAction(event -> {
System.out.println("CALLED HERE");
ViewManager.getInstance().goToStartView();
});
}
public void setFinishedBoats(ArrayList<ClientYacht> finishedBoats) {
@@ -119,6 +119,12 @@ public class ServerCreationController implements Initializable {
.runAsHost("localhost", 4941, serverName.getText(), (int) maxPlayersSlider
.getValue(), mapMaker.getCurrentRacePath(), (int) legsSlider.getValue(), pickupsCheckBox.isSelected());
if (serverDescription == null){
ViewManager.getInstance().getGameClient().getServerThread().closeSocket();
ViewManager.getInstance().getGameClient().stopGame();
return;
}
ViewManager.getInstance().setProperty("serverName", serverDescription.getName());
ViewManager.getInstance().setProperty("mapName", serverDescription.getMapName());
}
+1 -1
View File
@@ -45,7 +45,7 @@
<Corner CompoundMarkID="1" Rounding="PS"/>
<Corner CompoundMarkID="2" Rounding="S"/>
<Corner CompoundMarkID="3" Rounding="S"/>
<Corner CompoundMarkID="4" Rounding="SP"/>
<Corner CompoundMarkID="4" Rounding="PS"/>
</OpeningSegment>
<RepeatingSegment>
File diff suppressed because one or more lines are too long