AKKK1 6 Опубликовано 23 Марта 2010 malandrinus и всем кому интересно. нашел на диске статью Скрипты в игре «Сталкер» Документация для гейм-дизайнеров и скриптописателей В игре используется скриптовый язык Lua, поэтому необходимо воспользоваться его документацией для дальнейшего прочтения этого документа (S:\GameData\Scripts\manual.html) Из игры в Lua вынесены следующие классы и глобальные функции: a. Базовые функции на C++ i. log(<string_to_print>) 1. выводит в лог строку ii. flush() 1. сохраняет лог на диск, работает очень медленно, в Release версии вообще отключена iii. device() 1. получить экземпляр класса render_device (описание смотрите ниже) iv. system_ini() – возвращает указатель ini_file на system.ltx v. alife_simulator *alife() – возвращает указатель на симулятор vi. game.time() 1. получить игровое время в миллисекундах vii. level.object(<object_name>) 1. получить экземпляр класса game_object по имени объекта viii. level.actor() 1. получить экземпляр класса game_object актёра ix. level.get_weather() 1. возвращает строку – имя текущей погоды x. level.set_weather(<weather_name>) 1. устанавливает погоду xi. level.set_time_factor(<time_factor>) 1. устанавливает game time factor xii. level.get_time_factor() 1. возвращает текущий game time factor xiii. level.cover_in_direction(<vertex_id>,<direction>) 1. возвращает прикрытость в заданном узле в заданном направлении xiv. level.vertex_in_direction(<vertex_id>,<direction>,<max_distance>) 1. возвращает ноду в заданном напрвалении xv. level.rain_factor() 1. возвращает, насколько идёт дождь (0..1) xvi. level.patrol_path_exists(<patrol_path_name>) 1. возвращает, существует ли патрульный путь. xvii. level.vertex_position(<vertex_id>) – возвращает центр AI-ноды b. Базовые функции на Lua i. printf 1. форматированный вывод данных, аналог printf в C++ (с ограничениями) ii. wait() 1. ждать до следующего обновления скрипта iii. wait(<time_to_wait>) 1. ждать заданное в миллисекундах время до следующего обновления скрипта iv. wait_game(<game_time_to_wait>) 1. ждать заданное в миллисекундах игровое время до следующего обновления скрипта v. action(<object>,<action1>,…) 1. Добавить объекту object в очередь заданий новое с переданными под-action-ами (смотрите примеры) c. Классы C++ i. vector 1. класс трёхмерный вектор, имеет следующие члены, методы: x,y,z – компоненты вектора set – установить значения компонент вектора по заданным значениям (три числа, вектор) add – добавить вектор sub – отнять вектор mul – умножить покомпонентно на вектор div – поделить покомпонентно на вектор … - есть ещё штук 30 других, но вы вряд ли будете ими пользоваться........ Дмитрий Ясенев 12.10.2003 Надеюсь чем-то поможет полная версия http://ifolder.ru/16937470 Поделиться этим сообщением Ссылка на сообщение
AKKK1 6 Опубликовано 25 Марта 2010 (изменено) Информация для создателей скриптов Составитель: 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 Задание имен вейпоинтов: Имя вейпоинта должно иметь следующий вид: имя|поле=значение|поле=значение|… Первое слово является именем и игнорируется парсером. Остальные фразы, разделенные символом '|' будут обработаны. Пример имен: 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 – персонаж сразу же пойдет дальше. Добавлено: Информация для создателей скриптов Составитель: 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 Задание имен вейпоинтов: Имя вейпоинта должно иметь следующий вид: имя|поле=значение|поле=значение|… Первое слово является именем и игнорируется парсером. Остальные фразы, разделенные символом '|' будут обработаны. Пример имен: 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 – персонаж сразу же пойдет дальше Изменено 25 Марта 2010 пользователем AKKK1 1 Поделиться этим сообщением Ссылка на сообщение
AKKK1 6 Опубликовано 19 Января 2011 Kolmogor, malandrinus Извените за оф топ но Возможно-ли чисто теоритически построение 3D АИ-сетки? Базовые ноды на земле имеют соединение (утрирую) вперед, назад, лево, право, верх. Второй уровень вперед, назад, лево, право, верх, низ . 3 уровень вперед, назад, лево, право, верх, низ и.т.д. получается один столбик но таких столбиков может быть столькоже сколько и нодов на земле (террейне) Впринципе можно добавить соединение по диоганали с соседних уровней сетки. Справятся с таким средние по современным меркам PC? Еще раз извеняюсь за оф топ. Поделиться этим сообщением Ссылка на сообщение