Скрипт для спавна наборов объектов — S.T.A.L.K.E.R. Inside Wiki

Скрипт для спавна наборов объектов

Материал из S.T.A.L.K.E.R. Inside Wiki

Перейти к: навигация, поиск

Предлагаю вашему вниманию мой скромный вклад с дело модостроения. Предложенный скрипт, на мой взгляд, гораздо удобнее, нежели использование традиционных формул - с дублированием функций 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
 

автор --Erlik 17:32, 30 ноября 2009 (UTC)

Другие места
LANGUAGE