Статистика Форума
Последние обновленные темы
Самые популярные темы
Активисты форума
Авторитеты форума
Беседы у костра

Создал: WurDalaK; ответов: 2108
Вопросы по модострою

Создал: WurDalaK; ответов: 1160
Ходка №1

Создал: Алеся; ответов: 301
Какой трек у вас сейчас и...

Создал: Never; ответов: 64
Злой админ

Создал: WurDalaK; ответов: 54
WurDalaK

Постов: 2038
Возрожденный

Постов: 1624
Wo1fRam

Постов: 592
Алеся

Постов: 183
Marsel

Постов: 174
WurDalaK

Уважение: 28
Venus

Уважение: 23
Never

Уважение: 17
Возрожденный

Уважение: 13
Wo1fRam

Уважение: 13

Страница 1 из 11
Модератор форума: WurDalaK 
Форум » Уроки по созданию модов » Конфиги, скрипты и прочие мелочи » Скрипт для спавна набора объектов
Скрипт для спавна набора объектов
Российская Федерация  WurDalaK
Дата: Среда, 17.04.2013, 22:46 | Сообщение # 1
Mysterious asari
Статус
Страж
Группа
Администраторы
Сообщений
2038
Награды
9
-
28
+
Предлагаю вашему вниманию мой скромный вклад с дело модостроения. Предложенный скрипт, на мой взгляд, гораздо
удобнее, нежели использование традиционных формул - с дублированием функций alife():create() или использование
несколько раз подряд операторов цикла для спавна нужного кол-ва разноименных объектов. В моей функции все это
уже включено - вам остается только написать функцию с данными, в которой вы укажите имена объектов, нужное вам
кол-во и место - либо это конкретные координаты, либо инвентарь эктора.

Код
local count = 0  
function uni_spawn_new(tab_items,tab_where)
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)
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


доработанный вариант с возможностью спавна по сиду не только онлайн(клиентским), но и оффлайн(серверным)
объектам. То есть можете смело спавнить в инвентарь NPC и ящиков, которые на момент активации скрипта
находятся в оффлайне либо на других(неактивных) локациях.

Код
local count = 0  
function uni_spawn_new(tab_items,tab_where)
local pos, lvid, gvid, id
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


Эту функцию нужно будет просто скопировать в любой скриптовый файл. Конечно, сама по себе она работать не
будет - в эту функцию необходимо передать нужные нам данные: имя объекта по ltx секции (или если это NPC -
то его имя из спавн секции: например "agr_stalker_regular"), его кол-во, место спавна.

Вот так должна выглядеть функция с данными, которую вы и будете вызывать любым удобным для вас способом:
каждый объект таблицы tab_items должен быть заключен в фигурные скобки, имя объекта - в кавычках, кол-во
объектов указываем в квадратных скобках. (для тех, кто знает lua - тут все понятно: цифры это порядковые
индексы элемента таблицы, которые я использовал в качестве значений для переменной лимита оператора цикла).
Координаты указываем во второй таблице tab_where - x,y,z - это понятно координаты по осям, lv, gv - левел
вертекс и гейм вертекс. Для знатоков lua тут тоже все ясно - по строковым индексам нужные данные передаются
в основной скрипт и функция спавнит объект куда нам надо.

Код
function uny_spawn_1()
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 = {x=-249.495,y=-18.495,z=-107.105, lv=10784,gv=8}
this.uni_spawn_new(tab_items,tab_where)
end


то же самое, но для спавна в инвентарь эктора:

Код
function uny_spawn_2()
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 = "actor"
this.uni_spawn_new(tab_items,tab_where)
end


Для спавна в инвентарь эктора просто меняется тип переменной - с "table" на "string". А скрипт, заметив это,
тут же понимает куда ему надо спавнить. Кстати, вместо строчки "actor", можно писать все угодно - это не
имеет никакого значения. Разумеется, слово должно быть заключено в кавычки.

И третий вариант - для спавна в инвентарь непися по его 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.uni_spawn_new(tab_items,tab_where)
end


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


Занимаюсь созданием сайтов в системе uCoz и модов для серии игр S.T.A.L.K.E.R. Писать в ЛС.
Хочешь сказать спасибо? Ставь + в репутацию!
 
Форум » Уроки по созданию модов » Конфиги, скрипты и прочие мелочи » Скрипт для спавна набора объектов
Страница 1 из 11
Поиск:
Мини-чат
Яндекс.Метрика