void CPreGame::GameDataReceived(boost::shared_ptr<const netcode::RawPacket> packet) { ScopedOnceTimer startserver("PreGame::GameDataReceived"); try { gameData.reset(new GameData(packet)); } catch (const netcode::UnpackPacketException& ex) { throw content_error(std::string("Server sent us invalid GameData: ") + ex.what()); } // for demos, ReadDataFromDemo precedes UpdateClientNet -> GameDataReceived // this means gameSetup contains data from the original game but we need the // modified version (cf StartServerForDemo) which the server already has that // contains an extra player if (gameSetup != NULL) SafeDelete(gameSetup); if (CGameSetup::LoadReceivedScript(gameData->GetSetupText(), clientSetup->isHost)) { assert(gameSetup != NULL); gu->LoadFromSetup(gameSetup); gs->LoadFromSetup(gameSetup); // do we really need to do this so early? CPlayer::UpdateControlledTeams(); } else { throw content_error("Server sent us incorrect script"); } // some sanity checks for (int p = 0; p < playerHandler->ActivePlayers(); ++p) { const CPlayer* player = playerHandler->Player(p); if (!playerHandler->IsValidPlayer(player->playerNum)) { throw content_error("Invalid player in game data"); } if (!teamHandler->IsValidTeam(player->team)) { throw content_error("Invalid team in game data"); } if (!teamHandler->IsValidAllyTeam(teamHandler->AllyTeam(player->team))) { // TODO: seems not to make sense really throw content_error("Invalid ally team in game data"); } } // Load archives into VFS AddGameSetupArchivesToVFS(gameSetup, false); // Check checksums of map & game try { archiveScanner->CheckArchive(gameSetup->mapName, gameData->GetMapChecksum()); } catch (const content_error& ex) { LOG_L(L_WARNING, "Incompatible map-checksum: %s", ex.what()); } try { archiveScanner->CheckArchive(modArchive, gameData->GetModChecksum()); } catch (const content_error& ex) { LOG_L(L_WARNING, "Incompatible game-checksum: %s", ex.what()); } if (clientSetup->isHost && !gameSetup->recordDemo) { //script.txt allows to disable demo file recording (host only, used for menu) wantDemo = false; } if (clientNet != NULL && wantDemo) { assert(clientNet->GetDemoRecorder() == NULL); CDemoRecorder* recorder = new CDemoRecorder(gameSetup->mapName, gameSetup->modName, false); recorder->WriteSetupText(gameData->GetSetupText()); recorder->SaveToDemo(packet->data, packet->length, clientNet->GetPacketTime(gs->frameNum)); clientNet->SetDemoRecorder(recorder); LOG("Recording demo to: %s", (recorder->GetName()).c_str()); } }
void CPreGame::GameDataReceived(boost::shared_ptr<const netcode::RawPacket> packet) { ScopedOnceTimer startserver("PreGame::GameDataReceived"); try { gameData.reset(new GameData(packet)); } catch (const netcode::UnpackPacketException& ex) { throw content_error(std::string("Server sent us invalid GameData: ") + ex.what()); } CGameSetup* temp = new CGameSetup(); if (temp->Init(gameData->GetSetup())) { if (settings->isHost) { const std::string& setupTextStr = gameData->GetSetup(); std::fstream setupTextFile("_script.txt", std::ios::out); setupTextFile.write(setupTextStr.c_str(), setupTextStr.size()); setupTextFile.close(); } gameSetup = temp; gu->LoadFromSetup(gameSetup); gs->LoadFromSetup(gameSetup); CPlayer::UpdateControlledTeams(); } else { throw content_error("Server sent us incorrect script"); } // some sanity checks for (int p = 0; p < playerHandler->ActivePlayers(); ++p) { const CPlayer* player = playerHandler->Player(p); if (!playerHandler->IsValidPlayer(player->playerNum)) { throw content_error("Invalid player in game data"); } if (!teamHandler->IsValidTeam(player->team)) { throw content_error("Invalid team in game data"); } if (!teamHandler->IsValidAllyTeam(teamHandler->AllyTeam(player->team))) { // TODO: seems not to make sense really throw content_error("Invalid ally team in game data"); } } gs->SetRandSeed(gameData->GetRandomSeed(), true); LOG("Using map: %s", gameSetup->mapName.c_str()); vfsHandler->AddArchiveWithDeps(gameSetup->mapName, false); try { archiveScanner->CheckArchive(gameSetup->mapName, gameData->GetMapChecksum()); } catch (const content_error& ex) { LOG_L(L_WARNING, "Incompatible map-checksum: %s", ex.what()); } LOG("Using game: %s", gameSetup->modName.c_str()); vfsHandler->AddArchiveWithDeps(gameSetup->modName, false); modArchive = archiveScanner->ArchiveFromName(gameSetup->modName); LOG("Using game archive: %s", modArchive.c_str()); try { archiveScanner->CheckArchive(modArchive, gameData->GetModChecksum()); } catch (const content_error& ex) { LOG_L(L_WARNING, "Incompatible game-checksum: %s", ex.what()); } if (net != NULL && wantDemo) { assert(net->GetDemoRecorder() == NULL); CDemoRecorder* recorder = new CDemoRecorder(gameSetup->mapName, gameSetup->modName); recorder->WriteSetupText(gameData->GetSetup()); recorder->SaveToDemo(packet->data, packet->length, net->GetPacketTime(gs->frameNum)); net->SetDemoRecorder(recorder); LOG("recording demo: %s", (recorder->GetName()).c_str()); } }