Скрипт для спавна наборов объектов — различия между версиями
Материал из S.T.A.L.K.E.R. Inside Wiki
Erlik (обсуждение | вклад) |
|||
Строка 3: | Строка 3: | ||
В моей функции все это уже включено - вам остается только написать функцию с данными, в которой вы укажите имена объектов, нужное вам кол-во и место - либо это конкретные координаты, либо инвентарь эктора. | В моей функции все это уже включено - вам остается только написать функцию с данными, в которой вы укажите имена объектов, нужное вам кол-во и место - либо это конкретные координаты, либо инвентарь эктора. | ||
− | + | Приведенный ниже скрипт является общей функцией, куда передаются данные. | |
− | + | Его можно положить в любой скриптовый файл. | |
− | + | Если же хотите, что бы функцию можно было вызывать также и из логики - то скрипт нужно положить в файл xr_effects.script. | |
− | + | ||
− | + | Вызов соответственно нужно делать именно функции с данными - любым удобным\подходящим по ситуации способом - через экшен в диалоге, через другой скрипт, через файл info_portions (если хотите заспавнить, скажем, эктору что-то в инвентарь при старте игры). | |
− | + | ||
− | + | Для каждого объекта надо указать кол-во: если нужен один объект то 1, если сто - то 100 и т.д. | |
− | + | ||
− | + | Доработанный вариант дает возможностью спавнить по сиду как клиентским так и серверным, то есть находящимся в оффлайне объектам, | |
− | + | а также есть возможность спавнить NPC по их профильному имени, которое указывается в теге | |
− | + | <specific_character id = | |
− | + | в файлах character_desc_локация | |
− | + | и в файле npc_profile в теге <character id = | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | < | + | |
− | |||
− | |||
<code> | <code> | ||
− | + | function SpawnToNpcOrToLocation(tab_items,tab_where) | |
− | function | + | local count = 0 |
− | local | + | local pos, lvid, gvid, id, obj |
− | + | ||
− | + | ||
− | + | ||
− | count = | + | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | local | + | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
+ | 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 | ||
− | + | ||
− | local tab_items ={{[1]="exo_outfit"},{[ | + | Функции с передачей данных: |
− | {[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=- | + | local tab_where ={x=-22,y=-33,z=-66,lv=33333,gv=44} |
− | this. | + | this.SpawnToNpcOrToLocation(tab_items,tab_where) |
end | end | ||
− | |||
− | + | --для спавна в инвентарь эктора: | |
− | + | function uny_spawn_2() | |
− | local tab_items ={{[1]="exo_outfit"},{[ | + | 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. | + | this.SpawnToNpcOrToLocation(tab_items,tab_where) |
− | end | + | end |
− | + | --для спавна в инвентарь NPC по его sid'у: | |
− | + | ||
− | + | ||
− | + | function uny_spawn_3() | |
− | + | local tab_items ={ | |
− | + | {[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 | + | local tab_where = 006 -- это sid волка |
− | this. | + | 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)