Модостроение. Спавн и логика
|
|
denis2000 | Дата: Пн, 10.10.2011, 21:20 | Сообщение # 1 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Спавн и логика Создание объектов на локации и логика поведения этих объектов Если у вас появились вопросы по созданию динамических объектов в игре (НПС, монстры, аномалии, и т.п.) и настройке их "поведения". Задавайте их в этой теме - умные головы, модосторители и просто разбирающиеся в программировании люди вам ответят.
Много интересного материала здесь (wiki), Lua_help.script, Help из SDK 0.7
Сборник модостроения ЗП 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 | Дата: Чт, 15.08.2013, 23:06 | Сообщение # 601 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Цитата (FantomICW) параметр snd_anim_synс со значением true...
Это может помочь, нужно попробовать.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
sergej5500 | Дата: Сб, 17.08.2013, 19:31 | Сообщение # 602 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Добрый Вечер. В СГМ сделал сталкера с логикой: [cut=Логика][logic] active = move@walker
[move@walker] move_dest_number = 1174497 move_look_vertex = 1174487 move_state_when_center = ward_noweap move_state_when_move = walk meet = meet invulnerable = true combat_ignore_cond = true combat_ignore_keep_when_attacked = true on_info = {+mayron_m249_stalker_raskazal} move@final
[move@final] move_dest_number = 1174497 move_look_vertex = 1174487 move_state_when_center = ward_noweap move_state_when_move = walk meet = meet invulnerable = true combat_ignore_cond = true combat_ignore_keep_when_attacked = true on_info = {+mayron_m249_otdal_stalkeram =dist_to_actor_ge(250)} nil %=release_npc% on_info2 = {-mayron_m249_otdal_stalkeram =dist_to_actor_ge(250)} nil %=release_npc +zat_b42_mayron_m249_enemy% on_info3 = {+zat_b42_mayron_m249_enemy} nil %=release_npc%
[meet] abuse = true use = {=actor_has_item(m249_mayron) =dist_to_actor_le(3)} self,false allow_break = false meet_on_talking = false trade_enable = false[/cut]
При наличии у ГГ квестового предмета сталкер заводит диалог с ГГ и предлагает отдать квестовый предмет (m249_mayron). В принципе, всё работает. Но этот сталкер заводит диалог, даже когда ГГ за металлической переборкой Скадовска и сталкер ГГ видеть не может. Можно ли сделать так, чтобы сталкер заводил разговор, только когда "видит" ГГ? Заранее благодарен за советы.
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
Митрандир | Дата: Сб, 17.08.2013, 20:07 | Сообщение # 603 |
Удаленные
| sergej5500, варианты: - уменьшить зону срабатывания логики разговора - передвинуть нпс от стенки объекта
Нет такого понятия как прямая видимость ГГ в одну сторону, зона использования будет распространятся как окружность во все стороны, вне зависимости от наличия полигона какого-либо объекта локации (в данном случае стенка корабля)
|
|
|
Эти 0 пользователя(ей) поблагодарили Митрандир за это полезное сообщение: |
|
|
denis2000 | Дата: Сб, 17.08.2013, 21:17 | Сообщение # 604 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| sergej5500, Используй функцию function see_actor(actor, npc) из скрипта xr_conditions.script
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
9vova8 | Дата: Сб, 31.08.2013, 11:25 | Сообщение # 605 |
Новичок
Пользователи
Сообщений: 91
| Доброго времени суток, возможно ли телепортироваться на Припять не в здание военных, если да, то как? У меня получаеться вылет [cut] FATAL ERROR
[error]Expression : !m_error_code [error]Function : raii_guard::~raii_guard [error]File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp [error]Line : 748 [error]Description : .... - Зов Припяти\gamedata\scripts\xr_motivator.script:159: attempt to index local 'smart_terrain' (a nil value)
stack trace: [/cut] Телепорт я делал сам и изменял координаты стандартного.
Сообщение отредактировал 9vova8 - Сб, 31.08.2013, 11:26 |
|
|
Эти 0 пользователя(ей) поблагодарили 9vova8 за это полезное сообщение: |
|
|
denis2000 | Дата: Сб, 31.08.2013, 12:07 | Сообщение # 606 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Цитата (9vova8) возможно ли телепортироваться на Припять не в здание военных, если да, то как? Да конечно при помощи level_changer-а
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
9vova8 | Дата: Сб, 31.08.2013, 12:19 | Сообщение # 607 |
Новичок
Пользователи
Сообщений: 91
| denis2000, с помощью level_changer-а и получаеться вылет [cut][6619] ; cse_abstract properties section_name = level_changer name = zatonp_level_changer position = -180.71,13.94,78.24 direction = 0,0,2.2000000171829e-005 cse_abstract__unk1_h16 = 0x1
; cse_alife_object properties game_vertex_id = 145 distance = 67.1 level_vertex_id = 580244 object_flags = 0xffffff3e
; cse_shape properties shapes = shape0 shape0:type = sphere shape0:offset = 0,0,0 shape0:radius = 1.51
; cse_alife_space_restrictor properties restrictor_type = 3
; cse_alife_level_changer properties dest_game_vertex_id = 809 dest_level_vertex_id = 344650 dest_position = 118.11,-0.25,347.58 dest_direction = 0,0,-0 dest_level_name = pripyat dest_graph_point = pripyat_lc_graph_point silent_mode = 1
; se_level_changer properties [/cut]
Координаты начала игры на припяти также не изменяються.
Сообщение отредактировал 9vova8 - Сб, 31.08.2013, 12:37 |
|
|
Эти 0 пользователя(ей) поблагодарили 9vova8 за это полезное сообщение: |
|
|
denis2000 | Дата: Сб, 31.08.2013, 13:26 | Сообщение # 608 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| 9vova8, У меня вылета с вашим level_changer - нет. Проблема не в нем.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
sergej5500 | Дата: Сб, 31.08.2013, 17:13 | Сообщение # 609 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Добрый День. Начал делать квест на "тихое" проникновение на ВНЗ Круг, занятый Альфой. По замыслу, если ГГ в костюме наёмника, то Альфовцы должны быть к нему нейтралами. Переделал им логику так: [cut=Логика альфовца][logic] active = move@walking on_death = death
[death] on_info = %+zat_b38_alfa1_death%
[move@walking] move_dest_number = 206665 move_state_when_center = guard move_state_when_move = walk move_look_vertex = 246485 meet = meet on_info = {=zat_b38_alfa_has_outfit} %=actor_neutral%
[meet] abuse = true use = {!actor_enemy} true, false allow_break = true meet_on_talking = false[/cut]
[cut=Функция проверки костюма ГГ в xr_effects]function zat_b38_alfa_has_outfit(actor,npc,p) local outfit_in_slot=db.actor:item_in_slot(7) if outfit_in_slot~=nil and (find_in_string(outfit_in_slot:section(),"killer_outfit") or find_in_string(outfit_in_slot:section(),"killer_exo_outfit")) then return true else return false end end[/cut]
При входе альфовцев в онлайн поймал вылет. [cut=Лог]FATAL ERROR [error]Expression : !m_error_code [error]Function : raii_guard::~raii_guard [error]File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp [error]Line : 748 [error]Description : ...files 1\Зов Припяти\gamedata\scripts\xr_logic.script:500: attempt to call field '?' (a nil value)
stack trace:[/cut] Как я понял, что-то нужно вписать в xr_conditions. Вопрос, что именно?
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
makdm | Дата: Сб, 31.08.2013, 17:32 | Сообщение # 610 |
Рожденный в СССР
Разработчики
Сообщений: 1294
| sergej5500, Функция проверки пишется в файле xr_conditons.script
Пропишите так
function zat_b38_alfa_has_outfit(actor, npc) local actor_outfit = db.actor:item_in_slot(7) if actor_outfit ~= nil then if string.find(actor_outfit:section(), "killer") ~= nil then return true end end return false end
Терпение...... И все получится!
Сообщение отредактировал makdm - Сб, 31.08.2013, 17:39 |
|
|
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
sergej5500 | Дата: Вс, 01.09.2013, 20:08 | Сообщение # 611 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Добрый Вечер. Делаю квест на "тихое" проникновение на ВНЗ Круг, занятый Альфой и освобождение пленного сталкера. По замыслу игрок в костюме наёмника беспрепятственно проходит в подвал, где держат пленника, передаёт ему ещё один костюм наёмника и они уходят. Для "переодевания" пленного сталкера организовал гашение экрана и отключение игрового интерфейса. За это время сталкер удаляется и спавнится новый в костюме наёмника.
[cut=Рестриктор ВНЗ][logic] active = sr_idle@start
[sr_idle@start] on_info = {+zat_b38_alfa_plennic_quests_start} sr_idle@plennic on_info2 = {+zat_b38_attack} sr_idle@final %+zat_b38_alfa_stop_spawn =zat_b38_table_enemies% on_info3 = {+zat_b38_stalker_enemy} sr_idle@final %+zat_b38_alfa_stop_spawn%
[sr_idle@plennic] on_info = {+zat_b38_alfa_plennic_outfit_otdal} sr_idle@plennic2 on_info2 = {+zat_b38_alfa_plennic_quests_fail} sr_idle@start2 on_info3 = {+zat_b38_alfa_plennic_quests_reward} sr_idle@start2
[sr_idle@plennic2] on_timer = 3500|sr_idle@plennic2 %=run_postprocess(black:38001:true) =disable_ui +zat_b38_alfa_plennic1_release_nps% on_info = {+zat_b38_alfa_plennic_quests_fail} sr_idle@start2 on_info2 = {+zat_b38_alfa_plennic_quests_reward} sr_idle@start2 on_info3 = {+zat_b38_alfa_plennic1_release_nps} sr_idle@plennic3
[sr_idle@plennic3] on_info = {+zat_b38_alfa_plennic_killer_outfit_otdal +zat_b38_alfa_plennic1_release_npc -zat_b38_alfa_plennic2_spawn} sr_idle@plennic4 %+zat_b38_alfa_plennic2_spawn =zat_b38_alfa_plennic2_spawn% on_info2 = {+zat_b38_alfa_plennic_killer_exo_outfit_otdal +zat_b38_alfa_plennic1_release_npc -zat_b38_alfa_plennic3_spawn} sr_idle@plennic4 %+zat_b38_alfa_plennic3_spawn =zat_b38_alfa_plennic3_spawn%
[sr_idle@plennic4] on_timer = 3500|sr_idle@plennic4 %=stop_postprocess(38001) =enable_ui% on_info = {+zat_b38_alfa_plennic_quests_fail} sr_idle@start2 on_info2 = {+zat_b38_alfa_plennic_quests_reward} sr_idle@start2
[sr_idle@start2] on_info = {+zat_b38_attack} sr_idle@final %+zat_b38_alfa_stop_spawn =zat_b38_table_enemies% on_info2 = {+zat_b38_stalker_enemy} sr_idle@final %+zat_b38_alfa_stop_spawn%
[sr_idle@final] on_info = {+zat_b38_alfa1_death +zat_b38_alfa2_death +zat_b38_alfa3_death +zat_b38_alfa4_death +zat_b38_alfa5_death +zat_b38_alfa6_death +zat_b38_alfa7_death +zat_b38_alfa8_death +zat_b38_alfa9_death +zat_b38_alfa10_death +zat_b38_alfa11_death +zat_b38_alfa12_death +zat_b38_alfa13_death +zat_b38_alfa14_death +zat_b38_alfa15_death +zat_b38_alfa16_death +zat_b38_alfa17_death +zat_b38_alfa18_death +zat_b38_alfa19_death +zat_b38_alfa20_death +zat_b38_alfa21_death +zat_b38_alfa22_death +zat_b38_alfa23_death +zat_b38_alfa24_death +zat_b38_alfa25_death +zat_b38_alfa26_death +zat_b38_alfa27_death +zat_b38_alfa28_death +zat_b38_alfa29_death +zat_b38_alfa30_death -zat_b38_alfa_kill} %+zat_b38_alfa_kill =scenario_autosave(st_save_zat_b38_alfa_kill)% on_info2 = {+zat_b38_alfa_kill} sr_idle@nil
[sr_idle@nil][/cut] Всё работает. Экран гасится, интерфейс игрока отключается, сталкер спавнится. Вопрос, как перемотать игровое время за время затемнения, допустим на 10 игровых минут вперёд. Иначе получается, что сталкер "переоделся" меньше, чем за одну игровую минуту.
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
denis2000 | Дата: Вс, 01.09.2013, 20:12 | Сообщение # 612 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| sergej5500, Можно функцией из xr_effects.script: Код =forward_game_time(0:10)
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
9vova8 | Дата: Ср, 04.09.2013, 17:56 | Сообщение # 613 |
Новичок
Пользователи
Сообщений: 91
| Доброго времени суток, 3 суток не могу ничего сделать: Игра вылетает при спавне сквада в припяти с таким вот логом [cut=лог]FATAL ERROR
[error]Expression : !m_error_code [error]Function : raii_guard::~raii_guard [error]File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp [error]Line : 748 [error]Description : ...e.r. - Зов Припяти\gamedata\scripts\sim_board.script:228: attempt to index local 'spawn_smart' (a nil value)
stack trace:[/cut] Самое плохое это то, что вылетает только после перехода на припять с другой локации, а если на припяти с новой игры - всё хорошо, сквад спваниться, НПС действуют по логике.
[cut=логика рестриктора][logic] active = sr_idle
[sr_idle] on_actor_inside = {-spawn_monolith} sr_idle@1 %+spawn_monolith =create_squad(pri_mon_squad:pri_smart_monolith)%
[sr_idle@1][/cut] [cut=squad_descr][pri_mon_squad]:online_offline_group faction = monolith npc = pri_ucheniy_stiven, pri_base_1, pri_base_2, pri_base_3 story_id = pri_mon_squad[/cut]
[cut=smart][6621] ; cse_abstract properties section_name = smart_terrain name = pri_smart_monolith position = 263.32,0.16,304.27 direction = -0.43800100684166,0.972104012966156,-3.10020399093628
; cse_alife_object properties game_vertex_id = 680 distance = 0 level_vertex_id = 465469 custom_data = <<END [story_object] story_id = pri_smart_monolith [smart_terrain] cfg = scripts\pripyat\pri_smart_monolith.ltx END ; cse_shape properties shapes = shape0 shape0:type = sphere shape0:offset = 0,0,0 shape0:radius = 1.7 ; cse_alife_space_restrictor properties restrictor_type = 3 ; se_smart_terrain properties[/cut]
Сообщение отредактировал 9vova8 - Ср, 04.09.2013, 17:56 |
|
|
Эти 0 пользователя(ей) поблагодарили 9vova8 за это полезное сообщение: |
|
|
FantomICW | Дата: Ср, 04.09.2013, 18:30 | Сообщение # 614 |
Лидер «Свободы»
Свобода
Сообщений: 4438
| 9vova8, где-то читал, что подобна ошибка бывает при указании несуществующего смарта, где спавнится отряд. В алл.спавн секция есть. Пока у меня два предположения: 1. Спавн перекомпилировать не забыл? 2. Есть ли файл с логикой смарта?
Сообщение отредактировал FantomICW - Ср, 04.09.2013, 18:32 |
|
|
Эти 0 пользователя(ей) поблагодарили FantomICW за это полезное сообщение: |
|
|
9vova8 | Дата: Ср, 04.09.2013, 18:34 | Сообщение # 615 |
Новичок
Пользователи
Сообщений: 91
| FantomICW, [cut=логика смарта][smart_terrain];pri_smart_monolith squad_id = 92 max_population = 4
[exclusive] pri_base_1 = pripyat\pri_base_1.ltx pri_base_2 = pripyat\pri_base_2.ltx pri_base_3 = pripyat\pri_base_3.ltx pri_ucheniy_stiven = pripyat\pri_ucheniy_stiven.ltx[/cut] ошибка у меня когда то такая была и проблемма была с файлом логики, но всё вроде рабочее, так как при новой игре на припяти всё работает. Могла быть ошибка в пути к имени файла с логикой смарта, но логика НПС ексклюзивная и поэтому она бы вылетала раньше.
Сообщение отредактировал 9vova8 - Ср, 04.09.2013, 18:36 |
|
|
Эти 0 пользователя(ей) поблагодарили 9vova8 за это полезное сообщение: |
|
|
|