Рандомный спавн объектов
Материал из S.T.A.L.K.E.R. Inside Wiki
Предлагаю свой вариант рандомного спавна. В данном способе, нет проблем с проваливанием объектов под землю. Но рандомность, к сожалению фиксирована. Хотя, это даже к лучшему, так как появляется возможность спавнить только по укромным местам, а так же возможность указывать не только координаты, но и id объектов, в том числе и нпс. Функция универсальна, что расширяет её возможности.
Итак, в файле xr_effects.script вписываем новую функцию:
function uni_random_spawn(items, tbl, kol, rand) local obj, item, ms local lv_id, gv_id local id = 65535 local pos = vector() if kol == nil then kol = 1 end if type(items) == 'table' then item = math.random(#items) item = items[item] else item = items end if type(tbl) == 'table' then ms = math.random(#tbl) end if type(tbl) == 'table' and type(tbl[ms]) == 'table' then pos.x = tbl[ms][1] pos.y = tbl[ms][2] pos.z = tbl[ms][3] lv_id = tbl[ms][4] gv_id = tbl[ms][5] else if type(tbl) == 'table' and type(tbl[ms]) == 'number' then ms = tbl[ms] obj = level_object_by_sid (ms) elseif type(tbl) == 'table' and type(tbl[ms]) == 'string' or type(tbl) == 'string' then obj = db.actor elseif type(tbl) == 'number' then obj = level_object_by_sid (tbl) end pos = obj:position() lv_id = obj:level_vertex_id() gv_id = obj:game_vertex_id() id = obj:id() end for i=1, kol do if rand == true then item = math.random(#items) item = items[item] end alife():create(item, pos, lv_id, gv_id, id) end end
Функция является общей, а значит при запуске функции, нам потребуется передавать ей данные для спавна. Передача данных будет производиться из других функций.
Функции с данными должны выглядеть так:
function random_spawn_data_1() local tbl = --таблица мест спавна local items = --таблица объектов спавна local kol = 5 --количество объектов спавна, за один раз. если строку вообще не указывать, то спавниться будет только один предмет. local rand = true --для kol. если true, то случайные объекты. если строку вообще не указывать, то случайно-одинаковые объекты. Строка не указывается, если kol не указан. this.uni_random_spawn(items, tbl, kol, rand) --если обе функции находятся в одном файле. end
Если функция с данными прописывается в другом файле, то вместо this пишется имя файла без расширения, в котором находится общая функция. В нашем случае, это xr_effects.script.
Тоесть, получится так:
xr_effects.uni_random_spawn(items, tbl, kol, rand)
Рассмотрим функции данных, для каждого типа спавна.
1.Рандомно, случайный объект:
function random_spawn_data_1() local tbl = { 2040, -- id ящика 'huesos', --строка, а значит инвентарь актора {125.45,-1,117.88,35447,1213}, --координаты(x, y, z, lv_id, gv_id) {134.526,0,70.318,36649,1229}, {102,0,128.98,32231,1219}, 2041, 573, 500, --id Бармена 'actor', 'npc' } local items = {'af_medusa','af_cristall_flower'} --Список возможных объектов this.uni_spawn_new(items, tbl, kol, rand) end
Таблица tbl содержит в себе разные типы мест для спавна. Такие как id, актор и непосредственные координаты. Весь список данных записывается в фигурных скобках, через запятую. Непосредственные координаты, заключаются в дополнительные фигурные скобки, как в нашем примере. Строки, могут содержать в себе любую информацию. Это не имеет значения, так как проверка идёт на тип значения 'string'. Если строка, то спавнить в инвентаре актора.
Таблица items содержит в себе, список возможных объектов. Которые так же, вписываются в фигурные скобки, через запятую.
2. Рандомно, определённый объект:
function random_spawn_data_1() local tbl = { 2040, -- id ящика 'actor', --строка, а значит инвентарь актора {125.45,-1,117.88,35447,1213}, --координаты(x, y, z, lv_id, gv_id) {134.526,0,70.318,36649,1229}, {102,0,128.98,32231,1219}, 2041, 573, 500 --id Бармена } local items = 'af_medusa' --Объект спавна this.uni_spawn_new(items, tbl, kol, rand) end
В данном случае, выбирается всего один объект, а значит в таблице items фигурные скобки ставить не обязательно. Что переделывает её, в простую переменную.
3. В определённом месте, случайный объект:
function random_spawn_data_1() local tbl = 2040 -- id ящика local items = {'af_medusa','af_cristall_flower'} --Список возможных объектов this.uni_spawn_new(items, tbl, kol, rand) end
В этом случае, переменная tbl может иметь один из трёх типов (table, number, string). Если указывается id ящика или нпс, то прописывается так, как указано на примере. В данном случае, tbl будет иметь, тип - number. Если указать актора, то тип будет string:
local tbl = "actor"
Ну а если указывать непосредственные координаты, то tbl будет таблицей:
local tbl = {134.526,0,70.318,36649,1229}
4. В определённом месте, определённый объект:
function random_spawn_data_1() local tbl = 2040 local items = 'af_medusa' this.uni_spawn_new(items, tbl, kol, rand) end
Ну тут, всё уже понятно.
Всё. Теперь вызываем функцию random_spawn_data_1, например из диалога:
<action>xr_effects.random_spawn_data_1</action>
И любуемся результатом.
Планируется доработка возможности спавнить рандомно, несколько разных (не случайных) объектов.
Автор скрипта: SINGAPUR22