SCM-функции
Начиная с версии 7.3 генератор поддерживает SCM-функций. Их синтаксис практически тот же, что и синтаксис потоков. Для добавления функции нам нужно создать класс, который наследует класс Function
. В отличии от потоков они должны завершать роботу командой ret
.
Генератор не контролирует входные и выходные параметры. Всё это должен делать разработчик, поэтому важно знать как они работают.
Хорошо. Общие данные Вы уже знаете. Давайте теперь определимся какие параметры функция будет принимать. Допустим, это будет два числа. В этом случае мы можем декларировать локальные переменные:
Метод ret ничего не возвращает по умолчанию. Если нам нужны возвращаемые значения, то мы можем передать в этот метод нужные данные. Допустим, мы будем возвращать переменную, которая хранит результат сложения двух параметров:
Простая функция сложения двух чисел готова! Как нам теперь её вызывать? Да точно так же, как и в Sanny Builder: используем метод call_scm_function
. Мы должны между символами <
и >
указать класс, который наследует класс Function. В нашем случае это SUMM. Также есть 1 обязательный параметр метода, в который надо передать количество аргументов функции, которые будут передаваться в качестве параметра. В нашем случае таких аргументов будет 2. Остальные параметры опциональны и зависят уже от требования самой функции. Вот пример вызова созданной выше функции:
Запомнить параметры не всегда получается. Также синтаксис функции call_scm_function не дают точно определить какой конкретно тип нужен. Поэтому лучше этот вызов написать в пользовательских командах или в методах расширений. Вот пример как это сделать:
Согласитесь, что вызвать метод summ приятнее, хоть и нужно потратить немного времени на эту "обёртку". Обратите внимание, что я использовал тип Out<Int>
для параметра result. Этот тип является неким фильтром, который позволяет передавать в него указанный тип (между символами <
и >
), а также гарантирует, что указанный параметр будет переменной, а не литералом.
Методы call_scm_function и ret могут принимать максимум 30 аргументов, а для GTA III и VC этот лимит составляет 14 аргументов (включает входные и выходные параметры)!
Строки в SCM-функциях
Тип Parameter
не разрешает передавать строки в качестве параметров. Если такая необходимость будет, то можно воспользоваться статический метод GetParameters
. Он есть в классах sString и vString:
Этот метод возвращает массив C# типа Int. Дальше этот массив можно использовать для передачи и получения параметров, как это делается в Sanny Builder.
Процедура возврата строки из функции делается точно так же:
Условные SCM-функции
Вы можете использовать SCM-функции в качестве условий. За вызов такой функции отвечает метод is_call_scm_function
. Он имеет те же параметры, что и call_scm_function, но может использоваться в блоке с условиями.
Для правильной работы требуется использовать команды ret_true
и ret_false
до вызова метода ret:
Существуют также методы ret_true_with_args
, ret_false_with_args
, ret_true_without_args
и ret_false_without_args
. Они автоматически делают возврат, что полезно в некоторых ситуациях:
Опкод 0AB1 не может быть инвертирован коммандой is_call_scm_function!
Простой совет
Много функций и их "обёртки" несомненно будут накапливаться и могут дублировать имена друг-друга, что не позволит быстро вести поиск при вызове меню (CTRL+Space
). Лучше всем функциям предоставить отдельное пространство имён:
Тогда в "обёртке" доступ к MYFUNC будет осуществляться через пространство имён MY_FUNTION_HERE
:
Таким образом все классы для функций будут скрыты по умолчанию от основного кода, но доступны через namespace
.
Last updated