Информация для создателей скриптов

Информация для создателей скриптов

 

Составитель: AndreyFidrya (Zmey), af@svitonline.com

 

В каждом скрипте должны быть:

 

action:initialize() – вызывается в момент включения схемы по GOAP.

Инициализировать переменные здесь НЕЛЬЗЯ. Нужно провести установку callback-ов, которые будет использовать скрипт. В самом конце функции нужно вызвать acton:reset_scheme()

 

action:reset_scheme() – вызывается в момент включения схемы другим скриптом (gulagи т.п.), также вызывается из initializeпри включении схемы по GOAP

Вся инициализация должна производиться вreset_scheme(), а не вinitialize()!

 

action:finalize() – вызывается в момент выключения схемы по GOAP. Снять проставленные в initializecallback-и.

 

functionadd_to_binder(npc, char_ini) – биндит схему, только если char_ini == nil (это значит, что биндинг запрошен другим скриптом), или сущестует секция с именем скрипта в custom_data, которая передана как char_ini.

 

functionset_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).

 

Перемещение:

 

За перемещение отвечает movementmanager.

 

Пример использования – 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

 

Задание имен вейпоинтов:

 

           Имя вейпоинта должно иметь следующий вид:

имя|поле=значение|поле=значение|…

           Первое слово является именем и игнорируется парсером. Остальные фразы, разделенные символом '|' будут обработаны.

            Пример имен:

wp00|a=hide

wp01

wp02|a=hide|s=weather

ит.д.

 

Примечание:

            Если задано имя поля, но не задано значение – автоматически парсер подставит true.

Т.е. не надо писать “wp0|r=true|d=true”, достаточно просто написать “wp0|r|d”.

 

Флагипутиpath_walk:

 

            n = 0 ..9999 – номер точки синхронизации. Рекомендуется первой точке задавать значение 0, остальным – числа по возрастанию с произвольным шагом. Прийдя в точку с большим n, сталкер будет ждать отстающих напарников.  Примечание: сталкер дожидается опаздывающих напарников _только_ в точках остановки (т.е. только в тех местах, где точка path_walk имеет общие флаги с одной из точек path_look).

            Внимание – для поддержки зацикленных маршрутов, сталкеры на точке с минимальным n дожидаются сталкеров на точке с максимальным n. Поэтому минимальное количество точек синхронизации для корректной работы схемы должно составлять 3 точки или больше!

 

           s= имя_звуковой_схемы – пробегая через эту точку, сталкер включит указанную звуковую схему. Звук стартует ДО начала поворота и старта анимации. Для того, чтобы звук стартовал синхронно с анимацией – задавайте его в path_look соответствующей точки, а не в path_walk. Если нужно стартовать звук одновременно с ЛЮБОЙ из анимаций в этой точке, можно воспользоваться параметром sa.

 

           sp= с какой вероятностью будет проигран звук (по умолчанию 100)

 

           sa=true– ждать начала анимации в точке, прежде чем стартовать проигрывание звука (по умолчанию false).

 

           sc=true– разрешить проигрывать звуки схемы неоднократно (по умолчанию false).

 

           sf,st– временной интервал повторения фраз из выбранной звуковой схемы в секундах (по умолчанию от 5 до 10 сек).

 

           c=true– дальше перемещаться в присяде (по умолчанию false)

 

           r=true– дальше перемещаться бегом (по умолчанию false)

 

            d=true– перемещаться в состоянии danger (по умолчанию false)

 

           ds= имена_диалогов – имена диалогов, которые разрешено стартовать начиная с этой точки (разрешение действует до следующей точки). Имена задаются в виде текстовой строки, разделенной запятыми: ds=bandits_talk,weather_talk и т.д.

 

           ret= число – сразу же по прибытии в точку вызывает зарегистрированный при инициализации movement manager-а callback с этим числом в качестве второго аргумента.

 

            w= имя_walk_пути – переводит схему на новыйpath_walk. Рекомендуется также задать новый path_look с помощью параметра ”l”, иначе текущий path_look будет сброшен. Персонаж идет на стартовую точку с режимом перемещения, заданным в точке с параметром “w”. Настройки функции коллбека при переключении пути сохраняются.

 

           l= имя_look_пути - сбросит схему на новый path_look. Задавать параметр “l” нужно вместе с параметром ”w”, иначе “l” будет проигнорирован. По умолчаниюpath_lookпри смене path_walk будет сброшен.

 

Флаги путиpath_look:

 

           p= 100 – вероятность, с которой персонаж посмотрит именно в эту точку. Значения p всех возможных точек суммируются, т.е. если у одной точки p = 100, а у другой 300, то персонаж посмотрит в первую с вероятностью 25%! (т.е. 100 из 400).

Рекомендуется задавать p так, чтобы их сумма составляла 100.

По умолчанию у всех точек p = 100.

 

           a= анимация, которую проиграет персонаж, посмотрев в эту точку (по умолчанию idle). Для того, чтобы персонаж стоял в точке без анимации, задайте значениеnil: “a=nil

 

           c=true– смотреть в точку в присяде (по умолчанию используется значение одноименного поля из path_walk)

 

           d=true– смотреть в точку в состоянии danger (по умолчанию используется значение одноименного поля из path_walk)

 

           att= 1 или 2 – номер атаки (основная, вспомогательная). Можно использовать вместо анимации (например ”a=nil|att=1”), можно вместе с анимацией (”a=стреляем_в_потолок|att=1»).

 

           t= время, которое персонаж будет ждать, играя анимацию или стреляя (по умолчанию 5000). Если требуется ждать бесконечно долго (например, это финальная точка пути), нужно задать t равным “-1”.

            Примечание: если персонаж ждет синхронизации в точке, то он будет играть анимацию столько времени, сколько нужно для того, чтобы дождаться напарников, но только по прибытию всех напарников на точки засечет заданное в ”t” время. Исключение составляет стрельба – персонаж не станет стрелять сразу по прибытию в точку, а сперва дождется напарников, а потом уже начнет стрелять в течение заданного времени.

 

           s= имя - звук, который персонаж разово проиграет, посмотрев в эту точку.

 

           sp= с какой вероятностью будет проигран звук (по умолчанию 100)

 

sl= имя_прожектора – если задано, то при повороте в указанную точку персонаж также повернет и прожектор в неё.

 

           ret= число – после поворота в целевую точку вызывает зарегистрированный при инициализации movement manager-а callback с числом ret в качестве второго аргумента. При этом время ожидания (поле t) игнорируется, т.е. после того как callback вызовет update_movement_state – персонаж сразу же пойдет дальше.

 

           

Нравится11
Комментарии (1)
  • 0
    дядяСаша
    Написано красиво!!
    Есть такая поговорка: "Один дурак своим вопросом может поставить в тупик 1000 мудрецов".
    Так вот вопрос? Прошу написать образец кода логики в all.spawn, подчёркиваю образец! (без галиматьи см. выше) с кратким пояснением напротив строки для чего нужна, вот тогда будет понятно, для людей.
    НПС идёт из точки 0 в точку 1, садится и стреляет во врагов или монстров и ни куда не бежит при появлении врагов.
    Чтобы как пишут "знатоки" не срывался в универсальный комбат(сомневаюсь что понимают что пишут), если проще чтобы понять: если это бандит то сидел тихонько у окна или за кустом(за углом) и ждал пока ГГ подойдёт, и пристрелил его, а не метался как "сраный кот по помойке"(Например АТП на кордоне), что характерно для всего Сталкера и не характерно для жизни. Бандиты в атаку не ходят -)). Они стреляют в спину по жизни.
    Вт тогда спасибо!
    А это кому писал? для GSC что ли? -))

B
i
u
Спойлер