int LoadingScreen::Update() { R3D_ENSURE_MAIN_THREAD(); r3dMouse::Show(); r3dStartFrame(); if( r3dRenderer->DeviceAvailable ) { r3dRenderer->StartRender(1); r3dRenderer->StartFrame(); r3dRenderer->SetRenderingMode(R3D_BLEND_ALPHA | R3D_BLEND_NZ); ClearFullScreen_Menu(); // for now just draw a static picture in background, later on will be a video r3d_assert(m_pBackgroundTex); float x, y, w, h; r3dRenderer->GetBackBufferViewport(&x, &y, &w, &h); D3DVIEWPORT9 oldVp, newVp; r3dRenderer->DoGetViewport(&oldVp); newVp = oldVp; newVp.X = 0; newVp.Y = 0; newVp.Width = r3dRenderer->d3dpp.BackBufferWidth; newVp.Height = r3dRenderer->d3dpp.BackBufferHeight; r3dRenderer->SetViewport( (float)newVp.X, (float)newVp.Y, (float)newVp.Width, (float)newVp.Height ); DWORD oldScissor = 0; r3dRenderer->pd3ddev->GetRenderState(D3DRS_SCISSORTESTENABLE, &oldScissor); r3dRenderer->pd3ddev->SetRenderState(D3DRS_SCISSORTESTENABLE, FALSE); r3dDrawBox2D(x, y, w, h, r3dColor24::white, m_pBackgroundTex); r3dRenderer->SetViewport( (float)oldVp.X, (float)oldVp.Y, (float)oldVp.Width, (float)oldVp.Height ); r3dRenderer->pd3ddev->SetRenderState(D3DRS_SCISSORTESTENABLE, oldScissor); if(!m_RenderingDisabled) { gfxMovie.UpdateAndDraw(); } r3dRenderer->Flush(); r3dRenderer->EndFrame(); } r3dRenderer->EndRender( true ); r3dEndFrame(); return 0; }
static void supervisorServerLoop() { r3dResetFrameTime(); // start monitor first, so if port is used, supervisor won't connect to master gUdpMonitor.Start(SBNET_SUPER_WATCH_PORT); if(!gSupervisorServer.Start()) return; // start log uploader if(gSupervisorConfig->uploadLogs_) { gLogUploader.Start(); } else { r3dOutToLog("LogUploader is disabled\n"); } r3dResetFrameTime(); while(1) { r3dEndFrame(); r3dStartFrame(); Sleep(1); gSupervisorServer.Tick(); gUdpMonitor.Tick(); if(gSupervisorServer.IsMasterDisconnected()) { r3dOutToLog("Master Server disconnected, exiting\n"); break; } } gUdpMonitor.Stop(); return; }
virtual int Update() { r3dProcessWindowMessages(); r3dMouse::Show(); r3dStartFrame(); r3dRenderer->StartRender(1); r3dRenderer->StartFrame(); r3dRenderer->SetRenderingMode(R3D_BLEND_ALPHA | R3D_BLEND_NZ); ClearFullScreen_Menu(); gfxMovie.Update(); gfxMovie.Draw(); r3dRenderer->Flush(); r3dRenderer->EndFrame(); r3dRenderer->EndRender( true ); r3dEndFrame(); return 0; };
void PlayGameServer() { r3d_assert(gServerLogic.ginfo_.IsValid()); switch(gServerLogic.ginfo_.mapId) { default: r3dError("invalid map id\n"); break; case GBGameInfo::MAPID_Editor_Particles: r3dGameLevel::SetHomeDir("WorkInProgress\\Editor_Particles"); break; case GBGameInfo::MAPID_ServerTest: r3dGameLevel::SetHomeDir("WorkInProgress\\ServerTest"); break; case GBGameInfo::MAPID_WZ_Colorado: r3dGameLevel::SetHomeDir("WZ_Colorado"); break; case GBGameInfo::MAPID_Laskar: r3dGameLevel::SetHomeDir("Laskar_Village_V2"); break; case GBGameInfo::MAPID_WZ_Cliffside_Farm: r3dGameLevel::SetHomeDir("WZ_Cliffside_Farm"); break; case GBGameInfo::MAPID_WZ_RaccoonCity: r3dGameLevel::SetHomeDir("WZ_RaccoonCity"); break; case GBGameInfo::MAPID_WZ_RaccoonCity_Premium: r3dGameLevel::SetHomeDir("WZ_RaccoonCity_Premium"); break; case GBGameInfo::MAPID_WZ_CARCANFLY: r3dGameLevel::SetHomeDir("WZ_CARCANFLY"); break; case GBGameInfo::MAPID_WZ_Cliffside_PVP: r3dGameLevel::SetHomeDir("WZ_Cliffside_PVP"); break; case GBGameInfo::MAPID_wo_wasteland: r3dGameLevel::SetHomeDir("wo_wasteland"); break; case GBGameInfo::MAPID_wo_inferno: r3dGameLevel::SetHomeDir("wo_inferno"); break; case GBGameInfo::MAPID_wo_eastern_bunker_tdm: r3dGameLevel::SetHomeDir("wo_eastern_bunker_tdm"); break; case GBGameInfo::MAPID_WO_Grozny: r3dGameLevel::SetHomeDir("WO_Grozny"); break; case GBGameInfo::MAPID_wo_shippingyard: r3dGameLevel::SetHomeDir("wo_shippingyard"); break; } r3dResetFrameTime(); GameWorld_Create(); u_srand(timeGetTime()); GameWorld().Init(OBJECTMANAGER_MAXOBJECTS, OBJECTMANAGER_MAXSTATICOBJECTS); ServerDummyWorld.Init(OBJECTMANAGER_MAXOBJECTS, OBJECTMANAGER_MAXSTATICOBJECTS); g_pPhysicsWorld = new PhysXWorld; g_pPhysicsWorld->Init(); r3dTerrain::SetNeedShaders( false ); LoadLevel_Objects( 1.f ); gCollectionsManager.Init( 0, 1 ); r3dOutToLog( "NavMesh.Load...\n" ); gAutodeskNavMesh.Init(); r3dResetFrameTime(); GameWorld().Update(); ServerDummyWorld.Update(); r3dOutToLog("Spawning Vehicles... Count:%d\n",GameWorld().spawncar); gServerLogic.SpawnNewCar(); r3dGameLevel::SetStartGameTime(r3dGetTime()); r3dOutToLog("server main loop started\n"); r3dResetFrameTime(); gServerLogic.OnGameStart(); gKeepAliveReporter.SetStarted(true); while(1) { ::Sleep(20); // limit to 100 FPS r3dEndFrame(); r3dStartFrame(); //if(GetAsyncKeyState(VK_F1)&0x8000) r3dError("r3dError test"); //if(GetAsyncKeyState(VK_F2)&0x8000) r3d_assert(false && "r3d_Assert test"); gKeepAliveReporter.Tick(gServerLogic.curPlayers_); gServerLogic.Tick(); gMasterServerLogic.Tick(); if(gMasterServerLogic.IsMasterDisconnected()) { r3dOutToLog("Master Server disconnected, exiting\n"); gKeepAliveReporter.SetStarted(false); return; } GameWorld().StartFrame(); GameWorld().Update(); // fire few ticks of temporary world update, just for safety (physics init and stuff) static int TempWorldUpdateN = 0; if(TempWorldUpdateN < 20) { TempWorldUpdateN++; ServerDummyWorld.Update(); } // start physics after game world update right now, as gameworld will move some objects around if necessary g_pPhysicsWorld->StartSimulation(); g_pPhysicsWorld->EndSimulation(); #if ENABLE_AUTODESK_NAVIGATION const float t1 = r3dGetTime(); gAutodeskNavMesh.Update(); const float t2 = r3dGetTime() - t1; bool showSpd = (GetAsyncKeyState('Q') & 0x8000) && (GetAsyncKeyState('E') & 0x8000); bool showKys = false; //(GetAsyncKeyState('Q') & 0x8000) && (GetAsyncKeyState('R') & 0x8000); extern int _zstat_NumZombies; extern int _zstat_NavFails; extern int _zstat_Disabled; if(showKys) { gAutodeskNavMesh.perfBridge.Dump(); r3dOutToLog("NavMeshUpdate %f sec, z:%d, bad:%d, f:%d\n", t2, _zstat_NumZombies, _zstat_Disabled, _zstat_NavFails); } if(showSpd) { r3dOutToLog("NavMeshUpdate %f sec, z:%d, bad:%d, f:%d\n", t2, _zstat_NumZombies, _zstat_Disabled, _zstat_NavFails); } #ifndef _DEBUG if((t2 > (1.0f / 60.0f))) { r3dOutToLog("!!!! NavMeshUpdate %f sec, z:%d, bad:%d, f:%d\n", t2, _zstat_NumZombies, _zstat_Disabled, _zstat_NavFails); //gAutodeskNavMesh.perfBridge.Dump(); //r3dOutToLog("!!!! NavMeshUpdate %f sec, z:%d, bad:%d, f:%d, navPend:%d\n", t2, _zstat_NumZombies, _zstat_Disabled, _zstat_NavFails, _zstat_UnderProcess); } #endif #endif // ENABLE_AUTODESK_NAVIGATION GameWorld().EndFrame(); if(gServerLogic.gameFinished_) break; } // set that we're finished gKeepAliveReporter.SetStarted(false); gMasterServerLogic.FinishGame(); gServerLogic.DumpPacketStatistics(); gCollectionsManager.Destroy(); GameWorld_Destroy(); ServerDummyWorld.Destroy(); return; }
void game::MainLoop(void) { r3dOutToLog("Starting updater, v:%s, cmd:%s\n", UPDATER_VERSION, __r3dCmdLine); CUpdater updater; // parse command line int argc = 0; char** argv = CommandLineToArgvA(__r3dCmdLine, &argc); for(int i=0; i<argc; i++) { /*if(strcmp(argv[i], "-steam") == 0 && (i + 0) < argc) { r3dOutToLog("Trying to init steam\n"); gSteam.InitSteam(); continue; }*/ } if(g_isConsoleUpdater) { cmdLine_MainLoop(updater); return; } updater.Start(); win32_input_Flush(); if(g_taskbar) g_taskbar->SetProgressState(win::hWnd, TBPF_NORMAL); r3dStartFrame(); while(1) { r3dEndFrame(); r3dStartFrame(); g_mb = 0; g_hCursor = gCursorArrow; tempDoMsgLoop(); ::Sleep(1); r3dRenderer->StartRender(); r3dRenderer->StartFrame(); r3dRenderer->SetRenderingMode(R3D_BLEND_ALPHA | R3D_BLEND_NZ); r3dSetFiltering(R3D_POINT); r3dDrawBox2D(0, 0, r3dRenderer->ScreenW, r3dRenderer->ScreenH, r3dColor(64, 64, 64)); #if 0 updater.status_ = CUpdater::STATUS_TimeExpired; updater.showProgress_ = false; updater.prgTotal_.cur = 100; updater.prgTotal_.total = 100; r3dscpy(updater.updMsg1_, "Xxxxxxx"); #endif switch(updater.status_) { default: r3d_assert(0); case CUpdater::STATUS_Checking: g_bkgStarting->draw(0, 0, r3dRenderer->ScreenW, r3dRenderer->ScreenH, r3dColor(255, 255, 255)); break; case CUpdater::STATUS_NeedLogin: g_bkgLogin->draw(0, 0, r3dRenderer->ScreenW, r3dRenderer->ScreenH, r3dColor(255, 255, 255)); drawLoginButtons(updater); break; case CUpdater::STATUS_SerialCheck: g_bkgSerialCheck->draw(0, 0, r3dRenderer->ScreenW, r3dRenderer->ScreenH, r3dColor(255, 255, 255)); drawSerialCheckButtons(updater); break; case CUpdater::STATUS_NeedRegister: g_bkgRegister->draw(0, 0, r3dRenderer->ScreenW, r3dRenderer->ScreenH, r3dColor(255, 255, 255)); drawRegisterButtons(updater); break; case CUpdater::STATUS_TimeExpired: g_bkgExpired->draw(0, 0, r3dRenderer->ScreenW, r3dRenderer->ScreenH, r3dColor(255, 255, 255)); drawTimeExpiredButtons(updater); break; case CUpdater::STATUS_Updating: g_bkgUpdate->draw(0, 0, r3dRenderer->ScreenW, r3dRenderer->ScreenH, r3dColor(255, 255, 255)); drawUpdateButtons(updater); drawServerStatus(updater); drawNews(updater); break; } drawProgressBar(updater); drawCloseButton(); r3dRenderer->EndFrame(); r3dRenderer->EndRender(true); // if exit requested by control-f4 if(g_bExit) { updater.RequestStop(); break; } // activate updater window if other instance requested it if(WaitForSingleObject(g_updaterEvt, 0) == WAIT_OBJECT_0) { SwitchToThisWindow(win::hWnd, TRUE); } // try to remove mouse lock because of // win::HandleActivate code that will lock mouse inside window ClipCursor(NULL); // if signalled to play game if(g_bStartGame) break; if(updater.result_ != CUpdater::RES_UPDATING && updater.result_ != CUpdater::RES_PLAY) break; // wndclass.hCursor must be NULL for this to work //SetCursor(g_hCursor); } updater.Stop(); if(g_taskbar) g_taskbar->SetProgressState(win::hWnd, TBPF_NOPROGRESS); switch(updater.result_) { default: r3d_assert(0); case CUpdater::RES_STOPPED: break; case CUpdater::RES_PLAY: startGame(updater); break; case CUpdater::RES_ERROR: showErrorMessageBox(updater); break; } gHwInfoPoster.Stop(); TerminateProcess(GetCurrentProcess(), 0); return; }
int Menu_AppSelect::DoModal() { // TEST SWF BEGIN #if 0 class CTestMenu : public UIMenu { public: CTestMenu(const char * movieName) : UIMenu(movieName) {} virtual ~CTestMenu() {}; virtual bool Initialize() {return true;} virtual int Update() { r3dProcessWindowMessages(); r3dMouse::Show(); r3dStartFrame(); r3dRenderer->StartRender(1); r3dRenderer->StartFrame(); r3dRenderer->SetRenderingMode(R3D_BLEND_ALPHA | R3D_BLEND_NZ); ClearFullScreen_Menu(); gfxMovie.Update(); gfxMovie.Draw(); r3dRenderer->Flush(); r3dRenderer->EndFrame(); r3dRenderer->EndRender( true ); r3dEndFrame(); return 0; }; }; CTestMenu* menu = new CTestMenu("data/menu/HUD_OutOfBattleZone.swf"); menu->Load(); int res = 0; if(menu->Initialize()) { while(res == 0) { res = menu->Update(); } } menu->Unload(); SAFE_DELETE(menu); // TEST SWF END #endif AppSelectMode = 100; Desktop().SetViewSize( r3dRenderer->ScreenW, r3dRenderer->ScreenH ); while(1) { if(g_bExit) return 0; r3dStartFrame(); mUpdate(); imgui_Update(); int ret = 1; mDrawStart(); ClearFullScreen_Menu(); r3dRenderer->SetRenderingMode(R3D_BLEND_ALPHA | R3D_BLEND_NZ); r3dSetFiltering( R3D_POINT ); r3dRenderer->SetMipMapBias(-6.0f,-1); switch (AppSelectMode) { case 100: { const static char *BNames1[] = {"Update DB", "Game (Public Server)", "Game (DEV Server)" }; for (int i=0;i<R3D_ARRAYSIZE(BNames1);i++) if (imgui_Button(r3dRenderer->ScreenW/2-(210*R3D_ARRAYSIZE(BNames1))/2+210*i, r3dRenderer->ScreenH/2 - 30,200, 30,BNames1[i], 0)) released_id = bUpdateDB+i; const static char* BNames[] = {"Level Editor", "Particle Editor", "Physics Editor", "Character Editor" }; for (int i=0;i<R3D_ARRAYSIZE(BNames);i++) if (imgui_Button(r3dRenderer->ScreenW/2-(210*R3D_ARRAYSIZE(BNames))/2+210*i, r3dRenderer->ScreenH/2 + 30,200, 30,BNames[i], 0)) released_id = bStartLevelEditor+i; } break; } r3dRenderer->pd3ddev->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE); r3dRenderer->SetRenderingMode(R3D_BLEND_NOALPHA | R3D_BLEND_NZ); mDrawEnd(); r3dEndFrame(); switch(released_id) { case -1: break; default: return released_id; }; } return 0; }
/*void UpdateCmd() { ::Sleep(100); if ((_getch() == 'c' || _getch() == 'C') && !isInput) { isInput = true; char n[512]; scanf("%s",&n); isInput = false; r3dOutToLog("cmd :%s\n",n); } }*/ int main(int argc, char* argv[]) { extern int _r3d_bLogToConsole; _r3d_bLogToConsole = 1; extern int _r3d_bSilent_r3dError; _r3d_bSilent_r3dError = 1; extern int _r3d_Network_DoLog; _r3d_Network_DoLog = 0; r3d_CurrentProcess = GetCurrentProcess(); SetConsoleCtrlHandler(ConsoleHandlerRoutine, TRUE); win::hInstance = GetModuleHandle(NULL); // change log file now and install handler, so we'll record r3dErrors { _mkdir("logms"); time_t t1; time(&t1); char fname[MAX_PATH]; sprintf(fname, "logms\\MS_%x.txt", (DWORD)t1); extern void r3dChangeLogFile(const char* fname); r3dChangeLogFile(fname); sprintf(fname, "logms\\MS_%x.dmp", (DWORD)t1); SrvSetCrashHandler(fname); } try { serverCreateTempD3DWindow(); ClipCursor(NULL); moveWindowToCorner(); gServerConfig = new CMasterServerConfig(); // from SF config.cpp, bah. //extern void RegisterAllVars(); //RegisterAllVars(); //r3dOutToLog("API: %s\n", g_api_ip->GetString()); // AllocConsole(); //isInput = false; //CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) UpdateCmd, NULL, 0, NULL); gMasterGameServer.Start(gServerConfig->masterPort_, gServerConfig->serverId_); gMasterUserServer.Start(gServerConfig->clientPort_, gServerConfig->masterCCU_); gUdpMonitor.Start(SBNET_MASTER_WATCH_PORT); r3dStartFrame(); while(1) { r3dEndFrame(); r3dStartFrame(); Sleep(1); gMasterGameServer.Tick(); gMasterUserServer.Tick(); gUdpMonitor.Tick(); if(_kbhit()) { int k1 = _getch(); // weird way to check for F4 (two symbols - 0, 62) if(k1 == 0 && _kbhit()) { if(_getch() == 62) { gMasterGameServer.RequestShutdown(); } } if(k1 == 'r' || k1 == 'R') { r3dOutToLog("-- reloading games configuration\n"); gServerConfig->LoadConfig(); } if(k1 == 'd' || k1 == 'D') { gMasterUserServer.Temp_Debug1(); } } // gracefully shutdown if requested if(gMasterGameServer.shuttingDown_ && gMasterGameServer.shutdownLeft_ < 0) { extern void killProcessByName(const char *filename); r3dOutToLog("Shutting down...\n"); break; } } } catch(const char* what) { r3dOutToLog("!!! Exception: %s\n", what); what = what; HRESULT res = TerminateProcess(r3d_CurrentProcess, 0); } gMasterUserServer.Stop(); gMasterGameServer.Stop(); gUdpMonitor.Stop(); DestroyWindow(win::hWnd); HRESULT res = TerminateProcess(r3d_CurrentProcess, 0); return 0; }
/*static unsigned int WINAPI NetworkThread( void * param ) { while(1) { ::Sleep(1); gServerLogic.net_->Update(); } }*/ void PlayGameServer() { r3d_assert(gServerLogic.ginfo_.IsValid()); switch(gServerLogic.ginfo_.mapId) { default: r3dError("invalid map id\n"); break; case GBGameInfo::MAPID_Editor_Particles: r3dGameLevel::SetHomeDir("WorkInProgress\\Editor_Particles"); break; case GBGameInfo::MAPID_ServerTest: r3dGameLevel::SetHomeDir("WorkInProgress\\ServerTest"); break; case GBGameInfo::MAPID_WZ_Colorado: r3dGameLevel::SetHomeDir("WZ_Colorado"); break; case GBGameInfo::MAPID_UB_Cliffside: r3dGameLevel::SetHomeDir("WZ_Cliffside"); break; case GBGameInfo::MAPID_UB_CaliWood: r3dGameLevel::SetHomeDir("CaliWood"); break; case GBGameInfo::MAPID_UB_Valley: r3dGameLevel::SetHomeDir("UB_Valley"); break; case GBGameInfo::MAPID_UB_Area51: r3dGameLevel::SetHomeDir("UB_Deserto"); break; case GBGameInfo::MAPID_UB_CryZ: r3dGameLevel::SetHomeDir("UB_CryZ"); break; case GBGameInfo::MAPID_UB_Terra: r3dGameLevel::SetHomeDir("UB_Terra"); break; case GBGameInfo::MAPID_UB_Mega: r3dGameLevel::SetHomeDir("UB_Mega"); break; } r3dResetFrameTime(); GameWorld_Create(); u_srand(timeGetTime()); GameWorld().Init(OBJECTMANAGER_MAXOBJECTS, OBJECTMANAGER_MAXSTATICOBJECTS); ServerDummyWorld.Init(OBJECTMANAGER_MAXOBJECTS, OBJECTMANAGER_MAXSTATICOBJECTS); g_pPhysicsWorld = new PhysXWorld; g_pPhysicsWorld->Init(); r3dTerrain::SetNeedShaders( false ); LoadLevel_Objects( 1.f ); gCollectionsManager.Init( 0, 1 ); r3dOutToLog( "NavMesh.Load...\n" ); gAutodeskNavMesh.Init(); r3dResetFrameTime(); GameWorld().Update(); ServerDummyWorld.Update(); r3dGameLevel::SetStartGameTime(r3dGetTime()); r3dOutToLog("server main loop started\n"); r3dResetFrameTime(); gServerLogic.OnGameStart(); gKeepAliveReporter.SetStarted(true); // _beginthreadex ( NULL, 0, NetworkThread, NULL, 0, NULL ); while(1) { ::Sleep(20); // limit to 100 FPS char text[64] ={0}; sprintf(text,"WarZ Game Server [Running..] id:%d curPeer:%d players:%d/%d",gServerLogic.ginfo_.gameServerId,gServerLogic.curPeersConnected,gServerLogic.curPlayers_,gServerLogic.ginfo_.maxPlayers); SetConsoleTitle(text); gServerLogic.net_->Update(); r3dEndFrame(); r3dStartFrame(); //if(GetAsyncKeyState(VK_F1)&0x8000) r3dError("r3dError test"); //if(GetAsyncKeyState(VK_F2)&0x8000) r3d_assert(false && "r3d_Assert test"); gKeepAliveReporter.Tick(gServerLogic.curPlayers_); gServerLogic.Tick(); gServerLogic.UpdateNetId(); gMasterServerLogic.Tick(); if(gMasterServerLogic.IsMasterDisconnected()) { r3dOutToLog("Master Server disconnected, exiting\n"); gKeepAliveReporter.SetStarted(false); return; } GameWorld().StartFrame(); GameWorld().Update(); // fire few ticks of temporary world update, just for safety (physics init and stuff) static int TempWorldUpdateN = 0; if(TempWorldUpdateN < 20) { TempWorldUpdateN++; ServerDummyWorld.Update(); } // start physics after game world update right now, as gameworld will move some objects around if necessary g_pPhysicsWorld->StartSimulation(); g_pPhysicsWorld->EndSimulation(); #if ENABLE_AUTODESK_NAVIGATION const float t1 = r3dGetTime(); gAutodeskNavMesh.Update(); const float t2 = r3dGetTime() - t1; bool showSpd = (GetAsyncKeyState('Q') & 0x8000) && (GetAsyncKeyState('E') & 0x8000); bool showKys = false; //(GetAsyncKeyState('Q') & 0x8000) && (GetAsyncKeyState('R') & 0x8000); extern int _zstat_NumZombies; extern int _zstat_NavFails; extern int _zstat_Disabled; if(showKys) { gAutodeskNavMesh.perfBridge.Dump(); r3dOutToLog("NavMeshUpdate %f sec, z:%d, bad:%d, f:%d\n", t2, _zstat_NumZombies, _zstat_Disabled, _zstat_NavFails); } if(showSpd) { r3dOutToLog("NavMeshUpdate %f sec, z:%d, bad:%d, f:%d\n", t2, _zstat_NumZombies, _zstat_Disabled, _zstat_NavFails); } #ifndef _DEBUG if((t2 > (1.0f / 60.0f))) { r3dOutToLog("!!!! NavMeshUpdate %f sec, z:%d, bad:%d, f:%d\n", t2, _zstat_NumZombies, _zstat_Disabled, _zstat_NavFails); //gAutodeskNavMesh.perfBridge.Dump(); //r3dOutToLog("!!!! NavMeshUpdate %f sec, z:%d, bad:%d, f:%d, navPend:%d\n", t2, _zstat_NumZombies, _zstat_Disabled, _zstat_NavFails, _zstat_UnderProcess); } #endif #endif // ENABLE_AUTODESK_NAVIGATION GameWorld().EndFrame(); if(gServerLogic.gameFinished_) break; } // set that we're finished gKeepAliveReporter.SetStarted(false); gMasterServerLogic.FinishGame(); gServerLogic.DumpPacketStatistics(); gCollectionsManager.Destroy(); GameWorld_Destroy(); ServerDummyWorld.Destroy(); return; }