-
Notifications
You must be signed in to change notification settings - Fork 4
Adding Custom Function
Перед прочтением данной статьи рекомендуеться прочитать информацию о Condlist-ах!
Оригинальный набор функций игры достаточно обширный и охватывает многие ситуации. Однако бывают случаи, когда есть необходимость в функции, которой нету. В этой статье я объясню, как это работает и как добавлять свои функции.
Вне зависимости от того, какого типа функция вам нужна, у них есть несколько общих особенностей и требований. Для начала арументы:
function example(actor, obj, p)
end
-
actor
- Игрок (скорее всего) -
npc
или 'obj' - Вне зависимости от названия, это объект, внутри которого вызвана функция. То есть, если функция вызвана внутри рестриктора, то будет передан именно этот объект. -
p
- Перечень аргументов, является списком. Поэтому точно сказать, какие аргументы он должен получать можно лишь по исходному коду скрипта. Указывать его не обязательно, если функция не требует аргументов. При обращаемся к аргументу необходимо указать номер, напримерp[1]
, то есть к первому элементу (отсчет начинается с 1).
Функции для условий, или же проверки, хранятся в файле xr_conditions.script
и нужны для вызова в {}
скобках Condlist-а. Оно возвращает True
или False
в зависимости от кода и информации внутри игры.
Рассмотрим функцию actor_has_item
:
function actor_has_item(actor, npc, p)
local story_actor = get_story_object("actor")
return p[1] ~= nil and story_actor and story_actor:object(p[1]) ~= nil
end
Первый аргумент это название предмета, который должен быть у игрока. И так как это функция проверки, то мы должны возвращать булевое значение в return
. Тут функция вернёт True
, если у игрока есть предмет, который указан в p[1]
.
Данные функции хранятся в xr_effects.script
и нужны для вызова в %%
скобках Condlist-а. Как уже понятно по названию, они нужны для вызова различного рода действий, выдача предметов, квестов, убийство НПС или же изменение отношения к игроку.
Рассмотрим функцию give_task
:
function give_task(actor, obj, p)
if p[1] == nil then
abort("No parameter in give_task function.")
end
task_manager.get_task_manager():give_task(p[1])
end
Достаточно простая функция. Происходит проверка, что мы указали название квеста, который хотим выдать игроку. Если квест указан, то просто выдаем его через другой скрипт. Иначе мы это игнорируем.
Вне зависимости от типа скрипта, его необходимо добавить в соответствующий файл:
-
xr_effects.script
- Функции действия -
xr_conditions.script
- Функции проверок
Далее указываем название и аргументы. На самом деле, аргументы можно оставить пустыми, если вам они не нужны, однако если вам нужно указывать их при вызове, то ни в коем случае нельзя писать так:
function test(p)
end
Крайне важна последовательность и аргументы обязательно должны идти третьими по счету:
function test(actor, obj, p)
end
Дальше необходимо написать код на языке lua
, в зависимости от требований. К сожалению, нету единого правила о том, как это делать, ведь все зависит от ситуации. Могу лишь порекомендовать:
- Посмотрите реализацию других скриптов, как они работают
- Проверьте, возможно то, что вы ищите уже сделано
- Если все-таки ничего не получается, обратитесь за помощью в Discord или же на форуме.
И это всё. После того как вы только объявите название функции в одном из файлов, игра и расширение его увидят.
Предложения и дополнения всегда приветствуются!
База знаний:
Информация о расширении: