Пропоную вашій увазі скрипт, який, на мій погляд, набагато зручніший, ніж використання традиційних формул - з дублюванням функцій alife():create() або використання кілька разів поспіль операторів циклу для спавна потрібної кількості різнойменних об'єктів. У моїй функції все це вже включено - вам залишається тільки написати функцію з даними, в якій ви вкажете імена об'єктів, потрібну вам кількість і місце - або це конкретні координати, або інвентар ектора.
Наведений нижче скрипт є загальною функцією, куди передаються дані. Його можна покласти в будь-який скриптовий файл. Якщо ж хочете, щоб функцію можна було викликати також і з логіки - то скрипт потрібно покласти у файл xr_effects.script.
Виклик відповідно потрібно робити саме функції з даними - будь-яким зручним\підходящим за ситуацією способом - через екшен у діалозі, через інший скрипт, через файл info_portions (якщо хочете заспавнити, скажімо, ектору щось в інвентар під час старту гри).
Для кожного об'єкта треба вказати кількість: якщо потрібен один об'єкт, то 1, якщо сто - то 100 і т.д.
Доопрацьований варіант дає можливість спавнити за сідом як клієнтські, так і серверні об'єкти, тобто ті, що перебувають в офлайні, а також є можливість спавнити NPC за їхнім профільним ім'ям, що вказують у тезі <specific_character id = у файлах character_desc_локація та у файлі npc_profile у тезі <character id =
function SpawnToNpcOrToLocation(tab_items,tab_where) local count = 0 local pos, lvid, gvid, id, obj local function Compare(id) obj = alife():object(id) return obj and obj.profile_name and obj:profile_name() == tab_where end for k, v in pairs(tab_items) do if type(tab_where)=='table' then for k, v in pairs (tab_items[k]) do count = k for i=1, count do alife():create(v,vector():set(tab_where['x'], tab_where['y'],tab_where['z']), tab_where['lv'],tab_where['gv']) end end elseif type(tab_where)=='string' then if tab_where =="actor" then obj = alife():actor() else for i=1, 65534 do local predicate = Compare(i) if predicate then break end end end if obj == nil then return end for k, v in pairs (tab_items[k]) do count = k for i=1, count do alife():create(v, obj.position, obj.m_level_vertex_id, obj.m_game_vertex_id, obj.id) end end elseif type(tab_where)=='number' then obj = level_object_by_sid(tab_where) if obj ~= nil then id, pos, lvid, gvid= obj:id(), obj:position(), obj:level_vertex_id(), obj:game_vertex_id() elseif obj == nil then obj = alife():story_object(tab_where) id, pos, lvid, gvid = obj.id, obj.position, obj.m_level_vertex_id, obj.m_game_vertex_id for k, v in pairs (tab_items[k]) do count = k for i=1, count do alife():create(v, pos, lvid, gvid, id) end end end end end end
Функції з передачею даних:
--для спавна по координатам:
function uny_spawn_1() local tab_items ={ {[1]="exo_outfit"}, {[1]="af_cristall_flower"}, {[1]="wpn_fn2000"}, {[5]="ammo_5.56x45_ss190"}, {[3]="bread"}, {[5]="medkit_army"}} local tab_where ={x=-22,y=-33,z=-66,lv=33333,gv=44} this.SpawnToNpcOrToLocation(tab_items,tab_where) end
--для спавна в інтвентар головного героя:
function uny_spawn_2() local tab_items ={ {[1]="exo_outfit"}, {[1]="af_cristall_flower"}, {[1]="wpn_fn2000"}, {[5]="ammo_5.56x45_ss190"}, {[3]="bread"}, {[5]="medkit_army"}} local tab_where = "actor" this.SpawnToNpcOrToLocation(tab_items,tab_where) end
--для спавна в інтентар NPC по його sid:
function uny_spawn_3()
local tab_items ={
{[1]="exo_outfit"},
{[2]="af_cristall_flower"},
{[1]="wpn_fn2000"},
{[5]="ammo_5.56x45_ss190"},
{[3]="bread"},
{[5]="medkit_army"}}
local tab_where = 006 -- це sid вовка
this.SpawnToNpcOrToLocation(tab_items,tab_where)
end
-- для спавна в інвентар NPC по його назві профілю
function uny_spawn_4()
local tab_items ={
{[1]="ammo_12x70_buck"},
{[1]="ammo_12x76_dart"},
{[1]="ammo_12x76_zhekan"},
{[1]="wpn_toz34"},
{[1]="wpn_ak74u"},
{[1]="stalker_outfit"},
{[1]="mutant_zombie_hand"},
{[1]="mutant_snork_leg"}
}
local tab_where = "mil_Svoboda_trader" -- назва з профілю
this.SpawnToNpcOrToLocation(tab_items,tab_where)
end