Merge remote-tracking branch 'origin/Story1055_Lobby_View_Update' into Merging_GameState_With_Lobby
# Conflicts: # src/main/java/seng302/client/ClientPacketParser.java # src/main/java/seng302/client/ClientToServerThread.java # src/main/java/seng302/controllers/LobbyController.java # src/main/java/seng302/controllers/StartScreenController.java # src/main/java/seng302/gameServer/ServerToClientThread.java
@@ -36,11 +36,9 @@ public class ClientPacketParser {
|
||||
|
||||
public static ConcurrentHashMap<Long, PriorityBlockingQueue<BoatPositionPacket>> markLocations = new ConcurrentHashMap<>();
|
||||
public static ConcurrentHashMap<Long, PriorityBlockingQueue<BoatPositionPacket>> boatLocations = new ConcurrentHashMap<>();
|
||||
private String threadName;
|
||||
private Thread t;
|
||||
private static boolean newRaceXmlReceived = false;
|
||||
private static boolean raceStarted = false;
|
||||
private static XMLParser xmlObject;
|
||||
private static XMLParser xmlObject = new XMLParser();
|
||||
private static boolean raceFinished = false;
|
||||
private static boolean streamStatus = false;
|
||||
private static long timeSinceStart = -1;
|
||||
@@ -51,7 +49,7 @@ public class ClientPacketParser {
|
||||
private static Long currentTimeLong;
|
||||
private static String currentTimeString;
|
||||
private static boolean appRunning;
|
||||
|
||||
private static Map<Integer, Yacht> clientStateBoats = new ConcurrentHashMap<>();
|
||||
|
||||
//CONVERSION CONSTANTS
|
||||
private static final Double MS_TO_KNOTS = 1.94384;
|
||||
@@ -121,7 +119,7 @@ public class ClientPacketParser {
|
||||
*/
|
||||
private static void extractHeartBeat(StreamPacket packet) {
|
||||
long heartbeat = bytesToLong(packet.getPayload());
|
||||
System.out.println("heartbeat = " + heartbeat);
|
||||
System.out.println("[CLIENT] Received heartbeat = " + heartbeat);
|
||||
}
|
||||
|
||||
private static String getTimeZoneString() {
|
||||
@@ -173,8 +171,10 @@ public class ClientPacketParser {
|
||||
if (raceStatus == 4 || raceStatus == 8) {
|
||||
raceFinished = true;
|
||||
raceStarted = false;
|
||||
ClientState.setRaceStarted(false);
|
||||
} else if (!raceStarted) {
|
||||
raceStarted = true;
|
||||
ClientState.setRaceStarted(true);
|
||||
raceFinished = false;
|
||||
}
|
||||
timeSinceStart = timeTillStart;
|
||||
@@ -186,41 +186,35 @@ public class ClientPacketParser {
|
||||
|
||||
int noBoats = payload[22];
|
||||
int raceType = payload[23];
|
||||
clientStateBoats = ClientState.getBoats();
|
||||
for (int i = 0; i < noBoats; i++) {
|
||||
long boatStatusSourceID = bytesToLong(
|
||||
Arrays.copyOfRange(payload, 24 + (i * 20), 28 + (i * 20)));
|
||||
Yacht boat = boats.get((int) boatStatusSourceID);
|
||||
boat.setBoatStatus((int) payload[28 + (i * 20)]);
|
||||
setBoatLegPosition(boat, (int) payload[29 + (i * 20)]);
|
||||
boat.setPenaltiesAwarded((int) payload[30 + (i * 20)]);
|
||||
boat.setPenaltiesServed((int) payload[31 + (i * 20)]);
|
||||
Long estTimeAtNextMark = bytesToLong(
|
||||
int boatStatus = (int) payload[28 + (i * 20)];
|
||||
int boatLegNumber = (int) payload[29 + (i * 20)];
|
||||
int boatPenaltyAwarded = (int) payload[30 + (i * 20)];
|
||||
int boatPenaltyServed = (int) payload[31 + (i * 20)];
|
||||
long estTimeAtNextMark = bytesToLong(
|
||||
Arrays.copyOfRange(payload, 32 + (i * 20), 38 + (i * 20)));
|
||||
boat.setEstimateTimeAtNextMark(estTimeAtNextMark);
|
||||
Long estTimeAtFinish = bytesToLong(
|
||||
long estTimeAtFinish = bytesToLong(
|
||||
Arrays.copyOfRange(payload, 38 + (i * 20), 44 + (i * 20)));
|
||||
|
||||
Yacht boat = boats.get((int) boatStatusSourceID);
|
||||
boat.setBoatStatus((boatStatus));
|
||||
setBoatLegPosition(boat, boatLegNumber);
|
||||
boat.setPenaltiesAwarded(boatPenaltyAwarded);
|
||||
boat.setPenaltiesServed(boatPenaltyServed);
|
||||
boat.setEstimateTimeAtNextMark(estTimeAtNextMark);
|
||||
boat.setEstimateTimeAtFinish(estTimeAtFinish);
|
||||
// boatsPos.put(estTimeAtFinish, boat);
|
||||
// String boatStatus = "SourceID: " + boatStatusSourceID;
|
||||
// boatStatus += "\nBoat Status: " + (int)payload[28 + (i * 20)];
|
||||
// boatStatus += "\nLegNumber: " + (int)payload[29 + (i * 20)];
|
||||
// boatStatus += "\nPenaltiesAwarded: " + (int)payload[29 + (i * 20)];
|
||||
// boatStatus += "\nPenaltiesServed: " + (int)payload[30 + (i * 20)];
|
||||
// boatStatus += "\nEstTimeAtNextMark: " + bytesToLong(Arrays.copyOfRange(payload,31 + (i * 20),37+ (i * 20)));
|
||||
// boatStatus += "\nEstTimeAtFinish: " + bytesToLong(Arrays.copyOfRange(payload,37 + (i * 20),43+ (i * 20)));
|
||||
// boatStatuses.add(boatStatus);
|
||||
|
||||
Yacht clientBoat = clientStateBoats.get((int) boatStatusSourceID);
|
||||
clientBoat.setBoatStatus((boatStatus));
|
||||
setBoatLegPosition(clientBoat, boatLegNumber);
|
||||
clientBoat.setPenaltiesAwarded(boatPenaltyAwarded);
|
||||
clientBoat.setPenaltiesServed(boatPenaltyServed);
|
||||
clientBoat.setEstimateTimeAtNextMark(estTimeAtNextMark);
|
||||
clientBoat.setEstimateTimeAtFinish(estTimeAtFinish);
|
||||
}
|
||||
// if (isRaceStarted()) {
|
||||
// int pos = 1;
|
||||
// for (Yacht yacht : boatsPos.values()) {
|
||||
// yacht.setPosition(String.valueOf(pos));
|
||||
// pos++;
|
||||
// }
|
||||
// } else {
|
||||
// for (Yacht yacht : boatsPos.values()) {
|
||||
// yacht.setPosition("-");
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
||||
private static void setBoatLegPosition(Yacht updatingBoat, Integer leg){
|
||||
@@ -288,9 +282,10 @@ public class ClientPacketParser {
|
||||
xmlObject.constructXML(doc, messageType);
|
||||
if (messageType == 7) { //7 is the boat XML
|
||||
boats = xmlObject.getBoatXML().getCompetingBoats();
|
||||
ClientState.setBoats(xmlObject.getBoatXML().getCompetingBoats());
|
||||
ClientState.setDirtyState(true);
|
||||
}
|
||||
if (messageType == 6) { //6 is race info xml
|
||||
|
||||
newRaceXmlReceived = true;
|
||||
}
|
||||
}
|
||||
@@ -378,7 +373,7 @@ public class ClientPacketParser {
|
||||
//type 1 is a racing yacht and type 3 is a mark, needed for updating positions of the mark and boat
|
||||
if (deviceType == 1){
|
||||
Yacht boat = boats.get((int) boatId);
|
||||
// boat.setVelocity(groundSpeed);
|
||||
boat.setVelocity(groundSpeed);
|
||||
BoatPositionPacket boatPacket = new BoatPositionPacket(boatId, timeValid, lat, lon, heading, groundSpeed);
|
||||
|
||||
//add a new priority que to the boatLocations HashMap
|
||||
|
||||
@@ -0,0 +1,78 @@
|
||||
package seng302.client;
|
||||
|
||||
import com.sun.org.apache.xpath.internal.operations.Bool;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import seng302.models.Yacht;
|
||||
|
||||
/**
|
||||
* Used by the client to store static variables to be used in game.
|
||||
*/
|
||||
public class ClientState {
|
||||
|
||||
private static String hostIp = "";
|
||||
private static Boolean isHost = false;
|
||||
private static Boolean raceStarted = false;
|
||||
private static Boolean connectedToHost = false;
|
||||
private static Map<Integer, Yacht> boats = new ConcurrentHashMap<>();
|
||||
private static Boolean dirtyState = true;
|
||||
private static String clientSourceId = "";
|
||||
|
||||
public static String getHostIp() {
|
||||
return hostIp;
|
||||
}
|
||||
|
||||
public static void setHostIp(String hostIp) {
|
||||
ClientState.hostIp = hostIp;
|
||||
}
|
||||
|
||||
public static Boolean isHost() {
|
||||
return isHost;
|
||||
}
|
||||
|
||||
public static void setHost(Boolean isHost) {
|
||||
ClientState.isHost = isHost;
|
||||
}
|
||||
|
||||
public static Boolean isRaceStarted() {
|
||||
return raceStarted;
|
||||
}
|
||||
|
||||
public static void setRaceStarted(Boolean raceStarted) {
|
||||
ClientState.raceStarted = raceStarted;
|
||||
}
|
||||
|
||||
public static Boolean isConnectedToHost() {
|
||||
return connectedToHost;
|
||||
}
|
||||
|
||||
public static void setConnectedToHost(Boolean connectedToHost) {
|
||||
ClientState.connectedToHost = connectedToHost;
|
||||
}
|
||||
|
||||
public static Map<Integer, Yacht> getBoats() {
|
||||
return boats;
|
||||
}
|
||||
|
||||
public static Boolean isDirtyState() {
|
||||
return dirtyState;
|
||||
}
|
||||
|
||||
public static void setDirtyState(Boolean dirtyState) {
|
||||
ClientState.dirtyState = dirtyState;
|
||||
}
|
||||
|
||||
public static String getClientSourceId() {
|
||||
return clientSourceId;
|
||||
}
|
||||
|
||||
public static void setClientSourceId(String clientSourceId) {
|
||||
ClientState.clientSourceId = clientSourceId;
|
||||
}
|
||||
|
||||
public static void setBoats(Map<Integer, Yacht> boats) {
|
||||
ClientState.boats = boats;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
package seng302.client;
|
||||
|
||||
import java.util.Observable;
|
||||
|
||||
/**
|
||||
* Used by LobbyController to run a separate thread-loop
|
||||
* updates the controller when change is detected.
|
||||
*/
|
||||
public class ClientStateQueryingRunnable extends Observable implements Runnable {
|
||||
|
||||
private Boolean terminate = false;
|
||||
|
||||
public ClientStateQueryingRunnable() {}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
while(!terminate) {
|
||||
// if (ClientState.isRaceStarted() && ClientState.isConnectedToHost()) {
|
||||
// setChanged();
|
||||
// notifyObservers();
|
||||
// }
|
||||
// Sleeping the thread so it will respond to the if statement below
|
||||
// if you know a better fix, pls tell me :) -ryan
|
||||
try {
|
||||
Thread.sleep(0);
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
if (ClientState.isDirtyState()) {
|
||||
setChanged();
|
||||
notifyObservers();
|
||||
ClientState.setDirtyState(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void terminate() {
|
||||
terminate = true;
|
||||
}
|
||||
}
|
||||
@@ -5,6 +5,7 @@ import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.net.Socket;
|
||||
import java.net.UnknownHostException;
|
||||
import java.util.zip.CRC32;
|
||||
import java.util.zip.Checksum;
|
||||
|
||||
@@ -30,19 +31,16 @@ public class ClientToServerThread implements Runnable {
|
||||
private Boolean updateClient = true;
|
||||
private ByteArrayOutputStream crcBuffer;
|
||||
|
||||
public ClientToServerThread(String ipAddress, Integer portNumber){
|
||||
try {
|
||||
public ClientToServerThread(String ipAddress, Integer portNumber) throws Exception{
|
||||
socket = new Socket(ipAddress, portNumber);
|
||||
is = socket.getInputStream();
|
||||
os = socket.getOutputStream();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
Integer allocatedID = threeWayHandshake();
|
||||
if (allocatedID != null) {
|
||||
ourID = allocatedID;
|
||||
clientLog("Successful handshake. Allocated ID: " + ourID, 1);
|
||||
ClientState.setClientSourceId(String.valueOf(ourID));
|
||||
} else {
|
||||
clientLog("Unsuccessful handhsake", 1);
|
||||
closeSocket();
|
||||
@@ -64,7 +62,7 @@ public class ClientToServerThread implements Runnable {
|
||||
int sync1;
|
||||
int sync2;
|
||||
// TODO: 14/07/17 wmu16 - Work out how to fix this while loop
|
||||
while(true) {
|
||||
while(ClientState.isConnectedToHost()) {
|
||||
try {
|
||||
//Perform a write if it is time to as delegated by the MainServerThread
|
||||
if (updateClient) {
|
||||
@@ -99,14 +97,17 @@ public class ClientToServerThread implements Runnable {
|
||||
} else {
|
||||
System.err.println("Packet has been dropped");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
closeSocket();
|
||||
e.printStackTrace();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
closeSocket();
|
||||
System.out.println("[CLIENT] Disconnected from server");
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -5,18 +5,28 @@ import java.net.Inet4Address;
|
||||
import java.net.InetAddress;
|
||||
import java.net.NetworkInterface;
|
||||
import java.net.URL;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Enumeration;
|
||||
import java.util.List;
|
||||
import java.util.Observable;
|
||||
import java.util.Observer;
|
||||
import java.util.ResourceBundle;
|
||||
import javafx.application.Platform;
|
||||
import javafx.collections.FXCollections;
|
||||
import javafx.collections.ObservableList;
|
||||
import javafx.fxml.FXML;
|
||||
import javafx.fxml.FXMLLoader;
|
||||
import javafx.fxml.Initializable;
|
||||
import javafx.scene.control.ListView;
|
||||
import javafx.scene.image.Image;
|
||||
import javafx.scene.image.ImageView;
|
||||
import javafx.scene.layout.AnchorPane;
|
||||
import javafx.scene.layout.GridPane;
|
||||
import javafx.scene.layout.Pane;
|
||||
import javafx.scene.text.Text;
|
||||
import seng302.client.ClientState;
|
||||
import seng302.client.ClientStateQueryingRunnable;
|
||||
import seng302.gameServer.GameStages;
|
||||
import seng302.gameServer.GameState;
|
||||
|
||||
@@ -24,16 +34,56 @@ import seng302.gameServer.GameState;
|
||||
* A class describing the actions of the lobby screen
|
||||
* Created by wmu16 on 10/07/17.
|
||||
*/
|
||||
public class LobbyController implements Initializable{
|
||||
public class LobbyController implements Initializable, Observer{
|
||||
|
||||
|
||||
@FXML
|
||||
private ListView competitorsListView;
|
||||
@FXML
|
||||
private GridPane lobbyScreen;
|
||||
@FXML
|
||||
private Text lobbyIpText;
|
||||
@FXML
|
||||
private ListView firstListView;
|
||||
@FXML
|
||||
private ListView secondListView;
|
||||
@FXML
|
||||
private ListView thirdListView;
|
||||
@FXML
|
||||
private ListView fourthListView;
|
||||
@FXML
|
||||
private ListView fifthListView;
|
||||
@FXML
|
||||
private ListView sixthListView;
|
||||
@FXML
|
||||
private ListView seventhListView;
|
||||
@FXML
|
||||
private ListView eighthListView;
|
||||
@FXML
|
||||
private ImageView firstImageView;
|
||||
@FXML
|
||||
private ImageView secondImageView;
|
||||
@FXML
|
||||
private ImageView thirdImageView;
|
||||
@FXML
|
||||
private ImageView fourthImageView;
|
||||
@FXML
|
||||
private ImageView fifthImageView;
|
||||
@FXML
|
||||
private ImageView sixthImageView;
|
||||
@FXML
|
||||
private ImageView seventhImageView;
|
||||
@FXML
|
||||
private ImageView eighthImageView;
|
||||
|
||||
private static ObservableList competitors;
|
||||
private static List<ObservableList<String>> competitors = new ArrayList<>();
|
||||
private static ObservableList<String> firstCompetitor = FXCollections.observableArrayList();
|
||||
private static ObservableList<String> secondCompetitor = FXCollections.observableArrayList();
|
||||
private static ObservableList<String> thirdCompetitor = FXCollections.observableArrayList();
|
||||
private static ObservableList<String> fourthCompetitor = FXCollections.observableArrayList();
|
||||
private static ObservableList<String> fifthCompetitor = FXCollections.observableArrayList();
|
||||
private static ObservableList<String> sixthCompetitor = FXCollections.observableArrayList();
|
||||
private static ObservableList<String> seventhCompetitor = FXCollections.observableArrayList();
|
||||
private static ObservableList<String> eighthCompetitor = FXCollections.observableArrayList();
|
||||
private ClientStateQueryingRunnable clientStateQueryingRunnable;
|
||||
|
||||
private void setContentPane(String jfxUrl) {
|
||||
try {
|
||||
@@ -52,57 +102,128 @@ public class LobbyController implements Initializable{
|
||||
|
||||
@Override
|
||||
public void initialize(URL location, ResourceBundle resources) {
|
||||
lobbyIpText.setText("Lobby Host IP: " + getLocalHostIp());
|
||||
if (ClientState.isHost())
|
||||
lobbyIpText.setText("Lobby Host IP: " + ClientState.getHostIp());
|
||||
else
|
||||
lobbyIpText.setText("Connected to IP: ");
|
||||
initialiseListView();
|
||||
// initialiseLobbyControllerThread();
|
||||
// initialiseImageView(); // parrot gif init
|
||||
|
||||
// set up client state query thread, so that when it receives the race-started packet
|
||||
// it can switch to the race view
|
||||
ClientStateQueryingRunnable clientStateQueryingRunnable = new ClientStateQueryingRunnable();
|
||||
clientStateQueryingRunnable.addObserver(this);
|
||||
Thread clientStateQueryingThread = new Thread(clientStateQueryingRunnable, "Client State querying thread");
|
||||
clientStateQueryingThread.setDaemon(true);
|
||||
clientStateQueryingThread.start();
|
||||
}
|
||||
|
||||
public void initialize() {
|
||||
competitors = FXCollections.observableArrayList();
|
||||
competitorsListView.setItems(competitors);
|
||||
@Override
|
||||
public void update(Observable o, Object arg) {
|
||||
Platform.runLater(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
// switchToRaceView();
|
||||
initialiseListView();
|
||||
// clientStateQueryingRunnable.terminate();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private String getLocalHostIp() {
|
||||
String ipAddress = null;
|
||||
try {
|
||||
Enumeration<NetworkInterface> e = NetworkInterface.getNetworkInterfaces();
|
||||
while (e.hasMoreElements()) {
|
||||
NetworkInterface ni = e.nextElement();
|
||||
if (ni.isLoopback())
|
||||
continue;
|
||||
if(ni.isPointToPoint())
|
||||
continue;
|
||||
if(ni.isVirtual())
|
||||
continue;
|
||||
private void initialiseListView() {
|
||||
firstListView.getItems().clear();
|
||||
secondListView.getItems().clear();
|
||||
thirdListView.getItems().clear();
|
||||
fourthListView.getItems().clear();
|
||||
fifthListView.getItems().clear();
|
||||
sixthListView.getItems().clear();
|
||||
seventhListView.getItems().clear();
|
||||
eighthListView.getItems().clear();
|
||||
|
||||
Enumeration<InetAddress> addresses = ni.getInetAddresses();
|
||||
while(addresses.hasMoreElements()) {
|
||||
InetAddress address = addresses.nextElement();
|
||||
if(address instanceof Inet4Address) { // skip all ipv6
|
||||
ipAddress = address.getHostAddress();
|
||||
competitors = new ArrayList<>();
|
||||
Collections.addAll(competitors, firstCompetitor, secondCompetitor, thirdCompetitor,
|
||||
fourthCompetitor, fifthCompetitor, sixthCompetitor, seventhCompetitor, eighthCompetitor);
|
||||
|
||||
for (ObservableList<String> ol : competitors) {
|
||||
ol.removeAll();
|
||||
}
|
||||
|
||||
firstCompetitor.add(ClientState.getClientSourceId());
|
||||
|
||||
int competitorIndex = 1;
|
||||
for (Integer yachtId : ClientState.getBoats().keySet()) {
|
||||
// break if there are more than 7 competitors
|
||||
if (competitorIndex >= 8) {
|
||||
break;
|
||||
}
|
||||
if (!yachtId.equals(ClientState.getClientSourceId())) {
|
||||
competitors.get(competitorIndex).add(String.valueOf(yachtId));
|
||||
competitorIndex++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
firstListView.setItems(firstCompetitor);
|
||||
secondListView.setItems(secondCompetitor);
|
||||
thirdListView.setItems(thirdCompetitor);
|
||||
fourthListView.setItems(fourthCompetitor);
|
||||
fifthListView.setItems(fifthCompetitor);
|
||||
sixthListView.setItems(sixthCompetitor);
|
||||
seventhListView.setItems(seventhCompetitor);
|
||||
eighthListView.setItems(eighthCompetitor);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
|
||||
private void initialiseLobbyControllerThread() {
|
||||
Thread thread = new Thread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
Platform.runLater(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
|
||||
}
|
||||
if (ipAddress == null) {
|
||||
System.out.println("[HOST] Cannot obtain local host ip address.");
|
||||
});
|
||||
}
|
||||
return ipAddress;
|
||||
});
|
||||
thread.start();
|
||||
}
|
||||
|
||||
private void initialiseImageView() {
|
||||
Image image1 = new Image(getClass().getResourceAsStream("/ParrotGif/alistair.gif"));
|
||||
firstImageView.setImage(image1);
|
||||
Image image2 = new Image(getClass().getResourceAsStream("/ParrotGif/calum.gif"));
|
||||
secondImageView.setImage(image2);
|
||||
Image image3 = new Image(getClass().getResourceAsStream("/ParrotGif/haoming.gif"));
|
||||
thirdImageView.setImage(image3);
|
||||
Image image4 = new Image(getClass().getResourceAsStream("/ParrotGif/kusal.gif"));
|
||||
fourthImageView.setImage(image4);
|
||||
Image image5 = new Image(getClass().getResourceAsStream("/ParrotGif/michael.gif"));
|
||||
fifthImageView.setImage(image5);
|
||||
Image image6 = new Image(getClass().getResourceAsStream("/ParrotGif/peter.gif"));
|
||||
sixthImageView.setImage(image6);
|
||||
Image image7 = new Image(getClass().getResourceAsStream("/ParrotGif/ryan.gif"));
|
||||
seventhImageView.setImage(image7);
|
||||
Image image8 = new Image(getClass().getResourceAsStream("/ParrotGif/will.gif"));
|
||||
eighthImageView.setImage(image8);
|
||||
}
|
||||
|
||||
@FXML
|
||||
public void leaveLobbyButtonPressed() {
|
||||
// TODO: 10/07/17 wmu16 - Finish function!
|
||||
setContentPane("/views/StartScreenView.fxml");
|
||||
System.out.println("Leaving lobby!");
|
||||
GameState.setCurrentStage(GameStages.CANCELLED);
|
||||
// TODO: 20/07/17 wmu16 - Implement some way of terminating the game
|
||||
ClientState.setConnectedToHost(false);
|
||||
}
|
||||
|
||||
|
||||
@FXML
|
||||
public void readyButtonPressed() {
|
||||
GameState.setCurrentStage(GameStages.RACING);
|
||||
}
|
||||
|
||||
private void switchToRaceView() {
|
||||
setContentPane("/views/RaceView.fxml");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -96,12 +96,12 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel
|
||||
startingBoats = new ArrayList<>(ClientPacketParser.getBoats().values());
|
||||
|
||||
includedCanvasController.setup(this);
|
||||
includedCanvasController.initializeCanvas();
|
||||
// includedCanvasController.initializeCanvas();
|
||||
initializeUpdateTimer();
|
||||
initialiseFPSCheckBox();
|
||||
initialiseAnnotationSlider();
|
||||
initialiseBoatSelectionComboBox();
|
||||
includedCanvasController.timer.start();
|
||||
// includedCanvasController.timer.start();
|
||||
selectAnnotationBtn.setOnAction(event -> loadSelectAnnotationView());
|
||||
|
||||
}
|
||||
@@ -283,7 +283,7 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel
|
||||
event -> {
|
||||
updateRaceTime();
|
||||
updateWindDirection();
|
||||
updateOrder();
|
||||
// updateOrder();
|
||||
updateBoatSelectionComboBox();
|
||||
})
|
||||
);
|
||||
|
||||
@@ -1,11 +1,17 @@
|
||||
package seng302.controllers;
|
||||
|
||||
import java.net.Inet4Address;
|
||||
import java.net.NetworkInterface;
|
||||
import java.util.Enumeration;
|
||||
import javafx.fxml.FXML;
|
||||
import javafx.fxml.FXMLLoader;
|
||||
import javafx.scene.control.Alert;
|
||||
import javafx.scene.control.Alert.AlertType;
|
||||
import javafx.scene.control.TextField;
|
||||
import javafx.scene.layout.AnchorPane;
|
||||
import javafx.scene.layout.GridPane;
|
||||
import javafx.scene.layout.Pane;
|
||||
import seng302.client.ClientState;
|
||||
import seng302.client.ClientToServerThread;
|
||||
import seng302.gameServer.GameState;
|
||||
import seng302.gameServer.MainServerThread;
|
||||
@@ -23,6 +29,8 @@ public class StartScreenController {
|
||||
@FXML
|
||||
private TextField ipTextField;
|
||||
@FXML
|
||||
private TextField portTextField;
|
||||
@FXML
|
||||
private GridPane startScreen2;
|
||||
|
||||
private Controller controller;
|
||||
@@ -54,43 +62,99 @@ public class StartScreenController {
|
||||
/**
|
||||
* ATTEMPTS TO:
|
||||
* Sets up a new game state with your IP address as designated as the host.
|
||||
* Starts a thread to listen for incoming connections
|
||||
* Starts a thread to listen for incoming connections.
|
||||
* Starts a client to server thread and connects to own ip.
|
||||
* Switches to the lobby screen
|
||||
*/
|
||||
@FXML
|
||||
public void hostButtonPressed() {
|
||||
try {
|
||||
String ipAddress = InetAddress.getLocalHost().getHostAddress();
|
||||
new GameState(ipAddress);
|
||||
new MainServerThread();
|
||||
ClientToServerThread clientToServerThread = new ClientToServerThread("localhost", 4950);
|
||||
controller.setClientToServerThread(clientToServerThread);
|
||||
// new GameServerThread("Fuck you");
|
||||
// get the lobby controller so that we can pass the game server thread to it
|
||||
new GameState(getLocalHostIp());
|
||||
new MainServerThread();
|
||||
ClientState.setHost(true);
|
||||
// host will connect and handshake to itself after setting up the server
|
||||
ClientToServerThread clientToServerThread = new ClientToServerThread(ClientState.getHostIp(), 4950);
|
||||
ClientState.setConnectedToHost(true);
|
||||
controller.setClientToServerThread(clientToServerThread);
|
||||
setContentPane("/views/LobbyView.fxml");
|
||||
} catch (UnknownHostException e) {
|
||||
System.err.println("COULD NOT FIND YOUR IP ADDRESS!");
|
||||
} catch (Exception e) {
|
||||
Alert alert = new Alert(AlertType.ERROR);
|
||||
alert.setHeaderText("Cannot host");
|
||||
alert.setContentText("Oops, failed to host, try to restart.");
|
||||
alert.showAndWait();
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* ATTEMPTS TO:
|
||||
* Connect to an ip address and port using the ip and port specified on start screen.
|
||||
* Starts a Client To Server Thread to maintain connection to host.
|
||||
* Switch view to lobby view.
|
||||
*/
|
||||
@FXML
|
||||
public void connectButtonPressed() {
|
||||
// TODO: 10/07/17 wmu16 - Finish function
|
||||
String ipAddress = ipTextField.getText().trim().toLowerCase();
|
||||
try {
|
||||
// TODO: 22/07/17 wmu 16 - make this port number some static constant somewhere perhaps a config file?
|
||||
ClientToServerThread clientToServerThread = new ClientToServerThread(ipAddress, 4950);
|
||||
String ipAddress = ipTextField.getText().trim().toLowerCase();
|
||||
Integer port = Integer.valueOf(portTextField.getText().trim());
|
||||
|
||||
ClientToServerThread clientToServerThread = new ClientToServerThread(ipAddress, port);
|
||||
ClientState.setHost(false);
|
||||
ClientState.setConnectedToHost(true);
|
||||
|
||||
controller.setClientToServerThread(clientToServerThread);
|
||||
setContentPane("/views/LobbyView.fxml");
|
||||
} catch (Exception e){
|
||||
e.printStackTrace();
|
||||
} catch (Exception e) {
|
||||
Alert alert = new Alert(AlertType.ERROR);
|
||||
alert.setHeaderText("Cannot reach the host");
|
||||
alert.setContentText("Please check your host IP address.");
|
||||
alert.showAndWait();
|
||||
}
|
||||
}
|
||||
|
||||
public void setController(Controller controller) {
|
||||
this.controller = controller;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the local host ip address and sets this ip to ClientState.
|
||||
* Only runs by the host.
|
||||
*
|
||||
* @return the localhost ip address
|
||||
*/
|
||||
private String getLocalHostIp() {
|
||||
String ipAddress = null;
|
||||
try {
|
||||
Enumeration<NetworkInterface> e = NetworkInterface.getNetworkInterfaces();
|
||||
while (e.hasMoreElements()) {
|
||||
NetworkInterface ni = e.nextElement();
|
||||
if (ni.isLoopback())
|
||||
continue;
|
||||
if(ni.isPointToPoint())
|
||||
continue;
|
||||
if(ni.isVirtual())
|
||||
continue;
|
||||
|
||||
Enumeration<InetAddress> addresses = ni.getInetAddresses();
|
||||
while(addresses.hasMoreElements()) {
|
||||
InetAddress address = addresses.nextElement();
|
||||
if(address instanceof Inet4Address) { // skip all ipv6
|
||||
ipAddress = address.getHostAddress();
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
if (ipAddress == null) {
|
||||
System.out.println("[HOST] Cannot obtain local host ip address.");
|
||||
}
|
||||
ClientState.setHostIp(ipAddress);
|
||||
return ipAddress;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -37,6 +37,7 @@ public class GameState {
|
||||
yachts = new HashMap<>();
|
||||
//set this when game stage changes to prerace
|
||||
previousUpdateTime = System.currentTimeMillis();
|
||||
yachts = new HashMap<>();
|
||||
}
|
||||
|
||||
public static String getHostIpAddress() {
|
||||
|
||||
@@ -34,7 +34,7 @@ public class MainServerThread implements Runnable, PacketBufferDelegate, ClientC
|
||||
try {
|
||||
serverSocket = new ServerSocket(PORT);
|
||||
} catch (IOException e) {
|
||||
System.out.println("IO error in server thread handler upon trying to make new server socket");
|
||||
serverLog("IO error in server thread handler upon trying to make new server socket", 0);
|
||||
}
|
||||
|
||||
packetBuffer = new PriorityBlockingQueue<>();
|
||||
@@ -80,7 +80,6 @@ public class MainServerThread implements Runnable, PacketBufferDelegate, ClientC
|
||||
updateClients();
|
||||
|
||||
while (!packetBuffer.isEmpty()){
|
||||
System.out.println("WHATUPPP");
|
||||
try {
|
||||
StreamPacket packet = packetBuffer.take();
|
||||
ClientPacketParser.parsePacket(packet);
|
||||
@@ -90,9 +89,6 @@ public class MainServerThread implements Runnable, PacketBufferDelegate, ClientC
|
||||
}
|
||||
}
|
||||
|
||||
System.out.println("WHOOPSIES");
|
||||
|
||||
|
||||
// TODO: 14/07/17 wmu16 - Send out disconnect packet to clients
|
||||
try {
|
||||
serverSocket.close();
|
||||
@@ -118,7 +114,6 @@ public class MainServerThread implements Runnable, PacketBufferDelegate, ClientC
|
||||
|
||||
@Override
|
||||
public boolean addToBuffer(StreamPacket streamPacket) {
|
||||
System.out.println("HEY HI");
|
||||
return packetBuffer.add(streamPacket);
|
||||
}
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@ import java.util.ArrayList;
|
||||
import java.util.Random;
|
||||
import java.util.zip.CRC32;
|
||||
import java.util.zip.Checksum;
|
||||
import org.apache.commons.io.IOUtils;
|
||||
import seng302.models.Player;
|
||||
import seng302.models.Yacht;
|
||||
import seng302.models.stream.packets.PacketType;
|
||||
@@ -20,6 +21,13 @@ import seng302.models.xml.XMLGenerator;
|
||||
import seng302.server.messages.BoatActionType;
|
||||
import seng302.server.messages.BoatLocationMessage;
|
||||
import seng302.server.messages.Message;
|
||||
|
||||
import java.io.*;
|
||||
import java.net.Socket;
|
||||
import java.util.zip.CRC32;
|
||||
import java.util.zip.Checksum;
|
||||
import seng302.server.messages.XMLMessage;
|
||||
import seng302.server.messages.XMLMessageSubType;
|
||||
import seng302.server.messages.XMLMessage;
|
||||
import seng302.server.messages.XMLMessageSubType;
|
||||
import seng302.utilities.GeoPoint;
|
||||
@@ -89,8 +97,76 @@ public class ServerToClientThread implements Runnable {
|
||||
int sync1;
|
||||
int sync2;
|
||||
// TODO: 14/07/17 wmu16 - Work out how to fix this while loop
|
||||
|
||||
// used by ryan to simulate sending boats.xml
|
||||
// InputStream inputStream = getClass().getResourceAsStream("/server_config/boats1.xml");
|
||||
// StringWriter writer = new StringWriter();
|
||||
// try {
|
||||
// IOUtils.copy(inputStream, writer);
|
||||
// } catch (IOException e) {
|
||||
// e.printStackTrace();
|
||||
// }
|
||||
// String xml = writer.toString();
|
||||
// Message message = new XMLMessage(xml, XMLMessageSubType.BOAT, 0);
|
||||
// sendMessage(message);
|
||||
// System.out.println("[server] send message 1 " + message);
|
||||
//
|
||||
// try {
|
||||
// Thread.sleep(3000);
|
||||
// } catch (InterruptedException e) {
|
||||
// e.printStackTrace();
|
||||
// }
|
||||
//
|
||||
// inputStream = getClass().getResourceAsStream("/server_config/boats.xml");
|
||||
// writer = new StringWriter();
|
||||
// try {
|
||||
// IOUtils.copy(inputStream, writer);
|
||||
// } catch (IOException e) {
|
||||
// e.printStackTrace();
|
||||
// }
|
||||
// xml = writer.toString();
|
||||
// message = new XMLMessage(xml, XMLMessageSubType.BOAT, 0);
|
||||
// sendMessage(message);
|
||||
// System.out.println("[server] send message 2 " + message);
|
||||
//
|
||||
// try {
|
||||
// Thread.sleep(3000);
|
||||
// } catch (InterruptedException e) {
|
||||
// e.printStackTrace();
|
||||
// }
|
||||
//
|
||||
// inputStream = getClass().getResourceAsStream("/server_config/boats2.xml");
|
||||
// writer = new StringWriter();
|
||||
// try {
|
||||
// IOUtils.copy(inputStream, writer);
|
||||
// } catch (IOException e) {
|
||||
// e.printStackTrace();
|
||||
// }
|
||||
// xml = writer.toString();
|
||||
// message = new XMLMessage(xml, XMLMessageSubType.BOAT, 0);
|
||||
// sendMessage(message);
|
||||
// System.out.println("[server] send message 3 " + message);
|
||||
//
|
||||
// try {
|
||||
// Thread.sleep(3000);
|
||||
// } catch (InterruptedException e) {
|
||||
// e.printStackTrace();
|
||||
// }
|
||||
//
|
||||
// inputStream = getClass().getResourceAsStream("/server_config/boats.xml");
|
||||
// writer = new StringWriter();
|
||||
// try {
|
||||
// IOUtils.copy(inputStream, writer);
|
||||
// } catch (IOException e) {
|
||||
// e.printStackTrace();
|
||||
// }
|
||||
// xml = writer.toString();
|
||||
// message = new XMLMessage(xml, XMLMessageSubType.BOAT, 0);
|
||||
// sendMessage(message);
|
||||
// System.out.println("[server] send message 4 " + message);
|
||||
//-------
|
||||
|
||||
while(true) {
|
||||
//System.out.print(".");
|
||||
|
||||
try {
|
||||
if (initialisedRace) {
|
||||
@@ -275,6 +351,8 @@ public class ServerToClientThread implements Runnable {
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
public Thread getThread() {
|
||||
return thread;
|
||||
|
||||
|
After Width: | Height: | Size: 50 KiB |
|
After Width: | Height: | Size: 44 KiB |
|
After Width: | Height: | Size: 52 KiB |
|
After Width: | Height: | Size: 46 KiB |
|
After Width: | Height: | Size: 51 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 54 KiB |
|
After Width: | Height: | Size: 49 KiB |
|
After Width: | Height: | Size: 59 KiB |
@@ -0,0 +1,171 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<BoatConfig>
|
||||
<Modified>2015-08-28T17:32:59+0100</Modified>
|
||||
<Version>12</Version>
|
||||
<Snapshot>219</Snapshot>
|
||||
<Settings>
|
||||
<RaceBoatType Type="AC45"/>
|
||||
<BoatDimension BoatLength="14.019" HullLength="13.449"/>
|
||||
<ZoneSize MarkZoneSize="40.347" CourseZoneSize="53.796"/>
|
||||
<ZoneLimits Limit1="200" Limit2="100" Limit3="53.796" Limit4="0" Limit5="-100"/>
|
||||
</Settings>
|
||||
<BoatShapes>
|
||||
<BoatShape ShapeID="0">
|
||||
<Vertices>
|
||||
<Vtx Seq="3" Y="25" X="0"/>
|
||||
</Vertices>
|
||||
</BoatShape>
|
||||
<BoatShape ShapeID="14">
|
||||
<Vertices>
|
||||
<Vtx Seq="1" Y="0" X="-1"/>
|
||||
<Vtx Seq="2" Y="0.75" X="-1"/>
|
||||
<Vtx Seq="3" Y="0.75" X="-0.25"/>
|
||||
<Vtx Seq="4" Y="3.5" X="-0.25"/>
|
||||
<Vtx Seq="5" Y="4.5" X="-1"/>
|
||||
<Vtx Seq="6" Y="6.5" X="-1"/>
|
||||
<Vtx Seq="7" Y="7" X="-0.5"/>
|
||||
<Vtx Seq="8" Y="7" X="0.5"/>
|
||||
<Vtx Seq="9" Y="6.5" X="1"/>
|
||||
<Vtx Seq="10" Y="4.5" X="1"/>
|
||||
<Vtx Seq="11" Y="3.5" X="0.25"/>
|
||||
<Vtx Seq="12" Y="0.75" X="0.25"/>
|
||||
<Vtx Seq="13" Y="0.75" X="1"/>
|
||||
<Vtx Seq="14" Y="0" X="1"/>
|
||||
</Vertices>
|
||||
</BoatShape>
|
||||
<BoatShape ShapeID="15">
|
||||
<Vertices>
|
||||
<Vtx Seq="1" Y="0" X="-3.46"/>
|
||||
<Vtx Seq="2" Y="13.449" X="-3.46"/>
|
||||
<Vtx Seq="3" Y="14.019" X="0"/>
|
||||
<Vtx Seq="4" Y="13.449" X="3.46"/>
|
||||
<Vtx Seq="5" Y="0" X="3.46"/>
|
||||
</Vertices>
|
||||
<Catamaran>
|
||||
<Vtx Seq="1" Y="1.769" X="-2.752"/>
|
||||
<Vtx Seq="2" Y="0" X="-2.813"/>
|
||||
<Vtx Seq="3" Y="0" X="-3.34"/>
|
||||
<Vtx Seq="4" Y="5.351" X="-3.46"/>
|
||||
<Vtx Seq="5" Y="10.544" X="-3.387"/>
|
||||
<Vtx Seq="6" Y="13.449" X="-3.075"/>
|
||||
<Vtx Seq="7" Y="10.851" X="-2.793"/>
|
||||
<Vtx Seq="8" Y="6.669" X="-2.699"/>
|
||||
<Vtx Seq="9" Y="6.669" X="2.699"/>
|
||||
<Vtx Seq="10" Y="10.851" X="2.793"/>
|
||||
<Vtx Seq="11" Y="13.449" X="3.075"/>
|
||||
<Vtx Seq="12" Y="10.544" X="3.387"/>
|
||||
<Vtx Seq="13" Y="5.351" X="3.46"/>
|
||||
<Vtx Seq="14" Y="0" X="3.34"/>
|
||||
<Vtx Seq="15" Y="0" X="2.813"/>
|
||||
<Vtx Seq="16" Y="1.769" X="2.752"/>
|
||||
</Catamaran>
|
||||
<Bowsprit>
|
||||
<Vtx Seq="1" Y="6.669" X="-0.2"/>
|
||||
<Vtx Seq="2" Y="11.377" X="-0.2"/>
|
||||
<Vtx Seq="3" Y="14.019" X="0"/>
|
||||
<Vtx Seq="4" Y="11.377" X="0.2"/>
|
||||
<Vtx Seq="5" Y="6.669" X="0.2"/>
|
||||
</Bowsprit>
|
||||
<Trampoline>
|
||||
<Vtx Seq="1" Y="2" X="-2.699"/>
|
||||
<Vtx Seq="2" Y="6.438" X="-2.699"/>
|
||||
<Vtx Seq="3" Y="6.438" X="2.699"/>
|
||||
<Vtx Seq="4" Y="2" X="2.699"/>
|
||||
</Trampoline>
|
||||
</BoatShape>
|
||||
<BoatShape ShapeID="18">
|
||||
<Vertices>
|
||||
<Vtx Seq="1" Y="0" X="-1.04"/>
|
||||
<Vtx Seq="2" Y="0.11" X="-1.18"/>
|
||||
<Vtx Seq="3" Y="0.42" X="-1.28"/>
|
||||
<Vtx Seq="4" Y="3.74" X="-1.29"/>
|
||||
<Vtx Seq="5" Y="5.36" X="-1.21"/>
|
||||
<Vtx Seq="6" Y="6.29" X="-1.08"/>
|
||||
<Vtx Seq="7" Y="7.15" X="-0.84"/>
|
||||
<Vtx Seq="8" Y="7.63" X="-0.62"/>
|
||||
<Vtx Seq="9" Y="7.94" X="-0.34"/>
|
||||
<Vtx Seq="10" Y="8.06" X="0"/>
|
||||
<Vtx Seq="11" Y="7.94" X="0.34"/>
|
||||
<Vtx Seq="12" Y="7.63" X="0.62"/>
|
||||
<Vtx Seq="13" Y="7.15" X="0.84"/>
|
||||
<Vtx Seq="14" Y="6.29" X="1.08"/>
|
||||
<Vtx Seq="15" Y="5.36" X="1.21"/>
|
||||
<Vtx Seq="16" Y="3.74" X="1.29"/>
|
||||
<Vtx Seq="17" Y="0.42" X="1.28"/>
|
||||
<Vtx Seq="18" Y="0.11" X="1.18"/>
|
||||
<Vtx Seq="19" Y="0" X="1.04"/>
|
||||
</Vertices>
|
||||
</BoatShape>
|
||||
<BoatShape ShapeID="24">
|
||||
<Vertices>
|
||||
<Vtx Seq="1" Y="0" X="-2.5"/>
|
||||
<Vtx Seq="2" Y="7" X="-2.5"/>
|
||||
<Vtx Seq="3" Y="12.6" X="-2.2"/>
|
||||
<Vtx Seq="4" Y="12.6" X="2.2"/>
|
||||
<Vtx Seq="5" Y="7" X="2.5"/>
|
||||
<Vtx Seq="6" Y="0" X="2.5"/>
|
||||
</Vertices>
|
||||
</BoatShape>
|
||||
<BoatShape ShapeID="34">
|
||||
<Vertices>
|
||||
<Vtx Seq="1" Y="0" X="-1.16"/>
|
||||
<Vtx Seq="2" Y="5.51" X="-1.16"/>
|
||||
<Vtx Seq="3" Y="5.846" X="-0.84"/>
|
||||
<Vtx Seq="4" Y="5.846" X="0.84"/>
|
||||
<Vtx Seq="5" Y="5.51" X="1.16"/>
|
||||
<Vtx Seq="6" Y="0" X="1.16"/>
|
||||
</Vertices>
|
||||
</BoatShape>
|
||||
<BoatShape ShapeID="35">
|
||||
<Vertices>
|
||||
<Vtx Seq="1" Y="0" X="-1.461"/>
|
||||
<Vtx Seq="2" Y="6" X="-1.461"/>
|
||||
<Vtx Seq="3" Y="7" X="-1.44"/>
|
||||
<Vtx Seq="4" Y="8" X="-1.38"/>
|
||||
<Vtx Seq="5" Y="9" X="-1.17"/>
|
||||
<Vtx Seq="6" Y="10" X="-0.76"/>
|
||||
<Vtx Seq="7" Y="10.6" X="-0.34"/>
|
||||
<Vtx Seq="8" Y="10.61" X="0"/>
|
||||
<Vtx Seq="9" Y="10.6" X="0.34"/>
|
||||
<Vtx Seq="10" Y="10" X="0.76"/>
|
||||
<Vtx Seq="11" Y="9" X="1.17"/>
|
||||
<Vtx Seq="12" Y="8" X="1.38"/>
|
||||
<Vtx Seq="13" Y="7" X="1.44"/>
|
||||
<Vtx Seq="14" Y="6" X="1.461"/>
|
||||
<Vtx Seq="15" Y="0" X="1.461"/>
|
||||
</Vertices>
|
||||
</BoatShape>
|
||||
</BoatShapes>
|
||||
<Boats>
|
||||
<Boat Type="Yacht" SourceID="201" ShapeID="15" StoweName="USA" ShortName="ORACLE" ShorterName="USA" BoatName="ORACLE TEAM USA" HullNum="AC4515" Skipper="SPITHILL" Helmsman="SPITHILL" Country="USA" PeliID="101" RadioIP="172.20.2.101">
|
||||
<GPSposition Z="1.78" Y="-0.331" X="-0.006"/>
|
||||
<MastTop Z="21.496" Y="3.7" X="0"/>
|
||||
<FlagPosition Z="0" Y="6.2" X="0"/>
|
||||
</Boat>
|
||||
<Boat Type="Yacht" SourceID="301" ShapeID="15" StoweName="SWE" ShortName="ARTEMIS" ShorterName="SWE" BoatName="ARTEMIS RACING" HullNum="AC4517" Skipper="OUTTERIDGE" Helmsman="OUTTERIDGE" Country="SWE" PeliID="102" RadioIP="172.20.2.102">
|
||||
<GPSposition Z="1.727" Y="-0.359" X="-0.0121"/>
|
||||
<MastTop Z="21.496" Y="3.7" X="0"/>
|
||||
<FlagPosition Z="0" Y="6.2" X="0"/>
|
||||
</Boat>
|
||||
<Boat Type="Yacht" SourceID="401" ShapeID="15" StoweName="NZL" ShortName="ETNZ" ShorterName="NZL" BoatName="EMIRATES TEAM NZ" HullNum="AC4503" Skipper="ASHBY" Helmsman="BURLING" Country="NZL" PeliID="103" RadioIP="172.20.2.103">
|
||||
<GPSposition Z="1.881" Y="-0.291" X="-0.003"/>
|
||||
<MastTop Z="21.496" Y="3.7" X="0"/>
|
||||
<FlagPosition Z="0" Y="6.2" X="0"/>
|
||||
</Boat>
|
||||
<Boat Type="Yacht" SourceID="501" ShapeID="15" StoweName="JPN" ShortName="JAPAN" ShorterName="JPN" BoatName="SOFTBANK TEAM JAPAN" HullNum="AC4504" Skipper="BARKER" Helmsman="BARKER" Country="JPN" PeliID="104" RadioIP="172.20.2.104">
|
||||
<GPSposition Z="1.805" Y="-0.322" X="-0.003"/>
|
||||
<MastTop Z="21.496" Y="3.7" X="0"/>
|
||||
<FlagPosition Z="0" Y="6.2" X="0"/>
|
||||
</Boat>
|
||||
<Boat Type="Yacht" SourceID="601" ShapeID="15" StoweName="FRA" ShortName="FRANCE" ShorterName="FRA" BoatName="GROUPAMA TEAM FRANCE" HullNum="AC4505" Skipper="CAMMAS" Helmsman="CAMMAS" Country="FRA" PeliID="105" RadioIP="172.20.2.105">
|
||||
<GPSposition Z="1.863" Y="-0.3" X="-0.003"/>
|
||||
<MastTop Z="21.496" Y="3.7" X="0"/>
|
||||
<FlagPosition Z="0" Y="6.2" X="0"/>
|
||||
</Boat>
|
||||
<Boat Type="Yacht" SourceID="701" ShapeID="15" StoweName="GBR" ShortName="GBR" ShorterName="GBR" BoatName="LAND ROVER BAR" HullNum="AC4516" Skipper="ANSLIE" Helmsman="ANSLIE" Country="GBR" PeliID="106" RadioIP="172.20.2.106">
|
||||
<GPSposition Z="1.734" Y="-0.352" X="0"/>
|
||||
<MastTop Z="21.496" Y="3.7" X="0"/>
|
||||
<FlagPosition Z="0" Y="6.2" X="0"/>
|
||||
</Boat>
|
||||
</Boats>
|
||||
</BoatConfig>
|
||||
@@ -0,0 +1,161 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<BoatConfig>
|
||||
<Modified>2015-08-28T17:32:59+0100</Modified>
|
||||
<Version>12</Version>
|
||||
<Snapshot>219</Snapshot>
|
||||
<Settings>
|
||||
<RaceBoatType Type="AC45"/>
|
||||
<BoatDimension BoatLength="14.019" HullLength="13.449"/>
|
||||
<ZoneSize MarkZoneSize="40.347" CourseZoneSize="53.796"/>
|
||||
<ZoneLimits Limit1="200" Limit2="100" Limit3="53.796" Limit4="0" Limit5="-100"/>
|
||||
</Settings>
|
||||
<BoatShapes>
|
||||
<BoatShape ShapeID="0">
|
||||
<Vertices>
|
||||
<Vtx Seq="3" Y="25" X="0"/>
|
||||
</Vertices>
|
||||
</BoatShape>
|
||||
<BoatShape ShapeID="14">
|
||||
<Vertices>
|
||||
<Vtx Seq="1" Y="0" X="-1"/>
|
||||
<Vtx Seq="2" Y="0.75" X="-1"/>
|
||||
<Vtx Seq="3" Y="0.75" X="-0.25"/>
|
||||
<Vtx Seq="4" Y="3.5" X="-0.25"/>
|
||||
<Vtx Seq="5" Y="4.5" X="-1"/>
|
||||
<Vtx Seq="6" Y="6.5" X="-1"/>
|
||||
<Vtx Seq="7" Y="7" X="-0.5"/>
|
||||
<Vtx Seq="8" Y="7" X="0.5"/>
|
||||
<Vtx Seq="9" Y="6.5" X="1"/>
|
||||
<Vtx Seq="10" Y="4.5" X="1"/>
|
||||
<Vtx Seq="11" Y="3.5" X="0.25"/>
|
||||
<Vtx Seq="12" Y="0.75" X="0.25"/>
|
||||
<Vtx Seq="13" Y="0.75" X="1"/>
|
||||
<Vtx Seq="14" Y="0" X="1"/>
|
||||
</Vertices>
|
||||
</BoatShape>
|
||||
<BoatShape ShapeID="15">
|
||||
<Vertices>
|
||||
<Vtx Seq="1" Y="0" X="-3.46"/>
|
||||
<Vtx Seq="2" Y="13.449" X="-3.46"/>
|
||||
<Vtx Seq="3" Y="14.019" X="0"/>
|
||||
<Vtx Seq="4" Y="13.449" X="3.46"/>
|
||||
<Vtx Seq="5" Y="0" X="3.46"/>
|
||||
</Vertices>
|
||||
<Catamaran>
|
||||
<Vtx Seq="1" Y="1.769" X="-2.752"/>
|
||||
<Vtx Seq="2" Y="0" X="-2.813"/>
|
||||
<Vtx Seq="3" Y="0" X="-3.34"/>
|
||||
<Vtx Seq="4" Y="5.351" X="-3.46"/>
|
||||
<Vtx Seq="5" Y="10.544" X="-3.387"/>
|
||||
<Vtx Seq="6" Y="13.449" X="-3.075"/>
|
||||
<Vtx Seq="7" Y="10.851" X="-2.793"/>
|
||||
<Vtx Seq="8" Y="6.669" X="-2.699"/>
|
||||
<Vtx Seq="9" Y="6.669" X="2.699"/>
|
||||
<Vtx Seq="10" Y="10.851" X="2.793"/>
|
||||
<Vtx Seq="11" Y="13.449" X="3.075"/>
|
||||
<Vtx Seq="12" Y="10.544" X="3.387"/>
|
||||
<Vtx Seq="13" Y="5.351" X="3.46"/>
|
||||
<Vtx Seq="14" Y="0" X="3.34"/>
|
||||
<Vtx Seq="15" Y="0" X="2.813"/>
|
||||
<Vtx Seq="16" Y="1.769" X="2.752"/>
|
||||
</Catamaran>
|
||||
<Bowsprit>
|
||||
<Vtx Seq="1" Y="6.669" X="-0.2"/>
|
||||
<Vtx Seq="2" Y="11.377" X="-0.2"/>
|
||||
<Vtx Seq="3" Y="14.019" X="0"/>
|
||||
<Vtx Seq="4" Y="11.377" X="0.2"/>
|
||||
<Vtx Seq="5" Y="6.669" X="0.2"/>
|
||||
</Bowsprit>
|
||||
<Trampoline>
|
||||
<Vtx Seq="1" Y="2" X="-2.699"/>
|
||||
<Vtx Seq="2" Y="6.438" X="-2.699"/>
|
||||
<Vtx Seq="3" Y="6.438" X="2.699"/>
|
||||
<Vtx Seq="4" Y="2" X="2.699"/>
|
||||
</Trampoline>
|
||||
</BoatShape>
|
||||
<BoatShape ShapeID="18">
|
||||
<Vertices>
|
||||
<Vtx Seq="1" Y="0" X="-1.04"/>
|
||||
<Vtx Seq="2" Y="0.11" X="-1.18"/>
|
||||
<Vtx Seq="3" Y="0.42" X="-1.28"/>
|
||||
<Vtx Seq="4" Y="3.74" X="-1.29"/>
|
||||
<Vtx Seq="5" Y="5.36" X="-1.21"/>
|
||||
<Vtx Seq="6" Y="6.29" X="-1.08"/>
|
||||
<Vtx Seq="7" Y="7.15" X="-0.84"/>
|
||||
<Vtx Seq="8" Y="7.63" X="-0.62"/>
|
||||
<Vtx Seq="9" Y="7.94" X="-0.34"/>
|
||||
<Vtx Seq="10" Y="8.06" X="0"/>
|
||||
<Vtx Seq="11" Y="7.94" X="0.34"/>
|
||||
<Vtx Seq="12" Y="7.63" X="0.62"/>
|
||||
<Vtx Seq="13" Y="7.15" X="0.84"/>
|
||||
<Vtx Seq="14" Y="6.29" X="1.08"/>
|
||||
<Vtx Seq="15" Y="5.36" X="1.21"/>
|
||||
<Vtx Seq="16" Y="3.74" X="1.29"/>
|
||||
<Vtx Seq="17" Y="0.42" X="1.28"/>
|
||||
<Vtx Seq="18" Y="0.11" X="1.18"/>
|
||||
<Vtx Seq="19" Y="0" X="1.04"/>
|
||||
</Vertices>
|
||||
</BoatShape>
|
||||
<BoatShape ShapeID="24">
|
||||
<Vertices>
|
||||
<Vtx Seq="1" Y="0" X="-2.5"/>
|
||||
<Vtx Seq="2" Y="7" X="-2.5"/>
|
||||
<Vtx Seq="3" Y="12.6" X="-2.2"/>
|
||||
<Vtx Seq="4" Y="12.6" X="2.2"/>
|
||||
<Vtx Seq="5" Y="7" X="2.5"/>
|
||||
<Vtx Seq="6" Y="0" X="2.5"/>
|
||||
</Vertices>
|
||||
</BoatShape>
|
||||
<BoatShape ShapeID="34">
|
||||
<Vertices>
|
||||
<Vtx Seq="1" Y="0" X="-1.16"/>
|
||||
<Vtx Seq="2" Y="5.51" X="-1.16"/>
|
||||
<Vtx Seq="3" Y="5.846" X="-0.84"/>
|
||||
<Vtx Seq="4" Y="5.846" X="0.84"/>
|
||||
<Vtx Seq="5" Y="5.51" X="1.16"/>
|
||||
<Vtx Seq="6" Y="0" X="1.16"/>
|
||||
</Vertices>
|
||||
</BoatShape>
|
||||
<BoatShape ShapeID="35">
|
||||
<Vertices>
|
||||
<Vtx Seq="1" Y="0" X="-1.461"/>
|
||||
<Vtx Seq="2" Y="6" X="-1.461"/>
|
||||
<Vtx Seq="3" Y="7" X="-1.44"/>
|
||||
<Vtx Seq="4" Y="8" X="-1.38"/>
|
||||
<Vtx Seq="5" Y="9" X="-1.17"/>
|
||||
<Vtx Seq="6" Y="10" X="-0.76"/>
|
||||
<Vtx Seq="7" Y="10.6" X="-0.34"/>
|
||||
<Vtx Seq="8" Y="10.61" X="0"/>
|
||||
<Vtx Seq="9" Y="10.6" X="0.34"/>
|
||||
<Vtx Seq="10" Y="10" X="0.76"/>
|
||||
<Vtx Seq="11" Y="9" X="1.17"/>
|
||||
<Vtx Seq="12" Y="8" X="1.38"/>
|
||||
<Vtx Seq="13" Y="7" X="1.44"/>
|
||||
<Vtx Seq="14" Y="6" X="1.461"/>
|
||||
<Vtx Seq="15" Y="0" X="1.461"/>
|
||||
</Vertices>
|
||||
</BoatShape>
|
||||
</BoatShapes>
|
||||
<Boats>
|
||||
<Boat Type="Yacht" SourceID="201" ShapeID="15" StoweName="USA" ShortName="ORACLE" ShorterName="USA" BoatName="ORACLE TEAM USA" HullNum="AC4515" Skipper="SPITHILL" Helmsman="SPITHILL" Country="USA" PeliID="101" RadioIP="172.20.2.101">
|
||||
<GPSposition Z="1.78" Y="-0.331" X="-0.006"/>
|
||||
<MastTop Z="21.496" Y="3.7" X="0"/>
|
||||
<FlagPosition Z="0" Y="6.2" X="0"/>
|
||||
</Boat>
|
||||
<Boat Type="Yacht" SourceID="401" ShapeID="15" StoweName="NZL" ShortName="ETNZ" ShorterName="NZL" BoatName="EMIRATES TEAM NZ" HullNum="AC4503" Skipper="ASHBY" Helmsman="BURLING" Country="NZL" PeliID="103" RadioIP="172.20.2.103">
|
||||
<GPSposition Z="1.881" Y="-0.291" X="-0.003"/>
|
||||
<MastTop Z="21.496" Y="3.7" X="0"/>
|
||||
<FlagPosition Z="0" Y="6.2" X="0"/>
|
||||
</Boat>
|
||||
<Boat Type="Yacht" SourceID="501" ShapeID="15" StoweName="JPN" ShortName="JAPAN" ShorterName="JPN" BoatName="SOFTBANK TEAM JAPAN" HullNum="AC4504" Skipper="BARKER" Helmsman="BARKER" Country="JPN" PeliID="104" RadioIP="172.20.2.104">
|
||||
<GPSposition Z="1.805" Y="-0.322" X="-0.003"/>
|
||||
<MastTop Z="21.496" Y="3.7" X="0"/>
|
||||
<FlagPosition Z="0" Y="6.2" X="0"/>
|
||||
</Boat>
|
||||
<Boat Type="Yacht" SourceID="701" ShapeID="15" StoweName="GBR" ShortName="GBR" ShorterName="GBR" BoatName="LAND ROVER BAR" HullNum="AC4516" Skipper="ANSLIE" Helmsman="ANSLIE" Country="GBR" PeliID="106" RadioIP="172.20.2.106">
|
||||
<GPSposition Z="1.734" Y="-0.352" X="0"/>
|
||||
<MastTop Z="21.496" Y="3.7" X="0"/>
|
||||
<FlagPosition Z="0" Y="6.2" X="0"/>
|
||||
</Boat>
|
||||
</Boats>
|
||||
</BoatConfig>
|
||||
@@ -0,0 +1,171 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<BoatConfig>
|
||||
<Modified>2015-08-28T17:32:59+0100</Modified>
|
||||
<Version>12</Version>
|
||||
<Snapshot>219</Snapshot>
|
||||
<Settings>
|
||||
<RaceBoatType Type="AC45"/>
|
||||
<BoatDimension BoatLength="14.019" HullLength="13.449"/>
|
||||
<ZoneSize MarkZoneSize="40.347" CourseZoneSize="53.796"/>
|
||||
<ZoneLimits Limit1="200" Limit2="100" Limit3="53.796" Limit4="0" Limit5="-100"/>
|
||||
</Settings>
|
||||
<BoatShapes>
|
||||
<BoatShape ShapeID="0">
|
||||
<Vertices>
|
||||
<Vtx Seq="3" Y="25" X="0"/>
|
||||
</Vertices>
|
||||
</BoatShape>
|
||||
<BoatShape ShapeID="14">
|
||||
<Vertices>
|
||||
<Vtx Seq="1" Y="0" X="-1"/>
|
||||
<Vtx Seq="2" Y="0.75" X="-1"/>
|
||||
<Vtx Seq="3" Y="0.75" X="-0.25"/>
|
||||
<Vtx Seq="4" Y="3.5" X="-0.25"/>
|
||||
<Vtx Seq="5" Y="4.5" X="-1"/>
|
||||
<Vtx Seq="6" Y="6.5" X="-1"/>
|
||||
<Vtx Seq="7" Y="7" X="-0.5"/>
|
||||
<Vtx Seq="8" Y="7" X="0.5"/>
|
||||
<Vtx Seq="9" Y="6.5" X="1"/>
|
||||
<Vtx Seq="10" Y="4.5" X="1"/>
|
||||
<Vtx Seq="11" Y="3.5" X="0.25"/>
|
||||
<Vtx Seq="12" Y="0.75" X="0.25"/>
|
||||
<Vtx Seq="13" Y="0.75" X="1"/>
|
||||
<Vtx Seq="14" Y="0" X="1"/>
|
||||
</Vertices>
|
||||
</BoatShape>
|
||||
<BoatShape ShapeID="15">
|
||||
<Vertices>
|
||||
<Vtx Seq="1" Y="0" X="-3.46"/>
|
||||
<Vtx Seq="2" Y="13.449" X="-3.46"/>
|
||||
<Vtx Seq="3" Y="14.019" X="0"/>
|
||||
<Vtx Seq="4" Y="13.449" X="3.46"/>
|
||||
<Vtx Seq="5" Y="0" X="3.46"/>
|
||||
</Vertices>
|
||||
<Catamaran>
|
||||
<Vtx Seq="1" Y="1.769" X="-2.752"/>
|
||||
<Vtx Seq="2" Y="0" X="-2.813"/>
|
||||
<Vtx Seq="3" Y="0" X="-3.34"/>
|
||||
<Vtx Seq="4" Y="5.351" X="-3.46"/>
|
||||
<Vtx Seq="5" Y="10.544" X="-3.387"/>
|
||||
<Vtx Seq="6" Y="13.449" X="-3.075"/>
|
||||
<Vtx Seq="7" Y="10.851" X="-2.793"/>
|
||||
<Vtx Seq="8" Y="6.669" X="-2.699"/>
|
||||
<Vtx Seq="9" Y="6.669" X="2.699"/>
|
||||
<Vtx Seq="10" Y="10.851" X="2.793"/>
|
||||
<Vtx Seq="11" Y="13.449" X="3.075"/>
|
||||
<Vtx Seq="12" Y="10.544" X="3.387"/>
|
||||
<Vtx Seq="13" Y="5.351" X="3.46"/>
|
||||
<Vtx Seq="14" Y="0" X="3.34"/>
|
||||
<Vtx Seq="15" Y="0" X="2.813"/>
|
||||
<Vtx Seq="16" Y="1.769" X="2.752"/>
|
||||
</Catamaran>
|
||||
<Bowsprit>
|
||||
<Vtx Seq="1" Y="6.669" X="-0.2"/>
|
||||
<Vtx Seq="2" Y="11.377" X="-0.2"/>
|
||||
<Vtx Seq="3" Y="14.019" X="0"/>
|
||||
<Vtx Seq="4" Y="11.377" X="0.2"/>
|
||||
<Vtx Seq="5" Y="6.669" X="0.2"/>
|
||||
</Bowsprit>
|
||||
<Trampoline>
|
||||
<Vtx Seq="1" Y="2" X="-2.699"/>
|
||||
<Vtx Seq="2" Y="6.438" X="-2.699"/>
|
||||
<Vtx Seq="3" Y="6.438" X="2.699"/>
|
||||
<Vtx Seq="4" Y="2" X="2.699"/>
|
||||
</Trampoline>
|
||||
</BoatShape>
|
||||
<BoatShape ShapeID="18">
|
||||
<Vertices>
|
||||
<Vtx Seq="1" Y="0" X="-1.04"/>
|
||||
<Vtx Seq="2" Y="0.11" X="-1.18"/>
|
||||
<Vtx Seq="3" Y="0.42" X="-1.28"/>
|
||||
<Vtx Seq="4" Y="3.74" X="-1.29"/>
|
||||
<Vtx Seq="5" Y="5.36" X="-1.21"/>
|
||||
<Vtx Seq="6" Y="6.29" X="-1.08"/>
|
||||
<Vtx Seq="7" Y="7.15" X="-0.84"/>
|
||||
<Vtx Seq="8" Y="7.63" X="-0.62"/>
|
||||
<Vtx Seq="9" Y="7.94" X="-0.34"/>
|
||||
<Vtx Seq="10" Y="8.06" X="0"/>
|
||||
<Vtx Seq="11" Y="7.94" X="0.34"/>
|
||||
<Vtx Seq="12" Y="7.63" X="0.62"/>
|
||||
<Vtx Seq="13" Y="7.15" X="0.84"/>
|
||||
<Vtx Seq="14" Y="6.29" X="1.08"/>
|
||||
<Vtx Seq="15" Y="5.36" X="1.21"/>
|
||||
<Vtx Seq="16" Y="3.74" X="1.29"/>
|
||||
<Vtx Seq="17" Y="0.42" X="1.28"/>
|
||||
<Vtx Seq="18" Y="0.11" X="1.18"/>
|
||||
<Vtx Seq="19" Y="0" X="1.04"/>
|
||||
</Vertices>
|
||||
</BoatShape>
|
||||
<BoatShape ShapeID="24">
|
||||
<Vertices>
|
||||
<Vtx Seq="1" Y="0" X="-2.5"/>
|
||||
<Vtx Seq="2" Y="7" X="-2.5"/>
|
||||
<Vtx Seq="3" Y="12.6" X="-2.2"/>
|
||||
<Vtx Seq="4" Y="12.6" X="2.2"/>
|
||||
<Vtx Seq="5" Y="7" X="2.5"/>
|
||||
<Vtx Seq="6" Y="0" X="2.5"/>
|
||||
</Vertices>
|
||||
</BoatShape>
|
||||
<BoatShape ShapeID="34">
|
||||
<Vertices>
|
||||
<Vtx Seq="1" Y="0" X="-1.16"/>
|
||||
<Vtx Seq="2" Y="5.51" X="-1.16"/>
|
||||
<Vtx Seq="3" Y="5.846" X="-0.84"/>
|
||||
<Vtx Seq="4" Y="5.846" X="0.84"/>
|
||||
<Vtx Seq="5" Y="5.51" X="1.16"/>
|
||||
<Vtx Seq="6" Y="0" X="1.16"/>
|
||||
</Vertices>
|
||||
</BoatShape>
|
||||
<BoatShape ShapeID="35">
|
||||
<Vertices>
|
||||
<Vtx Seq="1" Y="0" X="-1.461"/>
|
||||
<Vtx Seq="2" Y="6" X="-1.461"/>
|
||||
<Vtx Seq="3" Y="7" X="-1.44"/>
|
||||
<Vtx Seq="4" Y="8" X="-1.38"/>
|
||||
<Vtx Seq="5" Y="9" X="-1.17"/>
|
||||
<Vtx Seq="6" Y="10" X="-0.76"/>
|
||||
<Vtx Seq="7" Y="10.6" X="-0.34"/>
|
||||
<Vtx Seq="8" Y="10.61" X="0"/>
|
||||
<Vtx Seq="9" Y="10.6" X="0.34"/>
|
||||
<Vtx Seq="10" Y="10" X="0.76"/>
|
||||
<Vtx Seq="11" Y="9" X="1.17"/>
|
||||
<Vtx Seq="12" Y="8" X="1.38"/>
|
||||
<Vtx Seq="13" Y="7" X="1.44"/>
|
||||
<Vtx Seq="14" Y="6" X="1.461"/>
|
||||
<Vtx Seq="15" Y="0" X="1.461"/>
|
||||
</Vertices>
|
||||
</BoatShape>
|
||||
</BoatShapes>
|
||||
<Boats>
|
||||
<Boat Type="Yacht" SourceID="201" ShapeID="15" StoweName="USA" ShortName="ORACLE" ShorterName="USA" BoatName="ORACLE TEAM USA" HullNum="AC4515" Skipper="SPITHILL" Helmsman="SPITHILL" Country="USA" PeliID="101" RadioIP="172.20.2.101">
|
||||
<GPSposition Z="1.78" Y="-0.331" X="-0.006"/>
|
||||
<MastTop Z="21.496" Y="3.7" X="0"/>
|
||||
<FlagPosition Z="0" Y="6.2" X="0"/>
|
||||
</Boat>
|
||||
<Boat Type="Yacht" SourceID="301" ShapeID="15" StoweName="SWE" ShortName="ARTEMIS" ShorterName="SWE" BoatName="ARTEMIS RACING" HullNum="AC4517" Skipper="OUTTERIDGE" Helmsman="OUTTERIDGE" Country="SWE" PeliID="102" RadioIP="172.20.2.102">
|
||||
<GPSposition Z="1.727" Y="-0.359" X="-0.0121"/>
|
||||
<MastTop Z="21.496" Y="3.7" X="0"/>
|
||||
<FlagPosition Z="0" Y="6.2" X="0"/>
|
||||
</Boat>
|
||||
<Boat Type="Yacht" SourceID="401" ShapeID="15" StoweName="NZL" ShortName="ETNZ" ShorterName="NZL" BoatName="EMIRATES TEAM NZ" HullNum="AC4503" Skipper="ASHBY" Helmsman="BURLING" Country="NZL" PeliID="103" RadioIP="172.20.2.103">
|
||||
<GPSposition Z="1.881" Y="-0.291" X="-0.003"/>
|
||||
<MastTop Z="21.496" Y="3.7" X="0"/>
|
||||
<FlagPosition Z="0" Y="6.2" X="0"/>
|
||||
</Boat>
|
||||
<Boat Type="Yacht" SourceID="501" ShapeID="15" StoweName="JPN" ShortName="JAPAN" ShorterName="JPN" BoatName="SOFTBANK TEAM JAPAN" HullNum="AC4504" Skipper="BARKER" Helmsman="BARKER" Country="JPN" PeliID="104" RadioIP="172.20.2.104">
|
||||
<GPSposition Z="1.805" Y="-0.322" X="-0.003"/>
|
||||
<MastTop Z="21.496" Y="3.7" X="0"/>
|
||||
<FlagPosition Z="0" Y="6.2" X="0"/>
|
||||
</Boat>
|
||||
<Boat Type="Yacht" SourceID="601" ShapeID="15" StoweName="FRA" ShortName="FRANCE" ShorterName="FRA" BoatName="GROUPAMA TEAM FRANCE" HullNum="AC4505" Skipper="CAMMAS" Helmsman="CAMMAS" Country="FRA" PeliID="105" RadioIP="172.20.2.105">
|
||||
<GPSposition Z="1.863" Y="-0.3" X="-0.003"/>
|
||||
<MastTop Z="21.496" Y="3.7" X="0"/>
|
||||
<FlagPosition Z="0" Y="6.2" X="0"/>
|
||||
</Boat>
|
||||
<Boat Type="Yacht" SourceID="701" ShapeID="15" StoweName="GBR" ShortName="GBR" ShorterName="GBR" BoatName="LAND ROVER BAR" HullNum="AC4516" Skipper="ANSLIE" Helmsman="ANSLIE" Country="GBR" PeliID="106" RadioIP="172.20.2.106">
|
||||
<GPSposition Z="1.734" Y="-0.352" X="0"/>
|
||||
<MastTop Z="21.496" Y="3.7" X="0"/>
|
||||
<FlagPosition Z="0" Y="6.2" X="0"/>
|
||||
</Boat>
|
||||
</Boats>
|
||||
</BoatConfig>
|
||||
@@ -1,5 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<?import javafx.scene.image.*?>
|
||||
<?import javafx.geometry.*?>
|
||||
<?import java.lang.*?>
|
||||
<?import javafx.scene.control.*?>
|
||||
@@ -13,14 +14,14 @@
|
||||
<?import javafx.scene.layout.RowConstraints?>
|
||||
<?import javafx.scene.text.Font?>
|
||||
|
||||
<GridPane fx:id="lobbyScreen" nodeOrientation="LEFT_TO_RIGHT" prefHeight="533.0" prefWidth="802.0" style="-fx-background-color: #2C2c36;" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="seng302.controllers.LobbyController">
|
||||
<GridPane fx:id="lobbyScreen" nodeOrientation="LEFT_TO_RIGHT" prefHeight="960.0" prefWidth="1530.0" style="-fx-background-color: #2C2c36;" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="seng302.controllers.LobbyController">
|
||||
<columnConstraints>
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" />
|
||||
</columnConstraints>
|
||||
<rowConstraints>
|
||||
<RowConstraints maxHeight="171.0" minHeight="0.0" prefHeight="31.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints maxHeight="399.0" minHeight="10.0" prefHeight="394.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints maxHeight="63.0" minHeight="10.0" prefHeight="26.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints maxHeight="462.0" minHeight="10.0" prefHeight="462.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints maxHeight="100.0" minHeight="0.0" prefHeight="0.0" vgrow="SOMETIMES" />
|
||||
</rowConstraints>
|
||||
<children>
|
||||
<Text fx:id="lobbyIpText" fill="WHITE" strokeType="OUTSIDE" strokeWidth="0.0" text="Lobby: IP" GridPane.columnSpan="2147483647" GridPane.halignment="CENTER">
|
||||
@@ -28,7 +29,7 @@
|
||||
<Font size="29.0" />
|
||||
</font>
|
||||
</Text>
|
||||
<GridPane GridPane.rowIndex="2">
|
||||
<GridPane prefHeight="166.0" prefWidth="1530.0" GridPane.rowIndex="2">
|
||||
<columnConstraints>
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
@@ -41,27 +42,96 @@
|
||||
<Button focusTraversable="false" mnemonicParsing="false" onAction="#leaveLobbyButtonPressed" text="Leave Lobby" GridPane.columnIndex="1" GridPane.halignment="CENTER" />
|
||||
</children>
|
||||
</GridPane>
|
||||
<AnchorPane focusTraversable="true" prefHeight="200.0" prefWidth="200.0" GridPane.rowIndex="1">
|
||||
<children>
|
||||
<GridPane layoutX="335.0" layoutY="146.0" prefHeight="399.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
|
||||
<GridPane GridPane.rowIndex="1">
|
||||
<columnConstraints>
|
||||
<ColumnConstraints hgrow="SOMETIMES" maxWidth="261.0" minWidth="0.0" prefWidth="2.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="-Infinity" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" maxWidth="261.0" minWidth="0.0" prefWidth="2.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
</columnConstraints>
|
||||
<rowConstraints>
|
||||
<RowConstraints maxHeight="125.0" minHeight="0.0" prefHeight="0.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints maxHeight="266.0" minHeight="10.0" prefHeight="266.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
</rowConstraints>
|
||||
<children>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1" GridPane.rowIndex="1">
|
||||
<children>
|
||||
<ListView fx:id="competitorsListView" layoutX="154.0" layoutY="59.0" prefHeight="266.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<ListView fx:id="firstListView" prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1">
|
||||
<GridPane.margin>
|
||||
<Insets bottom="10.0" left="40.0" right="40.0" top="10.0" />
|
||||
</GridPane.margin>
|
||||
</ListView>
|
||||
<ListView fx:id="secondListView" prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="2">
|
||||
<GridPane.margin>
|
||||
<Insets bottom="10.0" left="40.0" right="40.0" top="10.0" />
|
||||
</GridPane.margin>
|
||||
</ListView>
|
||||
<ListView fx:id="thirdListView" prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="3">
|
||||
<GridPane.margin>
|
||||
<Insets bottom="10.0" left="40.0" right="40.0" top="10.0" />
|
||||
</GridPane.margin></ListView>
|
||||
<ListView fx:id="fourthListView" prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="4">
|
||||
<GridPane.margin>
|
||||
<Insets bottom="10.0" left="40.0" right="40.0" top="10.0" />
|
||||
</GridPane.margin>
|
||||
</ListView>
|
||||
<ListView fx:id="eighthListView" prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="4" GridPane.rowIndex="1">
|
||||
<GridPane.margin>
|
||||
<Insets bottom="10.0" left="40.0" right="40.0" top="10.0" />
|
||||
</GridPane.margin></ListView>
|
||||
<ListView fx:id="fifthListView" prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1" GridPane.rowIndex="1">
|
||||
<GridPane.margin>
|
||||
<Insets bottom="10.0" left="40.0" right="40.0" top="10.0" />
|
||||
</GridPane.margin></ListView>
|
||||
<ListView fx:id="sixthListView" prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="2" GridPane.rowIndex="1">
|
||||
<GridPane.margin>
|
||||
<Insets bottom="10.0" left="40.0" right="40.0" top="10.0" />
|
||||
</GridPane.margin></ListView>
|
||||
<ListView fx:id="seventhListView" prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="3" GridPane.rowIndex="1">
|
||||
<GridPane.margin>
|
||||
<Insets bottom="10.0" left="40.0" right="40.0" top="10.0" />
|
||||
</GridPane.margin></ListView>
|
||||
<ImageView fx:id="firstImageView" fitHeight="150.0" fitWidth="200.0" pickOnBounds="true" preserveRatio="true" GridPane.columnIndex="1" GridPane.halignment="CENTER" GridPane.valignment="BOTTOM">
|
||||
<GridPane.margin>
|
||||
<Insets bottom="10.0" />
|
||||
</GridPane.margin>
|
||||
</ImageView>
|
||||
<ImageView fx:id="secondImageView" fitHeight="150.0" fitWidth="200.0" pickOnBounds="true" preserveRatio="true" GridPane.columnIndex="2" GridPane.halignment="CENTER" GridPane.valignment="BOTTOM">
|
||||
<GridPane.margin>
|
||||
<Insets bottom="10.0" />
|
||||
</GridPane.margin>
|
||||
</ImageView>
|
||||
<ImageView fx:id="thirdImageView" fitHeight="150.0" fitWidth="200.0" pickOnBounds="true" preserveRatio="true" GridPane.columnIndex="3" GridPane.halignment="CENTER" GridPane.valignment="BOTTOM">
|
||||
<GridPane.margin>
|
||||
<Insets bottom="10.0" />
|
||||
</GridPane.margin>
|
||||
</ImageView>
|
||||
<ImageView fx:id="fourthImageView" fitHeight="150.0" fitWidth="200.0" pickOnBounds="true" preserveRatio="true" GridPane.columnIndex="4" GridPane.halignment="CENTER" GridPane.valignment="BOTTOM">
|
||||
<GridPane.margin>
|
||||
<Insets bottom="10.0" />
|
||||
</GridPane.margin>
|
||||
</ImageView>
|
||||
<ImageView fx:id="fifthImageView" fitHeight="150.0" fitWidth="200.0" pickOnBounds="true" preserveRatio="true" GridPane.columnIndex="1" GridPane.halignment="CENTER" GridPane.rowIndex="1" GridPane.valignment="BOTTOM">
|
||||
<GridPane.margin>
|
||||
<Insets bottom="10.0" />
|
||||
</GridPane.margin>
|
||||
</ImageView>
|
||||
<ImageView fx:id="sixthImageView" fitHeight="150.0" fitWidth="200.0" pickOnBounds="true" preserveRatio="true" GridPane.columnIndex="2" GridPane.halignment="CENTER" GridPane.rowIndex="1" GridPane.valignment="BOTTOM">
|
||||
<GridPane.margin>
|
||||
<Insets bottom="10.0" />
|
||||
</GridPane.margin>
|
||||
</ImageView>
|
||||
<ImageView fx:id="seventhImageView" fitHeight="150.0" fitWidth="200.0" pickOnBounds="true" preserveRatio="true" GridPane.columnIndex="3" GridPane.halignment="CENTER" GridPane.rowIndex="1" GridPane.valignment="BOTTOM">
|
||||
<GridPane.margin>
|
||||
<Insets bottom="10.0" />
|
||||
</GridPane.margin>
|
||||
</ImageView>
|
||||
<ImageView fx:id="eighthImageView" fitHeight="150.0" fitWidth="200.0" pickOnBounds="true" preserveRatio="true" GridPane.columnIndex="4" GridPane.halignment="CENTER" GridPane.rowIndex="1" GridPane.valignment="BOTTOM">
|
||||
<GridPane.margin>
|
||||
<Insets bottom="10.0" />
|
||||
</GridPane.margin>
|
||||
</ImageView>
|
||||
</children>
|
||||
</GridPane>
|
||||
</children></AnchorPane>
|
||||
</children>
|
||||
</GridPane>
|
||||
|
||||
@@ -15,8 +15,8 @@
|
||||
|
||||
<GridPane fx:id="startScreen2" nodeOrientation="LEFT_TO_RIGHT" prefWidth="800.0" style="-fx-background-color: #2C2c36;" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="seng302.controllers.StartScreenController">
|
||||
<columnConstraints>
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="442.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="358.0" />
|
||||
</columnConstraints>
|
||||
<rowConstraints>
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
@@ -33,10 +33,13 @@
|
||||
</font>
|
||||
</Label>
|
||||
<Button mnemonicParsing="false" onAction="#hostButtonPressed" prefHeight="25.0" prefWidth="175.0" text="Host" GridPane.columnSpan="2147483647" GridPane.halignment="CENTER" GridPane.rowIndex="2" />
|
||||
<Button mnemonicParsing="false" onAction="#connectButtonPressed" prefHeight="25.0" prefWidth="147.0" text="Connect" GridPane.columnIndex="1" GridPane.rowIndex="4" />
|
||||
<TextField fx:id="ipTextField" maxWidth="-Infinity" prefHeight="25.0" prefWidth="200.0" text="localhost" GridPane.halignment="RIGHT" GridPane.rowIndex="4">
|
||||
<Button mnemonicParsing="false" onAction="#connectButtonPressed" prefHeight="25.0" prefWidth="147.0" text="Connect" GridPane.columnIndex="1" GridPane.rowIndex="4">
|
||||
<GridPane.margin>
|
||||
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
|
||||
<Insets left="5.0" right="5.0" />
|
||||
</GridPane.margin></Button>
|
||||
<TextField fx:id="ipTextField" alignment="CENTER" maxWidth="-Infinity" prefHeight="25.0" prefWidth="148.0" promptText="Host IP" text="132.181.14." GridPane.halignment="RIGHT" GridPane.rowIndex="4">
|
||||
<GridPane.margin>
|
||||
<Insets bottom="10.0" left="5.0" right="85.0" top="10.0" />
|
||||
</GridPane.margin>
|
||||
</TextField>
|
||||
<Text fill="WHITE" strokeType="OUTSIDE" strokeWidth="0.0" text="OR" GridPane.columnSpan="2147483647" GridPane.halignment="CENTER" GridPane.rowIndex="3">
|
||||
@@ -44,5 +47,13 @@
|
||||
<Font size="21.0" />
|
||||
</font>
|
||||
</Text>
|
||||
<TextField fx:id="portTextField" alignment="CENTER" maxWidth="75.0" prefHeight="25.0" prefWidth="55.0" promptText="Port" text="4950" GridPane.halignment="RIGHT" GridPane.rowIndex="4">
|
||||
<opaqueInsets>
|
||||
<Insets />
|
||||
</opaqueInsets>
|
||||
<GridPane.margin>
|
||||
<Insets left="5.0" right="5.0" />
|
||||
</GridPane.margin>
|
||||
</TextField>
|
||||
</children>
|
||||
</GridPane>
|
||||
|
||||