void xrServer::AttachNewClient (IClient* CL) { MSYS_CONFIG msgConfig; msgConfig.sign1 = 0x12071980; msgConfig.sign2 = 0x26111975; msgConfig.is_battleye = 0; #ifdef BATTLEYE msgConfig.is_battleye = (g_pGameLevel && Level().battleye_system.server != 0)? 1 : 0; #endif // BATTLEYE if(psNET_direct_connect) //single_game { SV_Client = CL; CL->flags.bLocal = 1; SendTo_LL( SV_Client->ID, &msgConfig, sizeof(msgConfig), net_flags(TRUE,TRUE,TRUE,TRUE) ); } else { SendTo_LL (CL->ID,&msgConfig,sizeof(msgConfig), net_flags(TRUE, TRUE, TRUE, TRUE)); Server_Client_Check (CL); } // gen message if (!NeedToCheckClient_GameSpy_CDKey(CL)) { //------------------------------------------------------------- Check_GameSpy_CDKey_Success(CL); } //xrClientData * CL_D=(xrClientData*)(CL); //ip_address ClAddress; //GetClientAddress (CL->ID, ClAddress); CL->m_guid[0]=0; }
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 xrServer::SLS_Clear () { #if 0 Msg ("SLS-CLEAR : %d objects"); xrS_entities::const_iterator I = entities.begin(); xrS_entities::const_iterator E = entities.end(); for ( ; I != E; ++I) Msg ("entity to destroy : [%d][%s][%s]",(*I).second->ID,(*I).second->name(),(*I).second->name_replace()); #endif u32 mode = net_flags(TRUE,TRUE); while (!entities.empty()) { bool found = false; xrS_entities::const_iterator I = entities.begin(); xrS_entities::const_iterator E = entities.end(); for ( ; I != E; ++I) { if ((*I).second->ID_Parent != 0xffff) continue; found = true; Perform_destroy ((*I).second,mode); break; } R_ASSERT (found); } }
void CLevel::g_cl_Spawn (LPCSTR name, u8 rp, u16 flags, Fvector pos) { // Create CSE_Abstract* E = F_entity_Create(name); VERIFY (E); // Fill E->s_name = name; E->set_name_replace (""); //. E->s_gameid = u8(GameID()); E->s_RP = rp; E->ID = 0xffff; E->ID_Parent = 0xffff; E->ID_Phantom = 0xffff; E->s_flags.assign (flags); E->RespawnTime = 0; E->o_Position = pos; // Send NET_Packet P; E->Spawn_Write (P,TRUE); Send (P,net_flags(TRUE)); // Destroy F_entity_Destroy (E); }
void CEntity::KillEntity(u16 whoID) { if (whoID != ID()) { #ifdef DEBUG if (m_killer_id != ALife::_OBJECT_ID(-1)) { Msg ("! Entity [%s][%s] already has killer with id %d, but new killer id arrived - %d",*cNameSect(),*cName(),m_killer_id,whoID); CObject *old_killer = Level().Objects.net_Find(m_killer_id); Msg ("! Old killer is %s",old_killer ? *old_killer->cName() : "unknown"); CObject *new_killer = Level().Objects.net_Find(whoID); Msg ("! New killer is %s",new_killer ? *new_killer->cName() : "unknown"); VERIFY (m_killer_id == ALife::_OBJECT_ID(-1)); } #endif } else { if (m_killer_id != ALife::_OBJECT_ID(-1)) return; } m_killer_id = whoID; set_death_time (); if (!getDestroy()){ NET_Packet P; u_EventGen (P,GE_DIE,ID()); P.w_u16 (u16(whoID)); P.w_u32 (0); if (OnServer()) u_EventSend (P, net_flags(TRUE, TRUE, FALSE, TRUE)); } };
/////////spawn object representing destroyed item////////////////////////////////////////////////////////////////////////////////// void CPHDestroyable::GenSpawnReplace(u16 ref_id,LPCSTR section,shared_str visual_name) { CSE_Abstract *D = F_entity_Create(section);//*cNameSect() VERIFY (D); CSE_Visual *V =smart_cast<CSE_Visual*>(D); V->set_visual (*visual_name); CSE_PHSkeleton *l_tpPHSkeleton = smart_cast<CSE_PHSkeleton*>(D); VERIFY (l_tpPHSkeleton); l_tpPHSkeleton->source_id = ref_id; //init // Send D->s_name = section;//*cNameSect() D->ID_Parent = u16(-1); InitServerObject (D); if (OnServer()) { NET_Packet P; D->Spawn_Write (P,TRUE); Level().Send (P,net_flags(TRUE)); // Destroy F_entity_Destroy (D); m_depended_objects++; }; };
void CLevelChanger::feel_touch_new (CObject *tpObject) { CActor* l_tpActor = smart_cast<CActor*>(tpObject); VERIFY (l_tpActor); if (!l_tpActor->g_Alive()) return; if (m_bSilentMode) { NET_Packet p; p.w_begin (M_CHANGE_LEVEL); p.w (&m_game_vertex_id,sizeof(m_game_vertex_id)); p.w (&m_level_vertex_id,sizeof(m_level_vertex_id)); p.w_vec3 (m_position); p.w_vec3 (m_angles); Level().Send(p,net_flags(TRUE)); return; } Fvector p,r; bool b = get_reject_pos(p,r); CUIGameSP *pGameSP = smart_cast<CUIGameSP*>(HUD().GetUI()->UIGame()); if (pGameSP) pGameSP->ChangeLevel (m_game_vertex_id,m_level_vertex_id,m_position,m_angles,p,r,b); m_entrance_time = Device.fTimeGlobal; }
void xrServer::Process_event_activate (NET_Packet& P, const ClientID sender, const u32 time, const u16 id_parent, const u16 id_entity, bool send_message) { // Parse message CSE_Abstract* e_parent = game->get_entity_from_eid (id_parent); CSE_Abstract* e_entity = game->get_entity_from_eid (id_entity); #ifndef MASTER_GOLD Msg("* Artefact activate (parent = %d) (item = %d)", id_parent, id_entity); #endif // #ifndef MASTER_GOLD R_ASSERT2 (e_parent, make_string("parent not found. id_parent=%d id_entity=%d frame=%d",id_parent,id_entity, Device.dwFrame).c_str()); R_ASSERT2 (e_entity, make_string("entity not found. id_parent=%d id_entity=%d frame=%d",id_parent,id_entity, Device.dwFrame).c_str()); if (!game->OnActivate(id_parent, id_entity)) return; if (0xffff == e_entity->ID_Parent) { #ifndef MASTER_GOLD Msg ("! ERROR: can't activate independant object. entity[%s:%d], parent[%s:%d], section[%s]", e_entity->name_replace(),id_entity,e_parent->name_replace(),id_parent, *e_entity->s_name); #endif // #ifndef MASTER_GOLD return; } // Signal to everyone (including sender) if (send_message) { DWORD MODE = net_flags(TRUE,TRUE, FALSE, TRUE); SendBroadcast (BroadcastCID,P,MODE); } return; }
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 CRestrictedObject::remove_all_restrictions (const RestrictionSpace::ERestrictorTypes &restrictor_type) { NET_Packet net_packet; object().u_EventGen (net_packet,GE_REMOVE_ALL_RESTRICTIONS,object().ID()); net_packet.w (&restrictor_type,sizeof(restrictor_type)); Level().Send (net_packet,net_flags(TRUE,TRUE)); }
BOOL CLevel::Connect2Server (LPCSTR options) { NET_Packet P; m_bConnectResultReceived = false ; m_bConnectResult = true ; if (!Connect(options)) return FALSE; //--------------------------------------------------------------------------- if(psNET_direct_connect) m_bConnectResultReceived = true; u32 EndTime = GetTickCount() + ConnectionTimeOut; while (!m_bConnectResultReceived) { ClientReceive (); Sleep (5); if(Server) Server->Update() ; //----------------------------------------- u32 CurTime = GetTickCount(); if (CurTime > EndTime) { NET_Packet P; P.B.count = 0; P.r_pos = 0; P.w_u8(0); P.w_u8(0); P.w_stringZ("Data verification failed. Cheater? [1]"); OnConnectResult(&P); } if (net_isFails_Connect()) { OnConnectRejected (); Disconnect () ; return FALSE; } //----------------------------------------- } Msg ("%c client : connection %s - <%s>", m_bConnectResult ?'*':'!', m_bConnectResult ? "accepted" : "rejected", m_sConnectResult.c_str()); if (!m_bConnectResult) { OnConnectRejected (); Disconnect () ; return FALSE ; }; if(psNET_direct_connect) net_Syncronised = TRUE; else net_Syncronize (); while (!net_IsSyncronised()) { }; //--------------------------------------------------------------------------- P.w_begin (M_CLIENT_REQUEST_CONNECTION_DATA); Send (P, net_flags(TRUE, TRUE, TRUE, TRUE)); //--------------------------------------------------------------------------- return TRUE; };
void BattlEyeServer::SendPacket( int player, void* packet, int len ) { NET_Packet P; P.w_begin( M_BATTLEYE ); P.w_u32( len ); P.w( packet, len ); Level().Server->SendTo( (u32)player, P, net_flags() ); }
IC void CRestrictedObject::remove_object_restriction(ALife::_OBJECT_ID id, const RestrictionSpace::ERestrictorTypes &restrictor_type) { NET_Packet net_packet; object().u_EventGen (net_packet,GE_REMOVE_RESTRICTION,object().ID()); net_packet.w (&id,sizeof(id)); net_packet.w (&restrictor_type,sizeof(restrictor_type)); Level().Send (net_packet,net_flags(TRUE,TRUE)); }
void CLevel::OnBuildVersionChallenge () { NET_Packet P; P.w_begin (M_CL_AUTH); u64 auth = FS.auth_get(); P.w_u64 (auth); Send (P, net_flags(TRUE, TRUE, TRUE, TRUE)); };
void CPhysicsShellHolder::on_physics_disable() { if (IsGameTypeSingle()) return; NET_Packet net_packet; u_EventGen (net_packet,GE_FREEZE_OBJECT,ID()); Level().Send (net_packet,net_flags(TRUE,TRUE)); }
void game_sv_TeamDeathmatch::OnPlayerChangeTeam(ClientID id_who, s16 team) { game_PlayerState* ps_who = get_id (id_who); if (!ps_who) return; if (!team) { if (!ps_who->team) team = AutoTeam(); else if (TeamSizeEqual()) { team = ps_who->team; } else { team = AutoTeam(); } }; //----------------------------------------------------- NET_Packet Px; GenerateGameMessage(Px); Px.w_u32(GAME_EVENT_PLAYER_GAME_MENU_RESPOND); Px.w_u8(PLAYER_CHANGE_TEAM); Px.w_s16(team); m_server->SendTo(id_who,Px,net_flags(TRUE,TRUE)); //----------------------------------------------------- if (ps_who->team == team) return; //----------------------------------------------------- KillPlayer(id_who, ps_who->GameID); //----------------------------------------------------- ps_who->setFlag(GAME_PLAYER_FLAG_SPECTATOR); //----------------------------------------------------- s16 OldTeam = ps_who->team; ps_who->team = u8(team & 0x00ff); TeamStruct* pTS = GetTeamData(team); if (pTS) { if ((ps_who->money_for_round < pTS->m_iM_Start) || (OldTeam == 0)) Money_SetStart(id_who); } ///////////////////////////////////////////////////////// //Send Switch team message NET_Packet P; // P.w_begin (M_GAMEMESSAGE); GenerateGameMessage (P); P.w_u32 (PLAYER_CHANGE_TEAM); P.w_u16 (ps_who->GameID); P.w_u16 (ps_who->team); P.w_u16 (team); u_EventSend(P); ///////////////////////////////////////////////////////// SetPlayersDefItems(ps_who); }
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 CTeamBaseZone::feel_touch_delete (CObject *tpObject) { if(OnServer() && tpObject->CLS_ID == CLSID_OBJECT_ACTOR) { NET_Packet P_; u_EventGen (P_,GE_GAME_EVENT,ID() ); P_.w_u16 (GAME_EVENT_PLAYER_LEAVE_TEAM_BASE ); P_.w_u16 ( tpObject->ID() ); P_.w_u8 ( GetZoneTeam() ); u_EventSend (P_,net_flags(TRUE,TRUE)); }; }
void CLevel::SendPingMessage () { u32 CurTime = timeServer_Async(); if (CurTime < (m_dwCL_PingLastSendTime + m_dwCL_PingDeltaSend)) return; u32 m_dwCL_PingLastSendTime = CurTime; NET_Packet P; P.w_begin (M_CL_PING_CHALLENGE); P.w_u32 (m_dwCL_PingLastSendTime); P.w_u32 (m_dwCL_PingLastSendTime); P.w_u32 (m_dwRealPing); Send (P, net_flags(FALSE)); };
void CChangeLevelWnd::OnOk() { Game().StartStopMenu (this, true); NET_Packet p; p.w_begin (M_CHANGE_LEVEL); p.w (&m_game_vertex_id,sizeof(m_game_vertex_id)); p.w (&m_level_vertex_id,sizeof(m_level_vertex_id)); p.w_vec3 (m_position); p.w_vec3 (m_angles); Level().Send (p,net_flags(TRUE)); }
void CLevel::OnBuildVersionChallenge () { NET_Packet P; P.w_begin (M_CL_AUTH); #ifdef DEBUG u64 auth = MP_DEBUG_AUTH; #else u64 auth = FS.auth_get(); #endif //#ifdef DEBUG P.w_u64 (auth); SecureSend (P, net_flags(TRUE, TRUE, TRUE, TRUE)); };
virtual void Execute(LPCSTR args) { if (!ai().get_alife()) { Log ("! ALife simulator has not been started yet"); return; } string256 saved_game; saved_game[0] = 0; //. sscanf (args,"%s",saved_game); strcpy_s (saved_game, args); if (!xr_strlen(saved_game)) { Log ("! Specify file name!"); return; } if (!CSavedGameWrapper::saved_game_exist(saved_game)) { Msg ("! Cannot find saved game %s",saved_game); return; } if (!CSavedGameWrapper::valid_saved_game(saved_game)) { Msg ("! Cannot load saved game %s, version mismatch or saved game is corrupted",saved_game); return; } /* moved to level_network_messages.cpp CSavedGameWrapper wrapper(args); if (wrapper.level_id() == ai().level_graph().level_id()) { if (Device.Paused()) Device.Pause (FALSE, TRUE, TRUE, "CCC_ALifeLoadFrom"); Level().remove_objects (); game_sv_Single *game = smart_cast<game_sv_Single*>(Level().Server->game); R_ASSERT (game); game->restart_simulator (saved_game); return; } */ if(MainMenu()->IsActive()) MainMenu()->Activate(false); if (Device.Paused()) Device.Pause (FALSE, TRUE, TRUE, "CCC_ALifeLoadFrom"); NET_Packet net_packet; net_packet.w_begin (M_LOAD_GAME); net_packet.w_stringZ (saved_game); Level().Send (net_packet,net_flags(TRUE)); }
void xrServer::SendConnectionData(IClient* _CL) { g_perform_spawn_ids.clear_not_free(); xrClientData* CL = (xrClientData*)_CL; NET_Packet P; u32 mode = net_flags(TRUE,TRUE); // Replicate current entities on to this client xrS_entities::iterator I=entities.begin(),E=entities.end(); for (; I!=E; ++I) I->second->net_Processed = FALSE; for (I=entities.begin(); I!=E; ++I) Perform_connect_spawn (I->second,CL,P); // Send "finished" signal P.w_begin (M_SV_CONFIG_FINISHED); SendTo (CL->ID,P,mode); };
void CWeapon::SendHiddenItem() { if (!CHudItem::object().getDestroy() && m_pInventory) { // !!! 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(eHiding)); 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)); SetPending (TRUE); } }
virtual void Execute(LPCSTR args) { if ((GameID() == GAME_SINGLE) &&ai().get_alife()) { float id1 = 0.0f; sscanf(args ,"%f",&id1); if (id1 < 2.0f) Msg("Invalid online distance! (%.4f)",id1); else { NET_Packet P; P.w_begin (M_SWITCH_DISTANCE); P.w_float (id1); Level().Send (P,net_flags(TRUE,TRUE)); } } else Log("!Not a single player game!"); }
void CLevel::ClientSave () { NET_Packet P; u32 start = 0; for (;;) { P.w_begin (M_SAVE_PACKET); start = Objects_net_Save(&P, start, max_objects_size_in_save); if (P.B.count>2) Send (P, net_flags(FALSE)); else break; } }
void clientdata_proxy::notify_admin(clientdata_event_t event_for_admin, char const * reason) { NET_Packet ssr_packet; ssr_packet.w_begin (M_GAMEMESSAGE); ssr_packet.w_u32 (GAME_EVENT_MAKE_DATA); ssr_packet.w_u8 (static_cast<u8>(event_for_admin)); //receive data ssr_packet.w_u32 (m_chearer_id.value()); if ((event_for_admin == e_screenshot_response) || (event_for_admin == e_configs_response)) { ssr_packet.w_stringZ (m_cheater_name); } else { ssr_packet.w_stringZ (reason ? reason : "failed to download screenshot"); } Level().Server->SendTo (m_admin_id, ssr_packet, net_flags(TRUE, TRUE)); }
void xrServer::Perform_connect_spawn(CSE_Abstract* E, xrClientData* CL, NET_Packet& P) { xr_vector<u16>::iterator it = std::find(g_perform_spawn_ids.begin(), g_perform_spawn_ids.end(), E->ID); if(it!=g_perform_spawn_ids.end()) return; g_perform_spawn_ids.push_back(E->ID); if (E->net_Processed) return; if (E->s_flags.is(M_SPAWN_OBJECT_PHANTOM)) return; // Connectivity order CSE_Abstract* Parent = ID_to_entity (E->ID_Parent); if (Parent) Perform_connect_spawn (Parent,CL,P); // Process Flags16 save = E->s_flags; //------------------------------------------------- E->s_flags.set (M_SPAWN_UPDATE,TRUE); if (0==E->owner) { // PROCESS NAME; Name this entity if (E->s_flags.is(M_SPAWN_OBJECT_ASPLAYER)) { CL->owner = E; E->set_name_replace (*CL->name); } // Associate E->owner = CL; E->Spawn_Write (P,TRUE ); E->UPDATE_Write (P); } else { // Just inform E->Spawn_Write (P,FALSE); E->UPDATE_Write (P); } //----------------------------------------------------- E->s_flags = save; SendTo (CL->ID,P,net_flags(TRUE,TRUE)); E->net_Processed = TRUE; }
//процесс отсоединения вещи заключается в спауне новой вещи //в инвентаре и установке соответствующих флагов в родительском //объекте, поэтому функция должна быть переопределена 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 CPHSkeleton::SpawnCopy() { if(PPhysicsShellHolder()->Local()) { CSE_Abstract* D = F_entity_Create("ph_skeleton_object");//*cNameSect() R_ASSERT (D); ///////////////////////////////////////////////////////////////////////////////////////////// CSE_ALifePHSkeletonObject *l_tpALifePhysicObject = smart_cast<CSE_ALifePHSkeletonObject*>(D); R_ASSERT (l_tpALifePhysicObject); l_tpALifePhysicObject->_flags.set (CSE_PHSkeleton::flSpawnCopy,1); //SetNotNeedSave() ///////////////////////////////////////////////////////////////////////////////////////////// InitServerObject (D); // Send NET_Packet P; D->Spawn_Write (P,TRUE); Level().Send (P,net_flags(TRUE)); // Destroy F_entity_Destroy (D); } }