Рандомный спавн объектов — различия между версиями
Материал из S.T.A.L.K.E.R. Inside Wiki
(Увеличена универсальность функции.) |
|||
| Строка 1: | Строка 1: | ||
| − | Предлагаю свой вариант рандомного спавна. В данном способе, нет проблем с проваливанием объектов под землю. Но рандомность, к сожалению фиксирована. Хотя, это даже к лучшему, так как появляется возможность спавнить только по укромным местам. Функция универсальна, что расширяет её возможности. | + | Предлагаю свой вариант рандомного спавна. В данном способе, нет проблем с проваливанием объектов под землю. Но рандомность, к сожалению фиксирована. Хотя, это даже к лучшему, так как появляется возможность спавнить только по укромным местам, а так же возможность указывать не только координаты, но и id объектов, в том числе и нпс. Функция универсальна, что расширяет её возможности. |
Итак, в файле '''xr_effects.script''' вписываем новую функцию: | Итак, в файле '''xr_effects.script''' вписываем новую функцию: | ||
| − | <pre>function uni_random_spawn(items, tbl) | + | <pre>function uni_random_spawn(items, tbl, kol, rand) |
| − | local item, ms | + | local obj, item, ms |
| − | local | + | local lv_id, gv_id |
| + | local id = 65535 | ||
| + | local pos = vector() | ||
| − | if type(items) == 'table' then | + | if kol == nil then |
| − | + | kol = 1 | |
| − | else | + | 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 | 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 | end | ||
| − | alife():create(item, pos, lv_id, gv_id, | + | alife():create(item, pos, lv_id, gv_id, id) |
| + | end | ||
end</pre> | end</pre> | ||
| − | + | Функция является общей, а значит при запуске функции, нам потребуется передавать ей данные для спавна. Передача данных будет производиться из других функций. | |
| − | + | ||
| − | + | Функции с данными должны выглядеть так: | |
| − | <pre>function | + | <pre>function random_spawn_data_1() |
| − | local items = | + | local tbl = --таблица мест спавна |
| + | |||
| + | local items = --таблица объектов спавна | ||
| + | |||
| + | local kol = 5 --количество объектов спавна, за один раз. если строку вообще не указывать, то спавниться будет только один предмет. | ||
| + | |||
| + | local rand = true --для kol. если true, то случайные объекты. если строку вообще не указывать, то случайно-одинаковые объекты. Строка не указывается, если kol не указан. | ||
| + | |||
| + | this.uni_random_spawn(items, tbl, kol, rand) --если обе функции находятся в одном файле. | ||
| + | end</pre> | ||
| + | |||
| + | |||
| + | Если функция с данными прописывается в другом файле, то вместо '''this''' пишется имя файла без расширения, в котором находится общая функция. В нашем случае, это '''xr_effects.script'''. | ||
| + | Тоесть, получится так: | ||
| + | |||
| + | <pre>xr_effects.uni_random_spawn(items, tbl, kol, rand)</pre> | ||
| + | |||
| + | ------------------------------------------------------------------------------------------------ | ||
| + | |||
| + | Рассмотрим функции данных, для каждого типа спавна. | ||
| + | |||
| + | --------------------------- | ||
| + | |||
| + | '''1.Рандомно, случайный объект:''' | ||
| + | |||
| + | <pre>function random_spawn_data_1() | ||
local tbl = { | 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' | ||
} | } | ||
| − | this. | + | local items = {'af_medusa','af_cristall_flower'} --Список возможных объектов |
| + | |||
| + | this.uni_spawn_new(items, tbl, kol, rand) | ||
end</pre> | end</pre> | ||
| − | + | Таблица '''tbl''' содержит в себе разные типы мест для спавна. Такие как '''id''', '''актор''' и '''непосредственные координаты'''. Весь список данных записывается в фигурных скобках, через запятую. Непосредственные координаты, заключаются в дополнительные фигурные скобки, как в нашем примере. | |
| − | + | Строки, могут содержать в себе любую информацию. Это не имеет значения, так как проверка идёт на тип значения 'string'. Если строка, то спавнить в инвентаре актора. | |
| − | + | ||
| − | + | ||
| − | + | ||
| + | Таблица '''items''' содержит в себе, список возможных объектов. Которые так же, вписываются в фигурные скобки, через запятую. | ||
| − | ''' | + | ----------------------------------------------------------------------------------- |
| + | |||
| + | '''2. Рандомно, определённый объект:''' | ||
| − | <pre>function | + | <pre>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. | + | local items = 'af_medusa' --Объект спавна |
| + | |||
| + | this.uni_spawn_new(items, tbl, kol, rand) | ||
end</pre> | end</pre> | ||
| − | + | В данном случае, выбирается всего один объект, а значит в таблице '''items''' фигурные скобки ставить не обязательно. Что переделывает её, в простую переменную. | |
| − | + | ------------------------------------------------------------------------------------ | |
| − | + | '''3. В определённом месте, случайный объект:''' | |
| − | + | ||
| − | + | ||
| − | this. | + | <pre>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</pre> | end</pre> | ||
| − | ''' | + | В этом случае, переменная '''tbl''' может иметь один из трёх типов '''(table, number, string)'''. Если указывается id ящика или нпс, то прописывается так, как указано на примере. В данном случае, '''tbl''' будет иметь, тип - number. Если указать актора, то тип будет string: |
| − | <pre> | + | <pre>local tbl = "actor"</pre> |
| − | + | ||
| − | local tbl = | + | |
| − | this. | + | Ну а если указывать непосредственные координаты, то tbl будет таблицей: |
| + | |||
| + | <pre>local tbl = {134.526,0,70.318,36649,1229}</pre> | ||
| + | |||
| + | ------------------------------------------------------------------------------------------ | ||
| + | |||
| + | '''4. В определённом месте, определённый объект:''' | ||
| + | |||
| + | <pre>function random_spawn_data_1() | ||
| + | local tbl = 2040 | ||
| + | |||
| + | local items = 'af_medusa' | ||
| + | |||
| + | this.uni_spawn_new(items, tbl, kol, rand) | ||
end</pre> | end</pre> | ||
| − | + | Ну тут, всё уже понятно. | |
| − | + | ||
| + | -------------------------------------------------------------------------------------------- | ||
| + | |||
| + | Всё. Теперь вызываем функцию '''random_spawn_data_1''', например из диалога: | ||
| + | |||
| + | <pre><action>xr_effects.random_spawn_data_1</action></pre> | ||
| + | |||
| + | И любуемся результатом. | ||
| + | |||
| + | ------------------------------------------------------------------------------------------------------------------------------- | ||
| − | + | Планируется доработка возможности спавнить рандомно, несколько разных (не случайных) объектов. | |
| − | |||
----------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- | ||
| − | |||
----------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- | ||
Автор скрипта: '''SINGAPUR22''' | Автор скрипта: '''SINGAPUR22''' | ||
[[Категория:скрипты]] | [[Категория:скрипты]] | ||
Версия 05:17, 14 июня 2009
Предлагаю свой вариант рандомного спавна. В данном способе, нет проблем с проваливанием объектов под землю. Но рандомность, к сожалению фиксирована. Хотя, это даже к лучшему, так как появляется возможность спавнить только по укромным местам, а так же возможность указывать не только координаты, но и 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