From 8c1eded926c64260454e6cb175783117aa965b82 Mon Sep 17 00:00:00 2001 From: David Wu Date: Mon, 4 Sep 2017 14:06:38 +1200 Subject: [PATCH] Boat collision packets are now sent. Command class created for boat collision. Currently prints out message depending on if user crashed or someone else crashed. #story[1195] --- .../src/main/java/mock/app/Event.java | 1 + .../src/main/java/mock/model/RaceLogic.java | 18 +++++++++- .../src/main/java/mock/model/RaceServer.java | 36 +++++++++++++++++++ .../java/mock/model/collider/Collider.java | 2 ++ .../BoatCollisionCommand.java | 33 +++++++++++++++++ .../VisualiserRaceCommandFactory.java | 9 ++++- .../src/main/java/visualiser/app/App.java | 6 ++-- .../model/VisualiserRaceController.java | 2 +- 8 files changed, 101 insertions(+), 6 deletions(-) create mode 100644 racevisionGame/src/main/java/visualiser/Commands/VisualiserRaceCommands/BoatCollisionCommand.java diff --git a/racevisionGame/src/main/java/mock/app/Event.java b/racevisionGame/src/main/java/mock/app/Event.java index c054e2fb..c9ef3d5b 100644 --- a/racevisionGame/src/main/java/mock/app/Event.java +++ b/racevisionGame/src/main/java/mock/app/Event.java @@ -81,6 +81,7 @@ public class Event { String raceXMLFile = "mock/mockXML/raceTest.xml"; String boatsXMLFile = "mock/mockXML/boatTest.xml"; + //String boatsXMLFile = "mock/mockXML/boatsSinglePlayer.xml"; String regattaXMLFile = "mock/mockXML/regattaTest.xml"; if (singlePlayer) { diff --git a/racevisionGame/src/main/java/mock/model/RaceLogic.java b/racevisionGame/src/main/java/mock/model/RaceLogic.java index 5b35d449..d70b6152 100644 --- a/racevisionGame/src/main/java/mock/model/RaceLogic.java +++ b/racevisionGame/src/main/java/mock/model/RaceLogic.java @@ -11,6 +11,7 @@ import network.Messages.Enums.RaceStatusEnum; import network.Messages.LatestMessages; import shared.model.RunnableWithFramePeriod; +import java.util.ArrayList; import java.util.Observable; import java.util.Observer; @@ -104,6 +105,8 @@ public class RaceLogic implements RunnableWithFramePeriod, Observer { */ private void raceLoop() { + ArrayList collisionBoats = new ArrayList<>(); + long previousFrameTime = System.currentTimeMillis(); while (race.getRaceStatusEnum() != RaceStatusEnum.FINISHED && loopBool) { @@ -129,9 +132,17 @@ public class RaceLogic implements RunnableWithFramePeriod, Observer { //If it is still racing, update its position. if (boat.getStatus() == BoatStatusEnum.RACING) { race.updatePosition(boat, framePeriod, race.getRaceClock().getDurationMilli()); - race.getColliderRegistry().rayCast(boat); + + if(race.getColliderRegistry().rayCast(boat)){ + System.out.println("Collision!"); + //Add boat to list + collisionBoats.add(boat); + } + + //System.out.println(race.getColliderRegistry().rayCast(boat)); } + } } else { @@ -144,9 +155,14 @@ public class RaceLogic implements RunnableWithFramePeriod, Observer { // Change wind direction race.changeWindDirection(); + //Pass collision boats in + server.parseBoatCollisions(collisionBoats); + //Parse the race snapshot. server.parseSnapshot(); + collisionBoats.clear(); + //Update the last frame time. previousFrameTime = currentTime; } diff --git a/racevisionGame/src/main/java/mock/model/RaceServer.java b/racevisionGame/src/main/java/mock/model/RaceServer.java index cbbe1971..279d2742 100644 --- a/racevisionGame/src/main/java/mock/model/RaceServer.java +++ b/racevisionGame/src/main/java/mock/model/RaceServer.java @@ -2,6 +2,7 @@ package mock.model; import network.Messages.*; import network.Messages.Enums.BoatLocationDeviceEnum; +import network.Messages.Enums.YachtEventEnum; import shared.model.Bearing; import shared.model.CompoundMark; import shared.model.Mark; @@ -15,6 +16,7 @@ import java.util.List; public class RaceServer { private MockRace race; private LatestMessages latestMessages; + private List collisionEvents = new ArrayList<>(); /** @@ -44,7 +46,17 @@ public class RaceServer { //Parse the race status. snapshotMessages.add(parseRaceStatus()); + //Parse collisions + if(collisionEvents.size()>0){ + snapshotMessages.addAll(collisionEvents); + } + latestMessages.setSnapshot(snapshotMessages); + + //Reset collision list + collisionEvents.clear(); + //System.out.println(collisionEvents.size()); + } @@ -178,4 +190,28 @@ public class RaceServer { return raceStatus; } + + /** + * Parse the yacht event and return it + * @param boat yacht with event + * @param event event that happened + * @return yacht event + */ + private YachtEvent parseYachtEvent(MockBoat boat, YachtEventEnum event){ + YachtEvent yachtEvent = new YachtEvent( + System.currentTimeMillis(), + this.boatLocationSequenceNumber, + race.getRaceId(), + boat.getSourceID(), + 1337, + event); + return yachtEvent; + } + + public void parseBoatCollisions(ArrayList boats){ + for (MockBoat boat : boats){ + collisionEvents.add(parseYachtEvent(boat, YachtEventEnum.COLLISION)); + } + } + } diff --git a/racevisionGame/src/main/java/mock/model/collider/Collider.java b/racevisionGame/src/main/java/mock/model/collider/Collider.java index 029fee57..81b2ed62 100644 --- a/racevisionGame/src/main/java/mock/model/collider/Collider.java +++ b/racevisionGame/src/main/java/mock/model/collider/Collider.java @@ -32,6 +32,8 @@ public abstract class Collider extends Observable implements Locatable { notifyObservers(collision); this.setChanged(); + //Send out packet to all boats + return true; } else return false; } diff --git a/racevisionGame/src/main/java/visualiser/Commands/VisualiserRaceCommands/BoatCollisionCommand.java b/racevisionGame/src/main/java/visualiser/Commands/VisualiserRaceCommands/BoatCollisionCommand.java new file mode 100644 index 00000000..7e2047d7 --- /dev/null +++ b/racevisionGame/src/main/java/visualiser/Commands/VisualiserRaceCommands/BoatCollisionCommand.java @@ -0,0 +1,33 @@ +package visualiser.Commands.VisualiserRaceCommands; + +import mock.model.commandFactory.Command; +import network.Messages.YachtEvent; +import visualiser.model.VisualiserRaceState; + +/** + * Created by zwu18 on 4/09/17. + */ +public class BoatCollisionCommand implements Command { + + YachtEvent yachtEvent; + + VisualiserRaceState visualiserRace; + + public BoatCollisionCommand(YachtEvent yachtEvent, VisualiserRaceState visualiserRace){ + this.yachtEvent = yachtEvent; + this.visualiserRace = visualiserRace; + + } + + @Override + public void execute() { + + if(visualiserRace.getPlayerBoatID()==yachtEvent.getSourceID()){ + System.out.println("Someone else crashed!"); + } else { + System.out.println("I crashed!"); + } + + //System.out.println("Collision command executed!"); + } +} diff --git a/racevisionGame/src/main/java/visualiser/Commands/VisualiserRaceCommands/VisualiserRaceCommandFactory.java b/racevisionGame/src/main/java/visualiser/Commands/VisualiserRaceCommands/VisualiserRaceCommandFactory.java index 37755e91..0e2f3d15 100644 --- a/racevisionGame/src/main/java/visualiser/Commands/VisualiserRaceCommands/VisualiserRaceCommandFactory.java +++ b/racevisionGame/src/main/java/visualiser/Commands/VisualiserRaceCommands/VisualiserRaceCommandFactory.java @@ -23,7 +23,9 @@ public class VisualiserRaceCommandFactory { switch (message.getType()) { - case BOATLOCATION: return new BoatLocationCommand((BoatLocation) message, visualiserRace); + case BOATLOCATION: + //System.out.println("Boat location received"); + return new BoatLocationCommand((BoatLocation) message, visualiserRace); case RACESTATUS: return new RaceStatusCommand((RaceStatus) message, visualiserRace); @@ -31,6 +33,11 @@ public class VisualiserRaceCommandFactory { case ASSIGN_PLAYER_BOAT: return new AssignPlayerBoatCommand((AssignPlayerBoat) message, visualiserRace); + case YACHTEVENTCODE: + return new BoatCollisionCommand((YachtEvent) message, visualiserRace); + + + default: throw new CommandConstructionException("Could not create VisualiserRaceCommand. Unrecognised or unsupported MessageType: " + message.getType()); } diff --git a/racevisionGame/src/main/java/visualiser/app/App.java b/racevisionGame/src/main/java/visualiser/app/App.java index eeae5a5d..6a7d47f2 100644 --- a/racevisionGame/src/main/java/visualiser/app/App.java +++ b/racevisionGame/src/main/java/visualiser/app/App.java @@ -96,15 +96,15 @@ public class App extends Application { ); updateMessage("Preparing ingredients . . ."); - Thread.sleep(1000); + Thread.sleep(100); for (int i = 0; i < burgerFilling.size(); i++) { - Thread.sleep(800); + Thread.sleep(100); updateProgress(i + 1, burgerFilling.size()); String nextFilling = burgerFilling.get(i); addedFilling.add(nextFilling); updateMessage("Adding the " + nextFilling + " . . ."); } - Thread.sleep(400); + Thread.sleep(100); updateMessage("Burger's done!"); return addedFilling; diff --git a/racevisionGame/src/main/java/visualiser/model/VisualiserRaceController.java b/racevisionGame/src/main/java/visualiser/model/VisualiserRaceController.java index 748808b3..47382b74 100644 --- a/racevisionGame/src/main/java/visualiser/model/VisualiserRaceController.java +++ b/racevisionGame/src/main/java/visualiser/model/VisualiserRaceController.java @@ -65,7 +65,7 @@ public class VisualiserRaceController implements RunnableWithFramePeriod { compositeRaceCommand.addCommand(command); } catch (CommandConstructionException e) { - Logger.getGlobal().log(Level.WARNING, "VisualiserRaceController could not create a command for incoming message."); + //Logger.getGlobal().log(Level.WARNING, "VisualiserRaceController could not create a command for incoming message."); } catch (InterruptedException e) { Logger.getGlobal().log(Level.SEVERE, "VisualiserRaceController was interrupted on thread: " + Thread.currentThread() + " while waiting for messages.");