detect entering options menu

This commit is contained in:
Josh Allen
2004-09-06 23:26:16 +00:00
parent 7a11b10426
commit c1e319abac
+148 -194
View File
@@ -1,12 +1,10 @@
/* NetworkSyncServer.cpp
*/
#include "global.h"
#include "NetworkSyncServer.h"
#include "RageLog.h"
#include <time.h>
LanPlayer::LanPlayer()
{
LanPlayer::LanPlayer() {
score = 0;
health = 0;
feet = 0;
@@ -19,25 +17,21 @@ LanPlayer::LanPlayer()
options = "";
}
StepManiaLanServer::StepManiaLanServer()
{
StepManiaLanServer::StepManiaLanServer() {
stop = true;
SecondSameSelect = false;
AssignPlayerIDs();
}
StepManiaLanServer::~StepManiaLanServer()
{
StepManiaLanServer::~StepManiaLanServer() {
ServerStop();
}
bool StepManiaLanServer::ServerStart()
{
bool StepManiaLanServer::ServerStart() {
server.blocking = 0; /* Turn off blocking */
if (server.create())
if (server.bind(8765))
if (server.listen())
{
if (server.listen()) {
stop = false;
statsTime = time(NULL);
return true;
@@ -54,9 +48,9 @@ bool StepManiaLanServer::ServerStart()
return false;
}
void StepManiaLanServer::ServerStop()
{
for (int x = 0; x < NUMBERCLIENTS; ++x) {
void StepManiaLanServer::ServerStop() {
int x;
for (x = 0; x < NUMBERCLIENTS; x++) {
Client[x].clientSocket.close();
Client[x].Used = false;
}
@@ -64,15 +58,12 @@ void StepManiaLanServer::ServerStop()
stop = true;
}
void StepManiaLanServer::ServerUpdate()
{
if (!stop)
{
void StepManiaLanServer::ServerUpdate() {
if (!stop) {
NewClientCheck(); /* See if there is another client wanting to play */
UpdateClients();
// CheckReady();
if (time(NULL) > statsTime)
{
if (time(NULL) > statsTime) {
SendStatsToClients();
statsTime = time(NULL);
}
@@ -80,8 +71,7 @@ void StepManiaLanServer::ServerUpdate()
}
}
void StepManiaLanServer::UpdateClients()
{
void StepManiaLanServer::UpdateClients() {
/* Go through all the clients and check to see if it is being used.
If so then try to get a backet and parse the data. */
for (int x = 0; x < NUMBERCLIENTS; x++)
@@ -90,8 +80,7 @@ void StepManiaLanServer::UpdateClients()
ParseData(Packet, x);
}
GameClient::GameClient()
{
GameClient::GameClient() {
Used = 0;
GotStartRequest = 0;
clientSocket.blocking = 0;
@@ -105,8 +94,7 @@ GameClient::GameClient()
wasIngame = false;
}
int GameClient::GetData(PacketFunctions& Packet)
{
int GameClient::GetData(PacketFunctions &Packet) {
int length = -1;
CheckConnection();
Packet.ClearPacket();
@@ -114,11 +102,9 @@ int GameClient::GetData(PacketFunctions& Packet)
return length;
}
void StepManiaLanServer::ParseData(PacketFunctions& Packet, int clientNum)
{
void StepManiaLanServer::ParseData(PacketFunctions &Packet, int clientNum) {
int command = Packet.Read1();
switch (command)
{
switch (command) {
case 0:
// No Operation
SendValue(129, clientNum);
@@ -167,8 +153,7 @@ void StepManiaLanServer::ParseData(PacketFunctions& Packet, int clientNum)
}
}
void StepManiaLanServer::Hello(PacketFunctions& Packet, int clientNum)
{
void StepManiaLanServer::Hello(PacketFunctions &Packet, int clientNum) {
int ClientVersion = Packet.Read1();
CString build = Packet.ReadNT();
@@ -186,26 +171,22 @@ void StepManiaLanServer::Hello(PacketFunctions& Packet, int clientNum)
}
void GameClient::StyleUpdate(PacketFunctions& Packet)
{
void GameClient::StyleUpdate(PacketFunctions &Packet) {
int playernumber = 0;
Player[0].name = Player[1].name = "";
twoPlayers = Packet.Read1()-1;
for (int x = 0; x < twoPlayers+1; x++)
{
for (int x = 0; x < twoPlayers+1; x++) {
playernumber = Packet.Read1();
Player[playernumber].name = Packet.ReadNT();
}
}
void GameClient::SetClientVersion(int ver, const CString& b)
{
void GameClient::SetClientVersion(int ver, CString b) {
version = ver;
build = b;
}
void GameClient::StartRequest(PacketFunctions& Packet)
{
void GameClient::StartRequest(PacketFunctions &Packet) {
int firstbyte = Packet.Read1();
int secondbyte = Packet.Read1();
int thirdbyte = Packet.Read1();
@@ -224,34 +205,31 @@ void GameClient::StartRequest(PacketFunctions& Packet)
gameInfo.artist = Packet.ReadNT();
gameInfo.course = Packet.ReadNT();
for (int x = 0; x < 2; ++x)
{
for (int x = 0; x < 2; x++) {
Player[x].score = 0;
Player[x].combo = 0;
Player[x].projgrade = 0;
Player[x].maxCombo = 0;
memset(Player[x].steps, 0, sizeof(int)*9);
memset((void*)Player[x].steps, 0, sizeof(int)*9);
}
GotStartRequest = true;
// InGame = true;
}
void StepManiaLanServer::CheckReady()
{
void StepManiaLanServer::CheckReady() {
bool canStart = true;
int x;
//Only check clients that are starting (after ScreenNetMusicSelect before InGame).
for (x = 0; (x < NUMBERCLIENTS)&& canStart; ++x)
if (Client[x].Used)
for (x = 0; (x < NUMBERCLIENTS)&&(canStart == true); x++)
if (Client[x].Used == true)
if (Client[x].isStarting)
if (!Client[x].GotStartRequest)
if (Client[x].GotStartRequest == false)
canStart = false;
if (canStart)
{
if (canStart == true) {
//(Test this)
//For whatever reason we need to pause in a way
//that will not use a lot of CPU.
@@ -260,16 +238,13 @@ void StepManiaLanServer::CheckReady()
usleep ( 2000000 );
//Only start clients waiting for start between ScreenNetMusicSelect and game.
for (x = 0; x < NUMBERCLIENTS; ++x)
{
if (Client[x].Used)
if (Client[x].isStarting)
{
for (x = 0; x < NUMBERCLIENTS; x++) {
if (Client[x].Used == true)
if (Client[x].isStarting) {
Client[x].clientSocket.blocking = true;
SendValue(131, x);
Client[x].GotStartRequest = false;
if (Client[x].startPosition == 1)
{
if (Client[x].startPosition == 1) {
Client[x].isStarting = false;
Client[x].InGame = true;
//After we start the clients, clear each client's hasSong.
@@ -282,8 +257,7 @@ void StepManiaLanServer::CheckReady()
}
void StepManiaLanServer::GameOver(PacketFunctions& Packet, int clientNum)
{
void StepManiaLanServer::GameOver(PacketFunctions &Packet, int clientNum) {
bool allOver = true;
int x;
@@ -291,39 +265,37 @@ void StepManiaLanServer::GameOver(PacketFunctions& Packet, int clientNum)
Client[clientNum].InGame = false;
Client[clientNum].wasIngame = true;
for (x = 0; (x < NUMBERCLIENTS)&&allOver ; ++x)
if (Client[x].Used)
if (Client[x].InGame)
for (x = 0; (x < NUMBERCLIENTS)&&(allOver == true); x++)
if (Client[x].Used == true)
if ((Client[x].InGame == true))
allOver = false;
//Wait untill everyone is done before sending
if (allOver)
{
if (allOver) {
numPlayers = SortStats(playersPtr);
Reply.ClearPacket();
Reply.Write1( 4+128 );
Reply.Write1( (uint8_t) numPlayers );
for (x = 0; x < numPlayers; ++x)
for (x = 0; x < numPlayers; x++)
Reply.Write1((uint8_t)playersPtr[x]->PlayerID);
for (x = 0; x < numPlayers; ++x)
for (x = 0; x < numPlayers; x++)
Reply.Write4(playersPtr[x]->score);
for (x = 0; x < numPlayers; ++x)
for (x = 0; x < numPlayers; x++)
Reply.Write1( (uint8_t) playersPtr[x]->projgrade );
for (x = 0; x < numPlayers; ++x)
for (x = 0; x < numPlayers; x++)
Reply.Write1( (uint8_t) playersPtr[x]->diff );
for (int y = 6; y >= 1; --y)
for (x = 0; x < numPlayers; ++x)
for (int y = 6; y >= 1; y--)
for (x = 0; x < numPlayers; x++)
Reply.Write2( (uint16_t) playersPtr[x]->steps[y] );
for (x = 0; x < numPlayers; ++x)
for (x = 0; x < numPlayers; x++)
Reply.Write2( (uint16_t) playersPtr[x]->steps[8] ); //Tack on OK
for (x = 0; x < numPlayers; ++x)
for (x = 0; x < numPlayers; x++)
Reply.Write2( (uint16_t) playersPtr[x]->maxCombo );
for (x = 0; x < numPlayers; ++x)
for (x = 0; x < numPlayers; x++)
Reply.WriteNT( playersPtr[x]->options );
for (x = 0; x < NUMBERCLIENTS; ++x)
if(Client[x].wasIngame)
{
for (x = 0; x < NUMBERCLIENTS; x++)
if(Client[x].wasIngame) {
SendNetPacket(x, Reply);
Client[x].wasIngame = false;
}
@@ -332,40 +304,36 @@ void StepManiaLanServer::GameOver(PacketFunctions& Packet, int clientNum)
}
}
void StepManiaLanServer::AssignPlayerIDs()
{
void StepManiaLanServer::AssignPlayerIDs() {
int counter = 0;
//Future: Figure out how to do dynamic numbering.
for (int x = 0; x < NUMBERCLIENTS; ++x)
for(int y = 0; y < 2; ++y)
for (int x = 0; x < NUMBERCLIENTS; x++)
for(int y = 0; y < 2; y++)
Client[x].Player[y].PlayerID = counter++;
}
int StepManiaLanServer::SortStats(LanPlayer *playersPtr[])
{
int StepManiaLanServer::SortStats(LanPlayer *playersPtr[]) {
int counter = 0;
LanPlayer *tmp;
StatsNameChange = false; //Set it to no name so stats will not send if there is not a change
bool allZero = true;
//Populate with in game players only
for (int x = 0; x < NUMBERCLIENTS; ++x)
if (Client[x].Used)
for (int x = 0; x < NUMBERCLIENTS; x++)
if (Client[x].Used == true)
if (Client[x].InGame||Client[x].wasIngame)
for (int y = 0; y < 2; ++y)
for (int y = 0; y < 2; y++)
if (Client[x].IsPlaying(y))
playersPtr[counter++] = &Client[x].Player[y];
for (int x = 0; x < counter; ++x)
{
for (int x = 0; x < counter; x++) {
//See if all the players have zero. Used to send names if everyone is 0
if ((playersPtr[x]->score > 0) && allZero)
if ((playersPtr[x]->score > 0)&&(allZero == true))
allZero = false;
if ((x+1) < counter)
if ((playersPtr[x]->score) < (playersPtr[x+1]->score))
{
if ((playersPtr[x]->score) < (playersPtr[x+1]->score)) {
tmp = playersPtr[x];
playersPtr[x] = playersPtr[x+1];
playersPtr[x+1] = tmp;
@@ -376,22 +344,21 @@ int StepManiaLanServer::SortStats(LanPlayer *playersPtr[])
}
//If there are players all at 0, the name lsit won't be updated
//this make sure it is sent to the server eventually
if (!StatsNameChange && allZero)
if ((StatsNameChange == false)&&(allZero == true))
StatsNameChange = true;
return counter;
}
void StepManiaLanServer::SendStatsToClients()
{
void StepManiaLanServer::SendStatsToClients() {
int x;
numPlayers = SortStats(playersPtr); //Return number of players
//If there was a chagne in the name data, send it to the clients.
//Used to save bandwidth and some processing time.
if (StatsNameChange)
{
// if (StatsNameChange) {
/* Write and Send name packet */
Reply.ClearPacket();
Reply.Write1(133);
@@ -400,11 +367,11 @@ void StepManiaLanServer::SendStatsToClients()
StatsNameColumn(Reply, playersPtr, numPlayers);
//Send to in game clients only.
for (x = 0; x < NUMBERCLIENTS; ++x)
if (Client[x].InGame)
for (x = 0; x < NUMBERCLIENTS; x++)
if (Client[x].InGame == true)
SendNetPacket(x, Reply);
}
// }
/* Write and send Combo packet */
Reply.ClearPacket();
@@ -415,8 +382,8 @@ void StepManiaLanServer::SendStatsToClients()
StatsComboColumn(Reply, playersPtr, numPlayers);
//Send to in game clients only.
for (x = 0; x < NUMBERCLIENTS; ++x)
if (Client[x].InGame)
for (x = 0; x < NUMBERCLIENTS; x++)
if (Client[x].InGame == true)
SendNetPacket(x, Reply);
@@ -431,41 +398,36 @@ void StepManiaLanServer::SendStatsToClients()
StatsProjgradeColumn(Reply, playersPtr, numPlayers);
//Send to in game clients only.
for (x = 0; x < NUMBERCLIENTS; ++x)
if (Client[x].InGame)
for (x = 0; x < NUMBERCLIENTS; x++)
if (Client[x].InGame == true)
SendNetPacket(x, Reply);
}
void StepManiaLanServer::SendNetPacket(int client, PacketFunctions& Packet)
{
void StepManiaLanServer::SendNetPacket(int client, PacketFunctions &Packet) {
/* If there is a connected client where we want to send then do so */
if (Client[client].Used)
if (Client[client].Used == true)
Client[client].clientSocket.SendPack((char*)Packet.Data, Packet.Position);
}
void StepManiaLanServer::StatsNameColumn(PacketFunctions &data, LanPlayer *playersPtr[], int numPlayers)
{
void StepManiaLanServer::StatsNameColumn(PacketFunctions &data, LanPlayer *playersPtr[], int numPlayers) {
CString numname;
for (int x = 0; x < numPlayers; ++x)
for (int x = 0; x < numPlayers; x++)
data.Write1( (uint8_t) playersPtr[x]->PlayerID );
}
void StepManiaLanServer::StatsComboColumn(PacketFunctions &data, LanPlayer *playersPtr[], int numPlayers)
{
for( int x = 0; x < numPlayers; ++x )
void StepManiaLanServer::StatsComboColumn(PacketFunctions &data, LanPlayer *playersPtr[], int numPlayers) {
for( int x = 0; x < numPlayers; x++ )
data.Write2( (uint16_t) playersPtr[x]->combo);
}
void StepManiaLanServer::StatsProjgradeColumn(PacketFunctions& data, LanPlayer *playersPtr[], int numPlayers)
{
for( int x = 0; x < numPlayers; ++x )
void StepManiaLanServer::StatsProjgradeColumn(PacketFunctions &data, LanPlayer *playersPtr[], int numPlayers) {
for( int x = 0; x < numPlayers; x++ )
data.Write1( (uint8_t) playersPtr[x]->projgrade );
}
bool GameClient::IsPlaying(int x)
{
bool GameClient::IsPlaying(int x) {
/* If the feet setting is above 0, there must be a player. */
if (Player[x].feet > 0)
return true;
@@ -473,8 +435,7 @@ bool GameClient::IsPlaying(int x)
return false;
}
void GameClient::UpdateStats(PacketFunctions& Packet)
{
void GameClient::UpdateStats(PacketFunctions &Packet) {
/* Get the Stats form a packet */
char firstbyte = Packet.Read1();
char secondbyte = Packet.Read1();
@@ -493,8 +454,7 @@ void GameClient::UpdateStats(PacketFunctions& Packet)
Player[pID].steps[Player[pID].currstep]++;
}
void StepManiaLanServer::NewClientCheck()
{
void StepManiaLanServer::NewClientCheck() {
/* Find the first available empty client. Then stick a new connection
in that client socket.*/
int CurrentEmptyClient = FindEmptyClient();
@@ -505,13 +465,11 @@ void StepManiaLanServer::NewClientCheck()
}
void StepManiaLanServer::SendValue(Uint8 value, int clientNum)
{
void StepManiaLanServer::SendValue(Uint8 value, int clientNum) {
Client[clientNum].clientSocket.SendPack((char*)&value, sizeof(Uint8));
}
void StepManiaLanServer::RelayChat(PacketFunctions& Packet, int clientNum)
{
void StepManiaLanServer::RelayChat(PacketFunctions &Packet, int clientNum) {
Reply.ClearPacket();
CString message = "";
@@ -531,15 +489,12 @@ void StepManiaLanServer::RelayChat(PacketFunctions& Packet, int clientNum)
SendToAllClients(Reply);
}
void StepManiaLanServer::SelectSong(PacketFunctions& Packet, int clientNum)
{
void StepManiaLanServer::SelectSong(PacketFunctions &Packet, int clientNum) {
int use = Packet.Read1();
CString message;
if (use == 2)
{
if (clientNum == 0)
{
if (use == 2) {
if (clientNum == 0) {
SecondSameSelect = false;
CurrentSongInfo.title = Packet.ReadNT();
@@ -554,7 +509,7 @@ void StepManiaLanServer::SelectSong(PacketFunctions& Packet, int clientNum)
Reply.WriteNT(CurrentSongInfo.subtitle);
//Only send data to clients currently in ScreenNetMusicSelect
for (int x = 0; x < NUMBERCLIENTS; ++x)
for (int x = 0; x < NUMBERCLIENTS; x++)
if (Client[x].inNetMusicSelect)
SendNetPacket(x, Reply);
// SendToAllClients(Reply);
@@ -565,8 +520,7 @@ void StepManiaLanServer::SelectSong(PacketFunctions& Packet, int clientNum)
if (strcmp(CurrentSongInfo.artist, LastSongInfo.artist) == 0)
SecondSameSelect = true;
if (!SecondSameSelect)
{
if (SecondSameSelect == false) {
LastSongInfo.title = CurrentSongInfo.title;
LastSongInfo.artist = CurrentSongInfo.artist;
LastSongInfo.subtitle = CurrentSongInfo.subtitle;
@@ -577,9 +531,7 @@ void StepManiaLanServer::SelectSong(PacketFunctions& Packet, int clientNum)
ServerChat(message);
}
}
else
{
} else {
message = servername;
message += ": You do not have permission to pick a song.";
Reply.ClearPacket();
@@ -589,16 +541,14 @@ void StepManiaLanServer::SelectSong(PacketFunctions& Packet, int clientNum)
}
}
if (use == 1)
{
if (use == 1) {
//If user dosn't have song
Client[clientNum].hasSong = false;
message = servername;
message += ": ";
message += Client[clientNum].Player[0].name;
if (Client[clientNum].twoPlayers)
{
if (Client[clientNum].twoPlayers) {
message += "&";
message += Client[clientNum].Player[1].name;
}
@@ -614,8 +564,7 @@ void StepManiaLanServer::SelectSong(PacketFunctions& Packet, int clientNum)
Client[clientNum].hasSong = true;
//Only play if everyone has the same song and the host has select the same song twice.
if ( CheckHasSongState() && SecondSameSelect && (clientNum == 0) )
{
if ( CheckHasSongState() && SecondSameSelect && (clientNum == 0) ) {
Reply.ClearPacket();
Reply.Write1(136);
Reply.Write1(2);
@@ -630,8 +579,7 @@ void StepManiaLanServer::SelectSong(PacketFunctions& Packet, int clientNum)
//Only send data to clients currently in ScreenNetMusicSelect
for (int x = 0; x < NUMBERCLIENTS; x++)
if (Client[x].inNetMusicSelect)
{
if (Client[x].inNetMusicSelect) {
SendNetPacket(x, Reply);
//Designate the client is starting,
//after ScreenNetMusicSelect but before game play (InGame).
@@ -642,86 +590,76 @@ void StepManiaLanServer::SelectSong(PacketFunctions& Packet, int clientNum)
}
}
bool StepManiaLanServer::CheckHasSongState()
{
for (int x = 0; x < NUMBERCLIENTS; ++x)
if (Client[x].Used)
bool StepManiaLanServer::CheckHasSongState() {
for (int x = 0; x < NUMBERCLIENTS; x++)
if (Client[x].Used == true)
if (Client[x].inNetMusicSelect)
if (!Client[x].hasSong)
if (Client[x].hasSong == false)
return false;
return true;
}
void StepManiaLanServer::ClearHasSong()
{
for (int x = 0; x < NUMBERCLIENTS; ++x)
if (Client[x].Used)
void StepManiaLanServer::ClearHasSong() {
for (int x = 0; x < NUMBERCLIENTS; x++)
if (Client[x].Used == true)
Client[x].hasSong = false;
}
void StepManiaLanServer::SendToAllClients(PacketFunctions& Packet)
{
for (int x = 0; x < NUMBERCLIENTS; ++x)
void StepManiaLanServer::SendToAllClients(PacketFunctions &Packet) {
for (int x = 0; x < NUMBERCLIENTS; x++)
SendNetPacket(x, Packet);
}
void StepManiaLanServer::ServerChat(const CString& message)
{
void StepManiaLanServer::ServerChat(CString message) {
Reply.ClearPacket();
Reply.Write1(135);
Reply.WriteNT(message);
SendToAllClients(Reply);
}
int StepManiaLanServer::FindEmptyClient()
{
int StepManiaLanServer::FindEmptyClient() {
//Look at Used flag, if zero then it's an empty client (return client index, -1 if none).
for (int x = 0; x < NUMBERCLIENTS; ++x)
for (int x = 0; x < NUMBERCLIENTS; x++)
if (Client[x].Used == 0)
return x;
return -1;
}
void GameClient::CheckConnection()
{
void GameClient::CheckConnection() {
//If there is an error close the socket.
if (clientSocket.IsError())
{
if (clientSocket.IsError()) {
clientSocket.close();
Used = GotStartRequest = hasSong = InGame = inNetMusicSelect = false;
Player[0].name = Player[1].name = "";
}
}
void StepManiaLanServer::MoveClientToHost()
{
if (!Client[ClientHost].Used)
for (int x = 1; x < NUMBERCLIENTS; ++x)
if (Client[x].Used)
{
void StepManiaLanServer::MoveClientToHost() {
if (Client[ClientHost].Used == false)
for (int x = 1; x < NUMBERCLIENTS; x++)
if (Client[x].Used == true) {
ClientHost = x;
x = NUMBERCLIENTS+1;
}
}
void StepManiaLanServer::SendUserList()
{
void StepManiaLanServer::SendUserList() {
Reply.ClearPacket();
Reply.Write1(137);
Reply.Write1(NUMBERCLIENTS*2);
Reply.Write1(NUMBERCLIENTS*2);
for (int x = 0; x < NUMBERCLIENTS; ++x)
{
for (int y = 0; y < 2; ++y)
{
if (Client[x].Player[y].name.length() == 0)
for (int x = 0; x < NUMBERCLIENTS; x++) {
for (int y = 0; y < 2; y++) {
if (Client[x].Player[y].name.length() == 0) {
Reply.Write1(0);
else
} else {
Reply.Write1(1);
}
Reply.WriteNT(Client[x].Player[y].name);
}
}
@@ -729,28 +667,44 @@ void StepManiaLanServer::SendUserList()
SendToAllClients(Reply);
}
void StepManiaLanServer::ScreenNetMusicSelectStatus(PacketFunctions& Packet, int clientNum)
{
LOG->Info("SNMS Change");
void StepManiaLanServer::ScreenNetMusicSelectStatus(PacketFunctions &Packet, int clientNum) {
int code = Packet.Read1()%2;
CString message = servername;
message += ": ";
if (Packet.Read1() == 1)
{
if (code%2 == 1) {
Client[clientNum].inNetMusicSelect = true;
message += Client[clientNum].Player[0].name;
if (Client[clientNum].twoPlayers)
message += "&";
message += Client[clientNum].Player[1].name;
message += " entered the game.";
}
else
{
} else {
Client[clientNum].inNetMusicSelect = false;
}
switch (code) {
case 0:
message += Client[clientNum].Player[0].name;
if (Client[clientNum].twoPlayers)
message += "&";
message += Client[clientNum].Player[1].name;
message += " left the game.";
message += " exited the Music Select.";
break;
case 1:
message += Client[clientNum].Player[0].name;
if (Client[clientNum].twoPlayers)
message += "&";
message += Client[clientNum].Player[1].name;
message += " entered the Music Select.";
break;
case 2:
message += Client[clientNum].Player[0].name;
if (Client[clientNum].twoPlayers)
message += "&";
message += Client[clientNum].Player[1].name;
message += " entered from options.";
break;
case 3:
message += Client[clientNum].Player[0].name;
if (Client[clientNum].twoPlayers)
message += "&";
message += Client[clientNum].Player[1].name;
message += " exited to options.";
break;
}
ServerChat(message);
}