diff --git a/src/main/java/seng302/server/ServerThread.java b/src/main/java/seng302/server/ServerThread.java index 8059827b..d648d243 100644 --- a/src/main/java/seng302/server/ServerThread.java +++ b/src/main/java/seng302/server/ServerThread.java @@ -14,6 +14,8 @@ public class ServerThread implements Runnable, Observer { private StreamingServerSocket server; private long startTime; boolean raceStarted = false; + boolean raceFinished = false; + Map boatsFinished = new HashMap<>(); private List boats; private Simulator raceSimulator; @@ -30,6 +32,11 @@ public class ServerThread implements Runnable, Observer { serverLog("Spawning Server", 0); raceSimulator = new Simulator(BOAT_LOCATION_PERIOD); boats = raceSimulator.getBoats(); + + for (Boat b : boats){ + boatsFinished.put(b.getSourceID(), false); + } + runner.start(); } @@ -71,21 +78,38 @@ public class ServerThread implements Runnable, Observer { List boatSubMessages = new ArrayList(); BoatStatus boatStatus; RaceStatus raceStatus; + boolean thereAreBoatsNotFinished = false; - if (raceStarted){ - boatStatus = BoatStatus.RACING; - raceStatus = RaceStatus.STARTED; - } - else{ - boatStatus = BoatStatus.PRESTART; - raceStatus = RaceStatus.PRESTART; - } for (Boat b : boats){ + if (raceStarted){ + boatStatus = BoatStatus.RACING; + thereAreBoatsNotFinished = true; + } + else if(boatsFinished.get(b.getSourceID())){ + boatStatus = BoatStatus.FINISHED; + } + else{ + boatStatus = BoatStatus.PRESTART; + thereAreBoatsNotFinished = true; + } + BoatSubMessage m = new BoatSubMessage(b.getSourceID(), boatStatus, b.getLastPassedCorner().getSeqID(), 0, 0, 0, 0); boatSubMessages.add(m); } + if (thereAreBoatsNotFinished){ + if (raceStarted){ + raceStatus = RaceStatus.STARTED; + } + else{ + raceStatus = RaceStatus.PRESTART; + } + } + else{ + raceStatus = RaceStatus.NOTACTIVE; + } + return new RaceStatusMessage(1, raceStatus, startTime, WindDirection.EAST, 100, boats.size(), RaceType.MATCH_RACE, 1, boatSubMessages); } @@ -223,14 +247,19 @@ public class ServerThread implements Runnable, Observer { for (Boat b : ((Simulator) o).getBoats()){ try { + Message m = new BoatLocationMessage(b.getSourceID(), 1, b.getLat(), b.getLng(), b.getHeadingCorner().getBearingToNextCorner(), ((long) b.getSpeed())); - server.send(m); } catch (IOException e) { serverLog("Couldn't send a boat status message", 1); } + catch (NullPointerException e){ + //raceFinished = true; + serverLog("Boat " + b.getSourceID() + " finished the race", 1); + boatsFinished.put(b.getSourceID(), true); + } } } }