void StepManiaLanServer::Disconnect(const unsigned int clientNum) { if (clientNum == (Client.size()-1)) { delete Client[Client.size()-1]; Client[Client.size()-1] = NULL; Client.pop_back(); } else { vector<GameClient*>::iterator Iterator; Iterator = Client.begin(); for (unsigned int x = 0; x < Client.size(); ++x) { if (x == clientNum) { delete Client[x]; Client[x] = NULL; Client.erase(Iterator); } ++Iterator; } } SendUserList(); }
ERROR_CODE PacketProcess::LobbyUserList(PacketInfo packetInfo) { CHECK_START // 현재 로비에 있는지 조사한다. // 유저 리스트를 보내준다. auto pUserRet = m_pRefUserMgr->GetUser(packetInfo.sessionIndex); auto errorCode = std::get<0>(pUserRet); if (errorCode != ERROR_CODE::NONE) { CHECK_ERROR(errorCode); } auto pUser = std::get<1>(pUserRet); if (pUser->IsCurDomainInLobby() == false) { CHECK_ERROR(ERROR_CODE::LOBBY_USER_LIST_INVALID_DOMAIN); } auto pLobby = m_pRefLobbyMgr->GetLobby(pUser->GetLobbyIndex()); if (pLobby == nullptr) { CHECK_ERROR(ERROR_CODE::LOBBY_USER_LIST_INVALID_LOBBY_INDEX); } auto reqPkt = (NCommon::PktLobbyUserListReq*)packetInfo.dataAddress; pLobby->SendUserList(pUser->GetSessioIndex(), reqPkt->StartUserIndex); return ERROR_CODE::NONE; CHECK_ERR: NCommon::PktLobbyUserListRes resPkt; resPkt.SetError(__result); m_pRefNetwork->SendData(packetInfo.sessionIndex, (short)PACKET_ID::LOBBY_ENTER_USER_LIST_RES, sizeof(NCommon::PktBase), (char*)&resPkt); return (ERROR_CODE)__result; }
void StepManiaLanServer::ParseData(PacketFunctions& Packet, const unsigned int clientNum) { int command = Packet.Read1(); switch (command) { case NSCPing: // No Operation SendValue(NSServerOffset + NSCPingR, clientNum); break; case NSCPingR: // No Operation response break; case NSCHello: // Hello Hello(Packet, clientNum); break; case NSCGSR: // Start Request Client[clientNum]->StartRequest(Packet); CheckReady(); //This is what ACTUALLY starts the games break; case NSCGON: // GameOver GameOver(Packet, clientNum); break; case NSCGSU: // StatsUpdate Client[clientNum]->UpdateStats(Packet); if (!Client[clientNum]->lowerJudge) CheckLowerJudge(clientNum); break; case NSCSU: // Style Update Client[clientNum]->StyleUpdate(Packet); SendUserList(); break; case NSCCM: // Chat message AnalizeChat(Packet, clientNum); break; case NSCRSG: SelectSong(Packet, clientNum); break; case NSCSMS: ScreenNetMusicSelectStatus(Packet, clientNum); break; case NSCUPOpts: Client[clientNum]->Player[0].options = Packet.ReadNT(); Client[clientNum]->Player[1].options = Packet.ReadNT(); break; default: break; } }
void StepManiaLanServer::ScreenNetMusicSelectStatus(PacketFunctions& Packet, unsigned int clientNum) { CString message = ""; int EntExitCode = Packet.Read1(); message += Client[clientNum]->Player[0].name; if (Client[clientNum]->twoPlayers) message += "&"; message += Client[clientNum]->Player[1].name; if (EntExitCode % 2 == 1) Client[clientNum]->inNetMusicSelect = true; else Client[clientNum]->inNetMusicSelect = false; GameClient::LastNetScreen LastScreenInfo = GameClient::NS_NOWHERE; switch (EntExitCode) { case 0: message += " left the song selection."; break; case 1: message += " entered the song selection."; LastScreenInfo = GameClient::NS_SELECTSCREEN; break; case 2: message += " exited options."; break; case 3: message += " went into options."; LastScreenInfo = GameClient::NS_OPTIONS; break; case 4: //no need to mention exiting of options break; case 5: message += " finished the game."; LastScreenInfo = GameClient::NS_EVALUATION; break; } ServerChat(message); Client[clientNum]->NetScreenInfo = LastScreenInfo; SendUserList (); }