void CLevel::ClientSend() { if ((GameID() != eGameIDSingle) || OnClient()) // fixed by Shoker { if ( !net_HasBandwidth() ) return; }; 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()) Send (P, net_flags(FALSE)); } } } }; if (m_file_transfer) { m_file_transfer->update_transfer(); m_file_transfer->stop_obsolete_receivers(); } 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 CWeapon::SwitchState(u32 S) { if (OnClient()) return; #ifndef MASTER_GOLD if ( bDebug ) { Msg("---Server is going to send GE_WPN_STATE_CHANGE to [%d], weapon_section[%s], parent[%s]", S, cNameSect().c_str(), H_Parent() ? H_Parent()->cName().c_str() : "NULL Parent"); } #endif // #ifndef MASTER_GOLD SetNextState ( S ); if (CHudItem::object().Local() && !CHudItem::object().getDestroy() && m_pInventory && OnServer()) { // !!! Just single entry for given state !!! NET_Packet P; CHudItem::object().u_EventGen (P,GE_WPN_STATE_CHANGE,CHudItem::object().ID()); P.w_u8 (u8(S)); P.w_u8 (u8(m_sub_state)); P.w_u8 (m_ammoType); P.w_u8 (u8(iAmmoElapsed & 0xff)); P.w_u8 (m_set_next_ammoType_on_reload); CHudItem::object().u_EventSend (P, net_flags(TRUE, TRUE, FALSE, TRUE)); } }
void CActorMP::postprocess_packet (net_update_A &N_A) { if (!NET.empty()) N_A.dwTimeStamp = NET.back().dwTimeStamp; else N_A.dwTimeStamp = Level().timeServer(); N_A.State.previous_position = N_A.State.position; N_A.State.previous_quaternion = N_A.State.quaternion; if (Local() && OnClient() || !g_Alive()) return; { //----------------------------------------------- if (!NET_A.empty() && N_A.dwTimeStamp < NET_A.back().dwTimeStamp) return; if (!NET_A.empty() && N_A.dwTimeStamp == NET_A.back().dwTimeStamp) { NET_A.back() = N_A; } else { VERIFY(valid_pos(N_A.State.position)); NET_A.push_back (N_A); if (NET_A.size()>5) NET_A.pop_front(); }; if (!NET_A.empty()) m_bInterpolate = true; }; Level().AddObject_To_Objects4CrPr (this); CrPr_SetActivated (false); CrPr_SetActivationStep (0); }
void CWeapon::OnEvent(NET_Packet& P, u16 type) { switch (type) { case GE_ADDON_CHANGE: { P.r_u8 (m_flagsAddOnState); InitAddons(); UpdateAddonsVisibility(); }break; case GE_WPN_STATE_CHANGE: { u8 state; P.r_u8 (state); P.r_u8 (m_sub_state); // u8 NewAmmoType = P.r_u8(); u8 AmmoElapsed = P.r_u8(); u8 NextAmmo = P.r_u8(); if (NextAmmo == undefined_ammo_type) m_set_next_ammoType_on_reload = undefined_ammo_type; else m_set_next_ammoType_on_reload = NextAmmo; if (OnClient()) SetAmmoElapsed(int(AmmoElapsed)); OnStateSwitch (u32(state)); } break; default: { inherited::OnEvent(P,type); }break; } };
bool CWeapon::SwitchAmmoType( u32 flags ) { if ( IsPending() || OnClient() ) return false; if ( !(flags & CMD_START) ) return false; u8 l_newType = m_ammoType; bool b1, b2; do { l_newType = u8( (u32(l_newType+1)) % m_ammoTypes.size() ); b1 = (l_newType != m_ammoType); b2 = unlimited_ammo() ? false : ( !m_pInventory->GetAny( m_ammoTypes[l_newType].c_str() ) ); } while( b1 && b2 ); if ( l_newType != m_ammoType ) { m_set_next_ammoType_on_reload = l_newType; if ( OnServer() ) { Reload(); } } return true; }
void CActor::OnItemTake (CInventoryItem *inventory_item) { CInventoryOwner::OnItemTake(inventory_item); if (OnClient()) return; /// if (GameID()==GAME_ARTEFACTHUNT) // SpawnAmmoForWeapon(inventory_item); }
void WeaponUsageStatistic::SaveDataLtx(CInifile& ini) { if (OnClient()) return; if (!CollectData()) return; if (aPlayersStatistic.empty()) return; WriteLtx (ini); }
void game_cl_GameState::set_type_name(LPCSTR s) { m_game_type_name =s; if(OnClient()){ strcpy (g_pGamePersistent->m_game_params.m_game_type, *m_game_type_name); g_pGamePersistent->OnGameStart(); } };
void CActorMP::net_Export (NET_Packet &packet) { if (OnClient()) { R_ASSERT (g_Alive()); R_ASSERT (PHGetSyncItemsNumber() == 1); } m_state_holder.write (packet); }
void CActorMP::fill_state (actor_mp_state &state) { if (OnClient()) { //R_ASSERT (g_Alive()); //R_ASSERT2 (PHGetSyncItemsNumber() == 1,make_string("PHGetSyncItemsNumber() returned %d, health = %.2f",PHGetSyncItemsNumber(),GetfHealth())); } SPHNetState State; PHGetSyncItem(0)->get_State (State); // static test = false; // if (test) { #if 0 Msg ("Frame [%d], object [%d]",Device.dwFrame,ID()); // Msg ("quaternion : [%f][%f][%f][%f]",State.quaternion.x,State.quaternion.y,State.quaternion.z,State.quaternion.w); // Msg ("angular : [%f][%f][%f]",State.angular_vel.x,State.angular_vel.y,State.angular_vel.z); Msg ("linear : [%f][%f][%f]",State.linear_vel.x,State.linear_vel.y,State.linear_vel.z); // Msg ("force : [%f][%f][%f]",State.force.x,State.force.y,State.force.z); // Msg ("torque : [%f][%f][%f]",State.torque.x,State.torque.y,State.torque.z); // Msg ("acceleration : [%f][%f][%f]",NET_SavedAccel.x,NET_SavedAccel.y,NET_SavedAccel.z); Msg ("model_yaw : [%f]",angle_normalize(r_model_yaw)); Msg ("camera_yaw : [%f]",angle_normalize(unaffected_r_torso.yaw)); // Msg ("camera_pitch : [%f]",angle_normalize(unaffected_r_torso.pitch)); // Msg ("camera_roll : [%f]",angle_normalize(unaffected_r_torso.roll)); // } #endif // 0 state.physics_quaternion = State.quaternion; state.physics_angular_velocity = State.angular_vel; state.physics_linear_velocity = State.linear_vel; state.physics_force = State.force; state.physics_torque = State.torque; state.physics_position = State.position; state.position = Position(); state.logic_acceleration = NET_SavedAccel; state.model_yaw = angle_normalize(r_model_yaw); state.camera_yaw = angle_normalize(unaffected_r_torso.yaw); state.camera_pitch = angle_normalize(unaffected_r_torso.pitch); state.camera_roll = angle_normalize(unaffected_r_torso.roll); state.time = Level().timeServer(); state.inventory_active_slot = inventory().GetActiveSlot(); state.body_state_flags = mstate_real & 0x0000ffff; state.health = GetfHealth(); //because after packing to 1 byte, this value can be positive... if (state.health < EPS) state.health = 0; state.radiation = g_Radiation()/100.0f; state.physics_state_enabled = State.enabled ? 1 : 0; }
void CActorMP::net_Export (NET_Packet &packet) { if (OnClient()) { //Msg("net_Export: ID is: 0x%08x, is going to send health %2.04f", this->ID(), m_state_holder.state().health); //R_ASSERT (g_Alive()); //R_ASSERT (PHGetSyncItemsNumber() == 1); } R_ASSERT2(valid_pos(m_state_holder.state().position,phBoundaries), "trying to export bad position"); m_state_holder.write (packet); }
void CWeapon::SpawnAmmo(u32 boxCurr, LPCSTR ammoSect, u32 ParentID) { if(!m_ammoTypes.size()) return; if (OnClient()) return; m_bAmmoWasSpawned = true; int l_type = 0; l_type %= m_ammoTypes.size(); if(!ammoSect) ammoSect = m_ammoTypes[l_type].c_str(); ++l_type; l_type %= m_ammoTypes.size(); CSE_Abstract *D = F_entity_Create(ammoSect); { CSE_ALifeItemAmmo *l_pA = smart_cast<CSE_ALifeItemAmmo*>(D); R_ASSERT (l_pA); l_pA->m_boxSize = (u16)pSettings->r_s32(ammoSect, "box_size"); D->s_name = ammoSect; D->set_name_replace (""); //. D->s_gameid = u8(GameID()); D->s_RP = 0xff; D->ID = 0xffff; if (ParentID == 0xffffffff) D->ID_Parent = (u16)H_Parent()->ID(); else D->ID_Parent = (u16)ParentID; D->ID_Phantom = 0xffff; D->s_flags.assign (M_SPAWN_OBJECT_LOCAL); D->RespawnTime = 0; l_pA->m_tNodeID = g_dedicated_server ? u32(-1) : ai_location().level_vertex_id(); if(boxCurr == 0xffffffff) boxCurr = l_pA->m_boxSize; while(boxCurr) { l_pA->a_elapsed = (u16)(boxCurr > l_pA->m_boxSize ? l_pA->m_boxSize : boxCurr); NET_Packet P; D->Spawn_Write (P, TRUE); Level().Send (P,net_flags(TRUE)); if(boxCurr > l_pA->m_boxSize) boxCurr -= l_pA->m_boxSize; else boxCurr = 0; } } F_entity_Destroy (D); }
void CWeaponMagazined::switch2_Fire() { CInventoryOwner* io = smart_cast<CInventoryOwner*>(H_Parent()); CInventoryItem* ii = smart_cast<CInventoryItem*>(this); #ifdef DEBUG VERIFY2(io, make_string("no inventory owner, item %s", *cName())); if (ii != io->inventory().ActiveItem()) Msg("! not an active item, item %s, owner %s, active item %s", *cName(), *H_Parent()->cName(), io->inventory().ActiveItem() ? *io->inventory().ActiveItem()->object().cName() : "no_active_item"); if (!(io && (ii == io->inventory().ActiveItem()))) { CAI_Stalker *stalker = smart_cast<CAI_Stalker*>(H_Parent()); if (stalker) { stalker->planner().show(); stalker->planner().show_current_world_state(); stalker->planner().show_target_world_state(); } } #else if (!io) return; #endif // DEBUG // // VERIFY2( // io && (ii == io->inventory().ActiveItem()), // make_string( // "item[%s], parent[%s]", // *cName(), // H_Parent() ? *H_Parent()->cName() : "no_parent" // ) // ); m_bStopedAfterQueueFired = false; m_bFireSingleShot = true; m_iShotNum = 0; if ((OnClient() || Level().IsDemoPlay()) && !IsWorking()) FireStart(); /* if(SingleShotMode()) { m_bFireSingleShot = true; bWorking = false; }*/ }
BOOL CActorMP::net_Relevant () { if (OnClient()) { if (!g_Alive()) return (false); if (m_i_am_dead) return (false); } if (character_physics_support()->IsRemoved()) return (false); actor_mp_state state; fill_state (state); return (m_state_holder.relevant(state)); }
//процесс отсоединения вещи заключается в спауне новой вещи //в инвентаре и установке соответствующих флагов в родительском //объекте, поэтому функция должна быть переопределена bool CInventoryItem::Detach(const char* item_section_name, bool b_spawn_item) { if (OnClient()) return true; if(b_spawn_item) { CSE_Abstract* D = F_entity_Create(item_section_name); R_ASSERT (D); CSE_ALifeDynamicObject *l_tpALifeDynamicObject = smart_cast<CSE_ALifeDynamicObject*>(D); R_ASSERT (l_tpALifeDynamicObject); l_tpALifeDynamicObject->m_tNodeID = object().ai_location().level_vertex_id(); // Fill D->s_name = item_section_name; D->set_name_replace (""); D->s_gameid = u8(GameID()); D->s_RP = 0xff; D->ID = 0xffff; if (GameID() == GAME_SINGLE) { D->ID_Parent = u16(object().H_Parent()->ID()); } else // i'm not sure this is right { // but it is simpliest way to avoid exception in MP BuyWnd... [Satan] if (object().H_Parent()) D->ID_Parent = u16(object().H_Parent()->ID()); else D->ID_Parent = NULL; } D->ID_Phantom = 0xffff; D->o_Position = object().Position(); D->s_flags.assign (M_SPAWN_OBJECT_LOCAL); D->RespawnTime = 0; // Send NET_Packet P; D->Spawn_Write (P,TRUE); Level().Send (P,net_flags(TRUE)); // Destroy F_entity_Destroy (D); } return true; }
void WeaponUsageStatistic::OnBullet_Check_Request(SHit* pHDS) { if (!pHDS || OnClient()) return; s16 BoneID = pHDS->bone(); u32 BulletID = pHDS->BulletID; u32 SenderID = pHDS->SenderID; BChA_it pSenderI = std::find(m_Requests.begin(), m_Requests.end(), SenderID); if (pSenderI == m_Requests.end() || (*pSenderI) != SenderID) { m_Requests.push_back(Bullet_Check_Array(SenderID)); pSenderI = m_Requests.end()-1; }; (*pSenderI).Requests.push_back(Bullet_Check_Request(BulletID, BoneID)); m_dwLastRequestSenderID = SenderID; // HitChecksReceived++; };
void CGrenade::PutNextToSlot() { if (OnClient()) return; VERIFY (!getDestroy()); //выкинуть гранату из инвентар¤ NET_Packet P; if (m_pInventory) { m_pInventory->Ruck (this); this->u_EventGen (P, GEG_PLAYER_ITEM2RUCK, this->H_Parent()->ID()); P.w_u16 (this->ID()); this->u_EventSend (P); } else Msg ("! PutNextToSlot : m_pInventory = NULL [%d][%d]", ID(), Device.dwFrame); if (smart_cast<CInventoryOwner*>(H_Parent()) && m_pInventory) { CGrenade *pNext = smart_cast<CGrenade*>( m_pInventory->Same(this,true) ); if(!pNext) pNext = smart_cast<CGrenade*>( m_pInventory->SameSlot(GRENADE_SLOT, this, true) ); VERIFY (pNext != this); if(pNext && m_pInventory->Slot(pNext->BaseSlot(),pNext) ) { pNext->u_EventGen (P, GEG_PLAYER_ITEM2SLOT, pNext->H_Parent()->ID()); P.w_u16 (pNext->ID()); P.w_u16 (pNext->BaseSlot()); pNext->u_EventSend (P); m_pInventory->SetActiveSlot (pNext->BaseSlot()); }else { CActor* pActor = smart_cast<CActor*>( m_pInventory->GetOwner()); if(pActor) pActor->OnPrevWeaponSlot(); } m_thrown = false; } }
void CExplosive::GenExplodeEvent (const Fvector& pos, const Fvector& normal) { if (OnClient() || cast_game_object()->Remote()) return; // if( m_bExplodeEventSent ) // return; VERIFY(!m_explosion_flags.test(flExplodEventSent));//!m_bExplodeEventSent VERIFY(0xffff != Initiator()); NET_Packet P; cast_game_object()->u_EventGen (P,GE_GRENADE_EXPLODE,cast_game_object()->ID()); P.w_u16 (Initiator()); P.w_vec3 (pos); P.w_vec3 (normal); cast_game_object()->u_EventSend (P); //m_bExplodeEventSent = true; m_explosion_flags.set(flExplodEventSent,TRUE); }
BOOL CWeapon::CheckForMisfire () { if (OnClient()) return FALSE; float rnd = ::Random.randF(0.f,1.f); float mp = GetConditionMisfireProbability(); if(rnd < mp) { FireEnd(); bMisfire = true; SwitchState(eMisfire); return TRUE; } else { return FALSE; } }
void WeaponUsageStatistic::OnBullet_Check_Result(bool Result) { if (OnClient()) return; if (m_dwLastRequestSenderID) { BChA_it pSenderI = std::find(m_Requests.begin(), m_Requests.end(), m_dwLastRequestSenderID); if (pSenderI != m_Requests.end() && (*pSenderI) == m_dwLastRequestSenderID) { (*pSenderI).Requests.back().Result = Result; (*pSenderI).Requests.back().Processed = true; if (Result) (*pSenderI).NumTrue++; else (*pSenderI).NumFalse++; } else { Msg ("! Warning can't Find Check!"); R_ASSERT(0); } m_dwLastRequestSenderID = 0; } };
void CGrenade::PutNextToSlot() { if (OnClient()) return; VERIFY (!getDestroy()); //выкинуть гранату из инвентар¤ if (m_pCurrentInventory) { NET_Packet P; m_pCurrentInventory->Ruck (this); #if defined(GRENADE_FROM_BELT) this->u_EventGen (P, GEG_PLAYER_ITEM2BELT, this->H_Parent()->ID()); #else this->u_EventGen (P, GEG_PLAYER_ITEM2RUCK, this->H_Parent()->ID()); #endif P.w_u16 (this->ID()); this->u_EventSend (P); #if defined(GRENADE_FROM_BELT) CGrenade *pNext = smart_cast<CGrenade*>( m_pCurrentInventory->Same(this,false) ); if(!pNext) pNext = smart_cast<CGrenade*>( m_pCurrentInventory->SameSlot(GRENADE_SLOT, this, false) ); #else CGrenade *pNext = smart_cast<CGrenade*>( m_pCurrentInventory->Same(this,true) ); if(!pNext) pNext = smart_cast<CGrenade*>( m_pCurrentInventory->SameSlot(GRENADE_SLOT, this, true) ); #endif VERIFY (pNext != this); if(pNext && m_pCurrentInventory->Slot(pNext) ) { pNext->u_EventGen (P, GEG_PLAYER_ITEM2SLOT, pNext->H_Parent()->ID()); P.w_u16 (pNext->ID()); pNext->u_EventSend (P); m_pCurrentInventory->SetActiveSlot(pNext->GetSlot()); } ///// m_thrown = false; } }
void CGrenade::PutNextToSlot() { if (OnClient()) return; // Msg ("* PutNextToSlot : %d", ID()); VERIFY (!getDestroy()); //выкинуть гранату из инвентар¤ NET_Packet P; if (m_pInventory) { m_pInventory->Ruck (this); //. m_pInventory->SetActiveSlot (NO_ACTIVE_SLOT); this->u_EventGen (P, GEG_PLAYER_ITEM2RUCK, this->H_Parent()->ID()); P.w_u16 (this->ID()); this->u_EventSend (P); } else Msg ("! PutNextToSlot : m_pInventory = 0"); if (smart_cast<CInventoryOwner*>(H_Parent()) && m_pInventory) { CGrenade *pNext = smart_cast<CGrenade*>( m_pInventory->Same(this,true) ); if(!pNext) pNext = smart_cast<CGrenade*>( m_pInventory->SameSlot(this,true) ); VERIFY (pNext != this); if(pNext && m_pInventory->Slot(pNext) ){ pNext->u_EventGen (P, GEG_PLAYER_ITEM2SLOT, pNext->H_Parent()->ID()); P.w_u16 (pNext->ID()); pNext->u_EventSend (P); // if(IsGameTypeSingle()) m_pInventory->SetActiveSlot (pNext->GetSlot()); } m_thrown = false; } }
void CActorMP::process_packet (net_update &N) { if (Local() && OnClient()) return; if (!NET.empty() && (N.dwTimeStamp < NET.back().dwTimeStamp)) return; if (g_Alive()) { setVisible ((BOOL)!HUDview ()); setEnabled (TRUE); }; if (!NET.empty() && (N.dwTimeStamp == NET.back().dwTimeStamp)) { NET.back() = N; return; } NET.push_back (N); if (NET.size() > 5) NET.pop_front (); }
void WeaponUsageStatistic::SaveData() { if (OnClient()) return; if (!CollectData()) return; if (aPlayersStatistic.empty()) return; string64 GameType; SYSTEMTIME Time; switch ( GameID() ) { case eGameIDDeathmatch: xr_sprintf(GameType, "dm"); break; case eGameIDTeamDeathmatch: xr_sprintf(GameType, "tdm"); break; case eGameIDArtefactHunt: xr_sprintf(GameType, "ah"); break; case eGameIDCaptureTheArtefact: xr_sprintf(GameType, "cta"); break; default: return; break; }; GetLocalTime(&Time); xr_sprintf(mFileName, "(%s)_(%s)_%02d.%02d.%02d_%02d.%02d.%02d.wus", *(Level().name()), GameType, Time.wMonth, Time.wDay, Time.wYear, Time.wHour, Time.wMinute, Time.wSecond); //--------------------------------------------------------- FS.update_path (mFileName,"$logs$",mFileName); FILE* SFile = fopen(mFileName, "wb"); if (!SFile) return; //--------------------------------------------------------- u32 IDENT = WUS_IDENT; fwrite (&IDENT, 4, 1, SFile); u32 Ver = WUS_VERSION; fwrite (&Ver, 4, 1, SFile); //--------------------------------------------------------- Write (SFile); //--------------------------------------------------------- fclose (SFile); };
void WeaponUsageStatistic::SaveData() { if (OnClient()) return; if (!CollectData()) return; if (aPlayersStatistic.empty()) return; string1024 GameType; SYSTEMTIME Time; switch (GameID()) { case GAME_DEATHMATCH: sprintf_s(GameType, "dm"); break; case GAME_TEAMDEATHMATCH: sprintf_s(GameType, "tdm"); break; case GAME_ARTEFACTHUNT: sprintf_s(GameType, "ah"); break; default: return; break; }; GetLocalTime(&Time); sprintf_s(mFileName, "(%s)_(%s)_%02d.%02d.%02d_%02d.%02d.%02d.wus", *(Level().name()), GameType, Time.wMonth, Time.wDay, Time.wYear, Time.wHour, Time.wMinute, Time.wSecond); //--------------------------------------------------------- FS.update_path (mFileName,"$logs$",mFileName); FILE* SFile = fopen(mFileName, "wb"); if (!SFile) return; //--------------------------------------------------------- u32 IDENT = WUS_IDENT; fwrite (&IDENT, 4, 1, SFile); u32 Ver = WUS_VERSION; fwrite (&Ver, 4, 1, SFile); //--------------------------------------------------------- Write (SFile); //--------------------------------------------------------- fclose (SFile); };
void CLevel::ClientReceive() { Demo_StartFrame(); Demo_Update(); m_dwRPC = 0; m_dwRPS = 0; for (NET_Packet* P = net_msg_Retreive(); P; P=net_msg_Retreive()) { //----------------------------------------------------- m_dwRPC++; m_dwRPS += P->B.count; //----------------------------------------------------- u16 m_type; u16 ID; P->r_begin (m_type); switch (m_type) { case M_MAP_SYNC: { shared_str map_name; P->r_stringZ(map_name); shared_str _name = net_Hosts.size() ? net_Hosts.front().dpSessionName:""; if(_name.size() && _name!=map_name && OnClient()) { Msg("!!! map sync failed. current is[%s] server is[%s]",m_name.c_str(), map_name.c_str()); Engine.Event.Defer ("KERNEL:disconnect"); Engine.Event.Defer ("KERNEL:start",m_caServerOptions.size() ? size_t( xr_strdup(*m_caServerOptions)) : 0, m_caClientOptions.size() ? size_t(xr_strdup(*m_caClientOptions)) : 0); } }break; case M_SPAWN: { if (!m_bGameConfigStarted || !bReady) { Msg ("Unconventional M_SPAWN received : cgf[%s] | bReady[%s]", (m_bGameConfigStarted) ? "true" : "false", (bReady) ? "true" : "false"); break; } /*/ cl_Process_Spawn(*P); /*/ game_events->insert (*P); if (g_bDebugEvents) ProcessGameEvents(); //*/ } break; case M_EVENT: game_events->insert (*P); if (g_bDebugEvents) ProcessGameEvents(); break; case M_EVENT_PACK: NET_Packet tmpP; while (!P->r_eof()) { tmpP.B.count = P->r_u8(); P->r(&tmpP.B.data, tmpP.B.count); tmpP.timeReceive = P->timeReceive; game_events->insert (tmpP); if (g_bDebugEvents) ProcessGameEvents(); }; break; case M_UPDATE: { game->net_import_update (*P); //------------------------------------------- if (OnServer()) break; //------------------------------------------- }; // ни в коем случае нельзя здесь ставить break, т.к. в случае если все объекты не влазят в пакет M_UPDATE, // они досылаются через M_UPDATE_OBJECTS case M_UPDATE_OBJECTS: { Objects.net_Import (P); if (OnClient()) UpdateDeltaUpd(timeServer()); IClientStatistic pStat = Level().GetStatistic(); u32 dTime = 0; if ((Level().timeServer() + pStat.getPing()) < P->timeReceive) { dTime = pStat.getPing(); } else dTime = Level().timeServer() - P->timeReceive + pStat.getPing(); u32 NumSteps = ph_world->CalcNumSteps(dTime); SetNumCrSteps(NumSteps); }break; // case M_UPDATE_OBJECTS: // { // Objects.net_Import (P); // }break; //----------- for E3 ----------------------------- case M_CL_UPDATE: { if (OnClient()) break; P->r_u16 (ID); u32 Ping = P->r_u32(); CGameObject* O = smart_cast<CGameObject*>(Objects.net_Find (ID)); if (0 == O) break; O->net_Import(*P); //--------------------------------------------------- UpdateDeltaUpd(timeServer()); if (pObjects4CrPr.empty() && pActors4CrPr.empty()) break; if (O->CLS_ID != CLSID_OBJECT_ACTOR) break; u32 dTime = 0; if ((Level().timeServer() + Ping) < P->timeReceive) { #ifdef DEBUG // Msg("! TimeServer[%d] < TimeReceive[%d]", Level().timeServer(), P->timeReceive); #endif dTime = Ping; } else dTime = Level().timeServer() - P->timeReceive + Ping; u32 NumSteps = ph_world->CalcNumSteps(dTime); SetNumCrSteps(NumSteps); O->CrPr_SetActivationStep(u32(ph_world->m_steps_num) - NumSteps); AddActor_To_Actors4CrPr(O); }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_CL_INPUT: { P->r_u16 (ID); CObject* O = Objects.net_Find (ID); if (0 == O) break; O->net_ImportInput(*P); }break; //--------------------------------------------------- case M_SV_CONFIG_NEW_CLIENT: InitializeClientGame(*P); break; case M_SV_CONFIG_GAME: game->net_import_state (*P); break; case M_SV_CONFIG_FINISHED: game_configured = TRUE; Msg("- Game configuring : Finished "); break; case M_MIGRATE_DEACTIVATE: // TO: Changing server, just deactivate { P->r_u16 (ID); CObject* O = Objects.net_Find (ID); if (0 == O) break; O->net_MigrateInactive (*P); if (bDebug) Log("! MIGRATE_DEACTIVATE",*O->cName()); } break; case M_MIGRATE_ACTIVATE: // TO: Changing server, full state { P->r_u16 (ID); CObject* O = Objects.net_Find (ID); if (0 == O) break; O->net_MigrateActive (*P); if (bDebug) Log("! MIGRATE_ACTIVATE",*O->cName()); } break; case M_CHAT: { char buffer[256]; P->r_stringZ(buffer); Msg ("- %s",buffer); } break; case M_GAMEMESSAGE: { if (!game) break; Game().OnGameMessage(*P); }break; case M_RELOAD_GAME: case M_LOAD_GAME: case M_CHANGE_LEVEL: { if(m_type==M_LOAD_GAME) { string256 saved_name; P->r_stringZ (saved_name); if(xr_strlen(saved_name) && ai().get_alife()) { CSavedGameWrapper wrapper(saved_name); if (wrapper.level_id() == ai().level_graph().level_id()) { Engine.Event.Defer ("Game:QuickLoad", size_t(xr_strdup(saved_name)), 0); break; } } } Engine.Event.Defer ("KERNEL:disconnect"); Engine.Event.Defer ("KERNEL:start",size_t(xr_strdup(*m_caServerOptions)),size_t(xr_strdup(*m_caClientOptions))); }break; case M_SAVE_GAME: { ClientSave (); }break; case M_GAMESPY_CDKEY_VALIDATION_CHALLENGE: { OnGameSpyChallenge(P); }break; case M_AUTH_CHALLENGE: { OnBuildVersionChallenge(); }break; case M_CLIENT_CONNECT_RESULT: { OnConnectResult(P); }break; case M_CHAT_MESSAGE: { if (!game) break; Game().OnChatMessage(P); }break; case M_CLIENT_WARN: { if (!game) break; Game().OnWarnMessage(P); }break; case M_REMOTE_CONTROL_AUTH: case M_REMOTE_CONTROL_CMD: { Game().OnRadminMessage(m_type, P); }break; case M_CHANGE_LEVEL_GAME: { Msg("- M_CHANGE_LEVEL_GAME Received"); if (OnClient()) { Engine.Event.Defer ("KERNEL:disconnect"); Engine.Event.Defer ("KERNEL:start",m_caServerOptions.size() ? size_t( xr_strdup(*m_caServerOptions)) : 0,m_caClientOptions.size() ? size_t(xr_strdup(*m_caClientOptions)) : 0); } else { const char* m_SO = m_caServerOptions.c_str(); // const char* m_CO = m_caClientOptions.c_str(); m_SO = strchr(m_SO, '/'); if (m_SO) m_SO++; m_SO = strchr(m_SO, '/'); string128 LevelName = ""; string128 GameType = ""; P->r_stringZ(LevelName); P->r_stringZ(GameType); string4096 NewServerOptions = ""; sprintf_s(NewServerOptions, "%s/%s", LevelName, GameType); if (m_SO) strcat(NewServerOptions, m_SO); m_caServerOptions = NewServerOptions; Engine.Event.Defer ("KERNEL:disconnect"); Engine.Event.Defer ("KERNEL:start",size_t(xr_strdup(*m_caServerOptions)),size_t(xr_strdup(*m_caClientOptions))); }; }break; case M_CHANGE_SELF_NAME: { net_OnChangeSelfName(P); }break; case M_BULLET_CHECK_RESPOND: { if (!game) break; if (GameID() != GAME_SINGLE) Game().m_WeaponUsageStatistic->On_Check_Respond(P); }break; case M_STATISTIC_UPDATE: { if (!game) break; if (GameID() != GAME_SINGLE) Game().m_WeaponUsageStatistic->OnUpdateRequest(P); }break; case M_STATISTIC_UPDATE_RESPOND: { if (!game) break; if (GameID() != GAME_SINGLE) Game().m_WeaponUsageStatistic->OnUpdateRespond(P); }break; case M_BATTLEYE: { #ifdef BATTLEYE battleye_system.ReadPacketClient( P ); #endif // BATTLEYE }break; } net_msg_Release(); } // if (!g_bDebugEvents) ProcessGameSpawns(); }
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::remove_objects () { if (!IsGameTypeSingle()) Msg("CLevel::remove_objects - Start"); BOOL b_stored = psDeviceFlags.test(rsDisableObjectsAsCrows); Game().reset_ui (); if (OnServer()) { VERIFY (Server); Server->SLS_Clear (); } snd_Events.clear (); for (int i=0; i<6; ++i) { psNET_Flags.set (NETFLAG_MINIMIZEUPDATES,FALSE); // ugly hack for checks that update is twice on frame // we need it since we do updates for checking network messages ++(Device.dwFrame); psDeviceFlags.set (rsDisableObjectsAsCrows,TRUE); ClientReceive (); ProcessGameEvents (); Objects.Update (true); Sleep (100); } if (OnClient()) ClearAllObjects (); BulletManager().Clear (); ph_commander().clear (); ph_commander_scripts().clear(); if(!g_dedicated_server) space_restriction_manager().clear (); psDeviceFlags.set (rsDisableObjectsAsCrows, b_stored); g_b_ClearGameCaptions = true; if (!g_dedicated_server) ai().script_engine().collect_all_garbage (); stalker_animation_data_storage().clear (); VERIFY (Render); Render->models_Clear (FALSE); Render->clear_static_wallmarks (); #ifdef DEBUG if(!g_dedicated_server) if (!client_spawn_manager().registry().empty()) client_spawn_manager().dump (); #endif // DEBUG if(!g_dedicated_server) { VERIFY (client_spawn_manager().registry().empty()); client_spawn_manager().clear (); } for (int i=0; i<6; i++) { ++(Device.dwFrame); Objects.Update(true); } g_pGamePersistent->destroy_particles (false); //. xr_delete (m_seniority_hierarchy_holder); //. m_seniority_hierarchy_holder = xr_new<CSeniorityHierarchyHolder>(); if (!IsGameTypeSingle()) Msg("CLevel::remove_objects - End"); }
void CLevel::OnFrame () { #ifdef DEBUG_MEMORY_MANAGER debug_memory_guard __guard__; #endif // DEBUG_MEMORY_MANAGER #ifdef DEBUG DBG_RenderUpdate( ); #endif // #ifdef DEBUG Fvector temp_vector; m_feel_deny.feel_touch_update (temp_vector, 0.f); if (GameID()!=eGameIDSingle) psDeviceFlags.set(rsDisableObjectsAsCrows,true); else psDeviceFlags.set(rsDisableObjectsAsCrows,false); // commit events from bullet manager from prev-frame Device.Statistic->TEST0.Begin (); BulletManager().CommitEvents (); Device.Statistic->TEST0.End (); // Client receive if (net_isDisconnected()) { if (OnClient() && GameID() != eGameIDSingle) { #ifdef DEBUG Msg("* I'm disconnected, so clear all objects..."); #endif // #ifdef DEBUG ClearAllObjects(); } Engine.Event.Defer ("kernel:disconnect"); return; } else { Device.Statistic->netClient1.Begin(); ClientReceive (); Device.Statistic->netClient1.End (); } ProcessGameEvents (); if (m_bNeed_CrPr) make_NetCorrectionPrediction(); if(!g_dedicated_server ) { if (g_mt_config.test(mtMap)) Device.seqParallel.push_back (fastdelegate::FastDelegate0<>(m_map_manager,&CMapManager::Update)); else MapManager().Update (); if( IsGameTypeSingle() && Device.dwPrecacheFrame==0 ) { if (g_mt_config.test(mtMap)) Device.seqParallel.push_back (fastdelegate::FastDelegate0<>(m_game_task_manager,&CGameTaskManager::UpdateTasks)); else GameTaskManager().UpdateTasks(); } } // Inherited update inherited::OnFrame (); // Draw client/server stats if ( !g_dedicated_server && psDeviceFlags.test(rsStatistic)) { CGameFont* F = HUD().Font().pFontDI; if (!psNET_direct_connect) { if ( IsServer() ) { const IServerStatistic* S = Server->GetStatistic(); F->SetHeightI (0.015f); F->OutSetI (0.0f,0.5f); F->SetColor (D3DCOLOR_XRGB(0,255,0)); F->OutNext ("IN: %4d/%4d (%2.1f%%)", S->bytes_in_real, S->bytes_in, 100.f*float(S->bytes_in_real)/float(S->bytes_in)); F->OutNext ("OUT: %4d/%4d (%2.1f%%)", S->bytes_out_real, S->bytes_out, 100.f*float(S->bytes_out_real)/float(S->bytes_out)); F->OutNext ("client_2_sever ping: %d", net_Statistic.getPing()); F->OutNext ("SPS/Sended : %4d/%4d", S->dwBytesPerSec, S->dwBytesSended); F->OutNext ("sv_urate/cl_urate : %4d/%4d", psNET_ServerUpdate, psNET_ClientUpdate); F->SetColor (D3DCOLOR_XRGB(255,255,255)); struct net_stats_functor { xrServer* m_server; CGameFont* F; void operator()(IClient* C) { m_server->UpdateClientStatistic(C); F->OutNext("%10s: P(%d), BPS(%2.1fK), MRR(%2d), MSR(%2d), Retried(%2d), Blocked(%2d)", //Server->game->get_option_s(*C->Name,"name",*C->Name), C->name.c_str(), C->stats.getPing(), float(C->stats.getBPS()),// /1024, C->stats.getMPS_Receive (), C->stats.getMPS_Send (), C->stats.getRetriedCount(), C->stats.dwTimesBlocked ); } }; net_stats_functor tmp_functor; tmp_functor.m_server = Server; tmp_functor.F = F; Server->ForEachClientDo(tmp_functor); } if (IsClient()) { IPureClient::UpdateStatistic(); F->SetHeightI(0.015f); F->OutSetI (0.0f,0.5f); F->SetColor (D3DCOLOR_XRGB(0,255,0)); F->OutNext ("client_2_sever ping: %d", net_Statistic.getPing()); F->OutNext ("sv_urate/cl_urate : %4d/%4d", psNET_ServerUpdate, psNET_ClientUpdate); F->SetColor (D3DCOLOR_XRGB(255,255,255)); F->OutNext("P(%d), BPS(%2.1fK), MRR(%2d), MSR(%2d), Retried(%2d), Blocked(%2d), Sended(%2d), SPS(%2d)", //Server->game->get_option_s(C->Name,"name",C->Name), // C->Name, net_Statistic.getPing(), float(net_Statistic.getBPS()),// /1024, net_Statistic.getMPS_Receive (), net_Statistic.getMPS_Send (), net_Statistic.getRetriedCount(), net_Statistic.dwTimesBlocked, net_Statistic.dwBytesSended, net_Statistic.dwBytesPerSec ); #ifdef DEBUG if (!pStatGraphR) { pStatGraphR = new CStatGraph(); pStatGraphR->SetRect(50, 700, 300, 68, 0xff000000, 0xff000000); //m_stat_graph->SetGrid(0, 0.0f, 10, 1.0f, 0xff808080, 0xffffffff); pStatGraphR->SetMinMax(0.0f, 65536.0f, 1000); pStatGraphR->SetStyle(CStatGraph::stBarLine); pStatGraphR->AppendSubGraph(CStatGraph::stBarLine); } pStatGraphR->AppendItem(float(net_Statistic.getBPS()), 0xff00ff00, 0); F->OutSet(20.f, 700.f); F->OutNext("64 KBS"); #endif } } } else { #ifdef DEBUG if (pStatGraphR) xr_delete(pStatGraphR); #endif } // g_pGamePersistent->Environment().SetGameTime (GetGameDayTimeSec(),GetGameTimeFactor()); g_pGamePersistent->Environment().SetGameTime (GetEnvironmentGameDayTimeSec(),game->GetEnvironmentGameTimeFactor()); //Device.Statistic->cripting.Begin (); if (!g_dedicated_server) ai().script_engine().script_process (ScriptEngine::eScriptProcessorLevel)->update(); //Device.Statistic->Scripting.End (); m_ph_commander->update (); m_ph_commander_scripts->update (); // autosave_manager().update (); //просчитать полет пуль Device.Statistic->TEST0.Begin (); BulletManager().CommitRenderSet (); Device.Statistic->TEST0.End (); // update static sounds if(!g_dedicated_server) { if (g_mt_config.test(mtLevelSounds)) Device.seqParallel.push_back (fastdelegate::FastDelegate0<>(m_level_sound_manager,&CLevelSoundManager::Update)); else m_level_sound_manager->Update (); } // deffer LUA-GC-STEP if (!g_dedicated_server) { if (g_mt_config.test(mtLUA_GC)) Device.seqParallel.push_back (fastdelegate::FastDelegate0<>(this,&CLevel::script_gc)); else script_gc () ; } //----------------------------------------------------- if (pStatGraphR) { static float fRPC_Mult = 10.0f; static float fRPS_Mult = 1.0f; pStatGraphR->AppendItem(float(m_dwRPC)*fRPC_Mult, 0xffff0000, 1); pStatGraphR->AppendItem(float(m_dwRPS)*fRPS_Mult, 0xff00ff00, 0); }; }
void CActorMP::net_Import ( NET_Packet &P) { net_update N; m_state_holder.read (P); R_ASSERT2(valid_pos(m_state_holder.state().position), "imported bad position"); /*if (m_i_am_dead) return;*/ if (OnClient()) { /*#ifdef DEBUG if (GetfHealth() != m_state_holder.state().health) Msg("net_Import: [%d][%s], is going to set health to %2.04f", this->ID(), Name(), m_state_holder.state().health); #endif*/ game_PlayerState* ps = Game().GetPlayerByGameID(this->object_id()); float new_health = m_state_holder.state().health; if (GetfHealth() < new_health) { SetfHealth(new_health); } else { if (!ps || !ps->testFlag(GAME_PLAYER_FLAG_INVINCIBLE)) { SetfHealth(new_health); } } } if (PPhysicsShell() != NULL) { return; } if (OnClient()) SetfRadiation (m_state_holder.state().radiation*100.0f); u16 ActiveSlot = m_state_holder.state().inventory_active_slot; if (OnClient() && (inventory().GetActiveSlot()!=ActiveSlot) ) { #ifdef DEBUG Msg("Client-SetActiveSlot[%d][%d]",ActiveSlot, Device.dwFrame); #endif // #ifdef DEBUG inventory().SetActiveSlot(ActiveSlot); } N.mstate = m_state_holder.state().body_state_flags; N.dwTimeStamp = m_state_holder.state().time; N.p_pos = m_state_holder.state().position; N.o_model = m_state_holder.state().model_yaw; N.o_torso.yaw = m_state_holder.state().camera_yaw; N.o_torso.pitch = m_state_holder.state().camera_pitch; N.o_torso.roll = m_state_holder.state().camera_roll; if (N.o_torso.roll > PI) N.o_torso.roll -= PI_MUL_2; { if (Level().IsDemoPlay() || OnServer() || Remote()) { unaffected_r_torso.yaw = N.o_torso.yaw; unaffected_r_torso.pitch = N.o_torso.pitch; unaffected_r_torso.roll = N.o_torso.roll; cam_Active()->yaw = -N.o_torso.yaw; cam_Active()->pitch = N.o_torso.pitch; }; }; //CSE_ALifeCreatureActor N.p_accel = m_state_holder.state().logic_acceleration; process_packet (N); net_update_A N_A; m_States.clear (); N_A.State.enabled = m_state_holder.state().physics_state_enabled; N_A.State.angular_vel = m_state_holder.state().physics_angular_velocity; N_A.State.linear_vel = m_state_holder.state().physics_linear_velocity; N_A.State.force = m_state_holder.state().physics_force; N_A.State.torque = m_state_holder.state().physics_torque; N_A.State.position = m_state_holder.state().physics_position; N_A.State.quaternion = m_state_holder.state().physics_quaternion; // interpolcation postprocess_packet (N_A); }