Главная » Статьи » Статьи » Моддинг

Упрощеный способ выдачи предмета
Итак многие знают что есть длинная функций на выдавание предмета(Забыл просто как она пишеться полностью) так же есть длинная функция на выдачу предмета в диалоге:

function give_item(first_speaker, second_speaker) 
dialogs.relocate_item_section_from_actor(first_speaker, second_speaker, "название предмета")
end

Сейчас расскажу как можно упростить.Создаем любой скрипт.Например test.script.Пишем туда вот такую функцию

function actor_add_item(section)
alife():create(section,
db.actor:position(),
db.actor:level_vertex_id(),
db.actor:game_vertex_id(),
db.actor:id())
end

Написали?Хорошо!Создадим теперь ту самую упрощеную функцию.Пишеться она так

название_скрипта.actor_add_item("название предмета")

Ну например:

function give_equip()
  give_item.actor_add_item("wpn_pm")
  give_item.actor_add_item("wpn_ak74")
  give_item.actor_add_item("bandage")
  give_item.actor_add_item("bandage")
  give_item.actor_add_item("bandage")
  give_item.actor_add_item("medkit") 
  give_item.actor_add_item("ammo_5.45x39_fmj")
  give_item.actor_add_item("ammo_5.45x39_fmj")
  give_item.actor_add_item("ammo_5.45x39_fmj")
  give_item.actor_add_item("ammo_5.45x39_fmj")
  give_item.actor_add_item("ammo_5.45x39_fmj")
  give_item.actor_add_item("ammo_5.45x39_fmj")
  give_item.actor_add_item("ammo_5.45x39_fmj")
  give_item.actor_add_item("ammo_5.45x39_fmj")
  give_item.actor_add_item("ammo_9x18_fmj")
  give_item.actor_add_item("ammo_9x18_fmj")
  give_item.actor_add_item("ammo_9x18_fmj")
  give_item.actor_add_item("stalker_outfit")
end

Итак сделали?Супер!Лезем теперь в config/gameplay/info_l01escape.xml и после строчки:

 
<info_portion id="esc_kill_gunslinger">
<task>storyline_eliminate_gunslinger</task>
 

Пишем: <action>test.give_equip</action> Там где test это название скрипта.give_equip название функции В итоге должно получиться вот так:

<info_portion id="esc_kill_gunslinger">
<task>storyline_eliminate_gunslinger</task>
<action>test.give_equip</action>
<article>about_enciclopedia</article>
<article>sl_beginning</article>
</info_portion>

Теперь при начале новой игры будет выдаваться экипировка! Итак.Многие кто хоть немного разбираються в скриптах уже догадались что функция стремная.Нету такой упрощеной штуки как выдавание сразу нескольких предметов за один вызов.Но ничего.И тут мы выкрутимся.Будем пользоваться функцией for i do.Привожу пример:

function give_equip()
give_item.actor_add_item("wpn_pm")
give_item.actor_add_item("wpn_ak74")
give_item.actor_add_item("medkit") 
for i=1, 3 do this.actor_give_item("bandage")
end
for i=1, 10 do this.actor_give_item("ammo_5.45x39_fmj")
end
for i=1, 3 do this.actor_give_item("ammo_9x18_fmj")
end
end

Итак если хотите регулировать число выдаваемых предметов то после i=1, ставим то число которое вам нужно Фух.Вроде все разобрали... Привел статью в полный порядок так же устранил пару недочетов:Fireman3000
Получено с http://stalkerin.gameru.net/wiki/index.php/%D0%A3%D0%BF%D1%80%D0%BE%D1%89%D0%B5%D0%BD%D1%8B%D0%B9_%D1%81%D0%BF%D0%BE%D1%81%D0%BE%D0%B1_%D0%B2%D1%8B%D0%B4%D0%B0%D1%87%D0%B8_%D0%BF%D1%80%D0%B5%D0%B4%D0%BC%D0%B5%D1%82%D0%B0

Категория: Скрипты
-------------------------------------------------------------------------------------------------
Рандомный спавн объектов
Материал из S.T.A.L.K.E.R. Inside Wiki
Перейти к: навигация, поиск

Предлагаю свой вариант рандомного спавна. В данном способе нет проблем с проваливанием объектов под землю. Но рандомность, к сожалению, фиксирована. Хотя, это даже к лучшему, так как появляется возможность спавнить только по укромным местам, а также возможность указывать не только координаты, но и 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
 

Если функция с данными прописывается в другом файле, то вместо this пишется имя файла без расширения, в котором находится общая функция. В нашем случае, это 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
 

В данном случае, выбирается всего один объект, а значит, в таблице 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_random_spawn(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_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>
 

И любуемся результатом.

Версия функции окончательная.

Автор скрипта: SINGAPUR22 
Категория: Моддинг | Добавил: Hardtmuth (13.07.2012)
Просмотров: 8930 | Рейтинг: 5.0/3
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]

Меню сайта

Свежие прохождения






Категории раздела

Мини-чат

Поиск

Статистика

Онлайн всего: 98
Гостей: 98
Пользователей: 0


Сегодня посетили:













Форма входа


Войти Зарегистрироваться