Создание объектов на локации и логика поведения этих объектов
Если у вас появились вопросы по созданию динамических объектов в игре (НПС, монстры, аномалии, и т.п.) и настройке их "поведения". Задавайте их в этой теме - умные головы, модосторители и просто разбирающиеся в программировании люди вам ответят.
Сборник модостроения ЗП v10.10.11 (автор: XOBAH): *.CHM, *.HTML [cut noguest=Если у вас не открывается файл CHM]Если у вас не открывается файл: 1. Запустите [Пуск]=>[Выполнить] (либо хот-кей [WIN]+[R]) 2. Введите команду (без кавычек) "regsvr32 %windir%\system32\hhctrl.ocx" 3. Если вылезло окно об успешном завершении вы все сделали правильно и можете перезагружать компьютер (а может и не надо) Также: файлы МОГУТ не открываться если в пути к файлу есть: символы кириллицы, "_", "#" Также: есть не стандартные программы-просмоторщики CHM файлов. Например: FBReader[/cut]
[cut=Где найти лог игры после вылета]Что такое LOG ошибки, и как мне его найти? Это система отладки происходивших вылетов, которая подается игрой в форме текста, хотя не всегда. Для того чтоб найти LOG необходимо зайти вот сюда:
В Win хр лог находится:
C:\Documents and Settings\All Users\Документы\S.T.A.L.K.E.R. - Зов Припяти\logs
Затем открываете первый файл в формате TXT, и в нем отбираете с низу 25 строчек. После кидаете эти 25 строчек в сообщение на форум.
В Win7 лог находится C:\Users\Public\Documents\S.T.A.L.K.E.R. - Зов Припяти\logs
Путь к папке с логом можно найти открыв файл fsgame.ltx который находится в корневой директории ЗП, за это отвечает строка: ... $app_data_root$ = true | false| $fs_root$| users\(тут мы указываем что папка пользователя, будет хранится рядом с Fsgame.ltx) ... $logs$ = true| false| $app_data_root$| logs\(а тут мы указываем что в папке пользователя, в подпапке Logs будут храниться наши логи) ... [/cut][cut=Получение более подробной информации о вылете (ХОВАН)] Открываем файл _g.script и ищем такую функцию: function abort(fmt, ...) Там есть заккомментированная строчка "--error_log(reason)", ее и надо расскомментировать, должно получиться вот так:
Code
function abort(fmt, ...) local reason = string.format(fmt, ...) error_log(reason) end
Вот для примера два одинаковых вылета, первый с функцией по умолчанию, второй - с поправленной функцией
Первый:
Code
Expression : !m_error_code Function : raii_guard::~raii_guard File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp Line : 748 Description : ....a.l.k.e.r. - Зов Припяти\gamedata\scripts\_g.script:478: bad argument #2 to 'format' (string expected, got nil)
Второй:
Code
Expression : 0 Function : ErrorLog File : D:\prog_repository\sources\trunk\xrServerEntities\script_engine_script.cpp Line : 49 Description : 'Attempt to read a non-existant string field 'path_walk' in section 'walker@mechanic'
[/cut]
Перед тем, как задать вопрос в этой теме, прочтите все предыдущие страницы, статьи в wiki по ссылке из шапки и соседнюю тему "Курс молодого бойца", возможно Ваш вопрос уже рассматривался.
Если произошел вылет - выкладываем лог! Вопрос ставим четко, не забываем указывать версию игры, установленные моды их версии, установленные фиксы модов и подробно ваши правки. Помните чем подробнее вопрос, тем точнее ответ.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение:
denis2000, Спасибо. Вылет на загрузке пропал. Но НПС не хотят выполнять работу. Сквад остается на смарте. Бойцы сидят, ходят туда-сюда. Работы, как одиночные НПС, выполнять не хотят.
Сообщение отредактировал sergej5500 - Сб, 25.01.2014, 21:57
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение:
sergej5500, Теперь сначит нужно анализировать работу скрипта smart_terrain.script вроде именно в нем происходит назначение НПС из сквадов на работы на смарте. "Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение:
Есть такая проблема заспавнил я монстров спавнятса норм на своих местах,только кроме етого спавнятса и окло меня все вместе .подскажите что зделал не правильно
алл спавн
[escape_smart_11] ; cse_abstract properties section_name = smart_terrain name = esc_smart_terrain_1_01 position = -117.170334,15.951937,132.855347 direction = 0.975060,0,-0.221941
sergej5500, Попробовал я запилить логику xr_move на смарте - у меня работает! Моей рекомендации оказалось достаточно.
gamer, В приведенных конфигах проблемы нет. "Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение:
После того, как ГГ поговорит с ним и отойдет метров на 30, НПС "зависает". Стоит на месте, ходит туда-сюда. Если ГГ удаляется от лесопилки на дистанцию загрузки локации и возвращается обратно, то НПС обнаруживается сидящим возле машины.
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение:
sergej5500, Это в смысле через смарт так, а через индивидуальную логику нормально? "Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение:
denis2000, В общем, да. Если этого НПС спавнить как одиночку с кастом-датой то он выполняет работу отлично. При добавлении этой логики как эксклюзива на смарт лесопилки работа выполняется неустойчиво".
Добавлено (28.01.2014, 16:07) --------------------------------------------- Добрый день. Для квеста по освобождению пленника с ВНЗ добавил 10 НПС, преследующих ГГ и пленного сталкера. Все НПС находятся под логикой xr_move.
local s_dir,s_dist=scheme_section["pursue_member_"..scheme_param.haved_pursue].dir,scheme_section["pursue_member_"..scheme_param.haved_pursue].dist utils.send_to_nearest_accessible_vertex(npc,level.vertex_in_direction(scheme_section.pursue_target:level_vertex_id(),s_dir,s_dist))
Файл xr_move правился с целью увеличения кол-ва НПС, одновременно движущихся за актором, до 12. Хотя к вылету это приводить не должно. Для пробы делал 15 тестовых НПС. 12 неписей устремлялись за игроком. 3 оставались на месте. В момент выдачи инфопорции некоторое кол-во преследователей может находиться в оффлайне. В чем может быть причина вылета и как его можно исправить?
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение:
При добавлении этой логики как эксклюзива на смарт лесопилки работа выполняется неустойчиво"
Видимо из-за того что логика написана в расчете на использование через кастомдату, взаимодействие с другими схемами реализовано не совсем корректно, хотя логика move честно пытается сменить положение тела у НПС после диалога это у нее не всегда получается (переход в анимстейт sit_ass гораздо чаще не получается, а вот в give_orders например бес проблем). Для того чтобы решить эту проблему можно в секции meet запретить телодвижения:
Теперь НПС не вскакивает без нужды и соответственно схема работает устойчиво.
sergej5500, Я уже выкладывал памятку по логике xr_move вот повторюсь:
Код
[logic]active = move
[move]move_dest_number = {+infa} 7574, 1192032 ; вертекс точки где стоит НПС move_stand_time = 0 ; Задержка в пункте назначения move_dest_actor = true ; идти за ГГ move_avail_cond = {=actor_has_weapon} false, true ; Условие при котором НПС может идти. move_look_vertex = {+infa} 7574, 1192032 ; вертекс точки куда смотрит НПС move_look_subject = actor ; смотреть на объект move_state_when_center = sit ; анимация стоячего положения move_state_when_move = walk ; анимация ходячего положения move_quick_animation = true ; Быстро ли применять анимацию тела move_home_teleport = true ; Телепортация в пункт назначения, при отходе от него. move_avail_speak = 15|wait|false|true ; Воспроизведение звуковой схемы через определённый промежуток времени (промежуток_в_секундах|звуковая_схема|говорить_при_беге|постоянно_говорить)
move_combat_disable = true ; Запретить ли реакцию на раздражители. move_stop_on_talk = true ; Останавливаться при диалоге.
move_pursue_actor = true ; Охранять ГГ. move_pursue_look_subject = actor ; Смотреть на ГГ. move_pursue_sid = story_id|false ; Охранять SID объект (название_sid|использовать_ли_анимацию_sidа) move_pursue_range = 5|35 ; Дистанции до SID при которых совершаются изменения анимаций тела (мин.дистанция|макс.дистанция).
move_pursue_state_stand = hide ; Анимация тела по достижении цели охраны. move_pursue_state_move = assault ; Анимация тела для обычного движения к цели охраны. move_pursue_state_overtake = sprint ; Анимация тела для ускоренного движения к цели охраны.
move_center_info = infa ; Выдать инфопортацию по достижении пункта назначения. move_center_action = %=(блабла)% ; Выполнить действие {} %% по достижении пункта назначения. move_approach_actor = 1.9 ; Приближаться к ГГ. Значение параметра указывает дистанцию до ГГ, по преодолению которой НПС остановится. Режим №1. approach_state = hide_na|18|> ; Применение анимации тела на определённых дистанциях. approach_info = infa |8|< ; Выдача инфопортации на определённой дистанции
[move@DEPEND] scheme_type = depend ; установка схемы DEPEND depend_home_point = 1250657 ; Рабочий вертекс, в радиусе depend_holder от которого будет ходить НПС. depend_holder = 20 ; Радиус рабочего вертекса. depend_anim = walk ; Анимация тела для передвижения НПС. depend_combat_disable = true ; Запретить ли реакцию на раздражители.
[move@SHOOTER] scheme_type = shooter ; установка схемы SHOOTER shooter_pos = 1096311 ; Рабочая позиция НПС. shooter_fire_look = enemy ; Цель-вертекс в режиме огня shooter_idle_look = actor ; Цель-вертекс в режиме прицеливания. shooter_clip = 100000 ; Количество патронов или зарядов у НПС. Значение -1 означает бесконечность. shooter_reload = 600 ; Время между выстрелами shooter_type_wpn = sniper ; Тип оружия. Может быть: grenade_launcher, rifle, sniper. shooter_need_see = true ; Необходимо ли видеть цель, чтобы войти в режим огня shooter_need_dist = 120 ; Дальность ведения огня. shooter_move_state = walk ; Анимация тела для движения к назначенной позиции shooter_idle_state = threat ; Анимация тела по достижении назначенной позиции, в режиме прицеливания. shooter_fire_state = threat_fire ; Анимация тела по достижении назначенной позиции, в режиме огня. shooter_avail_cond = {+инфо} true, false ; Условие входа в режим огня. shooter_end_action = %=000% ; Выполнение действия {} %% после завершения обстрела. shooter_ignore_actor = false ; Игнорировать ли ГГ.
[move@PATROL] scheme_type = patrol ; установка схемы PATROL patrol_count_path = 2 ; Количество точек в патрульном пути patrol_path_1 = 34198 ; вертекс 1 точки patrol_path_1_state = rush ; анимация движения к 1 точки patrol_path_2 = 25663 ; вертекс 1 точки patrol_path_2_state = rush ; анимация движения к 2 точки patrol_countdown = false ; Обратный ли проход по точкам. Не с 1 по 20, а с 20 по 1. patrol_closed = false ; Замкнутый ли патрульный путь.
patrol_quick_anim = true ; Быстро ли применять анимацию тела. patrol_no_reaction = false ; Запретить ли реакцию на раздражители.
Там move_pursue_actor = true - ОХРАНЯТЬ ГГ, так что эту логику для преследователей ГГ вы применяете изначально не корректно. По вылету ничего сказать не могу - логику нужно долго анализировать чтобы понять, где и в чем не стыковка. "Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение:
Сделайте переход не с walker, а со схемы move на схему companion
Если предполагаете что кто-то из нпс переходит в оффлайн, то попробуйте в логике работы на смарте прописать job_online = true Я не проверял, но судя по скриптам, "чувак" всегда будет online независимо от switch_distance. Терпение...... И все получится!
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение:
makdm, В схеме companion нашел 2 недочета. 1. Если НПС дружественные, то они буквально "лезут" на ГГ. Окружают его со всех сторон, не дают применять оружие. Можно ли им прописать остановку, например в 5 метрах от игрока? 2. Для НПС под логикой move можно прописать move_combat_disable = true. В таком режиме они ведут себя относительно адекватно. Не реагируют на удаленных врагов. Защищаются, если на них нападают. Актора валят прекрасно. Если в схеме companion параметр combat_ignore_cond ограничен 50 метрами, то игрок беспрепятственно валит НПС на больших дистанциях. Если ограничения на combat_ignore_cond снять, то НПС отвлекаются на ближайших врагов и уделяют актору мало внимания.
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение:
Я не думаю, что схема move_pursue_actor для враждебных НПС ошибочна.
Нет схемы move_pursue_actor, есть схема move и подсхемы: DEPEND, SHOOTER, PATROL (как это определил сам автор). move_pursue_actor - это параметр в схеме move говорящий что НПС нужно двигаться за ГГ в определенном порядке (pursue_formation), за формирование и поддержание которого отвечает function action_move:pursue_formation_control(npc,target) которая у вас к стати и вылетает. Все вроде хорошо, но есть одно но - этот режим подразумевает ТЕЛЕПОРТ НПС к ГГ в случае удаления от него на расстояние более 60 метров (по умолчанию), а это уж ни как не есть хорошо для логики ПРЕСЛЕДОВАТЕЛЯ.
Да можно использовать логику companion, предварительно ее модернизировав (я и сам это делал когда понадобилась логика охраняемого Главным Героем НПС), или переделать логику move так, чтобы враждебные НПС не могли по волшебству доганять ГГ. "Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: