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

Скрипт для спавна наборов объектов — различия между версиями

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

Перейти к: навигация, поиск
Строка 3: Строка 3:
 
В моей функции все это уже включено - вам остается только написать функцию с данными, в которой вы укажите имена объектов, нужное вам кол-во и место - либо это конкретные координаты, либо инвентарь эктора.
 
В моей функции все это уже включено - вам остается только написать функцию с данными, в которой вы укажите имена объектов, нужное вам кол-во и место - либо это конкретные координаты, либо инвентарь эктора.
  
<code>local count = 0
+
Приведенный ниже скрипт является общей функцией, куда передаются данные.
function uni_spawn_new(tab_items,tab_where)
+
Его можно положить в любой скриптовый файл.
for k, v in pairs(tab_items) do
+
Если же хотите, что бы функцию можно было вызывать также и из логики - то скрипт нужно положить в файл xr_effects.script.
if type(tab_where)=='table' then
+
 
for k, v in pairs (tab_items[k]) do
+
Вызов соответственно нужно делать именно функции с данными - любым удобным\подходящим по ситуации способом - через экшен в диалоге, через другой скрипт, через файл info_portions (если хотите заспавнить, скажем, эктору что-то в инвентарь при старте игры).
count = k
+
 
for i=1, count do
+
Для каждого объекта надо указать кол-во: если нужен один объект то 1, если сто - то 100 и т.д.
alife():create(v,vector():set(tab_where['x'],
+
 
tab_where['y'],tab_where['z']),
+
Доработанный вариант дает возможностью спавнить по сиду как клиентским так и серверным, то есть находящимся в оффлайне объектам,
tab_where['lv'],tab_where['gv'])
+
а также есть возможность спавнить NPC по их профильному имени, которое указывается в теге
end
+
<specific_character id =
end
+
в файлах character_desc_локация
elseif type(tab_where)=='string' then
+
и в файле npc_profile в теге <character id =
for k, v in pairs (tab_items[k]) do
+
count = k
+
for i=1, count do
+
alife():create(v, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
+
end
+
end
+
elseif type(tab_where)=='number' then
+
local obj = level_object_by_sid(tab_where)
+
for k, v in pairs (tab_items[k]) do
+
count = k
+
for i=1, count do
+
alife():create(v, obj:position(), obj:level_vertex_id(), obj:game_vertex_id(), obj:id())
+
end
+
end
+
end
+
end
+
end
+
</code>
+
  
доработанный вариант с возможностью спавна по сиду не только онлайн(клиентским), но и оффлайн(серверным) объектам.
 
То есть можете смело спавнить в инвентарь NPC и ящиков, которые на момент активации скрипта находятся в оффлайне либо на других(неактивных) локациях.
 
 
<code>
 
<code>
local count = 0
+
function SpawnToNpcOrToLocation(tab_items,tab_where)
function uni_spawn_new(tab_items,tab_where)
+
local count = 0
local pos, lvid, gvid, id
+
local pos, lvid, gvid, id, obj
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
+
for k, v in pairs(tab_items[k]) do
+
count = k
+
for i=1, count do
+
alife():create(v, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
+
end
+
end
+
elseif type(tab_where)=='number' then
+
local obj = level_object_by_sid(tab_where)
+
if obj ~= nil then
+
id = obj:id()
+
pos = obj:position()
+
lvid = obj:level_vertex_id()
+
gvid = obj:game_vertex_id()
+
elseif obj == nil then
+
obj = alife():story_object(tab_where)
+
id = obj.id
+
pos = obj.position
+
lvid = obj.m_level_vertex_id
+
gvid = 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
+
</code>
+
  
 +
  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
Конечно, сама по себе она работать не будет - в эту функцию необходимо передать нужные нам данные: имя объекта по ltx секции (или если это NPC - то его имя из спавн секции: например "agr_stalker_regular"), его кол-во, место спавна.
+
    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
каждый объект таблицы '''tab_items''' должен быть заключен в фигурные скобки, имя объекта - в кавычках, кол-во объектов указываем в квадратных скобках.
+
        for k, v in pairs (tab_items[k]) do
(для тех, кто знает lua - тут все понятно: цифры это порядковые индексы элемента таблицы, которые я использовал в качестве значений для переменной лимита  оператора  цикла).
+
            count = k
Координаты указываем во второй таблице '''tab_where''' - x,y,z  - это понятно координаты по осям, lv, gv - левел вертекс и гейм вертекс.
+
                for i=1, count do
Для знатоков lua тут тоже все ясно - по строковым индексам нужные данные передаются в основной скрипт и функция
+
                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
  
<code>function uny_spawn_1()
+
 
local tab_items ={{[1]="exo_outfit"},{[2]="af_cristall_flower"},  
+
Функции с передачей данных:
{[1]="wpn_fn2000"},{[5]="ammo_5.56x45_ss190"},{[3]="bread"},
+
 
 +
--для спавна по координатам:
 +
 
 +
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"}}
 
{[5]="medkit_army"}}
local tab_where = {x=-249.495,y=-18.495,z=-107.105, lv=10784,gv=8}
+
local tab_where ={x=-22,y=-33,z=-66,lv=33333,gv=44}
this.uni_spawn_new(tab_items,tab_where)
+
this.SpawnToNpcOrToLocation(tab_items,tab_where)
 
end
 
end
</code>
 
  
то же самое, но для спавна в инвентарь эктора:
+
--для спавна в инвентарь эктора:
  
<code>function uny_spawn_2()
+
function uny_spawn_2()
local tab_items ={{[1]="exo_outfit"},{[2]="af_cristall_flower"},  
+
local tab_items ={
{[1]="wpn_fn2000"},{[5]="ammo_5.56x45_ss190"},{[3]="bread"},
+
{[1]="exo_outfit"},
 +
{[1]="af_cristall_flower"},
 +
{[1]="wpn_fn2000"},
 +
{[5]="ammo_5.56x45_ss190"},
 +
{[3]="bread"},
 
{[5]="medkit_army"}}
 
{[5]="medkit_army"}}
 
local tab_where = "actor"
 
local tab_where = "actor"
this.uni_spawn_new(tab_items,tab_where)
+
this.SpawnToNpcOrToLocation(tab_items,tab_where)
end</code>
+
end
  
Для спавна в инвентарь эктора просто меняется тип переменной - с "table" на "string".
+
--для спавна в инвентарь NPC по его sid'у:
А скрипт, заметив это,  тут же понимает куда ему надо спавнить.
+
Кстати, вместо строчки "actor",  можно писать все угодно - это не имеет никакого значения. Разумеется, слово должно быть заключено в кавычки.
+
  
И третий вариант - для спавна в инвентарь непися по его sid'у:
+
function uny_spawn_3()
+
local tab_items ={
<code>function uny_spawn_3()
+
{[1]="exo_outfit"},
local tab_items ={{[1]="exo_outfit"},{[2]="af_cristall_flower"},  
+
{[2]="af_cristall_flower"},
{[1]="wpn_fn2000"},{[5]="ammo_5.56x45_ss190"},{[3]="bread"},
+
{[1]="wpn_fn2000"},
 +
{[5]="ammo_5.56x45_ss190"},
 +
{[3]="bread"},
 
{[5]="medkit_army"}}
 
{[5]="medkit_army"}}
local tab_where = 006 -- это sid волка  
+
local tab_where = 006 -- это sid волка
this.uni_spawn_new(tab_items,tab_where)
+
this.SpawnToNpcOrToLocation(tab_items,tab_where)
end</code>
+
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
 +
</code>
  
 
автор  
 
автор  

Версия 19:12, 27 сентября 2010

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