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); }
CSE_Abstract *CALifeSimulatorBase::spawn_item (LPCSTR section, const Fvector &position, u32 level_vertex_id, GameGraph::_GRAPH_ID game_vertex_id, u16 parent_id, bool registration) { CSE_Abstract *abstract = F_entity_Create(section); R_ASSERT3 (abstract,"Cannot find item with section",section); abstract->s_name = section; abstract->s_gameid = u8(GAME_SINGLE); // GameID() abstract->s_RP = 0xff; abstract->ID = server().PerformIDgen(0xffff); abstract->ID_Parent = parent_id; abstract->ID_Phantom = 0xffff; abstract->o_Position = position; abstract->m_wVersion = SPAWN_VERSION; string256 s_name_replace; strcpy (s_name_replace,*abstract->s_name); if (abstract->ID < 1000) strcat (s_name_replace,"0"); if (abstract->ID < 100) strcat (s_name_replace,"0"); if (abstract->ID < 10) strcat (s_name_replace,"0"); string16 S1; strcat (s_name_replace,itoa(abstract->ID,S1,10)); abstract->set_name_replace (s_name_replace); CSE_ALifeDynamicObject *dynamic_object = smart_cast<CSE_ALifeDynamicObject*>(abstract); VERIFY (dynamic_object); //оружие спавним с полным магазинои CSE_ALifeItemWeapon* weapon = smart_cast<CSE_ALifeItemWeapon*>(dynamic_object); if(weapon) weapon->a_elapsed = weapon->get_ammo_magsize(); dynamic_object->m_tNodeID = level_vertex_id; dynamic_object->m_tGraphID = game_vertex_id; dynamic_object->m_tSpawnID = u16(-1); if (registration) register_object (dynamic_object,true); #ifdef LUAICP_COMPAT if (parent_id < 0xFFFF) { CSE_Abstract *parent = (CSE_Abstract*) objects().object(parent_id,true); if (parent && parent->name() && strstr(parent->name(), "physic_")) { Msg("!WARN: object with section %-32s spawned into %s", section, parent->name()); Msg(" %s", get_lua_traceback(game_lua(), 1)); } } #endif dynamic_object->spawn_supplies (); dynamic_object->on_spawn (); // Msg ("LSS : SPAWN : [%s],[%s], level %s",*dynamic_object->s_name,dynamic_object->name_replace(),*ai().game_graph().header().level(ai().game_graph().vertex(dynamic_object->m_tGraphID)->level_id()).name()); return (dynamic_object); }
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); }
//процесс отсоединения вещи заключается в спауне новой вещи //в инвентаре и установке соответствующих флагов в родительском //объекте, поэтому функция должна быть переопределена 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; }
CSE_Abstract *CLevel::spawn_item (LPCSTR section, const Fvector &position, u32 level_vertex_id, u16 parent_id, bool return_item) { CSE_Abstract *abstract = F_entity_Create(section); R_ASSERT3 (abstract,"Cannot find item with section",section); CSE_ALifeDynamicObject *dynamic_object = smart_cast<CSE_ALifeDynamicObject*>(abstract); if (dynamic_object && ai().get_level_graph()) { dynamic_object->m_tNodeID = level_vertex_id; if (ai().level_graph().valid_vertex_id(level_vertex_id) && ai().get_game_graph() && ai().get_cross_table()) dynamic_object->m_tGraphID = ai().cross_table().vertex(level_vertex_id).game_vertex_id(); } //оружие спавним с полным магазинои CSE_ALifeItemWeapon* weapon = smart_cast<CSE_ALifeItemWeapon*>(abstract); if(weapon) weapon->a_elapsed = weapon->get_ammo_magsize(); // Fill abstract->s_name = section; abstract->set_name_replace (section); //. abstract->s_gameid = u8(GameID()); abstract->o_Position = position; abstract->s_RP = 0xff; abstract->ID = 0xffff; abstract->ID_Parent = parent_id; abstract->ID_Phantom = 0xffff; abstract->s_flags.assign(M_SPAWN_OBJECT_LOCAL); abstract->RespawnTime = 0; if (!return_item) { NET_Packet P; abstract->Spawn_Write (P,TRUE); Send (P,net_flags(TRUE)); F_entity_Destroy (abstract); return (0); } else return (abstract); }