void CLevel::ProcessGameEvents () { // Game events { NET_Packet P; u32 svT = timeServer()-NET_Latency; /* if (!game_events->queue.empty()) Msg("- d[%d],ts[%d] -- E[svT=%d],[evT=%d]",Device.dwTimeGlobal,timeServer(),svT,game_events->queue.begin()->timestamp); */ #ifdef SPAWN_ANTIFREEZE while (spawn_events->available(svT)) { u16 ID,dest,type; spawn_events->get (ID,dest,type,P); game_events->insert (P); } u32 avail_time = 5; u32 elps = Device.frame_elapsed(); if (elps < 30) avail_time = 33 - elps; u32 work_limit = elps + avail_time; #endif while (game_events->available(svT)) { u16 ID,dest,type; game_events->get (ID,dest,type,P); #ifdef SPAWN_ANTIFREEZE // не отправлять события не заспавненным объектам if (g_bootComplete && M_EVENT == ID && PostponedSpawn(dest)) { spawn_events->insert(P); continue; } if (g_bootComplete && M_SPAWN == ID && Device.frame_elapsed() > work_limit) // alpet: позволит плавнее выводить объекты в онлайн, без заметных фризов { u16 parent_id; GetSpawnInfo(P, parent_id); //------------------------------------------------- if (parent_id < 0xffff) // откладывать спавн только объектов в контейнеры { if (!spawn_events->available(svT)) Msg("* ProcessGameEvents, spawn event postponed. Events rest = %d", game_events->queue.size()); spawn_events->insert(P); continue; } } #endif switch (ID) { case M_SPAWN: { u16 dummy16; P.r_begin(dummy16); cl_Process_Spawn(P); }break; case M_EVENT: { cl_Process_Event(dest, type, P); }break; default: { VERIFY(0); }break; } } } if (OnServer() && GameID()!= GAME_SINGLE) Game().m_WeaponUsageStatistic->Send_Check_Respond(); }
void CLevel::ProcessGameEvents () { // Game events { NET_Packet P; u32 svT = timeServer()-NET_Latency; /* if (!game_events->queue.empty()) Msg("- d[%d],ts[%d] -- E[svT=%d],[evT=%d]",Device.dwTimeGlobal,timeServer(),svT,game_events->queue.begin()->timestamp); */ #ifdef SPAWN_ANTIFREEZE while (spawn_events->available(svT)) { u16 ID, dest, type; spawn_events->get(ID, dest, type, P); game_events->insert(P); } u32 avail_time = 5; u32 elps = Device.frame_elapsed(); if (elps < 30) avail_time = 33 - elps; u32 work_limit = elps + avail_time; #endif while (game_events->available(svT)) { u16 ID,dest,type; game_events->get (ID,dest,type,P); #ifdef SPAWN_ANTIFREEZE // не отправлять события не заспавненным объектам if (g_bootComplete && M_EVENT == ID && PostponedSpawn(dest)) { spawn_events->insert(P); continue; } if (g_bootComplete && M_SPAWN == ID && Device.frame_elapsed() > work_limit) // alpet: позволит плавнее выводить объекты в онлайн, без заметных фризов { u16 parent_id; GetSpawnInfo(P, parent_id); //------------------------------------------------- if (parent_id < 0xffff) // откладывать спавн только объектов в контейнеры { //if (!spawn_events->available(svT)) //Msg("* ProcessGameEvents, spawn event postponed. Events rest = %d", game_events->queue.size()); spawn_events->insert(P); continue; } } #endif switch (ID) { case M_SPAWN: { u16 dummy16; P.r_begin(dummy16); cl_Process_Spawn(P); }break; case M_EVENT: { cl_Process_Event(dest, type, P); }break; case M_MOVE_PLAYERS: { u8 Count = P.r_u8(); for (u8 i=0; i<Count; i++) { u16 ID = P.r_u16(); Fvector NewPos, NewDir; P.r_vec3(NewPos); P.r_vec3(NewDir); CActor* OActor = smart_cast<CActor*>(Objects.net_Find (ID)); if (0 == OActor) break; OActor->MoveActor(NewPos, NewDir); }; NET_Packet PRespond; PRespond.w_begin(M_MOVE_PLAYERS_RESPOND); Send(PRespond, net_flags(TRUE, TRUE)); }break; case M_STATISTIC_UPDATE: { if (GameID() != eGameIDSingle) Game().m_WeaponUsageStatistic->OnUpdateRequest(&P); }break; case M_FILE_TRANSFER: { if (m_file_transfer) //in case of net_Stop m_file_transfer->on_message(&P); }break; case M_GAMEMESSAGE: { Game().OnGameMessage(P); }break; default: { VERIFY(0); }break; } } } if (OnServer() && GameID()!= eGameIDSingle) Game().m_WeaponUsageStatistic->Send_Check_Respond(); }
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 }