Сповіщення
Очистити все

Функція спавну рандомного (випадкового) предмету


Ранг:
Майстер
Роль:
Гість
Записи:
752
Приєднався:
2 роки тому
 

У цьому способі немає проблем із провалюванням об'єктів під землю. Але рандомність, на жаль, фіксована. Хоча, це навіть на краще, тому що з'являється можливість сповнити тільки по затишних місцях, а також можливість вказувати не тільки координати, а й 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
 

Якщо функція з даними прописується в іншому файлі, то замість цього пишеться ім'я файлу без розширення, в якому знаходиться спільна функція. У нашому випадку це 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

В даному випадку, вибирається лише один об'єкт, а значить, у таблиці елементів фігурні дужки ставити не обов'язково. Що переробляє їх у просту змінну.


2. Рандомно, певний перелік об'єктів:

 
function random_spawn_data_1 ( ) 
local tbl = { 
2040 , -- id ящика ' 
actor' , --рядок , а значить інвентар актора 
{ 125.45 , -1 , 117.88 , 35447 , 1213 , , gv_id 
) { 134.526 , 0 , 70.318 , 36649 , 1229 } ,
 { 102 , 0 , 128.98 , 32231 , 1219 } ,
 2041 ,
 573 ,
 _ 

 
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 ящика
'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

У цьому випадку, змінна 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 >
 

І милуємося результатом.


Версія функції є остаточною.


   
Цитата