void CCustomMonster::net_Import(NET_Packet& P) { R_ASSERT (Remote()); net_update N; u8 flags; float health; P.r_float (health); SetfHealth (health); P.r_u32 (N.dwTimeStamp); P.r_u8 (flags); P.r_vec3 (N.p_pos); P.r_float /*r_angle8*/ (N.o_model); P.r_float /*r_angle8*/ (N.o_torso.yaw); P.r_float /*r_angle8*/ (N.o_torso.pitch); P.r_float /*r_angle8*/ (N.o_torso.roll ); id_Team = P.r_u8(); id_Squad = P.r_u8(); id_Group = P.r_u8(); if (NET.empty() || (NET.back().dwTimeStamp<N.dwTimeStamp)) { NET.push_back (N); NET_WasInterpolating = TRUE; } setVisible (TRUE); setEnabled (TRUE); }
void CInventoryItem::OnEvent (NET_Packet& P, u16 type) { switch (type) { case GE_ADDON_ATTACH: { u16 ItemID; P.r_u16 (ItemID); CInventoryItem* ItemToAttach = smart_cast<CInventoryItem*>(Level().Objects.net_Find(ItemID)); if (!ItemToAttach) break; Attach(ItemToAttach,true); }break; case GE_ADDON_DETACH: { string64 i_name; P.r_stringZ (i_name); Detach(i_name, true); }break; case GE_CHANGE_POS: { Fvector p; P.r_vec3(p); CPHSynchronize* pSyncObj = NULL; pSyncObj = object().PHGetSyncItem(0); if (!pSyncObj) return; SPHNetState state; pSyncObj->get_State(state); state.position = p; state.previous_position = p; pSyncObj->set_State(state); }break; } }
void CInventoryItem::net_Import (NET_Packet& P) { P.r_float (m_fCondition) ; net_update_IItem N ; N.dwTimeStamp=P.r_u32 ( ); u16 NumItems = 0; NumItems=P.r_u16 ( ); if (CSE_ALifeInventoryItem::FLAG_NO_POSITION != NumItems) N.State.position=P.r_vec3 (); if (!NumItems || (CSE_ALifeInventoryItem::FLAG_NO_POSITION == NumItems)) return; position_Import (P,N) ; net_updateData *p = NetSync() ; if ( !p->NET_IItem.empty() && (p->NET_IItem.back().dwTimeStamp>=N.dwTimeStamp)) return; if (!p->NET_IItem.empty()){ m_flags.set (FInInterpolate, TRUE); // m_bInterpolate = true; } Level().AddObject_To_Objects4CrPr (m_object); object().CrPr_SetActivated (false); object().CrPr_SetActivationStep (0); p->NET_IItem.push_back (N); while (p->NET_IItem.size() > 2) { p->NET_IItem.pop_front (); }; };
void CExplosive::OnEvent(NET_Packet& P, u16 type) { switch (type) { case GE_GRENADE_EXPLODE : { Fvector pos, normal; u16 parent_id; P.r_u16(parent_id); P.r_vec3(pos); P.r_vec3(normal); SetInitiator(parent_id); ExplodeParams(pos,normal); Explode(); m_fExplodeDuration = m_fExplodeDurationMax; break; } } }
void CPhysicObject::net_Import_PH_Params(NET_Packet& P, net_update_PItem& N, mask_num_items& num_items) { //N.State.force.set (0.f,0.f,0.f); //N.State.torque.set (0.f,0.f,0.f); //UI().Font().pFontStat->OutSet(100.0f,100.0f); P.r_vec3 (N.State.force); //Msg("Import N.State.force.y:%4.6f",N.State.force.y); P.r_vec3 (N.State.torque); P.r_vec3 (N.State.position); //Msg("Import N.State.position.y:%4.6f",N.State.position.y); P.r_float(N.State.quaternion.x); P.r_float(N.State.quaternion.y); P.r_float(N.State.quaternion.z); P.r_float(N.State.quaternion.w); N.State.enabled = num_items.mask & CSE_ALifeObjectPhysic::inventory_item_state_enabled; //UI().Font().pFontStat->OutNext("Import N.State.enabled:%i",int(N.State.enabled)); if (!(num_items.mask & CSE_ALifeObjectPhysic::inventory_item_angular_null)) { N.State.angular_vel.x = P.r_float(); N.State.angular_vel.y = P.r_float(); N.State.angular_vel.z = P.r_float(); } else N.State.angular_vel.set (0.f,0.f,0.f); if (!(num_items.mask & CSE_ALifeObjectPhysic::inventory_item_linear_null)) { N.State.linear_vel.x = P.r_float(); N.State.linear_vel.y = P.r_float(); N.State.linear_vel.z = P.r_float(); } else N.State.linear_vel.set (0.f,0.f,0.f); //Msg("Import N.State.linear_vel.y:%4.6f",N.State.linear_vel.y); N.State.previous_position = N.State.position; N.State.previous_quaternion = N.State.quaternion; }
void CBaseMonster::net_Import(NET_Packet& P) { R_ASSERT (Remote()); net_update N; u8 flags; float health; P.r_float (health); SetfHealth (health); P.r_u32 (N.dwTimeStamp); P.r_u8 (flags); P.r_vec3 (N.p_pos); P.r_float /*r_angle8*/ (N.o_model); P.r_float /*r_angle8*/ (N.o_torso.yaw); P.r_float /*r_angle8*/ (N.o_torso.pitch); P.r_float /*r_angle8*/ (N.o_torso.roll ); id_Team = P.r_u8(); id_Squad = P.r_u8(); id_Group = P.r_u8(); GameGraph::_GRAPH_ID l_game_vertex_id = ai_location().game_vertex_id(); P.r (&l_game_vertex_id, sizeof(l_game_vertex_id)); P.r (&l_game_vertex_id, sizeof(l_game_vertex_id)); if (NET.empty() || (NET.back().dwTimeStamp<N.dwTimeStamp)) { NET.push_back (N); NET_WasInterpolating = TRUE; } // P.r (&m_fGoingSpeed, sizeof(m_fGoingSpeed)); // P.r (&m_fGoingSpeed, sizeof(m_fGoingSpeed)); float f1 = 0; if (ai().game_graph().valid_vertex_id(l_game_vertex_id)) { f1 = Position().distance_to (ai().game_graph().vertex(l_game_vertex_id)->level_point()); P.r (&f1, sizeof(f1)); f1 = Position().distance_to (ai().game_graph().vertex(l_game_vertex_id)->level_point()); P.r (&f1, sizeof(f1)); } else { P.r (&f1, sizeof(f1)); P.r (&f1, sizeof(f1)); } setVisible (TRUE); setEnabled (TRUE); }
void CInventoryItem::OnEvent (NET_Packet& P, u16 type) { switch (type) { case GE_ADDON_ATTACH: { u32 ItemID; P.r_u32 (ItemID); CInventoryItem* ItemToAttach = smart_cast<CInventoryItem*>(Level().Objects.net_Find(ItemID)); if (!ItemToAttach) break; Attach(ItemToAttach,true); CActor* pActor = smart_cast<CActor*>(object().H_Parent()); if (pActor && pActor->inventory().ActiveItem() == this) { pActor->inventory().SetPrevActiveSlot(pActor->inventory().GetActiveSlot()); pActor->inventory().Activate(NO_ACTIVE_SLOT); } }break; case GE_ADDON_DETACH: { string64 i_name; P.r_stringZ (i_name); Detach(i_name, true); CActor* pActor = smart_cast<CActor*>(object().H_Parent()); if (pActor && pActor->inventory().ActiveItem() == this) { pActor->inventory().SetPrevActiveSlot(pActor->inventory().GetActiveSlot()); pActor->inventory().Activate(NO_ACTIVE_SLOT); }; }break; case GE_CHANGE_POS: { Fvector p; P.r_vec3(p); CPHSynchronize* pSyncObj = NULL; pSyncObj = object().PHGetSyncItem(0); if (!pSyncObj) return; SPHNetState state; pSyncObj->get_State(state); state.position = p; state.previous_position = p; pSyncObj->set_State(state); }break; } }
void CAI_Stalker::net_Import (NET_Packet& P) { R_ASSERT (Remote()); net_update N; u8 flags; P.r_float (); set_money ( P.r_u32(), false ); float health; P.r_float (health); SetfHealth (health); // fEntityHealth = health; P.r_u32 (N.dwTimeStamp); P.r_u8 (flags); P.r_vec3 (N.p_pos); P.r_float /*r_angle8*/ (N.o_model); P.r_float /*r_angle8*/ (N.o_torso.yaw); P.r_float /*r_angle8*/ (N.o_torso.pitch); P.r_float /*r_angle8*/ (N.o_torso.roll ); id_Team = P.r_u8(); id_Squad = P.r_u8(); id_Group = P.r_u8(); GameGraph::_GRAPH_ID graph_vertex_id = movement().game_dest_vertex_id(); P.r (&graph_vertex_id, sizeof(GameGraph::_GRAPH_ID)); graph_vertex_id = ai_location().game_vertex_id(); P.r (&graph_vertex_id, sizeof(GameGraph::_GRAPH_ID)); if (NET.empty() || (NET.back().dwTimeStamp<N.dwTimeStamp)) { NET.push_back (N); NET_WasInterpolating = TRUE; } P.r_float (); P.r_float (); P.r_stringZ (m_sStartDialog); setVisible (TRUE); setEnabled (TRUE); }
void SPHBonesData::net_Load(NET_Packet &P) { bones.clear (); bones_mask =P.r_u64(); root_bone =P.r_u16(); Fvector _mn, _mx; P.r_vec3 (_mn); P.r_vec3 (_mx); set_min_max (_mn, _mx); u16 bones_number =P.r_u16();//bones number /**/ for(int i=0;i<bones_number;i++) { SPHNetState S; S.net_Load(P,get_min(),get_max()); bones.push_back(S); } }
void CSE_ALifeInventoryItem::UPDATE_Read (NET_Packet &tNetPacket) { tNetPacket.r_u8 (m_u8NumItems); if (!m_u8NumItems) { return; } mask_num_items num_items; num_items.common = m_u8NumItems; m_u8NumItems = num_items.num_items; R_ASSERT2 ( m_u8NumItems < (u8(1) << 5), make_string("%d",m_u8NumItems) ); tNetPacket.r_vec3 (State.position); tNetPacket.r_float_q8 (State.quaternion.x,0.f,1.f); tNetPacket.r_float_q8 (State.quaternion.y,0.f,1.f); tNetPacket.r_float_q8 (State.quaternion.z,0.f,1.f); tNetPacket.r_float_q8 (State.quaternion.w,0.f,1.f); State.enabled = check(num_items.mask,inventory_item_state_enabled); if (!check(num_items.mask,inventory_item_angular_null)) { tNetPacket.r_float_q8 (State.angular_vel.x,0.f,10*PI_MUL_2); tNetPacket.r_float_q8 (State.angular_vel.y,0.f,10*PI_MUL_2); tNetPacket.r_float_q8 (State.angular_vel.z,0.f,10*PI_MUL_2); } else State.angular_vel.set (0.f,0.f,0.f); if (!check(num_items.mask,inventory_item_linear_null)) { tNetPacket.r_float_q8 (State.linear_vel.x,-32.f,32.f); tNetPacket.r_float_q8 (State.linear_vel.y,-32.f,32.f); tNetPacket.r_float_q8 (State.linear_vel.z,-32.f,32.f); } else State.linear_vel.set (0.f,0.f,0.f); };
void SHit::Read_Packet_Cont (NET_Packet Packet) { Packet.r_u16 (whoID); Packet.r_u16 (weaponID); Packet.r_dir (dir); Packet.r_float (power); Packet.r_u16 (boneID); Packet.r_vec3 (p_in_bone_space); Packet.r_float (impulse); aim_bullet = Packet.r_u16()!=0; hit_type = (ALife::EHitType)Packet.r_u16(); //hit type if (hit_type == ALife::eHitTypeFireWound) { Packet.r_float (ap); } if (PACKET_TYPE == GE_HIT_STATISTIC) { Packet.r_u32(BulletID); Packet.r_u32(SenderID); } }
void CAI_Rat::net_Import(NET_Packet& P) { R_ASSERT (Remote()); net_update N; u8 flags; float health; P.r_float (health); SetfHealth (health); P.r_u32 (N.dwTimeStamp); P.r_u8 (flags); P.r_vec3 (N.p_pos); P.r_angle8 (N.o_model); P.r_angle8 (N.o_torso.yaw); P.r_angle8 (N.o_torso.pitch); P.r_angle8 (N.o_torso.roll ); id_Team = P.r_u8(); id_Squad = P.r_u8(); id_Group = P.r_u8(); GameGraph::_GRAPH_ID t; P.r (&t, sizeof(t)); P.r (&t, sizeof(t)); ai_location().game_vertex (t); if (NET.empty() || (NET.back().dwTimeStamp<N.dwTimeStamp)) { NET.push_back (N); NET_WasInterpolating = TRUE; } setVisible (TRUE); setEnabled (TRUE); CEatableItem::net_Import(P); }
void CInventoryItem::net_Import (NET_Packet& P) { u8 NumItems = 0; NumItems = P.r_u8(); if (!NumItems) return; net_update_IItem N; N.State.force.set (0.f,0.f,0.f); N.State.torque.set (0.f,0.f,0.f); P.r_vec3 (N.State.position); N.State.quaternion.x = P.r_float_q8(0.f,1.f); N.State.quaternion.y = P.r_float_q8(0.f,1.f); N.State.quaternion.z = P.r_float_q8(0.f,1.f); N.State.quaternion.w = P.r_float_q8(0.f,1.f); mask_num_items num_items; num_items.common = NumItems; NumItems = num_items.num_items; N.State.enabled = num_items.mask & CSE_ALifeInventoryItem::inventory_item_state_enabled; if (!(num_items.mask & CSE_ALifeInventoryItem::inventory_item_angular_null)) { N.State.angular_vel.x = P.r_float_q8(0.f,10.f*PI_MUL_2); N.State.angular_vel.y = P.r_float_q8(0.f,10.f*PI_MUL_2); N.State.angular_vel.z = P.r_float_q8(0.f,10.f*PI_MUL_2); } else N.State.angular_vel.set (0.f,0.f,0.f); if (!(num_items.mask & CSE_ALifeInventoryItem::inventory_item_linear_null)) { N.State.linear_vel.x = P.r_float_q8(-32.f,32.f); N.State.linear_vel.y = P.r_float_q8(-32.f,32.f); N.State.linear_vel.z = P.r_float_q8(-32.f,32.f); } else N.State.linear_vel.set (0.f,0.f,0.f); //////////////////////////////////////////// N.State.previous_position = N.State.position; N.State.previous_quaternion = N.State.quaternion; net_updateData *p = NetSync(); //if (!p->NET_IItem.empty() && (p->NET_IItem.back().dwTimeStamp>=N.dwTimeStamp)) // return; if (!p->NET_IItem.empty()) { m_flags.set (FInInterpolate, TRUE); } Level().AddObject_To_Objects4CrPr (m_object); object().CrPr_SetActivated (false); object().CrPr_SetActivationStep (0); p->NET_IItem.push_back (N); while (p->NET_IItem.size() > 2) { p->NET_IItem.pop_front (); }; };
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 CActor::OnEvent(NET_Packet& P, u16 type) { inherited::OnEvent (P,type); CInventoryOwner::OnEvent (P,type); u16 id; switch (type) { case GE_TRADE_BUY: case GE_OWNERSHIP_TAKE: { P.r_u16 (id); CObject* Obj = Level().Objects.net_Find (id); // R_ASSERT2( Obj, make_string("GE_OWNERSHIP_TAKE: Object not found. object_id = [%d]", id).c_str() ); VERIFY2 ( Obj, make_string("GE_OWNERSHIP_TAKE: Object not found. object_id = [%d]", id).c_str() ); if ( !Obj ) { Msg ( "! GE_OWNERSHIP_TAKE: Object not found. object_id = [%d]", id ); break; } CGameObject* _GO = smart_cast<CGameObject*>(Obj); if (!IsGameTypeSingle() && !g_Alive()) { Msg("! WARNING: dead player [%d][%s] can't take items [%d][%s]", ID(), Name(), _GO->ID(), _GO->cNameSect().c_str()); break; } if( inventory().CanTakeItem(smart_cast<CInventoryItem*>(_GO)) ) { Obj->H_SetParent (smart_cast<CObject*>(this)); #ifdef MP_LOGGING string64 act; xr_strcpy( act, (type == GE_TRADE_BUY)? "buys" : "takes" ); Msg("--- Actor [%d][%s] %s [%d][%s]", ID(), Name(), act, _GO->ID(), _GO->cNameSect().c_str()); #endif // MP_LOGGING inventory().Take (_GO, false, true); SelectBestWeapon(Obj); } else { if (IsGameTypeSingle()) { NET_Packet P; u_EventGen (P,GE_OWNERSHIP_REJECT,ID()); P.w_u16 (u16(Obj->ID())); u_EventSend (P); } else { Msg("! ERROR: Actor [%d][%s] tries to drop on take [%d][%s]", ID(), Name(), _GO->ID(), _GO->cNameSect().c_str()); } } } break; case GE_TRADE_SELL: case GE_OWNERSHIP_REJECT: { P.r_u16 (id); CObject* Obj = Level().Objects.net_Find (id); // R_ASSERT2( Obj, make_string("GE_OWNERSHIP_REJECT: Object not found, id = %d", id).c_str() ); VERIFY2 ( Obj, make_string("GE_OWNERSHIP_REJECT: Object not found, id = %d", id).c_str() ); if ( !Obj ) { Msg ( "! GE_OWNERSHIP_REJECT: Object not found, id = %d", id ); break; } bool just_before_destroy = !P.r_eof() && P.r_u8(); bool dont_create_shell = (type==GE_TRADE_SELL) || just_before_destroy; Obj->SetTmpPreDestroy (just_before_destroy); CGameObject * GO = smart_cast<CGameObject*>(Obj); #ifdef MP_LOGGING string64 act; xr_strcpy( act, (type == GE_TRADE_SELL)? "sells" : "rejects" ); Msg("--- Actor [%d][%s] %s [%d][%s]", ID(), Name(), act, GO->ID(), GO->cNameSect().c_str()); #endif // MP_LOGGING VERIFY( GO->H_Parent() ); if ( !GO->H_Parent() ) { Msg("! ERROR: Actor [%d][%s] tries to reject item [%d][%s] that has no parent", ID(), Name(), GO->ID(), GO->cNameSect().c_str()); break; } VERIFY2( GO->H_Parent()->ID() == ID(), make_string("actor [%d][%s] tries to drop not own object [%d][%s]", ID(), Name(), GO->ID(), GO->cNameSect().c_str() ).c_str() ); if ( GO->H_Parent()->ID() != ID() ) { CActor* real_parent = smart_cast<CActor*>(GO->H_Parent()); Msg("! ERROR: Actor [%d][%s] tries to drop not own item [%d][%s], his parent is [%d][%s]", ID(), Name(), GO->ID(), GO->cNameSect().c_str(), real_parent->ID(), real_parent->Name()); break; } if (!Obj->getDestroy() && inventory().DropItem(GO, just_before_destroy, dont_create_shell)) { //O->H_SetParent(0,just_before_destroy);//moved to DropItem //feel_touch_deny(O,2000); Level().m_feel_deny.feel_touch_deny(Obj, 1000); // [12.11.07] Alexander Maniluk: extended GE_OWNERSHIP_REJECT packet for drop item to selected position Fvector dropPosition; if (!P.r_eof()) { P.r_vec3(dropPosition); GO->MoveTo(dropPosition); //Other variant :) /*NET_Packet MovePacket; MovePacket.w_begin(M_MOVE_ARTEFACTS); MovePacket.w_u8(1); MovePacket.w_u16(id); MovePacket.w_vec3(dropPosition); u_EventSend(MovePacket);*/ } } if (!just_before_destroy) SelectBestWeapon(Obj); } break; case GE_INV_ACTION: { u16 cmd; P.r_u16 (cmd); u32 flags; P.r_u32 (flags); s32 ZoomRndSeed = P.r_s32(); s32 ShotRndSeed = P.r_s32(); if (!IsGameTypeSingle() && !g_Alive()) { // Msg("! WARNING: dead player tries to rize inventory action"); break; } if (flags & CMD_START) { if (cmd == kWPN_ZOOM) SetZoomRndSeed(ZoomRndSeed); if (cmd == kWPN_FIRE) SetShotRndSeed(ShotRndSeed); IR_OnKeyboardPress(cmd); } else IR_OnKeyboardRelease(cmd); } break; case GEG_PLAYER_ITEM2SLOT: case GEG_PLAYER_ITEM2BELT: case GEG_PLAYER_ITEM2RUCK: case GEG_PLAYER_ITEM_EAT: case GEG_PLAYER_ACTIVATEARTEFACT: { P.r_u16 (id); CObject* Obj = Level().Objects.net_Find (id); // R_ASSERT2( Obj, make_string("GEG_PLAYER_ITEM_EAT(use): Object not found. object_id = [%d]", id).c_str() ); VERIFY2 ( Obj, make_string("GEG_PLAYER_ITEM_EAT(use): Object not found. object_id = [%d]", id).c_str() ); if ( !Obj ) { // Msg ( "! GEG_PLAYER_ITEM_EAT(use): Object not found. object_id = [%d]", id ); break; } // R_ASSERT2( !Obj->getDestroy(), make_string("GEG_PLAYER_ITEM_EAT(use): Object is destroying. object_id = [%d]", id).c_str() ); VERIFY2 ( !Obj->getDestroy(), make_string("GEG_PLAYER_ITEM_EAT(use): Object is destroying. object_id = [%d]", id).c_str() ); if ( Obj->getDestroy() ) { // Msg ( "! GEG_PLAYER_ITEM_EAT(use): Object is destroying. object_id = [%d]", id ); break; } if (!IsGameTypeSingle() && !g_Alive()) { Msg("! WARNING: dead player [%d][%s] can't use items [%d][%s]", ID(), Name(), Obj->ID(), Obj->cNameSect().c_str()); break; } if ( type == GEG_PLAYER_ACTIVATEARTEFACT ) { CArtefact* pArtefact = smart_cast<CArtefact*>(Obj); // R_ASSERT2( pArtefact, make_string("GEG_PLAYER_ACTIVATEARTEFACT: Artefact not found. artefact_id = [%d]", id).c_str() ); VERIFY2 ( pArtefact, make_string("GEG_PLAYER_ACTIVATEARTEFACT: Artefact not found. artefact_id = [%d]", id).c_str() ); if ( !pArtefact ) { Msg ( "! GEG_PLAYER_ACTIVATEARTEFACT: Artefact not found. artefact_id = [%d]", id ); break;//1 } pArtefact->ActivateArtefact (); break;//1 } PIItem iitem = smart_cast<CInventoryItem*>(Obj); R_ASSERT( iitem ); switch (type) { case GEG_PLAYER_ITEM2SLOT: { u16 slot_id = P.r_u16(); inventory().Slot(slot_id, iitem ); }break;//2 case GEG_PLAYER_ITEM2BELT: inventory().Belt( iitem ); break;//2 case GEG_PLAYER_ITEM2RUCK: inventory().Ruck( iitem ); break;//2 case GEG_PLAYER_ITEM_EAT: inventory().Eat( iitem ); break;//2 }//switch }break;//1 case GEG_PLAYER_ACTIVATE_SLOT: { u16 slot_id; P.r_u16 (slot_id); inventory().Activate (slot_id); }break; case GEG_PLAYER_DISABLE_SPRINT: { s8 cmd = P.r_s8(); m_block_sprint_counter = m_block_sprint_counter+cmd; Msg("m_block_sprint_counter=%d",m_block_sprint_counter); if(m_block_sprint_counter>0) { mstate_wishful &=~mcSprint; } }break; case GEG_PLAYER_WEAPON_HIDE_STATE: { u16 State = P.r_u16(); BOOL Set = !!P.r_u8(); inventory().SetSlotsBlocked (State, !!Set); }break; case GE_MOVE_ACTOR: { Fvector NewPos, NewRot; P.r_vec3(NewPos); P.r_vec3(NewRot); MoveActor(NewPos, NewRot); }break; case GE_ACTOR_MAX_POWER: { conditions().MaxPower(); conditions().ClearWounds(); ClearBloodWounds(); }break; case GE_ACTOR_MAX_HEALTH: { SetfHealth(GetMaxHealth()); }break; case GEG_PLAYER_ATTACH_HOLDER: { u16 id = P.r_u16(); CObject* O = Level().Objects.net_Find (id); if (!O){ Msg("! Error: No object to attach holder [%d]", id); break; } VERIFY(m_holder==NULL); CHolderCustom* holder = smart_cast<CHolderCustom*>(O); if(!holder->Engaged()) use_Holder (holder); }break; case GEG_PLAYER_DETACH_HOLDER: { if (!m_holder) break; u16 id = P.r_u16(); CGameObject* GO = smart_cast<CGameObject*>(m_holder); VERIFY (id==GO->ID()); use_Holder (NULL); }break; case GEG_PLAYER_PLAY_HEADSHOT_PARTICLE: { OnPlayHeadShotParticle(P); }break; case GE_ACTOR_JUMPING: { /* Fvector dir; P.r_dir(dir); float jump = P.r_float(); NET_SavedAccel = dir; extern float NET_Jump; NET_Jump = jump; m_bInInterpolation = false; mstate_real |= mcJump; */ }break; } }
void CActor::OnEvent (NET_Packet& P, u16 type) { inherited::OnEvent (P,type); CInventoryOwner::OnEvent (P,type); u16 id; switch (type) { case GE_TRADE_BUY: case GE_OWNERSHIP_TAKE: { P.r_u16 (id); CObject* O = Level().Objects.net_Find (id); if (!O) { Msg("! Error: No object to take/buy [%d]", id); break; } CGameObject* _GO = smart_cast<CGameObject*>(O); CFoodItem* pFood = smart_cast<CFoodItem*>(O); if(pFood) #if defined(INV_NEW_SLOTS_SYSTEM) if (pFood->m_eItemPlace != eItemPlaceSlot) #endif pFood->m_eItemPlace = eItemPlaceRuck; if( inventory().CanTakeItem(smart_cast<CInventoryItem*>(_GO)) ) { O->H_SetParent(smart_cast<CObject*>(this)); inventory().Take(_GO, false, true); CUIGameSP* pGameSP = NULL; CUI* ui = HUD().GetUI(); if( ui&&ui->UIGame() ) { pGameSP = smart_cast<CUIGameSP*>(HUD().GetUI()->UIGame()); if (Level().CurrentViewEntity() == this) HUD().GetUI()->UIGame()->ReInitShownUI(); }; //добавить отсоединенный аддон в инвентарь if(pGameSP) { if(pGameSP->MainInputReceiver() == pGameSP->InventoryMenu) { pGameSP->InventoryMenu->AddItemToBag(smart_cast<CInventoryItem*>(O)); } } SelectBestWeapon(O); } else { NET_Packet P; u_EventGen(P,GE_OWNERSHIP_REJECT,ID()); P.w_u16(u16(O->ID())); u_EventSend(P); } } break; case GE_TRADE_SELL: case GE_OWNERSHIP_REJECT: { P.r_u16 (id); CObject* O = Level().Objects.net_Find (id); if (!O) { Msg("! Error: No object to reject/sell [%d]", id); break; } bool just_before_destroy = !P.r_eof() && P.r_u8(); O->SetTmpPreDestroy (just_before_destroy); if (inventory().DropItem(smart_cast<CGameObject*>(O)) && !O->getDestroy()) { O->H_SetParent(0,just_before_destroy); //. feel_touch_deny(O,2000); Level().m_feel_deny.feel_touch_deny(O, 1000); } SelectBestWeapon(O); if (Level().CurrentViewEntity() == this && HUD().GetUI() && HUD().GetUI()->UIGame()) HUD().GetUI()->UIGame()->ReInitShownUI(); } break; case GE_INV_ACTION: { s32 cmd; P.r_s32 (cmd); u32 flags; P.r_u32 (flags); s32 ZoomRndSeed = P.r_s32(); s32 ShotRndSeed = P.r_s32(); if (flags & CMD_START) { if (cmd == kWPN_ZOOM) SetZoomRndSeed(ZoomRndSeed); if (cmd == kWPN_FIRE) SetShotRndSeed(ShotRndSeed); IR_OnKeyboardPress(cmd); } else IR_OnKeyboardRelease(cmd); } break; case GEG_PLAYER_ITEM2SLOT: case GEG_PLAYER_ITEM2BELT: case GEG_PLAYER_ITEM2RUCK: case GEG_PLAYER_ITEM_EAT: case GEG_PLAYER_ACTIVATEARTEFACT: { P.r_u16 (id); CObject* O = Level().Objects.net_Find (id); if(!O) break; if (O->getDestroy()) { #ifdef DEBUG Msg("! something to destroyed object - %s[%d]0x%X", *O->cName(), id, smart_cast<CInventoryItem*>(O)); #endif break; } switch (type) { case GEG_PLAYER_ITEM2SLOT: inventory().Slot(smart_cast<CInventoryItem*>(O)); break; case GEG_PLAYER_ITEM2BELT: inventory().Belt(smart_cast<CInventoryItem*>(O)); break; case GEG_PLAYER_ITEM2RUCK: inventory().Ruck(smart_cast<CInventoryItem*>(O)); break; case GEG_PLAYER_ITEM_EAT: inventory().Eat(smart_cast<CInventoryItem*>(O)); break; case GEG_PLAYER_ACTIVATEARTEFACT: { CArtefact* pArtefact = smart_cast<CArtefact*>(O); pArtefact->ActivateArtefact (); }break; } }break; case GEG_PLAYER_ACTIVATE_SLOT: { u32 slot_id; P.r_u32 (slot_id); inventory().Activate (slot_id); }break; case GEG_PLAYER_WEAPON_HIDE_STATE: { u32 State = P.r_u32(); BOOL Set = !!P.r_u8(); inventory().SetSlotsBlocked ((u16)State, !!Set); }break; case GE_MOVE_ACTOR: { Fvector NewPos, NewRot; P.r_vec3(NewPos); P.r_vec3(NewRot); MoveActor(NewPos, NewRot); }break; case GE_ACTOR_MAX_POWER: { conditions().MaxPower(); conditions().ClearWounds(); ClearBloodWounds(); }break; case GEG_PLAYER_ATTACH_HOLDER: { u32 id = P.r_u32(); CObject* O = Level().Objects.net_Find (id); if (!O){ Msg("! Error: No object to attach holder [%d]", id); break; } VERIFY(m_holder==NULL); CHolderCustom* holder = smart_cast<CHolderCustom*>(O); if(!holder->Engaged()) use_Holder (holder); }break; case GEG_PLAYER_DETACH_HOLDER: { if (!m_holder) break; u32 id = P.r_u32(); CGameObject* GO = smart_cast<CGameObject*>(m_holder); VERIFY (id==GO->ID()); use_Holder (NULL); }break; case GEG_PLAYER_PLAY_HEADSHOT_PARTICLE: { OnPlayHeadShotParticle(P); }break; case GE_ACTOR_JUMPING: { /* Fvector dir; P.r_dir(dir); float jump = P.r_float(); NET_SavedAccel = dir; extern float NET_Jump; NET_Jump = jump; m_bInInterpolation = false; mstate_real |= mcJump; */ }break; } }
BOOL CSE_Abstract::Spawn_Read (NET_Packet &tNetPacket) { u16 dummy16; // generic tNetPacket.r_begin (dummy16); R_ASSERT (M_SPAWN==dummy16); tNetPacket.r_stringZ (s_name ); string256 temp; tNetPacket.r_stringZ (temp); set_name_replace (temp); tNetPacket.r_u8 (s_gameid ); tNetPacket.r_u8 (s_RP ); tNetPacket.r_vec3 (o_Position ); tNetPacket.r_vec3 (o_Angle ); tNetPacket.r_u16 (RespawnTime ); tNetPacket.r_u16 (ID ); tNetPacket.r_u16 (ID_Parent ); tNetPacket.r_u16 (ID_Phantom ); tNetPacket.r_u16 (s_flags.flags ); // dangerous!!!!!!!!! if (s_flags.is(M_SPAWN_VERSION)) tNetPacket.r_u16 (m_wVersion); if (0==m_wVersion) { tNetPacket.r_pos -= sizeof(u16); m_wVersion = 0; return FALSE; } if (m_wVersion > 69) m_script_version = tNetPacket.r_u16(); // read specific data //client object custom data serialization LOAD if (m_wVersion > 70) { u16 client_data_size = (m_wVersion > 93) ? tNetPacket.r_u16() : tNetPacket.r_u8(); //не может быть больше 256 байт if (client_data_size > 0) { // Msg ("SERVER:loading:load:%d bytes:%d:%s",client_data_size,ID,s_name_replace ? s_name_replace : ""); client_data.resize (client_data_size); tNetPacket.r (&*client_data.begin(),client_data_size); } else client_data.clear (); } else client_data.clear (); if (m_wVersion > 79) tNetPacket.r (&m_tSpawnID, sizeof(m_tSpawnID)); if (m_wVersion < 112) { if (m_wVersion > 82) tNetPacket.r_float ();//m_spawn_probability); if (m_wVersion > 83) { tNetPacket.r_u32 ();//m_spawn_flags.assign(tNetPacket.r_u32()); xr_string temp; tNetPacket.r_stringZ (temp);//tNetPacket.r_stringZ(m_spawn_control); tNetPacket.r_u32 ();//m_max_spawn_count); // this stuff we do not need even in case of uncomment tNetPacket.r_u32 ();//m_spawn_count); tNetPacket.r_u64 ();//m_last_spawn_time); } if (m_wVersion > 84) { tNetPacket.r_u64 ();//m_min_spawn_interval); tNetPacket.r_u64 ();//m_max_spawn_interval); } } u16 size; tNetPacket.r_u16 (size); // size R_ASSERT3 ((m_tClassID == CLSID_SPECTATOR) || (size > sizeof(size)),"cannot read object, which is not successfully saved :(",name_replace()); STATE_Read (tNetPacket,size); return TRUE; }
void CSE_ALifeInventoryItem::UPDATE_Read (NET_Packet &tNetPacket) { tNetPacket.r_u8 (m_u8NumItems); if (!m_u8NumItems) { //Msg("* Object [%d] has no sync items", this->cast_abstract()->ID); return; } mask_num_items num_items; num_items.common = m_u8NumItems; m_u8NumItems = num_items.num_items; R_ASSERT2 ( m_u8NumItems < (u8(1) << 5), make_string("%d",m_u8NumItems) ); /*if (check(num_items.mask,animated)) { tNetPacket.r_float(m_blend_timeCurrent); anim_use=true; } else { anim_use=false; }*/ { tNetPacket.r_vec3 (State.force); tNetPacket.r_vec3 (State.torque); tNetPacket.r_vec3 (State.position); base()->o_Position.set (State.position); //this is very important because many functions use this o_Position.. tNetPacket.r_float (State.quaternion.x); tNetPacket.r_float (State.quaternion.y); tNetPacket.r_float (State.quaternion.z); tNetPacket.r_float (State.quaternion.w); State.enabled = check(num_items.mask,inventory_item_state_enabled); if (!check(num_items.mask,inventory_item_angular_null)) { tNetPacket.r_float (State.angular_vel.x); tNetPacket.r_float (State.angular_vel.y); tNetPacket.r_float (State.angular_vel.z); } else State.angular_vel.set (0.f,0.f,0.f); if (!check(num_items.mask,inventory_item_linear_null)) { tNetPacket.r_float (State.linear_vel.x); tNetPacket.r_float (State.linear_vel.y); tNetPacket.r_float (State.linear_vel.z); } else State.linear_vel.set (0.f,0.f,0.f); /*if (check(num_items.mask,animated)) { anim_use=true; }*/ } prev_freezed = freezed; if (tNetPacket.r_eof()) // in case spawn + update { freezed = false; return; } if (tNetPacket.r_u8()) { freezed = false; } else { if (!freezed) #ifdef XRGAME_EXPORTS m_freeze_time = Device.dwTimeGlobal; #else m_freeze_time = 0; #endif freezed = true; } };
bool CALifeUpdateManager::change_level (NET_Packet &net_packet) { if (m_changing_level) return (false); // prepare_objects_for_save (); // we couldn't use prepare_objects_for_save since we need // get updates from client // then change actor server entity // then call client net_Save // then restore actor server entity Level().ClientSend (); m_changing_level = true; GameGraph::_GRAPH_ID safe_graph_vertex_id = graph().actor()->m_tGraphID; u32 safe_level_vertex_id = graph().actor()->m_tNodeID; Fvector safe_position = graph().actor()->o_Position; Fvector safe_angles = graph().actor()->o_Angle; SRotation safe_torso = graph().actor()->o_torso; GameGraph::_GRAPH_ID holder_safe_graph_vertex_id = GameGraph::_GRAPH_ID(-1); u32 holder_safe_level_vertex_id = u32(-1); Fvector holder_safe_position = Fvector().set(flt_max,flt_max,flt_max); Fvector holder_safe_angles = Fvector().set(flt_max,flt_max,flt_max); CSE_ALifeObject *holder = 0; net_packet.r (&graph().actor()->m_tGraphID,sizeof(graph().actor()->m_tGraphID)); net_packet.r (&graph().actor()->m_tNodeID,sizeof(graph().actor()->m_tNodeID)); net_packet.r_vec3 (graph().actor()->o_Position); net_packet.r_vec3 (graph().actor()->o_Angle); Level().ClientSave (); graph().actor()->o_torso.yaw = graph().actor()->o_Angle.y; graph().actor()->o_torso.pitch = graph().actor()->o_Angle.x; graph().actor()->o_torso.roll = 0.f; if (graph().actor()->m_holderID != 0xffff) { holder = objects().object(graph().actor()->m_holderID); holder_safe_graph_vertex_id = holder->m_tGraphID; holder_safe_level_vertex_id = holder->m_tNodeID; holder_safe_position = holder->o_Position; holder_safe_angles = holder->o_Angle; holder->m_tGraphID = graph().actor()->m_tGraphID; holder->m_tNodeID = graph().actor()->m_tNodeID; holder->o_Position = graph().actor()->o_Position; holder->o_Angle = graph().actor()->o_Angle; } string256 autoave_name; strconcat (sizeof(autoave_name),autoave_name,Core.UserName,"_","autosave"); LPCSTR temp0 = strstr(**m_server_command_line,"/"); VERIFY (temp0); string256 temp; *m_server_command_line = strconcat(sizeof(temp),temp,autoave_name,temp0); save (autoave_name); graph().actor()->m_tGraphID = safe_graph_vertex_id; graph().actor()->m_tNodeID = safe_level_vertex_id; graph().actor()->o_Position = safe_position; graph().actor()->o_Angle = safe_angles; graph().actor()->o_torso = safe_torso; if (graph().actor()->m_holderID != 0xffff) { VERIFY (holder); holder->m_tGraphID = holder_safe_graph_vertex_id; holder->m_tNodeID = holder_safe_level_vertex_id; holder->o_Position = holder_safe_position; holder->o_Angle = holder_safe_angles; } return (true); }
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(); }