Packets are sent out when collision happens and receiver is able to interpret and display as visual alert. Updated visual alert to looks better.

- Created yacht event code message to be sent out as packet.
- Added observers to main server thread on yacht so when collision detected, main server thread will send out yacht event message to all server to client threads.
- Updated collision visual alert using circle and animation timer.

#story[1117]
This commit is contained in:
Zhi You Tan
2017-08-10 19:50:30 +12:00
parent 07386ed2db
commit 7e1686a980
6 changed files with 119 additions and 25 deletions
@@ -1,10 +1,12 @@
package seng302.gameServer;
import com.sun.corba.se.spi.activation.Server;
import java.io.IOException;
import java.net.ServerSocket;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Observable;
import java.util.Observer;
import java.util.Timer;
import java.util.TimerTask;
import seng302.model.GeoPoint;
@@ -18,7 +20,8 @@ import seng302.visualiser.GameClient;
* A class describing the overall server, which creates and collects server threads for each client
* Created by wmu16 on 13/07/17.
*/
public class MainServerThread extends Observable implements Runnable, ClientConnectionDelegate {
public class MainServerThread extends Observable implements Runnable, ClientConnectionDelegate,
Observer {
private static final int PORT = 4942;
private static final Integer CLIENT_UPDATES_PER_SECOND = 10;
@@ -112,7 +115,7 @@ public class MainServerThread extends Observable implements Runnable, ClientConn
serverToClientThreads.add(serverToClientThread);
this.addObserver(serverToClientThread);
setChanged();
notifyObservers();
notifyObservers("send setup message");
}
/**
@@ -136,11 +139,12 @@ public class MainServerThread extends Observable implements Runnable, ClientConn
}
}
setChanged();
notifyObservers();
notifyObservers("send setup message");
}
public void startGame() {
initialiseBoatPositions();
setupYachtObserver();
Timer t = new Timer();
@@ -210,4 +214,17 @@ public class MainServerThread extends Observable implements Runnable, ClientConn
boatIndex++;
}
}
@Override
public void update(Observable o, Object arg) {
for (ServerToClientThread serverToClientThread : serverToClientThreads) {
serverToClientThread.sendCollisionMessage((Integer) arg);
}
}
private void setupYachtObserver() {
for (ServerToClientThread serverToClientThread : serverToClientThreads) {
serverToClientThread.getYacht().addObserver(this);
}
}
}
@@ -18,6 +18,7 @@ import java.util.concurrent.ThreadLocalRandom;
import java.util.stream.Collectors;
import java.util.zip.CRC32;
import java.util.zip.Checksum;
import seng302.gameServer.server.messages.YachtEventCodeMessage;
import seng302.model.Player;
import seng302.model.Yacht;
import seng302.model.stream.packets.PacketType;
@@ -126,7 +127,9 @@ public class ServerToClientThread implements Runnable, Observer {
@Override
public void update(Observable o, Object arg) {
sendSetupMessages();
if (arg.equals("send setup message")) {
sendSetupMessages();
}
}
public void run() {
@@ -372,4 +375,8 @@ public class ServerToClientThread implements Runnable, Observer {
public Yacht getYacht() {
return yacht;
}
public void sendCollisionMessage(Integer yachtId) {
sendMessage(new YachtEventCodeMessage(yachtId));
}
}
@@ -0,0 +1,52 @@
package seng302.gameServer.server.messages;
/**
* Created by zyt10 on 10/08/17.
*/
public class YachtEventCodeMessage extends Message {
private final MessageType MESSAGE_TYPE = MessageType.YACHT_EVENT_CODE;
private final int MESSAGE_VERSION = 1; //Always set to 1
private final int MESSAGE_SIZE = 22;
// Message fields
private long timeStamp;
private long ack = 0x00; //Unused
private int raceId;
private int destSourceId;
private int incidentId;
private int eventId;
public YachtEventCodeMessage(Integer subjectId) {
timeStamp = System.currentTimeMillis() / 1000L;
ack = 0;
raceId = 1;
destSourceId = subjectId; // collision boat source id
incidentId = 0;
eventId = 33;
setHeader(new Header(MESSAGE_TYPE, 0x01, (short) getSize()));
allocateBuffer();
writeHeaderToBuffer();
// Write message fields
putUnsignedByte((byte) MESSAGE_VERSION);
putInt((int) timeStamp, 6);
putInt((int) ack, 2);
putInt((int) raceId, 4);
putInt((int) destSourceId, 4);
putInt((int) incidentId, 4);
putInt((int) eventId, 1);
writeCRC();
rewind();
}
/**
* @return The length of this message
*/
public int getSize() {
return MESSAGE_SIZE;
}
}