Skip to content

Adding Custom Function

AziatkaVictor edited this page Feb 25, 2023 · 1 revision

Перед прочтением данной статьи рекомендуеться прочитать информацию о 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 или же на форуме.

И это всё. После того как вы только объявите название функции в одном из файлов, игра и расширение его увидят.