void CLevel::Send (NET_Packet& P, u32 dwFlags, u32 dwTimeout) { if (IsDemoPlayStarted() || IsDemoPlayFinished()) return; // optimize the case when server located in our memory if(psNET_direct_connect){ ClientID _clid; _clid.set (1); Server->OnMessage (P, _clid ); }else if (Server && game_configured && OnServer() ) { #ifdef DEBUG VERIFY2(Server->IsPlayersMonitorLockedByMe() == false, "potential deadlock detected"); #endif VERIFY2(csMessagesAndNetQueueDeadLockDetect == false, "deadlock detected!"); Server->OnMessageSync (P,Game().local_svdpnid ); }else IPureClient::Send (P,dwFlags,dwTimeout ); if (g_pGameLevel && Level().game && GameID() != eGameIDSingle && !g_SV_Disable_Auth_Check) { // anti-cheat phTimefactor = 1.f ; psDeviceFlags.set (rsConstantFPS,FALSE) ; } }
/* for (xr_vector<CObject*>::iterator O=Level().Objects.objects.begin(); O!=Level().Objects.objects.end(); ++O) { if( smart_cast<CActor*>((*O)){ CActor* pActor = smart_cast<CActor*>(*O); if (!pActor || pActor->Remote()) continue; pActor->UpdatePosStack(Time0, Time1); } }; */ }; void CLevel::SetNumCrSteps ( u32 NumSteps ) { m_bNeed_CrPr = true; if (m_dwNumSteps > NumSteps) return; m_dwNumSteps = NumSteps; if (m_dwNumSteps > 1000000) { VERIFY(0); } }; ALife::_TIME_ID CLevel::GetStartGameTime() { return (game->GetStartGameTime()); } ALife::_TIME_ID CLevel::GetGameTime() { return (game->GetGameTime()); // return (Server->game->GetGameTime()); } ALife::_TIME_ID CLevel::GetEnvironmentGameTime() { return (game->GetEnvironmentGameTime()); // return (Server->game->GetGameTime()); } u8 CLevel::GetDayTime() { u32 dummy32; u32 hours; GetGameDateTime(dummy32, dummy32, dummy32, hours, dummy32, dummy32, dummy32); VERIFY (hours<256); return u8(hours); } float CLevel::GetGameDayTimeSec() { return (float(s64(GetGameTime() % (24*60*60*1000)))/1000.f); } u32 CLevel::GetGameDayTimeMS() { return (u32(s64(GetGameTime() % (24*60*60*1000)))); } float CLevel::GetEnvironmentGameDayTimeSec() { return (float(s64(GetEnvironmentGameTime() % (24*60*60*1000)))/1000.f); } void CLevel::GetGameDateTime (u32& year, u32& month, u32& day, u32& hours, u32& mins, u32& secs, u32& milisecs) { split_time(GetGameTime(), year, month, day, hours, mins, secs, milisecs); } float CLevel::GetGameTimeFactor() { return (game->GetGameTimeFactor()); // return (Server->game->GetGameTimeFactor()); } void CLevel::SetGameTimeFactor(const float fTimeFactor) { game->SetGameTimeFactor(fTimeFactor); // Server->game->SetGameTimeFactor(fTimeFactor); } void CLevel::SetGameTimeFactor(ALife::_TIME_ID GameTime, const float fTimeFactor) { game->SetGameTimeFactor(GameTime, fTimeFactor); // Server->game->SetGameTimeFactor(fTimeFactor); } void CLevel::SetEnvironmentGameTimeFactor(u64 const& GameTime, float const& fTimeFactor) { if (!game) return; game->SetEnvironmentGameTimeFactor(GameTime, fTimeFactor); // Server->game->SetGameTimeFactor(fTimeFactor); }/* void CLevel::SetGameTime(ALife::_TIME_ID GameTime) { game->SetGameTime(GameTime); // Server->game->SetGameTime(GameTime); } */ bool CLevel::IsServer () { // return (!!Server); if (!Server || IsDemoPlayStarted()) return false; //return (Server->GetClientsCount() != 0); return true; }
bool CLevel::IsClient () { // return (!Server); if (IsDemoPlayStarted()) return true; if (Server) return false; //return (Server->GetClientsCount() == 0); return true; }
void CLevel::g_sv_Spawn (CSE_Abstract* E) { #ifdef DEBUG_MEMORY_MANAGER u32 E_mem = 0; if (g_bMEMO) { lua_gc (ai().script_engine().lua(),LUA_GCCOLLECT,0); lua_gc (ai().script_engine().lua(),LUA_GCCOLLECT,0); E_mem = Memory.mem_usage(); Memory.stat_calls = 0; } #endif // DEBUG_MEMORY_MANAGER //----------------------------------------------------------------- // CTimer T(false); #ifdef DEBUG // Msg ("* CLIENT: Spawn: %s, ID=%d", *E->s_name, E->ID); #endif // Optimization for single-player only - minimize traffic between client and server if (GameID() == eGameIDSingle) psNET_Flags.set (NETFLAG_MINIMIZEUPDATES,TRUE); else psNET_Flags.set (NETFLAG_MINIMIZEUPDATES,FALSE); // Client spawn // T.Start (); CObject* O = Objects.Create (*E->s_name); // Msg ("--spawn--CREATE: %f ms",1000.f*T.GetAsync()); // T.Start (); #ifdef DEBUG_MEMORY_MANAGER mem_alloc_gather_stats (false); #endif // DEBUG_MEMORY_MANAGER if (0==O || (!O->net_Spawn (E))) { O->net_Destroy ( ); if(!g_dedicated_server) client_spawn_manager().clear(O->ID()); Objects.Destroy (O); Msg ("! Failed to spawn entity '%s'",*E->s_name); #ifdef DEBUG_MEMORY_MANAGER mem_alloc_gather_stats (!!psAI_Flags.test(aiDebugOnFrameAllocs)); #endif // DEBUG_MEMORY_MANAGER } else { #ifdef DEBUG_MEMORY_MANAGER mem_alloc_gather_stats (!!psAI_Flags.test(aiDebugOnFrameAllocs)); #endif // DEBUG_MEMORY_MANAGER if(!g_dedicated_server) client_spawn_manager().callback(O); //Msg ("--spawn--SPAWN: %f ms",1000.f*T.GetAsync()); if ((E->s_flags.is(M_SPAWN_OBJECT_LOCAL)) && (E->s_flags.is(M_SPAWN_OBJECT_ASPLAYER)) ) { if (IsDemoPlayStarted()) { if (E->s_flags.is(M_SPAWN_OBJECT_PHANTOM)) { SetControlEntity (O); SetEntity (O); //do not switch !!! SetDemoSpectator (O); } } else { if (CurrentEntity() != NULL) { CGameObject* pGO = smart_cast<CGameObject*>(CurrentEntity()); if (pGO) pGO->On_B_NotCurrentEntity(); } SetControlEntity (O); SetEntity (O); //do not switch !!! } } if (0xffff != E->ID_Parent) { /* // Generate ownership-event NET_Packet GEN; GEN.w_begin (M_EVENT); GEN.w_u32 (E->m_dwSpawnTime);//-NET_Latency); GEN.w_u16 (GE_OWNERSHIP_TAKE); GEN.w_u16 (E->ID_Parent); GEN.w_u16 (u16(O->ID())); game_events->insert (GEN); /*/ NET_Packet GEN; GEN.write_start(); GEN.read_start(); GEN.w_u16 (u16(O->ID())); cl_Process_Event(E->ID_Parent, GE_OWNERSHIP_TAKE, GEN); //*/ } } /*if (E->s_flags.is(M_SPAWN_UPDATE)) { NET_Packet temp; temp.B.count = 0; E->UPDATE_Write (temp); if (temp.B.count > 0) { temp.r_seek (0); O->net_Import (temp); } }*/ //:( //--------------------------------------------------------- Game().OnSpawn (O); //--------------------------------------------------------- #ifdef DEBUG_MEMORY_MANAGER if (g_bMEMO) { lua_gc (ai().script_engine().lua(),LUA_GCCOLLECT,0); lua_gc (ai().script_engine().lua(),LUA_GCCOLLECT,0); Msg ("* %20s : %d bytes, %d ops", *E->s_name,Memory.mem_usage()-E_mem, Memory.stat_calls ); } #endif // DEBUG_MEMORY_MANAGER }