Рандомный спавн объектов — различия между версиями — S.T.A.L.K.E.R. Inside Wiki

Рандомный спавн объектов — различия между версиями

Материал из 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 pos, lv_id, gv_id
+
    local lv_id, gv_id
 +
    local id = 65535
 +
    local pos = vector()
  
         if type(items) == 'table' then
+
    if kol == nil then
            item = items[math.random(#items)]
+
         kol = 1
         else
+
    end
             item = items
+
 
 +
    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
  
         if type(tbl[1]) == 'table' then
+
         pos = obj:position()
            ms = math.random(#tbl)
+
        lv_id = obj:level_vertex_id()
            pos = vector()
+
        gv_id = obj:game_vertex_id()
            pos.x = tbl[ms][1]
+
        id = obj:id()
            pos.y = tbl[ms][2]
+
    end
            pos.z = tbl[ms][3]
+
 
            lv_id = tbl[ms][4]
+
    for i=1, kol do
            gv_id = tbl[ms][5]
+
         if rand == true then
         else
+
             item = math.random(#items)
            pos = vector()
+
             item = items[item]
            pos.x = tbl[1]
+
             pos.y = tbl[2]
+
            pos.z = tbl[3]
+
             lv_id = tbl[4]
+
            gv_id = tbl[5]
+
 
         end
 
         end
  
alife():create(item, pos, lv_id, gv_id, 65535)
+
        alife():create(item, pos, lv_id, gv_id, id)
 +
    end
 
end</pre>
 
end</pre>
  
Данная функция является общей, и прямого вызова не имеет.
+
Функция является общей, а значит при запуске функции, нам потребуется передавать ей данные для спавна. Передача данных будет производиться из других функций.
Для того, чтобы произвести рандомный спавн, создаём дополнительную функцию с данными, которую мы и будем вызывать.
+
  
'''Для рандомного спавна, случайного обекта из определённого списка:'''
+
Функции с данными должны выглядеть так:
  
<pre>function my_spawn_1()
+
<pre>function random_spawn_data_1()
local items = {'item1','item2','item3','item4','item5'}
+
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 = {
{x1, y1, z1, lv1, gv1},
+
2040, -- id ящика
{x2, y2, z2, lv2, gv2},
+
'huesos', --строка, а значит инвентарь актора
{x3, y3, z3, lv3, gv3}
+
{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.uni_random_spawn(items, tbl)
+
local items = {'af_medusa','af_cristall_flower'} --Список возможных объектов
 +
 
 +
this.uni_spawn_new(items, tbl, kol, rand)
 
end</pre>
 
end</pre>
  
Где:
+
Таблица '''tbl''' содержит в себе разные типы мест для спавна. Такие как '''id''', '''актор''' и '''непосредственные координаты'''. Весь список данных записывается в фигурных скобках, через запятую. Непосредственные координаты, заключаются в дополнительные фигурные скобки, как в нашем примере.
    таблица '''items''' - список объектов, для рандомного выбора одного из них.
+
Строки, могут содержать в себе любую информацию. Это не имеет значения, так как проверка идёт на тип значения 'string'. Если строка, то спавнить в инвентаре актора.
    таблица '''tbl''' - список секций с координатами мест спавна, для рандомного выбора одной из них.
+
                  Где, '''x, y, z, lv, gv''' - заменяются на реальные координаты '''pos.x, pos.y, pos.z'''
+
                                              и '''level_vertex_id, game_vertex_id''' соответственно.
+
  
 +
Таблица '''items''' содержит в себе, список возможных объектов. Которые так же, вписываются в фигурные скобки, через запятую.
  
'''Для рандомного спавна определённого объекта:'''
+
-----------------------------------------------------------------------------------
 +
 
 +
'''2. Рандомно, определённый объект:'''
  
<pre>function my_spawn_2()
+
<pre>function random_spawn_data_1()
local items = {'item1'}      --или 'item1'
+
 
local tbl = {
 
local tbl = {
{x1, y1, z1, lv1, gv1},
+
2040, -- id ящика
{x2, y2, z2, lv2, gv2},
+
'actor', --строка, а значит инвентарь актора
{x3, y3, z3, lv3, gv3}
+
{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' --Объект спавна
 +
 
 +
this.uni_spawn_new(items, tbl, kol, rand)
 
end</pre>
 
end</pre>
  
Сдесь у нас прописан всего один объект, который можно не заключать в фигурные скобки.
+
В данном случае, выбирается всего один объект, а значит в таблице '''items''' фигурные скобки ставить не обязательно. Что переделывает её, в простую переменную.
  
'''Для спавна в определённом месте, случайного объекта из определённого списка:'''
+
------------------------------------------------------------------------------------
  
<pre>function my_spawn_3()
+
'''3. В определённом месте, случайный объект:'''
local items = {'item1','item2','item3','item4','item5'}
+
local tbl = {{x1, y1, z1, lv1, gv1}}      --или {x1, y1, z1, lv1, gv1}
+
  
this.uni_random_spawn(items, tbl)
+
<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>function my_spawn_3()
+
<pre>local tbl = "actor"</pre>
local items = {'item1'}                  --или 'item1'
+
local tbl = {{x1, y1, z1, lv1, gv1}}      --или {x1, y1, z1, lv1, gv1}
+
  
this.uni_random_spawn(items, tbl)
+
Ну а если указывать непосредственные координаты, то 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>
 +
 
 +
И любуемся результатом.
 +
 
 +
-------------------------------------------------------------------------------------------------------------------------------
  
<pre><action>xr_effects.my_spawn_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

Другие места
LANGUAGE