Рандомный спавн объектов — различия между версиями
Материал из S.T.A.L.K.E.R. Inside Wiki
RedPython (обсуждение | вклад) м (restored) |
|||
(не показаны 14 промежуточные версии 5 участников) | |||
Строка 1: | Строка 1: | ||
− | Предлагаю свой вариант рандомного спавна. В данном способе | + | Предлагаю свой вариант рандомного спавна. В данном способе нет проблем с проваливанием объектов под землю. Но рандомность, к сожалению, фиксирована. Хотя, это даже к лучшему, так как появляется возможность спавнить только по укромным местам, а также возможность указывать не только координаты, но и sid объектов, в том числе и нпс. Функция универсальна, что расширяет её возможности. |
Итак, в файле '''xr_effects.script''' вписываем новую функцию: | Итак, в файле '''xr_effects.script''' вписываем новую функцию: | ||
− | < | + | <lua> |
− | local item, ms | + | function uni_random_spawn(items, tbl, kol) |
− | local pos | + | local lv_id, gv_id, obj, item, ms, kol2 |
+ | local kol1 = 1 | ||
+ | local id = 65535 | ||
+ | local pos = vector() | ||
+ | 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 | ||
+ | |||
+ | if kol == nil then | ||
+ | kol = 1 | ||
+ | end | ||
+ | for s=1, kol do | ||
if type(items) == 'table' then | if type(items) == 'table' then | ||
− | item = | + | item = math.random(#items) |
+ | if type(items[item]) == 'number' then | ||
+ | item = item - 1 | ||
+ | end | ||
+ | if type(items[item+1]) == 'number' then | ||
+ | kol1 = items[item+1] | ||
+ | end | ||
+ | item = items[item] | ||
else | else | ||
item = items | item = items | ||
end | end | ||
− | + | for i=1, kol1 do | |
− | if type( | + | if type(item) == 'table' then |
− | + | for k, v in ipairs(item) do | |
− | + | if type(item[k+1]) == 'number' then | |
− | + | kol2 = item[k+1] | |
− | + | else | |
− | + | kol2 = 1 | |
− | + | end | |
− | + | if type(item[k]) ~= 'number' then | |
− | + | for j=1, kol2 do | |
− | + | alife():create(v, pos, lv_id, gv_id, id) | |
− | + | end | |
− | + | end | |
− | pos | + | end |
− | + | else | |
− | + | alife():create(item, pos, lv_id, gv_id, id) | |
end | end | ||
+ | end | ||
+ | end | ||
− | + | end | |
− | end</ | + | </lua> |
− | Данная функция | + | Разберём возможности функции. |
− | + | Данная функция имеет 4 типа спавна: | |
− | + | 1. Рандомно, случайный(ые) объект(ы) (из предлагаемого списка). | |
+ | 2. Рандомно, определённый(ые) объект(ы). | ||
+ | 3. В определённом месте, случайный(ые) объект(ы) (из предлагаемого списка). | ||
+ | 4. В определённом месте, определённый(ые) объект(ы). | ||
− | < | + | Можно указывать количество объектов, наборы объектов и количество каждого объекта в наборе. |
− | local items = | + | Также есть возможность указать количество циклов спавна (по объектам). Где при каждом цикле выбирается случайный объект или набор объектов. |
+ | |||
+ | Функция является общей, а значит при запуске функции, нам потребуется передавать ей данные для спавна. Передача данных будет производиться из других функций. | ||
+ | |||
+ | Функции с данными должны выглядеть так: | ||
+ | |||
+ | <lua> | ||
+ | function random_spawn_data_1() | ||
+ | local tbl = --таблица мест спавна | ||
+ | |||
+ | local items = --таблица объектов спавна | ||
+ | |||
+ | local kol = 5 --количество спавн-циклов (по объектам). При каждом цикле выбирается случайный объект или набор объектов. | ||
+ | Строку можно не указывать, если спавнится один объект или набор объектов. | ||
+ | |||
+ | this.uni_random_spawn(items, tbl, kol) --если обе функции находятся в одном файле. | ||
+ | end | ||
+ | </lua> | ||
+ | |||
+ | Если функция с данными прописывается в другом файле, то вместо '''this''' пишется имя файла без расширения, в котором находится общая функция. В нашем случае, это '''xr_effects.script'''. | ||
+ | То есть получится так: | ||
+ | |||
+ | <lua> | ||
+ | xr_effects.uni_random_spawn(items, tbl, kol) | ||
+ | </lua> | ||
+ | ------------------------------------------------------------------------------------------------ | ||
+ | |||
+ | Рассмотрим функции данных, для каждого типа спавна. | ||
+ | |||
+ | --------------------------- | ||
+ | |||
+ | '''1. Рандомно, случайный(ые) объект(ы):''' | ||
+ | |||
+ | <lua> | ||
+ | function random_spawn_data_1() | ||
+ | --Список мест спавна-- | ||
local tbl = { | 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',2, | ||
+ | 'af_cristall_flower', | ||
+ | {'af_dummy_battery',3,'af_fuzz_kolobok','af_night_star',2}, | ||
+ | {'bandage',10,'medkit_scientic','medkit_army',3,'medkit',5},2 | ||
+ | } | ||
− | this.uni_random_spawn(items, tbl) | + | this.uni_random_spawn(items, tbl, kol) |
− | end</ | + | end |
+ | </lua> | ||
− | + | Таблица '''tbl''' содержит в себе разные типы мест для спавна. Такие как '''id''', '''актор''' и '''непосредственные координаты'''. Весь список данных записывается в фигурных скобках, через запятую. Непосредственные координаты, заключаются в дополнительные фигурные скобки, как в нашем примере. | |
− | + | Строки, могут содержать в себе любую информацию. Это не имеет значения, так как проверка идёт на тип значения 'string'. Если строка, то спавнить в инвентаре актора. | |
− | + | ||
− | + | ||
− | + | ||
+ | Таблица '''items''' содержит в себе, список возможных объектов и(или) возможных наборов объектов. Которые так же, вписываются в фигурные скобки, через запятую. | ||
+ | Наборы объектов, заключаются в дополнительные фигурные скобки. | ||
+ | После каждого объекта, можно указывать количество, через запятую. | ||
+ | Можно также указать количество спавна набора объектов, через запятую, после закрытия фигурной скобки набора. | ||
− | + | ----------------------------------------------------------------------------------- | |
− | < | + | '''2. Рандомно, определённый объект:''' |
− | + | ||
+ | <lua> | ||
+ | function random_spawn_data_1() | ||
local tbl = { | 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 Бармена | ||
} | } | ||
− | this.uni_random_spawn(items, tbl) | + | local items = 'af_medusa' --объект спавна |
− | end</ | + | |
+ | this.uni_random_spawn(items, tbl, kol) | ||
+ | end | ||
+ | </lua> | ||
+ | |||
+ | В данном случае, выбирается всего один объект, а значит, в таблице '''items''' фигурные скобки ставить не обязательно. Что переделывает её в простую переменную. | ||
+ | |||
+ | ------------------------------------------------------------------------------------ | ||
+ | |||
+ | '''2. Рандомно, определённый список объектов:''' | ||
+ | |||
+ | <lua> | ||
+ | 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_dummy_battery',3,'af_fuzz_kolobok','af_night_star',2}} --Набор объектов, для спавна. | ||
+ | |||
+ | this.uni_random_spawn(items, tbl, kol) | ||
+ | end | ||
+ | </lua> | ||
+ | |||
+ | В данном случае, чтобы функция сообразила, что нам нужно заспавнить все прописанные объекты, список нужно заключить в двойные фигурные скобки. | ||
+ | |||
+ | ------------------------------------------------------------------------------------ | ||
+ | |||
+ | '''3. В определённом месте, случайный(ые) объект(ы):''' | ||
+ | |||
+ | <lua> | ||
+ | function random_spawn_data_1() | ||
+ | local tbl = 2040 -- id ящика | ||
+ | |||
+ | local items = { | ||
+ | 'af_medusa',2, | ||
+ | 'af_cristall_flower', | ||
+ | {'af_dummy_battery',3,'af_fuzz_kolobok','af_night_star',2}, | ||
+ | {'bandage',10,'medkit_scientic','medkit_army',3,'medkit',5},2 | ||
+ | } --Список возможных объектов и наборов объектов | ||
+ | |||
+ | this.uni_random_spawn(items, tbl, kol) | ||
+ | end | ||
+ | </lua> | ||
+ | |||
+ | В этом случае, переменная '''tbl''' может иметь один из трёх типов '''(table, number, string)'''. Если указывается id ящика или нпс, то прописывается так, как указано на примере. В данном случае, '''tbl''' будет иметь тип '''number'''. Если указать актора, то тип будет '''string''': | ||
+ | |||
+ | <lua> | ||
+ | local tbl = "actor" | ||
+ | </lua> | ||
+ | |||
+ | Ну а если указывать непосредственные координаты, то '''tbl''' будет таблицей: | ||
+ | |||
+ | <lua> | ||
+ | local tbl = {{134.526,0,70.318,36649,1229}} | ||
+ | </lua> | ||
+ | |||
+ | Координаты, как и в случае с набором объектов, нужно заключить в двойные фигурные скобки, чтобы функция не воспринила их как набор id. | ||
+ | |||
+ | ------------------------------------------------------------------------------------------ | ||
+ | |||
+ | '''4. В определённом месте, определённый объект:''' | ||
+ | |||
+ | <lua> | ||
+ | function random_spawn_data_1() | ||
+ | local tbl = 2040 | ||
+ | |||
+ | local items = 'af_medusa' | ||
+ | |||
+ | this.uni_random_spawn(items, tbl, kol) | ||
+ | end | ||
+ | </lua> | ||
− | + | Ну тут, всё уже понятно. | |
− | + | -------------------------------------------------------------------------------------------- | |
− | + | Как вы уже наверно поняли, спавнить можно не только объекты инвентаря, но и нпсов, и мутантов. Достаточно, вместо имени объекта, прописать имя секции из файла '''spawn_sections.ltx''' - для спавна нпс. Или имена типов мутантов из файла '''se_respawn.script''' - для спавна мутантов. | |
− | + | ||
− | + | ||
− | + | -------------------------------------------------------------------------------------------- | |
− | + | ||
− | ''' | + | Всё. Теперь вызываем функцию '''random_spawn_data_1''', например из диалога: |
− | < | + | <xml> |
− | + | <action>xr_effects.random_spawn_data_1</action> | |
− | + | </xml> | |
− | + | И любуемся результатом. | |
− | + | ||
− | + | ------------------------------------------------------------------------------------------------------------------------------- | |
− | + | ||
− | + | Версия функции окончательная. | |
− | |||
----------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- | ||
− | |||
----------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- | ||
Автор скрипта: '''SINGAPUR22''' | Автор скрипта: '''SINGAPUR22''' | ||
[[Категория:скрипты]] | [[Категория:скрипты]] |
Текущая версия на 14:30, 21 мая 2011
Предлагаю свой вариант рандомного спавна. В данном способе нет проблем с проваливанием объектов под землю. Но рандомность, к сожалению, фиксирована. Хотя, это даже к лучшему, так как появляется возможность спавнить только по укромным местам, а также возможность указывать не только координаты, но и sid объектов, в том числе и нпс. Функция универсальна, что расширяет её возможности.
Итак, в файле xr_effects.script вписываем новую функцию:
function uni_random_spawn(items, tbl, kol) local lv_id, gv_id, obj, item, ms, kol2 local kol1 = 1 local id = 65535 local pos = vector() 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 if kol == nil then kol = 1 end for s=1, kol do if type(items) == 'table' then item = math.random(#items) if type(items[item]) == 'number' then item = item - 1 end if type(items[item+1]) == 'number' then kol1 = items[item+1] end item = items[item] else item = items end for i=1, kol1 do if type(item) == 'table' then for k, v in ipairs(item) do if type(item[k+1]) == 'number' then kol2 = item[k+1] else kol2 = 1 end if type(item[k]) ~= 'number' then for j=1, kol2 do alife():create(v, pos, lv_id, gv_id, id) end end end else alife():create(item, pos, lv_id, gv_id, id) end end end end
Разберём возможности функции. Данная функция имеет 4 типа спавна:
1. Рандомно, случайный(ые) объект(ы) (из предлагаемого списка). 2. Рандомно, определённый(ые) объект(ы). 3. В определённом месте, случайный(ые) объект(ы) (из предлагаемого списка). 4. В определённом месте, определённый(ые) объект(ы).
Можно указывать количество объектов, наборы объектов и количество каждого объекта в наборе. Также есть возможность указать количество циклов спавна (по объектам). Где при каждом цикле выбирается случайный объект или набор объектов.
Функция является общей, а значит при запуске функции, нам потребуется передавать ей данные для спавна. Передача данных будет производиться из других функций.
Функции с данными должны выглядеть так:
function random_spawn_data_1() local tbl = --таблица мест спавна local items = --таблица объектов спавна local kol = 5 --количество спавн-циклов (по объектам). При каждом цикле выбирается случайный объект или набор объектов. Строку можно не указывать, если спавнится один объект или набор объектов. this.uni_random_spawn(items, tbl, kol) --если обе функции находятся в одном файле. end
Если функция с данными прописывается в другом файле, то вместо this пишется имя файла без расширения, в котором находится общая функция. В нашем случае, это xr_effects.script. То есть получится так:
xr_effects.uni_random_spawn(items, tbl, kol)
Рассмотрим функции данных, для каждого типа спавна.
1. Рандомно, случайный(ые) объект(ы):
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',2, 'af_cristall_flower', {'af_dummy_battery',3,'af_fuzz_kolobok','af_night_star',2}, {'bandage',10,'medkit_scientic','medkit_army',3,'medkit',5},2 } this.uni_random_spawn(items, tbl, kol) 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_random_spawn(items, tbl, kol) end
В данном случае, выбирается всего один объект, а значит, в таблице 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_dummy_battery',3,'af_fuzz_kolobok','af_night_star',2}} --Набор объектов, для спавна. this.uni_random_spawn(items, tbl, kol) end
В данном случае, чтобы функция сообразила, что нам нужно заспавнить все прописанные объекты, список нужно заключить в двойные фигурные скобки.
3. В определённом месте, случайный(ые) объект(ы):
function random_spawn_data_1() local tbl = 2040 -- id ящика local items = { 'af_medusa',2, 'af_cristall_flower', {'af_dummy_battery',3,'af_fuzz_kolobok','af_night_star',2}, {'bandage',10,'medkit_scientic','medkit_army',3,'medkit',5},2 } --Список возможных объектов и наборов объектов this.uni_random_spawn(items, tbl, kol) end
В этом случае, переменная tbl может иметь один из трёх типов (table, number, string). Если указывается id ящика или нпс, то прописывается так, как указано на примере. В данном случае, tbl будет иметь тип number. Если указать актора, то тип будет string:
local tbl = "actor"
Ну а если указывать непосредственные координаты, то tbl будет таблицей:
local tbl = {{134.526,0,70.318,36649,1229}}
Координаты, как и в случае с набором объектов, нужно заключить в двойные фигурные скобки, чтобы функция не воспринила их как набор id.
4. В определённом месте, определённый объект:
function random_spawn_data_1() local tbl = 2040 local items = 'af_medusa' this.uni_random_spawn(items, tbl, kol) end
Ну тут, всё уже понятно.
Как вы уже наверно поняли, спавнить можно не только объекты инвентаря, но и нпсов, и мутантов. Достаточно, вместо имени объекта, прописать имя секции из файла spawn_sections.ltx - для спавна нпс. Или имена типов мутантов из файла se_respawn.script - для спавна мутантов.
Всё. Теперь вызываем функцию random_spawn_data_1, например из диалога:
<action>xr_effects.random_spawn_data_1</action>
И любуемся результатом.
Версия функции окончательная.
Автор скрипта: SINGAPUR22