From 7027de80c41f0d81ab91e2788c5c36403072ba61 Mon Sep 17 00:00:00 2001 From: Calum Date: Mon, 25 Sep 2017 22:09:26 +1300 Subject: [PATCH] Fixed issues with correct protocol implementation. #issue[64] #fix #testmanual --- .../messages/BoatActionMessage.java | 8 ++-- .../messages/RegistrationRequestMessage.java | 4 +- .../java/seng302/utilities/XMLParser.java | 39 +++++++++++++------ .../visualiser/ClientToServerThread.java | 9 ++--- .../java/seng302/visualiser/GameClient.java | 6 ++- .../FinishScreenViewController.java | 1 - 6 files changed, 43 insertions(+), 24 deletions(-) diff --git a/src/main/java/seng302/gameServer/messages/BoatActionMessage.java b/src/main/java/seng302/gameServer/messages/BoatActionMessage.java index 419bf72e..8fa78195 100644 --- a/src/main/java/seng302/gameServer/messages/BoatActionMessage.java +++ b/src/main/java/seng302/gameServer/messages/BoatActionMessage.java @@ -5,19 +5,19 @@ package seng302.gameServer.messages; */ public class BoatActionMessage extends Message{ private final MessageType MESSAGE_TYPE = MessageType.BOAT_ACTION; - private final int MESSAGE_SIZE = 1; + private final int MESSAGE_SIZE = 5; private BoatAction actionType; - public BoatActionMessage(BoatAction actionType) { + public BoatActionMessage(BoatAction actionType, int sourceId) { this.actionType = actionType; - setHeader(new Header(MessageType.BOAT_ACTION, 0, (short) 1)); // the second variable is the source id + setHeader(new Header(MessageType.BOAT_ACTION, sourceId, (short) MESSAGE_SIZE)); // the second variable is the source id allocateBuffer(); writeHeaderToBuffer(); // Write message fields putInt(actionType.getValue(), 1); + putInt(sourceId, 4); writeCRC(); rewind(); - } @Override diff --git a/src/main/java/seng302/gameServer/messages/RegistrationRequestMessage.java b/src/main/java/seng302/gameServer/messages/RegistrationRequestMessage.java index c7b2a1db..6a8e76ad 100644 --- a/src/main/java/seng302/gameServer/messages/RegistrationRequestMessage.java +++ b/src/main/java/seng302/gameServer/messages/RegistrationRequestMessage.java @@ -4,8 +4,8 @@ package seng302.gameServer.messages; public class RegistrationRequestMessage extends Message { private static int MESSAGE_LENGTH = 2; - public RegistrationRequestMessage(ClientType type){ - setHeader(new Header(MessageType.REGISTRATION_REQUEST, 1, (short) getSize())); + public RegistrationRequestMessage(ClientType type, int clientID){ + setHeader(new Header(MessageType.REGISTRATION_REQUEST, clientID, (short) getSize())); allocateBuffer(); writeHeaderToBuffer(); diff --git a/src/main/java/seng302/utilities/XMLParser.java b/src/main/java/seng302/utilities/XMLParser.java index 71da1248..912708df 100644 --- a/src/main/java/seng302/utilities/XMLParser.java +++ b/src/main/java/seng302/utilities/XMLParser.java @@ -4,12 +4,14 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Random; import javafx.scene.paint.Color; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import seng302.model.ClientYacht; +import seng302.model.Colors; import seng302.model.Limit; import seng302.model.mark.CompoundMark; import seng302.model.mark.Corner; @@ -139,14 +141,26 @@ public class XMLParser { Node currentBoat = boatsList.item(i); if (currentBoat.getNodeName().equals("Boat")) { // Boat boat = new Boat(currentBoat); + BoatMeshType boatMeshType; + try { + boatMeshType = BoatMeshType.valueOf(XMLParser.getNodeAttributeString(currentBoat, "Type")); + } catch (IllegalArgumentException e){ + boatMeshType = BoatMeshType.DINGHY; + } + Color color; + try { + color = Color.web(getNodeAttributeString(currentBoat, "Color")); + } catch (NullPointerException npe) { + color = Colors.getColor(new Random().nextInt(8)); + } ClientYacht yacht = new ClientYacht( - BoatMeshType.valueOf(XMLParser.getNodeAttributeString(currentBoat, "Type")), + boatMeshType, XMLParser.getNodeAttributeInt(currentBoat, "SourceID"), XMLParser.getNodeAttributeString(currentBoat, "HullNum"), XMLParser.getNodeAttributeString(currentBoat, "ShortName"), XMLParser.getNodeAttributeString(currentBoat, "BoatName"), XMLParser.getNodeAttributeString(currentBoat, "Country")); - yacht.setColour(Color.web(getNodeAttributeString(currentBoat, "Color"))); + yacht.setColour(color); competingBoats.put(yacht.getSourceId(), yacht); } } @@ -195,17 +209,20 @@ public class XMLParser { */ private static List extractTokens(Element docEle) { List tokens = new ArrayList<>(); - NodeList tokenList = docEle.getElementsByTagName("Tokens").item(0).getChildNodes(); - for (int i = 0; i < tokenList.getLength(); i++) { - Node tokenNode = tokenList.item(i); - if (tokenNode.getNodeName().equals("Token")) { - String tokenType = getNodeAttributeString(tokenNode, "TokenType"); - Double lat = getNodeAttributeDouble(tokenNode, "TargetLat"); - Double lng = getNodeAttributeDouble(tokenNode, "TargetLng"); - tokens.add(new Token(TokenType.valueOf(tokenType), lat, lng)); + try { + NodeList tokenList = docEle.getElementsByTagName("Tokens").item(0).getChildNodes(); + for (int i = 0; i < tokenList.getLength(); i++) { + Node tokenNode = tokenList.item(i); + if (tokenNode.getNodeName().equals("Token")) { + String tokenType = getNodeAttributeString(tokenNode, "TokenType"); + Double lat = getNodeAttributeDouble(tokenNode, "TargetLat"); + Double lng = getNodeAttributeDouble(tokenNode, "TargetLng"); + tokens.add(new Token(TokenType.valueOf(tokenType), lat, lng)); + } } + } catch (NullPointerException npe) { + return new ArrayList<>(); } - return tokens; } diff --git a/src/main/java/seng302/visualiser/ClientToServerThread.java b/src/main/java/seng302/visualiser/ClientToServerThread.java index e53aed22..fe32ed85 100644 --- a/src/main/java/seng302/visualiser/ClientToServerThread.java +++ b/src/main/java/seng302/visualiser/ClientToServerThread.java @@ -175,7 +175,7 @@ public class ClientToServerThread implements Runnable { * Sends a request to the server asking for a source ID */ private void sendRegistrationRequest() { - RegistrationRequestMessage requestMessage = new RegistrationRequestMessage(ClientType.PLAYER); + RegistrationRequestMessage requestMessage = new RegistrationRequestMessage(ClientType.PLAYER, clientId); try { os.write(requestMessage.getBuffer()); @@ -193,7 +193,6 @@ public class ClientToServerThread implements Runnable { private void processRegistrationResponse(StreamPacket packet){ int sourceId = (int) Message.bytesToLong(Arrays.copyOfRange(packet.getPayload(), 0, 3)); int statusCode = (int) Message.bytesToLong(Arrays.copyOfRange(packet.getPayload(), 4,5)); - RegistrationResponseStatus status = RegistrationResponseStatus.getResponseStatus(statusCode); if (status.equals(RegistrationResponseStatus.SUCCESS_PLAYING)){ @@ -243,7 +242,7 @@ public class ClientToServerThread implements Runnable { new TimerTask() { @Override public void run() { - sendBoatActionMessage(new BoatActionMessage(BoatAction.DOWNWIND)); + sendBoatActionMessage(new BoatActionMessage(BoatAction.DOWNWIND, clientId)); } }, 0, PACKET_SENDING_INTERVAL_MS ); @@ -256,14 +255,14 @@ public class ClientToServerThread implements Runnable { new TimerTask() { @Override public void run() { - sendBoatActionMessage(new BoatActionMessage(BoatAction.UPWIND)); + sendBoatActionMessage(new BoatActionMessage(BoatAction.UPWIND, clientId)); } }, 0, PACKET_SENDING_INTERVAL_MS ); } break; default: - sendBoatActionMessage(new BoatActionMessage(actionType)); + sendBoatActionMessage(new BoatActionMessage(actionType, clientId)); break; } } diff --git a/src/main/java/seng302/visualiser/GameClient.java b/src/main/java/seng302/visualiser/GameClient.java index ee30b196..ad3a37d6 100644 --- a/src/main/java/seng302/visualiser/GameClient.java +++ b/src/main/java/seng302/visualiser/GameClient.java @@ -398,7 +398,11 @@ public class GameClient { } if (gameKeyBind.getKeyCode(KeyAction.SAILS_STATE) == e.getCode()) { // sails in/sails out - socketThread.sendBoatAction(BoatAction.SAILS_IN); + if (allBoatsMap.get(socketThread.getClientId()).getSailIn()) { + socketThread.sendBoatAction(BoatAction.SAILS_OUT); + } else { + socketThread.sendBoatAction(BoatAction.SAILS_IN); + } allBoatsMap.get(socketThread.getClientId()).toggleSail(); } else if (gameKeyBind.getKeyCode(KeyAction.UPWIND) == e.getCode() || gameKeyBind.getKeyCode(KeyAction.DOWNWIND) == e.getCode()) { diff --git a/src/main/java/seng302/visualiser/controllers/FinishScreenViewController.java b/src/main/java/seng302/visualiser/controllers/FinishScreenViewController.java index 7eb9b4fd..86e39ead 100644 --- a/src/main/java/seng302/visualiser/controllers/FinishScreenViewController.java +++ b/src/main/java/seng302/visualiser/controllers/FinishScreenViewController.java @@ -88,7 +88,6 @@ public class FinishScreenViewController implements Initializable { public void switchToStartScreenView() { Sounds.playButtonClick(); - //TODO merge fix setContentPane("/views/StartScreenView.fxml"); }