Рандомный спавн объектов — различия между версиями
Материал из S.T.A.L.K.E.R. Inside Wiki
(Увеличена универсальность функции.) |
(Окончательная версия функции., обновление данных) |
||
| Строка 3: | Строка 3: | ||
Итак, в файле '''xr_effects.script''' вписываем новую функцию: | Итак, в файле '''xr_effects.script''' вписываем новую функцию: | ||
| − | <pre>function | + | <pre>function uni_spawn_new(items, tbl, kol) |
| − | + | local lv_id, gv_id, obj, item, ms, kol1, kol2 | |
| − | + | local id = 65535 | |
| − | + | local pos = vector() | |
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
if type(tbl) == 'table' then | if type(tbl) == 'table' then | ||
| Строка 46: | Строка 34: | ||
end | end | ||
| − | for | + | if kol == nil then |
| − | if | + | kol = 1 |
| + | end | ||
| + | for s=1, kol do | ||
| + | if type(items) == 'table' then | ||
item = math.random(#items) | 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] | ||
| + | else | ||
| + | kol1 = 1 | ||
| + | end | ||
item = items[item] | 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 | ||
| + | end | ||
| + | |||
end</pre> | end</pre> | ||
| + | |||
| + | Разберём возможности функции. | ||
| + | Данная функция имеет 4 типа спавна: | ||
| + | |||
| + | 1. Рандомно, случайный(ые) предмет(ы) (из предлагаемого списка). | ||
| + | 2. Рандомно, определённый(ые) предмет(ы). | ||
| + | 3. В определённом месте, случайный(ые) предмет(ы) (из предлагаемого списка). | ||
| + | 4. В определённом месте, определённый(ые) предмет(ы). | ||
| + | |||
| + | Можно указывать количество предметов, наборы предметов и количество каждого предмета в наборе. | ||
| + | Так же, есть возможность указать количество циклов спавна (по предметам). Где, при каждом цикле выбирается случайный предмет или набор предметов. | ||
Функция является общей, а значит при запуске функции, нам потребуется передавать ей данные для спавна. Передача данных будет производиться из других функций. | Функция является общей, а значит при запуске функции, нам потребуется передавать ей данные для спавна. Передача данных будет производиться из других функций. | ||
| Строка 65: | Строка 94: | ||
local items = --таблица объектов спавна | local items = --таблица объектов спавна | ||
| − | local kol = 5 --количество | + | local kol = 5 --количество спавн-циклов (по предметам). При каждом цикле выбирается случайный предмет или набор предметов. Строку можно не указывать, если спавнится один предмет или один набор предметов. |
| − | + | ||
| − | + | ||
this.uni_random_spawn(items, tbl, kol, rand) --если обе функции находятся в одном файле. | this.uni_random_spawn(items, tbl, kol, rand) --если обе функции находятся в одном файле. | ||
| Строка 84: | Строка 111: | ||
--------------------------- | --------------------------- | ||
| − | '''1.Рандомно, случайный | + | '''1. Рандомно, случайный(ые) предмет(ы):''' |
<pre>function random_spawn_data_1() | <pre>function random_spawn_data_1() | ||
| + | --Список мест спавна-- | ||
local tbl = { | local tbl = { | ||
2040, -- id ящика | 2040, -- id ящика | ||
| − | ' | + | 'actor', --строка, а значит инвентарь актора |
{125.45,-1,117.88,35447,1213}, --координаты(x, y, z, lv_id, gv_id) | {125.45,-1,117.88,35447,1213}, --координаты(x, y, z, lv_id, gv_id) | ||
{134.526,0,70.318,36649,1229}, | {134.526,0,70.318,36649,1229}, | ||
| Строка 95: | Строка 123: | ||
2041, | 2041, | ||
573, | 573, | ||
| − | 500 | + | 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_spawn_new(items, tbl, kol) | |
| − | + | ||
| − | this.uni_spawn_new(items, tbl, kol | + | |
end</pre> | end</pre> | ||
| Строка 108: | Строка 138: | ||
Строки, могут содержать в себе любую информацию. Это не имеет значения, так как проверка идёт на тип значения 'string'. Если строка, то спавнить в инвентаре актора. | Строки, могут содержать в себе любую информацию. Это не имеет значения, так как проверка идёт на тип значения 'string'. Если строка, то спавнить в инвентаре актора. | ||
| − | Таблица '''items''' содержит в себе, список возможных | + | Таблица '''items''' содержит в себе, список возможных предметов и возможных наборов предметов. Которые так же, вписываются в фигурные скобки, через запятую. |
| + | Наборы предметов, заключаются в дополнительные фигурные скобки. | ||
| + | После каждого предмета, можно указывать количество, через запятую. | ||
| + | Можно также указать количество спавна набора предметов, через запятую, после закрытия фигурной скобки набора. | ||
----------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- | ||
| − | '''2. Рандомно, определённый | + | '''2. Рандомно, определённый предмет:''' |
<pre>function random_spawn_data_1() | <pre>function random_spawn_data_1() | ||
| Строка 126: | Строка 159: | ||
} | } | ||
| − | local items = 'af_medusa' -- | + | local items = 'af_medusa' --Предмет спавна |
| − | this.uni_spawn_new(items, tbl, kol | + | this.uni_spawn_new(items, tbl, kol) |
end</pre> | end</pre> | ||
| Строка 135: | Строка 168: | ||
------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ | ||
| − | '''3. В определённом месте, случайный | + | '''2. Рандомно, определённый список предметов:''' |
| + | |||
| + | <pre>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_spawn_new(items, tbl, kol) | ||
| + | end</pre> | ||
| + | |||
| + | В данном случае, чтобы функция сообразила, что нам нужно заспавнить все прописанные предметы, список нужно заключить в двойные фигурные скобки. | ||
| + | |||
| + | ------------------------------------------------------------------------------------ | ||
| + | |||
| + | '''3. В определённом месте, случайный(ые) предмет(ы):''' | ||
<pre>function random_spawn_data_1() | <pre>function random_spawn_data_1() | ||
local tbl = 2040 -- id ящика | local tbl = 2040 -- id ящика | ||
| − | local items = {'af_medusa','af_cristall_flower'} --Список возможных | + | 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_spawn_new(items, tbl, kol | + | this.uni_spawn_new(items, tbl, kol) |
end</pre> | end</pre> | ||
| Строка 151: | Строка 211: | ||
Ну а если указывать непосредственные координаты, то tbl будет таблицей: | Ну а если указывать непосредственные координаты, то tbl будет таблицей: | ||
| − | <pre>local tbl = {134.526,0,70.318,36649,1229}</pre> | + | <pre>local tbl = {{134.526,0,70.318,36649,1229}}</pre> |
| + | |||
| + | Координаты, как и в случае с набором предметов, нужно заключить в двойные фигурные скобки, чтобы функция не воспринила их как набор id. | ||
------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ | ||
| − | '''4. В определённом месте, определённый | + | '''4. В определённом месте, определённый предмет:''' |
<pre>function random_spawn_data_1() | <pre>function random_spawn_data_1() | ||
| Строка 162: | Строка 224: | ||
local items = 'af_medusa' | local items = 'af_medusa' | ||
| − | this.uni_spawn_new(items, tbl, kol | + | this.uni_spawn_new(items, tbl, kol) |
end</pre> | end</pre> | ||
| Строка 177: | Строка 239: | ||
------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | ||
| − | + | Версия функции окончательная. | |
----------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- | ||
Версия 17:23, 14 июня 2009
Предлагаю свой вариант рандомного спавна. В данном способе, нет проблем с проваливанием объектов под землю. Но рандомность, к сожалению фиксирована. Хотя, это даже к лучшему, так как появляется возможность спавнить только по укромным местам, а так же возможность указывать не только координаты, но и id объектов, в том числе и нпс. Функция универсальна, что расширяет её возможности.
Итак, в файле xr_effects.script вписываем новую функцию:
function uni_spawn_new(items, tbl, kol)
local lv_id, gv_id, obj, item, ms, kol1, kol2
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]
else
kol1 = 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, 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 ящика
'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_spawn_new(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_spawn_new(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_spawn_new(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_spawn_new(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_spawn_new(items, tbl, kol) end
Ну тут, всё уже понятно.
Всё. Теперь вызываем функцию random_spawn_data_1, например из диалога:
<action>xr_effects.random_spawn_data_1</action>
И любуемся результатом.
Версия функции окончательная.
Автор скрипта: SINGAPUR22