void CLevel::OnMessage (void* data, u32 size) { DemoCS.Enter(); if (IsDemoPlay() ) { if (m_bDemoStarted) { DemoCS.Leave(); return; } if (!m_aDemoData.empty() && net_IsSyncronised()) { // NET_Packet *P = &(m_aDemoData.front()); DemoDataStruct *P = &(m_aDemoData.front()); u32 CurTime = timeServer_Async(); timeServer_UserDelta(P->m_dwTimeReceive - CurTime); m_bDemoStarted = TRUE; Msg("! ------------- Demo Started ------------"); m_dwCurDemoFrame = P->m_dwFrame; DemoCS.Leave(); return; } }; if (IsDemoSave() && net_IsSyncronised()) { Demo_StoreData(data, size, DATA_CLIENT_PACKET); } IPureClient::OnMessage(data, size); DemoCS.Leave(); };
void CLevel::OnConnectResult (NET_Packet* P) { // multiple results can be sent during connection they should be "AND-ed" m_bConnectResultReceived = true; u8 result = P->r_u8(); u8 res1 = P->r_u8(); string128 ResultStr ; P->r_stringZ(ResultStr) ; if (!result) { m_bConnectResult = false ; switch (res1) { case 0: //Standart error { if (!xr_strcmp(ResultStr, "Data verification failed. Cheater? [2]")) MainMenu()->SetErrorDialog(CMainMenu::ErrDifferentVersion); }break; case 1: //GameSpy CDKey { if (!xr_strcmp(ResultStr, "Invalid CD Key")) MainMenu()->SetErrorDialog(CMainMenu::ErrCDKeyInvalid);//, ResultStr); if (!xr_strcmp(ResultStr, "CD Key in use")) MainMenu()->SetErrorDialog(CMainMenu::ErrCDKeyInUse);//, ResultStr); if (!xr_strcmp(ResultStr, "Your CD Key is disabled. Contact customer service.")) MainMenu()->SetErrorDialog(CMainMenu::ErrCDKeyDisabled);//, ResultStr); }break; case 2: //login+password { MainMenu()->SetErrorDialog(CMainMenu::ErrInvalidPassword); }break; } }; m_sConnectResult = ResultStr; if (IsDemoSave()) { // P->r_stringZ(m_sDemoHeader.LevelName); // P->r_stringZ(m_sDemoHeader.GameType); m_sDemoHeader.bServerClient = P->r_u8(); P->r_stringZ(m_sDemoHeader.ServerOptions); //----------------------------------------- FILE* fTDemo = fopen(m_sDemoName, "ab"); if (fTDemo) { fwrite(&m_sDemoHeader.bServerClient, 32, 1, fTDemo); DWORD OptLen = m_sDemoHeader.ServerOptions.size(); fwrite(&OptLen, 4, 1, fTDemo); fwrite(*m_sDemoHeader.ServerOptions, OptLen, 1, fTDemo); fclose(fTDemo); }; //----------------------------------------- }; };
void CLevel::OnConnectResult (NET_Packet* P) { // multiple results can be sent during connection they should be "AND-ed" m_bConnectResultReceived = true; u8 result = P->r_u8(); u8 res1 = P->r_u8(); string512 ResultStr ; P->r_stringZ_s(ResultStr) ; if (!result) { m_bConnectResult = false ; switch (res1) { case 0: //Standart error { if (strstr(ResultStr, "Data verification failed. Cheater?")) MainMenu()->SetErrorDialog(CMainMenu::ErrDifferentVersion); }break; case 1: //GameSpy CDKey { if (!xr_strcmp(ResultStr, "Invalid CD Key")) MainMenu()->SetErrorDialog(CMainMenu::ErrCDKeyInvalid);//, ResultStr); if (!xr_strcmp(ResultStr, "CD Key in use")) MainMenu()->SetErrorDialog(CMainMenu::ErrCDKeyInUse);//, ResultStr); if (!xr_strcmp(ResultStr, "Your CD Key is disabled. Contact customer service.")) MainMenu()->SetErrorDialog(CMainMenu::ErrCDKeyDisabled);//, ResultStr); }break; case 2: //login+password { MainMenu()->SetErrorDialog(CMainMenu::ErrInvalidPassword); }break; case 3: { if (!xr_strlen(ResultStr)) { MainMenu()->OnSessionTerminate( CStringTable().translate("st_you_have_been_banned").c_str() ); } else { MainMenu()->OnSessionTerminate(ResultStr); } }break; } }; m_sConnectResult = ResultStr; if (IsDemoSave()) { P->r_u8(); //server client or not shared_str server_options; P->r_stringZ(server_options); StartSaveDemo(server_options); } };
void CLevel::Demo_StartFrame () { if (!IsDemoSave() || !net_IsSyncronised()) return; DemoCS.Enter(); DemoFrameTime CurFrameTime; CurFrameTime.dwTimeDelta = Device.dwTimeDelta; CurFrameTime.dwTimeGlobal = Device.dwTimeGlobal; CurFrameTime.dwTimeServer = Level().timeServer(); CurFrameTime.dwTimeServer_Delta = Level().timeServer_Delta(); CurFrameTime.fTimeDelta = Device.fTimeDelta; CurFrameTime.fTimeGlobal= Device.fTimeGlobal; Demo_StoreData(&CurFrameTime, sizeof(CurFrameTime), DATA_FRAME); DemoCS.Leave(); };
CLevel::~CLevel() { xr_delete (g_player_hud); delete_data (hud_zones_list); hud_zones_list = NULL; Msg ("- Destroying level"); Engine.Event.Handler_Detach (eEntitySpawn, this); Engine.Event.Handler_Detach (eEnvironment, this); Engine.Event.Handler_Detach (eChangeTrack, this); Engine.Event.Handler_Detach (eDemoPlay, this); Engine.Event.Handler_Detach (eChangeRP, this); if (ph_world) { ph_world->Destroy (); xr_delete (ph_world); } // destroy PSs for (POIt p_it=m_StaticParticles.begin(); m_StaticParticles.end()!=p_it; ++p_it) CParticlesObject::Destroy(*p_it); m_StaticParticles.clear (); // Unload sounds // unload prefetched sounds sound_registry.clear (); // unload static sounds for (u32 i=0; i<static_Sounds.size(); ++i){ static_Sounds[i]->destroy(); xr_delete (static_Sounds[i]); } static_Sounds.clear (); xr_delete (m_level_sound_manager); xr_delete (m_space_restriction_manager); xr_delete (m_seniority_hierarchy_holder); xr_delete (m_client_spawn_manager); xr_delete (m_autosave_manager); #ifdef DEBUG xr_delete (m_debug_renderer); #endif if (!g_dedicated_server) ai().script_engine().remove_script_process(ScriptEngine::eScriptProcessorLevel); xr_delete (game); xr_delete (game_events); #ifdef SPAWN_ANTIFREEZE xr_delete(spawn_events); #endif //by Dandy //destroy fog of war // xr_delete (m_pFogOfWar); //destroy bullet manager xr_delete (m_pBulletManager); //----------------------------------------------------------- xr_delete (pStatGraphR); xr_delete (pStatGraphS); //----------------------------------------------------------- xr_delete (m_ph_commander); xr_delete (m_ph_commander_scripts); //----------------------------------------------------------- pObjects4CrPr.clear(); pActors4CrPr.clear(); ai().unload (); //----------------------------------------------------------- #ifdef DEBUG xr_delete (m_level_debug); #endif //----------------------------------------------------------- xr_delete (m_map_manager); delete_data (m_game_task_manager); // xr_delete (m_pFogOfWarMngr); // here we clean default trade params // because they should be new for each saved/loaded game // and I didn't find better place to put this code in CTradeParameters::clean (); if(g_tutorial && g_tutorial->m_pStoredInputReceiver==this) g_tutorial->m_pStoredInputReceiver = NULL; if(g_tutorial2 && g_tutorial2->m_pStoredInputReceiver==this) g_tutorial2->m_pStoredInputReceiver = NULL; if (IsDemoPlay()) { StopPlayDemo(); } xr_delete(m_msg_filter); if (IsDemoSave()) { StopSaveDemo(); } }
void CLevel::ClientSend() { if (!GameID() == GAME_SINGLE || OnClient()) if (GameID() == GAME_SINGLE || OnClient()) { if ( !net_HasBandwidth() ) return; }; #ifdef BATTLEYE battleye_system.UpdateClient(); #endif // BATTLEYE NET_Packet P; u32 start = 0; //----------- for E3 ----------------------------- // if () { // if (!(Game().local_player) || Game().local_player->testFlag(GAME_PLAYER_FLAG_VERY_VERY_DEAD)) return; if (CurrentControlEntity()) { CObject* pObj = CurrentControlEntity(); if (!pObj->getDestroy() && pObj->net_Relevant()) { P.w_begin (M_CL_UPDATE); P.w_u16 (u16(pObj->ID()) ); P.w_u32 (0); //reserved place for client's ping pObj->net_Export (P); if (P.B.count>9) { if (OnServer()) { if (net_IsSyncronised() && IsDemoSave()) { DemoCS.Enter(); Demo_StoreData(P.B.data, P.B.count, DATA_CLIENT_PACKET); DemoCS.Leave(); } } else Send (P, net_flags(FALSE)); } } } }; if (OnClient()) { Flush_Send_Buffer(); return; } //------------------------------------------------- while (1) { P.w_begin (M_UPDATE); start = Objects.net_Export (&P, start, max_objects_size); if (P.B.count>2) { Device.Statistic->TEST3.Begin(); Send (P, net_flags(FALSE)); Device.Statistic->TEST3.End(); }else break; } }
void CLevel::Demo_StoreData (void* data, u32 size, DEMO_CHUNK DataType) { if (!IsDemoSave()) return; // DemoCS.Enter(); u32 CurTime = timeServer_Async(); u32 TotalSize = 4 + 4 + 4;// switch(DataType) { case DATA_FRAME: { TotalSize += size; }break; case DATA_SERVER_PACKET: case DATA_CLIENT_PACKET: { TotalSize += size + 4; }break; } R_ASSERT2(size <= DEMO_DATA_SIZE, "Data is too BIG!"); if ((TotalSize + m_dwStoredDemoDataSize) >= DEMO_DATA_SIZE) { Demo_DumpData(); }; DEMO_CHUNK Chunk = DataType; CopyMemory(m_pStoredDemoData + m_dwStoredDemoDataSize, &Chunk, 4); m_dwStoredDemoDataSize += 4; CopyMemory(m_pStoredDemoData + m_dwStoredDemoDataSize, &m_dwCurDemoFrame, 4); m_dwStoredDemoDataSize += 4; CopyMemory(m_pStoredDemoData + m_dwStoredDemoDataSize, &CurTime, 4); m_dwStoredDemoDataSize += 4; switch (DataType) { case DATA_FRAME: { CopyMemory(m_pStoredDemoData + m_dwStoredDemoDataSize, data, size); m_dwStoredDemoDataSize += size; }break; case DATA_SERVER_PACKET: case DATA_CLIENT_PACKET: { CopyMemory(m_pStoredDemoData + m_dwStoredDemoDataSize, &size, 4); m_dwStoredDemoDataSize += 4; CopyMemory(m_pStoredDemoData + m_dwStoredDemoDataSize, data, size); m_dwStoredDemoDataSize += size; }break; } // DemoCS.Leave(); /* FILE* fTDemo = fopen(m_sDemoName, "ab"); if (!fTDemo) return; static u32 Count = 0; static u32 TotalSize = 0; u32 CurTime = timeServer_Async(); fwrite(&(CurTime), sizeof(CurTime), 1, fTDemo); TotalSize += sizeof(CurTime); fwrite(&(size), sizeof(size), 1, fTDemo); TotalSize += sizeof(size); if (size) fwrite((data), 1, size, fTDemo); TotalSize += size; fclose(fTDemo); Count++; */ }