Exemple #1
0
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;
}
Exemple #3
0
		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;
		};
Exemple #4
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;
}
Exemple #5
0
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;
}
Exemple #6
0
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;
}
Exemple #7
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;
}