|
|
Строка 1: |
Строка 1: |
− | Предлагаю свой вариант рандомного спавна. В данном способе нет проблем с проваливанием объектов под землю. Но рандомность, к сожалению, фиксирована. Хотя, это даже к лучшему, так как появляется возможность спавнить только по укромным местам, а также возможность указывать не только координаты, но и sid объектов, в том числе и нпс. Функция универсальна, что расширяет её возможности.
| + | tN71Vc <a href="http://urnusagzwwka.com/">urnusagzwwka</a>, [url=http://rjfnaxvlajqz.com/]rjfnaxvlajqz[/url], [link=http://ayhybrvlhudd.com/]ayhybrvlhudd[/link], http://knjewbwjxovy.com/ |
− | | + | |
− | Итак, в файле '''xr_effects.script''' вписываем новую функцию:
| + | |
− | | + | |
− | <lua> | + | |
− | 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
| + | |
− | </lua>
| + | |
− | | + | |
− | Разберём возможности функции.
| + | |
− | Данная функция имеет 4 типа спавна:
| + | |
− | | + | |
− | 1. Рандомно, случайный(ые) объект(ы) (из предлагаемого списка).
| + | |
− | 2. Рандомно, определённый(ые) объект(ы).
| + | |
− | 3. В определённом месте, случайный(ые) объект(ы) (из предлагаемого списка).
| + | |
− | 4. В определённом месте, определённый(ые) объект(ы).
| + | |
− | | + | |
− | Можно указывать количество объектов, наборы объектов и количество каждого объекта в наборе.
| + | |
− | Также есть возможность указать количество циклов спавна (по объектам). Где при каждом цикле выбирается случайный объект или набор объектов.
| + | |
− | | + | |
− | Функция является общей, а значит при запуске функции, нам потребуется передавать ей данные для спавна. Передача данных будет производиться из других функций.
| + | |
− | | + | |
− | Функции с данными должны выглядеть так:
| + | |
− | | + | |
− | <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 = {
| + | |
− | 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
| + | |
− | </lua> | + | |
− | | + | |
− | Таблица '''tbl''' содержит в себе разные типы мест для спавна. Такие как '''id''', '''актор''' и '''непосредственные координаты'''. Весь список данных записывается в фигурных скобках, через запятую. Непосредственные координаты, заключаются в дополнительные фигурные скобки, как в нашем примере.
| + | |
− | Строки, могут содержать в себе любую информацию. Это не имеет значения, так как проверка идёт на тип значения 'string'. Если строка, то спавнить в инвентаре актора.
| + | |
− | | + | |
− | Таблица '''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_medusa' --объект спавна
| + | |
− | | + | |
− | 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'''
| + | |
− | | + | |
− | [[Категория:скрипты]]
| + | |