diff --git a/src/main/java/seng302/controllers/CanvasController.java b/src/main/java/seng302/controllers/CanvasController.java index c13c9bcb..5c69f846 100644 --- a/src/main/java/seng302/controllers/CanvasController.java +++ b/src/main/java/seng302/controllers/CanvasController.java @@ -321,7 +321,7 @@ public class CanvasController { } for (Yacht boat : boats.values()) { - if (participantIDs.contains(boat.getSourceId())) { + if (participantIDs.contains(boat.getSourceID())) { boat.setColour(Colors.getColor()); BoatGroup boatGroup = new BoatGroup(boat, boat.getColour()); boatGroups.add(boatGroup); diff --git a/src/main/java/seng302/fxObjects/BoatGroup.java b/src/main/java/seng302/fxObjects/BoatGroup.java index 1f557318..acf0c0cb 100644 --- a/src/main/java/seng302/fxObjects/BoatGroup.java +++ b/src/main/java/seng302/fxObjects/BoatGroup.java @@ -316,7 +316,7 @@ public class BoatGroup extends Group { * @return An array containing all ID's associated with this RaceObject. */ public long getRaceId() { - return boat.getSourceId(); + return boat.getSourceID(); } public Group getWake () { diff --git a/src/main/java/seng302/gameServer/GameServerThread.java b/src/main/java/seng302/gameServer/GameServerThread.java index aafb6c0b..941dd149 100644 --- a/src/main/java/seng302/gameServer/GameServerThread.java +++ b/src/main/java/seng302/gameServer/GameServerThread.java @@ -96,7 +96,7 @@ public class GameServerThread implements Runnable, Observer, ClientConnectionDel thereAreBoatsNotFinished = true; } - BoatSubMessage m = new BoatSubMessage(y.getSourceId(), boatStatus, y.getLastMarkRounded().getId(), 0, 0, 1234l, 1234l); + BoatSubMessage m = new BoatSubMessage(y.getSourceID(), boatStatus, y.getLastMarkRounded().getId(), 0, 0, 1234l, 1234l); boatSubMessages.add(m); } @@ -223,11 +223,11 @@ public class GameServerThread implements Runnable, Observer, ClientConnectionDel server = ServerSocketChannel.open(); server.socket().bind(new InetSocketAddress("localhost", PORT_NUMBER)); - serverListenThread = new ServerListenThread(server, this); +// serverListenThread = new ServerListenThread(server, this); heartbeatThread = new HeartbeatThread(this); heartbeatThread.start(); - serverListenThread.start(); +// serverListenThread.start(); } catch (IOException e){ serverLog("Failed to bind socket: " + e.getMessage(), 0); @@ -286,7 +286,6 @@ public class GameServerThread implements Runnable, Observer, ClientConnectionDel * A client has tried to connect to the server * @param player The player that connected */ - @Override public void clientConnected(Player player) { if (GameState.getPlayers().size() < MAX_NUM_PLAYERS && GameState.getCurrentStage() == GameStages.LOBBYING) { serverLog("Player Connected", 0); @@ -295,6 +294,11 @@ public class GameServerThread implements Runnable, Observer, ClientConnectionDel } } + @Override + public void clientConnected(ServerToClientThread serverToClientThread) { + + } + /** * A player has left the game, remove the player from the GameState * @param player The player that left @@ -310,7 +314,7 @@ public class GameServerThread implements Runnable, Observer, ClientConnectionDel void broadcast(Message message) throws IOException{ for(Player player : GameState.getPlayers()) { //heh - player.getSocketChannel().socket().getOutputStream().write(message.getBuffer()); + player.getSocket().getOutputStream().write(message.getBuffer()); } seqNum++; } diff --git a/src/main/java/seng302/gameServer/GameState.java b/src/main/java/seng302/gameServer/GameState.java index 20aaaf4f..282915ec 100644 --- a/src/main/java/seng302/gameServer/GameState.java +++ b/src/main/java/seng302/gameServer/GameState.java @@ -1,11 +1,9 @@ package seng302.gameServer; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; + import seng302.models.Player; -import java.util.ArrayList; import seng302.models.Yacht; import seng302.server.messages.BoatActionType; @@ -30,6 +28,7 @@ public class GameState { players = new ArrayList<>(); currentStage = GameStages.LOBBYING; isRaceStarted = false; + yachts = new HashMap<>(); //set this when game stage changes to prerace previousUpdateTime = System.currentTimeMillis(); } @@ -74,6 +73,10 @@ public class GameState { return windSpeed; } + public static Map getYachts() { + return yachts; + } + public static void updateBoat(Integer sourceId, BoatActionType actionType) { switch (actionType) { case VMG: @@ -92,6 +95,7 @@ public class GameState { } public static void update() { + Long timeInterval = System.currentTimeMillis() - previousUpdateTime; previousUpdateTime = System.currentTimeMillis(); for (Yacht yacht : yachts.values()) { diff --git a/src/main/java/seng302/gameServer/MainServerThread.java b/src/main/java/seng302/gameServer/MainServerThread.java index 5149eee5..876a1a1e 100644 --- a/src/main/java/seng302/gameServer/MainServerThread.java +++ b/src/main/java/seng302/gameServer/MainServerThread.java @@ -59,13 +59,15 @@ public class MainServerThread extends Thread implements PacketBufferDelegate, Cl if (GameState.getCurrentStage() == GameStages.PRE_RACE) { GameState.update(); + updateClients(); } + //RACING if (GameState.getCurrentStage() == GameStages.RACING) { GameState.update(); + updateClients(); } - //FINISHED else if (GameState.getCurrentStage() == GameStages.FINISHED) { @@ -115,13 +117,6 @@ public class MainServerThread extends Thread implements PacketBufferDelegate, Cl return packetBuffer.add(streamPacket); } - private void initializeRace(){ - for (ServerToClientThread serverToClientThread : serverToClientThreads) { - serverToClientThread.updateClient(); - } - } - - /** * A client has tried to connect to the server * @param serverToClientThread The player that connected diff --git a/src/main/java/seng302/gameServer/ServerListenThread.java b/src/main/java/seng302/gameServer/ServerListenThread.java index b734ab8c..ab4dadec 100644 --- a/src/main/java/seng302/gameServer/ServerListenThread.java +++ b/src/main/java/seng302/gameServer/ServerListenThread.java @@ -29,6 +29,7 @@ public class ServerListenThread extends Thread{ Socket thisClient = serverSocket.accept(); if (thisClient != null){ ServerToClientThread thisConnection = new ServerToClientThread(thisClient); + thisConnection.initialiseRace(); thisConnection.start(); delegate.clientConnected(thisConnection); } diff --git a/src/main/java/seng302/gameServer/ServerToClientThread.java b/src/main/java/seng302/gameServer/ServerToClientThread.java index 14b98db8..a2ab4198 100644 --- a/src/main/java/seng302/gameServer/ServerToClientThread.java +++ b/src/main/java/seng302/gameServer/ServerToClientThread.java @@ -1,16 +1,15 @@ package seng302.gameServer; +import java.util.ArrayList; import java.util.Random; import seng302.client.ClientPacketParser; import seng302.models.Player; import seng302.models.Yacht; import seng302.models.stream.packets.PacketType; import seng302.models.stream.packets.StreamPacket; -import seng302.server.messages.ChatterMessage; -import seng302.server.messages.Heartbeat; -import seng302.server.messages.BoatActionType; -import seng302.server.messages.Message; +import seng302.models.xml.XMLGenerator; +import seng302.server.messages.*; import java.io.*; import java.net.Socket; @@ -35,9 +34,13 @@ public class ServerToClientThread extends Thread { private Boolean userIdentified = false; private Boolean connected = true; private Boolean updateClient = true; + private Boolean intiialisedRace = false; + private Integer seqNo; private Integer sourceId; + private XMLGenerator xml; + public ServerToClientThread(Socket socket) { this.socket = socket; try { @@ -51,6 +54,7 @@ public class ServerToClientThread extends Thread { Random rand = new Random(); sourceId = rand.nextInt(100000); GameState.addYacht(sourceId, new Yacht("Kappa", "Kap", new GeoPoint(0.0, 0.0), 0.0)); + seqNo = 0; } public void run() { @@ -61,12 +65,16 @@ public class ServerToClientThread extends Thread { //System.out.print("."); try { + if (intiialisedRace) { + sendSetupMessages(); + } + //Perform a write if it is time to as delegated by the MainServerThread if (updateClient) { // TODO: 13/07/17 wmu16 - Write out game state - some function that would write all appropriate messages to this output stream ChatterMessage chatterMessage = new ChatterMessage(4, 14, "Hello, it's me"); sendMessage(chatterMessage); - + sendBoatLocationPackets(); // try { // GameState.outputState(os); // } catch (IOException e) { @@ -115,6 +123,16 @@ public class ServerToClientThread extends Thread { } + private void sendSetupMessages() { + xml = new XMLGenerator(); + XMLMessage xmlMessage = new XMLMessage(xml.getRegattaAsXml(), XMLMessageSubType.REGATTA, xml.getRegattaAsXml().length()); + sendMessage(xmlMessage); + xmlMessage = new XMLMessage(xml.getBoatsAsXml(), XMLMessageSubType.BOAT, xml.getBoatsAsXml().length()); + sendMessage(xmlMessage); + xmlMessage = new XMLMessage(xml.getRaceAsXml(), XMLMessageSubType.RACE, xml.getRaceAsXml().length()); + sendMessage(xmlMessage); + } + public void updateClient() { updateClient = true; } @@ -156,6 +174,11 @@ public class ServerToClientThread extends Thread { } + public void initialiseRace(){ + intiialisedRace = true; + } + + private int readByte() throws Exception { int currentByte = -1; try { @@ -192,4 +215,18 @@ public class ServerToClientThread extends Thread { e.printStackTrace(); } } + + private int getSeqNo(){ + seqNo++; + return seqNo; + } + + + private void sendBoatLocationPackets(){ + ArrayList yachts = new ArrayList<>(GameState.getYachts().values()); + for (Yacht yacht: yachts){ + BoatLocationMessage boatLocationMessage = new BoatLocationMessage(sourceId,getSeqNo(), yacht.getLocation().getLat(), yacht.getLocation().getLng(), yacht.getHeading(), (long) yacht.getVelocity()); + sendMessage(boatLocationMessage); + } + } } diff --git a/src/main/java/seng302/models/Yacht.java b/src/main/java/seng302/models/Yacht.java index 7e45549d..3b53f4e6 100644 --- a/src/main/java/seng302/models/Yacht.java +++ b/src/main/java/seng302/models/Yacht.java @@ -252,4 +252,11 @@ public class Yacht { return boatName; } + public GeoPoint getLocation() { + return location; + } + + public Double getHeading() { + return heading; + } } diff --git a/src/main/java/seng302/models/stream/XMLParser.java b/src/main/java/seng302/models/stream/XMLParser.java index 733bcb54..99ce72c8 100644 --- a/src/main/java/seng302/models/stream/XMLParser.java +++ b/src/main/java/seng302/models/stream/XMLParser.java @@ -558,7 +558,7 @@ public class XMLParser { getNodeAttributeString(currentBoat, "Country")); this.boats.add(boat); if (boat.getBoatType().equals("Yacht")) { - competingBoats.put(boat.getSourceId(), boat); + competingBoats.put(boat.getSourceID(), boat); } } }