Составитель: Andrey Fidrya
(Zmey), af@svitonline.com
В каждом скрипте должны быть:
action:initialize() – вызывается в
момент включения схемы по GOAP.
Инициализировать переменные здесь НЕЛЬЗЯ. Нужно провести
установку callback-ов,
которые будет использовать скрипт. В самом конце функции нужно вызвать acton:reset_scheme()
action:reset_scheme() – вызывается в момент включения
схемы другим скриптом (gulag и т.п.), также вызывается из initialize при
включении схемы по GOAP
Вся инициализация должна производиться в reset_scheme(), а не в initialize()!
action:finalize() – вызывается в
момент выключения схемы по GOAP.
Снять проставленные в initialize callback-и.
function add_to_binder(npc, char_ini)
– биндит схему, только если char_ini == nil (это значит, что биндинг запрошен
другим скриптом), или сущестует секция с именем скрипта в custom_data, которая передана как char_ini
function set_scriptname(параметры) – настройка
параметров скрипта. Параметры, вместо которых передан nil, берутся из customdata персонажа.
Работа с customdata:
При чтении
полей customdata, если
поле не найдено, нужно выдавать сообщение об ошибке, а не тихо отключать скрипт.
Сделать это можно с помощью функции xr_utils.abort(“сообщение”, параметры),
которая действует аналогично printf,
но выводит сообщение в MessageBox и останавливает игру.
Чтобы не
переписывать парсинг заново в каждом скрипте, можно воспользоваться функциями из
xr_utils:
function
conf_get_bool(char_ini, section, field, override, object, mandatory)
function
conf_get_string(char_ini, section, field, override, object, mandatory)
function
conf_get_number(char_ini, section, field, override, object, mandatory)
Например:
st.enabled
= utils.conf_get_bool(char_ini, "guard", "enabled", enable,
object, true) Пример использования можно
посмотреть в xr_guard. Описание параметров – в xr_utils в месте,
где определена функция. В случае возникновения вопросов -
обращаться к Змею (af@svitonline.com).
Перемещение:
За перемещение отвечает movement manager.
Пример использования – xr_walker.script.
1) В _init создается экземпляр movement manager-а:
self.move_mgr = move_mgr.move_mgr()
2) В initialize грузим информацию о путях из их имен:
self.path_walk_info = utils.path_parse_waypoints(self.st.path_walk)
self.path_look_info =
utils.path_parse_waypoints(self.st.path_look)
3) В reset_scheme инициализируем movement manager:
function move_mgr:reset(path_walk, path_walk_info, path_look,
path_look_info,
team, mode, move_cb_info)
Здесь
team – команда для синхронизации нескольких персонажей
(произвольная текстовая строка)
mode – таблица, поля которой задают начальный режим
перемещения:
{ crouch = true/false, run = true/false,
danger=true/false }
move_cb_info – таблица, поля которой задают информацию о callback-методе,
который будет вызван, если персонаж прибыл в точку, в которой установлено
значение ret: { obj = объект,
func = функция }
obj – ссылка на объект
класса, которому принадлежит функция, или nil, если функция определена вне
класса.
func – ссылка на функцию, которая будет вызвана.
Поля team, mode, move_cb задавать не обязательно.
4) В execute:
self.move_mgr:update()
5) В finalize:
self.move_mgr:finalize()
Переключение
скорости и режима перемещения до прибытия в первый вейпоинт.
Для того, чтобы сменить
режим движения до прибытия в первый вейпоинт пути (например, переключиться с
ходьбы на бег при каких-то условиях), выполните в своем скрипте в любой момент
после reset-а:
// ВНИМАНИЕ – вызывать update_movement_state при last_index
// не равном nil
недопустимо!
if self.move_mgr.last_index == nil then
self.move_mgr.running = true / false
self.move_mgr.danger = true / false
self.move_mgr.crouch = true / false
self.move_mgr:update_movement_state()
end
Примечание: в большинстве
случаев переключать режим перемещения не понадобится. Рекомендуется задавать
стартовый режим перемещения с помощью параметра mode функции reset(), а не
менять его вышеописанным способом.
Использование
callback:
Функция-callback может быть как свободной
функцией, так и членом класса.
Прототип свободной функции
имеет следующий вид:
function my_callback(self, mode,
number)
Прототип функции класса:
function
class:my_callback(mode, number)
Здесь в качестве первого параметра (self) будет передано значение поля obj таблицы
move_cb_info, т.е. фактически это объект, которому принадлежит
функция-callback.
Параметр mode может быть одним из:
move_mgr.arrival_before_rotation – если поле ret было задано в path_walk и коллбек
был вызван сразу же по прибытию персонажа в точку, ДО поворота.
move_mgr.arrival_after_rotation – если поле ret было задано в path_look и коллбек
был вызван после прибытия в точку path_walk и поворота в соответствующую точку
path_look (в которой был задан ret).
number – значение поля ret.
В коллбеке можно прервать
движение персонажа (остановить его, но нежелательно сбрасывать пути) и
выполнять свои custom действия (апдейты movement manager-а при этом вызывать не
нужно по понятным причинам). Для прерывания нормальной
работы схемы с целью вмешательства в перемещение, нужно вернуть значение true
из callback-а, после чего перестать вызывать апдейты. Если это не сделать –
значения, которые Вы установите персонажу в коллбеке могут быть сбиты схемой
сразу же по возврату из Вашего коллбека!
Чтобы продолжить затем движение по маршруту, вызовите:
self.move_mgr:update_movement_state() – это
включит бег или ходьбу (в зависимости от настроек последней точки, в которой
был персонаж)
После чего продолжайте
вызывать апдейты movement manager-а как обычно.
Перед вызовом update_movement_state, можно также явно задать режим перемещения:
self.move_mgr.running = true /
false
self.move_mgr.danger = true /
false
self.move_mgr.crouch = true /
false
Если коллбек выполняет
задачи, никак не влияющие на перемещение и персонажа в целом (например, просто
ставит info portion), то из коллбека нужно вернуть nil или false. Вызов
коллбека тогда останется для схемы незамеченным.
Взаимодействие path_walk c path_look:
Прийдя на
точку path_walk, где установлена какая-то комбинация флажков, сталкер найдет
такую же комбинацию флажков в path_look и посмотрит в эту точку. Если же ни
один флажок не установлен, сталкер пойдет дальше не останавливаясь.
Проверка
текущего состояния персонажа:
Часто с персонажем должны
взаимодействовать другие персонажи, например, follower-ы командира должны знать
его состояние.
Движется ли персонаж в данный момент можно
узнать, опросив у move_mgr переменную moving.
if self.move_mgr.moving then движется end
При этом, если moving == true, можно
узнать подробности о перемещении:
if self.move_mgr.crouch then идет в присяде end
if self.move_mgr.running then бежит end
if self.move_mgr.danger then находится в состоянии danger end
Если moving == false, то:
if
self.move_mgr.standing_crouch then сидит end
if self.move_mgr.standing_danger
then сидит в состоянии danger end
|