From c1e319abacd44e7473c725c02dd66147b8f4ca91 Mon Sep 17 00:00:00 2001 From: Josh Allen Date: Mon, 6 Sep 2004 23:26:16 +0000 Subject: [PATCH] detect entering options menu --- stepmania/src/NetworkSyncServer.cpp | 342 ++++++++++++---------------- 1 file changed, 148 insertions(+), 194 deletions(-) diff --git a/stepmania/src/NetworkSyncServer.cpp b/stepmania/src/NetworkSyncServer.cpp index 8600a65fa8..838088e72e 100644 --- a/stepmania/src/NetworkSyncServer.cpp +++ b/stepmania/src/NetworkSyncServer.cpp @@ -1,12 +1,10 @@ /* NetworkSyncServer.cpp */ -#include "global.h" + #include "NetworkSyncServer.h" #include "RageLog.h" -#include -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); }