mirror of
https://github.com/michaelrausch/Party-Parrots-At-Sea.git
synced 2026-05-09 14:28:43 +00:00
Added processing of input from host via chat to manually trigger race finishing or to speed up boats.
#implement
This commit is contained in:
@@ -59,6 +59,7 @@ public class GameState implements Runnable {
|
|||||||
private static Long previousUpdateTime;
|
private static Long previousUpdateTime;
|
||||||
public static Double windDirection;
|
public static Double windDirection;
|
||||||
private static Double windSpeed;
|
private static Double windSpeed;
|
||||||
|
private static Double speedMultiplier = 1d;
|
||||||
|
|
||||||
private static Boolean customizationFlag; // dirty flag to tell if a player has customized their boat.
|
private static Boolean customizationFlag; // dirty flag to tell if a player has customized their boat.
|
||||||
|
|
||||||
@@ -356,7 +357,7 @@ public class GameState implements Runnable {
|
|||||||
Double velocity = yacht.getCurrentVelocity();
|
Double velocity = yacht.getCurrentVelocity();
|
||||||
Double trueWindAngle = Math.abs(windDirection - yacht.getHeading());
|
Double trueWindAngle = Math.abs(windDirection - yacht.getHeading());
|
||||||
Double boatSpeedInKnots = PolarTable.getBoatSpeed(getWindSpeedKnots(), trueWindAngle);
|
Double boatSpeedInKnots = PolarTable.getBoatSpeed(getWindSpeedKnots(), trueWindAngle);
|
||||||
Double maxBoatSpeed = GeoUtility.knotsToMMS(boatSpeedInKnots);
|
Double maxBoatSpeed = GeoUtility.knotsToMMS(boatSpeedInKnots) * speedMultiplier;
|
||||||
// TODO: 15/08/17 remove magic numbers from these equations.
|
// TODO: 15/08/17 remove magic numbers from these equations.
|
||||||
if (yacht.getSailIn()) {
|
if (yacht.getSailIn()) {
|
||||||
if (velocity < maxBoatSpeed - 500) {
|
if (velocity < maxBoatSpeed - 500) {
|
||||||
@@ -693,4 +694,13 @@ public class GameState implements Runnable {
|
|||||||
public static void broadcastChatter(ChatterMessage chatterMessage) {
|
public static void broadcastChatter(ChatterMessage chatterMessage) {
|
||||||
notifyMessageListeners(chatterMessage);
|
notifyMessageListeners(chatterMessage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void endRace () {
|
||||||
|
yachts.forEach((id, yacht) -> yacht.setBoatStatus(BoatStatus.FINISHED));
|
||||||
|
// currentStage = GameStages.FINISHED;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setSpeedMultiplier (double multiplier) {
|
||||||
|
speedMultiplier = multiplier;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -86,7 +86,13 @@ public class MainServerThread implements Runnable, ClientConnectionDelegate {
|
|||||||
|
|
||||||
//FINISHED
|
//FINISHED
|
||||||
else if (GameState.getCurrentStage() == GameStages.FINISHED) {
|
else if (GameState.getCurrentStage() == GameStages.FINISHED) {
|
||||||
terminate();
|
broadcastMessage(makeRaceStatusMessage());
|
||||||
|
try {
|
||||||
|
Thread.sleep(1000); //Hackish fix to make sure all threads have broadcasted
|
||||||
|
terminate();
|
||||||
|
} catch (InterruptedException ie) {
|
||||||
|
serverLog("Thread interrupted while waiting to terminate clients", 1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -169,6 +175,9 @@ public class MainServerThread implements Runnable, ClientConnectionDelegate {
|
|||||||
@Override
|
@Override
|
||||||
public void clientConnected(ServerToClientThread serverToClientThread) {
|
public void clientConnected(ServerToClientThread serverToClientThread) {
|
||||||
serverLog("Player Connected From " + serverToClientThread.getThread().getName(), 0);
|
serverLog("Player Connected From " + serverToClientThread.getThread().getName(), 0);
|
||||||
|
if (serverToClientThreads.size() == 0) { //Sets first client as host.
|
||||||
|
serverToClientThread.setAsHost();
|
||||||
|
}
|
||||||
serverToClientThreads.add(serverToClientThread);
|
serverToClientThreads.add(serverToClientThread);
|
||||||
serverToClientThread.addConnectionListener(() -> {
|
serverToClientThread.addConnectionListener(() -> {
|
||||||
for (ServerToClientThread thread : serverToClientThreads) {
|
for (ServerToClientThread thread : serverToClientThreads) {
|
||||||
@@ -257,6 +266,8 @@ public class MainServerThread implements Runnable, ClientConnectionDelegate {
|
|||||||
if (timeTillStart > PREPATORY_TIME) {
|
if (timeTillStart > PREPATORY_TIME) {
|
||||||
raceStatus = RaceStatus.PREPARATORY;
|
raceStatus = RaceStatus.PREPARATORY;
|
||||||
}
|
}
|
||||||
|
} else if (GameState.getCurrentStage() == GameStages.FINISHED) {
|
||||||
|
raceStatus = RaceStatus.TERMINATED;
|
||||||
} else {
|
} else {
|
||||||
raceStatus = RaceStatus.STARTED;
|
raceStatus = RaceStatus.STARTED;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,23 +31,6 @@ import seng302.gameServer.messages.RegistrationResponseStatus;
|
|||||||
import seng302.gameServer.messages.XMLMessage;
|
import seng302.gameServer.messages.XMLMessage;
|
||||||
import seng302.gameServer.messages.XMLMessageSubType;
|
import seng302.gameServer.messages.XMLMessageSubType;
|
||||||
import seng302.gameServer.messages.YachtEventCodeMessage;
|
import seng302.gameServer.messages.YachtEventCodeMessage;
|
||||||
import seng302.gameServer.messages.YachtEventCodeMessage;
|
|
||||||
import seng302.model.Player;
|
|
||||||
import seng302.model.ServerYacht;
|
|
||||||
import seng302.model.stream.packets.PacketType;
|
|
||||||
import seng302.model.stream.packets.StreamPacket;
|
|
||||||
import seng302.model.stream.xml.generator.Race;
|
|
||||||
import seng302.model.stream.xml.generator.Regatta;
|
|
||||||
import seng302.utilities.XMLGenerator;
|
|
||||||
import seng302.gameServer.messages.BoatAction;
|
|
||||||
import seng302.gameServer.messages.BoatLocationMessage;
|
|
||||||
import seng302.gameServer.messages.ClientType;
|
|
||||||
import seng302.gameServer.messages.Message;
|
|
||||||
import seng302.gameServer.messages.RegistrationResponseMessage;
|
|
||||||
import seng302.gameServer.messages.RegistrationResponseStatus;
|
|
||||||
import seng302.gameServer.messages.XMLMessage;
|
|
||||||
import seng302.gameServer.messages.XMLMessageSubType;
|
|
||||||
import seng302.gameServer.messages.YachtEventCodeMessage;
|
|
||||||
import seng302.model.Player;
|
import seng302.model.Player;
|
||||||
import seng302.model.ServerYacht;
|
import seng302.model.ServerYacht;
|
||||||
import seng302.model.stream.packets.PacketType;
|
import seng302.model.stream.packets.PacketType;
|
||||||
@@ -92,6 +75,7 @@ public class ServerToClientThread implements Runnable, Observer {
|
|||||||
|
|
||||||
private ClientType clientType;
|
private ClientType clientType;
|
||||||
private Boolean isRegistered = false;
|
private Boolean isRegistered = false;
|
||||||
|
private Boolean isHost = false;
|
||||||
|
|
||||||
private XMLGenerator xml;
|
private XMLGenerator xml;
|
||||||
|
|
||||||
@@ -227,9 +211,10 @@ public class ServerToClientThread implements Runnable, Observer {
|
|||||||
completeRegistration(requestedType);
|
completeRegistration(requestedType);
|
||||||
break;
|
break;
|
||||||
case CHATTER_TEXT:
|
case CHATTER_TEXT:
|
||||||
GameState.broadcastChatter(
|
// GameState.broadcastChatter(
|
||||||
ServerPacketParser.extractChatterText(payload)
|
// ServerPacketParser.extractChatterText(payload)
|
||||||
);
|
// );
|
||||||
|
parseChatter(payload);
|
||||||
break;
|
break;
|
||||||
case RACE_CUSTOMIZATION_REQUEST:
|
case RACE_CUSTOMIZATION_REQUEST:
|
||||||
Long sourceID = Message
|
Long sourceID = Message
|
||||||
@@ -391,4 +376,42 @@ public class ServerToClientThread implements Runnable, Observer {
|
|||||||
public void addDisconnectListener(DisconnectListener disconnectListener) {
|
public void addDisconnectListener(DisconnectListener disconnectListener) {
|
||||||
this.disconnectListener = disconnectListener;
|
this.disconnectListener = disconnectListener;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setAsHost() {
|
||||||
|
isHost = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void parseChatter(byte[] chatterPayload) {
|
||||||
|
String chatterText = new String(
|
||||||
|
Arrays.copyOfRange(chatterPayload, 3, 3 + chatterPayload.length)
|
||||||
|
);
|
||||||
|
String[] words = chatterText.split("\\s+");
|
||||||
|
if (words.length < 3) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
switch (words[2].trim()) {
|
||||||
|
case ">speed":
|
||||||
|
try {
|
||||||
|
GameState.setSpeedMultiplier(Double.valueOf(words[3]));
|
||||||
|
GameState.broadcastChatter(new ChatterMessage(
|
||||||
|
Byte.toUnsignedInt(chatterPayload[1]),
|
||||||
|
words[0] + "Host has set speed modifier to x" + words[3]
|
||||||
|
));
|
||||||
|
} catch (Exception e) {
|
||||||
|
logger.error("cannot parse >speed value");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ">finish":
|
||||||
|
GameState.endRace();
|
||||||
|
GameState.broadcastChatter(new ChatterMessage(
|
||||||
|
chatterPayload[1],
|
||||||
|
words[0] + "Host has ended the game"
|
||||||
|
));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
GameState.broadcastChatter(
|
||||||
|
ServerPacketParser.extractChatterText(chatterPayload)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user