void MasterServer::HandleUpdateServer(Packet *packet) { GameServer *gameServer; bool newServerAdded; BitStream incomingBitStream(packet->data, packet->length, false); incomingBitStream.IgnoreBits(8*sizeof(unsigned char)); gameServer = DeserializeServer(&incomingBitStream); gameServer->connectionIdentifier.binaryAddress=packet->playerId.binaryAddress; UpdateServerList(gameServer, true, &newServerAdded); if (newServerAdded) { #ifdef _SHOW_MASTER_SERVER_PRINTF printf("Server added. %i servers on the list\n", gameServerList.serverList.Size()); #endif gameServer->originationId=packet->playerId; } #ifdef _SHOW_MASTER_SERVER_PRINTF else printf("Server updated. %i servers on the list\n", gameServerList.serverList.Size()); #endif }
void MasterClient::HandleServerListResponse(Packet *packet, bool overwriteExisting) { int serverIndex; bool newServerAdded; unsigned short numberOfServers; GameServer *gameServer; RakNetTime currentTime; BitStream inputBitStream(packet->data, packet->length, false); inputBitStream.IgnoreBits(8*sizeof(unsigned char)); if (inputBitStream.ReadCompressed(numberOfServers)==false) return; currentTime=RakNet::GetTime(); for (serverIndex=0; serverIndex < numberOfServers; serverIndex++) { gameServer = DeserializeServer(&inputBitStream); // Find the existing game server that matches this port/address. // If not found, then add it to the list. // else update it // If (overwriteExisting) // - Delete any fields that exist in the old and not in the new // Add any fields that exist in the new and do not exist in the old // Update any fields that exist in both // Unset the deletion mark gameServer=UpdateServerList(gameServer,overwriteExisting, &newServerAdded); if (newServerAdded) { // Ping the new server rakPeer->Ping((char*)rakPeer->PlayerIDToDottedIP(gameServer->connectionIdentifier), gameServer->connectionIdentifier.port, false); // Returns true if new server updated OnGameServerListAddition(gameServer); } else { // returns false if an existing server is modified OnGameServerListRuleUpdate(gameServer); } } // Any servers that were not updated on the last call to UpdateServerList // will have lastUpdateTime time as less than the current time // Delete those serverIndex=0; while (serverIndex < (int) gameServerList.serverList.Size()) { if (gameServerList.serverList[serverIndex]->lastUpdateTime < currentTime) { delete gameServerList.serverList[serverIndex]; gameServerList.serverList.RemoveAtIndex(serverIndex); } else serverIndex++; } OnGameServerListQueryComplete(); }