|
Модостроение. Спавн и логика
|
|
| 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 за это полезное сообщение: |
|
|
| makdm | Дата: Чт, 05.09.2013, 00:28 | Сообщение # 616 |
 Рожденный в СССР
Разработчики
Сообщений: 1294
| NIV, алгоритм простой. Взяли асдс, распаковали оригинальный олспавн, тут же запаковали. Если всё гуд, значит асдс работает правильно. Взяли готовую секцию левелченджера из распакованного оллспавна, скопировали в конец файла, число в секции поменяли, внесли свои координаты, запаковали. Не нужно ни добавлять ни убавлять никакие строчки. Тогда и вылетов не должно быть.
Терпение...... И все получится!
|
| |
|
| Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
| denis2000 | Дата: Чт, 05.09.2013, 09:35 | Сообщение # 617 |
 Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| 9vova8, Тоесть вылет с указанным логом происходит после начала новой игры на другой локации, после перехода в Припять и захода в рестриктор?
Эти НПС получают логику? Каким образом если они не приписаны к смарту? Симуляция для смарта и сквада в каком состоянии? Почему не привели файл с логикой НПС и секции точек пути?
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
| |
|
| Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
| strelok200 | Дата: Чт, 05.09.2013, 13:06 | Сообщение # 618 |
 Бывалый
Свобода
Сообщений: 126
| Подскажите почему у меня некоторые сквады произвольно удаляются, заспавнены стандартным образом и прописаны в спавне при начале игры, но иногда можно зайти на локацию, а там нет сквада, хотя обычно все работало. Редко , но бывает так
|
| |
|
| Эти 0 пользователя(ей) поблагодарили strelok200 за это полезное сообщение: |
|
|
| denis2000 | Дата: Чт, 05.09.2013, 16:32 | Сообщение # 619 |
 Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| strelok200, Могут под симуляцией уходить на другие смарты.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
| |
|
| Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
| NIV | Дата: Чт, 05.09.2013, 17:24 | Сообщение # 620 |
 Полевой исследователь
Ученые сталкеры
Сообщений: 167
| По поводу левел-чейнджера: у меня сильное подозрение, что имя для него может быть не любое, а ДОЛЖНО оканчиваться на _level_changer, ибо стоило поменять имя, и олл.спаун собрался. Вопрос, что такое dest_graph_point, остался.
Изменяем реальность S.T.A.L.K.E.R. CoP: "Цена Новых Исследований" / "New Investigations' Value"
Сообщение отредактировал NIV - Чт, 05.09.2013, 17:26 |
| |
|
| Эти 0 пользователя(ей) поблагодарили NIV за это полезное сообщение: |
|
|
| 9vova8 | Дата: Чт, 05.09.2013, 17:57 | Сообщение # 621 |
|
Новичок
Пользователи
Сообщений: 91
| denis2000, да именно в этом случае; НПС получают логику, ибо находяться на своих местах [cut=логика НПС][logic@pri_base_3] suitable = {=check_npc_name(pri_base_3)} active = walker@2
[walker@2] path_walk = pri_base_3_walk path_look = pri_base_3_look def_state_standing = guard_na def_state_moving1 = assault invulnerable = true def_state_standing = wait on_meet = meet [smart_terrain] none = true
[meet] abuse = false use = false allow_break = false meet_on_talking = false[/cut]
[cut=way_escape][pri_mono_base_smart_pri_base_3_walk] points = p0 p0:name = wp00 p0:flags = 0x1 p0:position = 17.43,4.90,380.64 p0:game_vertex_id = 694 p0:level_vertex_id = 220669
[pri_mono_base_smart_pri_base_3_look] points = p0 p0:name = wp00 p0:flags = 0x1 p0:position = 17.25,4.68,399.11 p0:game_vertex_id = 794 p0:level_vertex_id = 220720[/cut]
[cut=симуляция][pri_mon_squad]:default_squad sim_avail = false[/cut]
[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 - Чт, 05.09.2013, 17:59 |
| |
|
| Эти 0 пользователя(ей) поблагодарили 9vova8 за это полезное сообщение: |
|
|
| strelok200 | Дата: Чт, 05.09.2013, 18:54 | Сообщение # 622 |
 Бывалый
Свобода
Сообщений: 126
| Цитата (denis2000) strelok200, Могут под симуляцией уходить на другие смарты. Это не симуляционные сквады, а эксклюзивы, целевой смарт только один
|
| |
|
| Эти 0 пользователя(ей) поблагодарили strelok200 за это полезное сообщение: |
|
|
| denis2000 | Дата: Чт, 05.09.2013, 21:29 | Сообщение # 623 |
 Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Цитата (NIV) у меня сильное подозрение, что имя для него может быть не любое, а ДОЛЖНО оканчиваться на _level_changer Подозрение не обоснованное имя может быть любое уникальное.
9vova8, А вот это у вас зачем? Код [smart_terrain] none = true 9vova8, У вас смарт pri_smart_monolith, а префикс в имени пути pri_mono_base_smart - это вообще как? 9vova8, В конфиге сквада не определен целевой смарт и куда им подеться?
Цитата (strelok200) Это не симуляционные сквады, а эксклюзивы, целевой смарт только один Странно у меня такого нет, где назначено там и сидят. Если конечно не убьют, но убить могут только в онлайне.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
| |
|
| Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
| 9vova8 | Дата: Чт, 05.09.2013, 21:32 | Сообщение # 624 |
|
Новичок
Пользователи
Сообщений: 91
| denis2000, думал что избавляет от симуляции, уборка не помогла(( Да, с именем пути протупил, но особо не повлияло, target_smart тоже ничего не дал
Сообщение отредактировал 9vova8 - Чт, 05.09.2013, 22:07 |
| |
|
| Эти 0 пользователя(ей) поблагодарили 9vova8 за это полезное сообщение: |
|
|
| sergej5500 | Дата: Чт, 05.09.2013, 23:39 | Сообщение # 625 |
 Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Добрый Вечер. Заинтересовал такой момент. В СГМ уникальные НПС спавнятся через скрипт sgm_world строками типа: create("zat_stalker_bodyguard",105.417,-1.338,179.173,1148335,316). Вопрос такой, можно ли решить аналогичную задачу через рестриктор? Несквадовые НПС в ЗП через рестрикторы спавнятся функциями типа =spawn_corpse(zat_b100_military_1:zat_b100_heli_2_look). Попробовал для эксперимента заспавнить этого НПС через рестриктор. Спавн получился, но телохранитель на Скадовске оказался почему-то мёртвый. Какую функцию можно использовать вместо spawn_corpse, чтобы спавнить живых НПС?
Сообщение отредактировал sergej5500 - Чт, 05.09.2013, 23:39 |
| |
|
| Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
| denis2000 | Дата: Чт, 05.09.2013, 23:59 | Сообщение # 626 |
 Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| sergej5500, spawn_corpse - заспавнить труп, так что неудивительно. Используйте function spawn_object(actor, obj, p) из xr_effects.script, где p[1] - секция кого спаунить p[2] - имя патрульного пути где спа унить. p[3] - индекс точки пути или 0 p[4] - угол поворота объекта или 0
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
| |
|
| Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
| strelok200 | Дата: Пт, 06.09.2013, 08:30 | Сообщение # 627 |
 Бывалый
Свобода
Сообщений: 126
| Цитата (denis2000) Странно у меня такого нет, где назначено там и сидят. Если конечно не убьют, но убить могут только в онлайне. Может из-за новых локаций? Хотя все правильно зарегистрировано
|
| |
|
| Эти 0 пользователя(ей) поблагодарили strelok200 за это полезное сообщение: |
|
|
| sergej5500 | Дата: Пт, 06.09.2013, 17:03 | Сообщение # 628 |
 Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Добрый День. Интересует такой момент. В логике рестриктора имеется строка: on_info4 = {+zat_b38_alfa1_death =dist_to_actor_ge(300)} %-zat_b38_alfa1_death =spawn_object(zat_b38_alfa1:zat_b38_alfa1_look:0:0)% Если НПС убит, а дистанция до ГГ более 300 метров, то инфопорция смерти сбрасывается, а НПС спавнится повторно. Здесь, как я полагаю, измеряется дистанция от ГГ до точки рестриктора, прописанной в all.spawn. Вопрос такой. Можно ли применить данную схему для измерения дистанции от ГГ до произвольной точки, координаты которой не совпадают с координатами рестриктора? Какой функцией можно воспользоваться и как она выглядит в логике? Как эту точку зарегистрировать в all.spawn? Мне для квеста нужно по этой схеме спавнить враждебных ГГ НПС в разных местах локации на больших расстояниях друг от друга. Спавн должен происходить, когда ГГ удалится от точки спавна НПС на 300 метров. Можно ли организовать спавн через один рестриктор, или каждому НПС надо делать свой собственный?
|
| |
|
| Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
| denis2000 | Дата: Пт, 06.09.2013, 17:43 | Сообщение # 629 |
 Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Цитата (9vova8) ...уборка не помогла...особо не повлияло...target_smart тоже ничего не дал Раз прямой метод не помогает идите от обратного: ставьте ловушки в скриптах для отслеживания причин глюка.
Цитата (strelok200) Может из-за новых локаций? Хотя все правильно зарегистрировано Раз прямой метод не помогает идите от обратного: отслеживайте состояние своего сквада и его перемещения (например включив отображения всех сквадов на карте или отслеживая удаление сквадов выводя инфу какой сквад и почему удаляется).
sergej5500, Все можно сделать (естественно в пределах движковых и скриптовых возможностей). Хотите сделайте скрипт вы дающий true при расстоянии более заданного от конкретного объекта или даже просто от конкретной точки заданной вектором координат. Хотите отслеживайте расстояние от нескольких точек. Я например писал логику рестриктора в котоом отслеживается респавн 4-х сквадов причем ГГ должен в этот момент находиться на расстоянии не менее 150 метров от ВСЕХ смартов на которых могут заспавниться эти сквады. [cut]Код -- Расстояние до группы объектов p[1]-расстояние p[2]..p[n]-стори-ид объектов function dist_to_objs_ge(actor, npc, p) for i=2, #p do local story_id = p[i] local story_obj_id = get_story_object_id(story_id) if story_obj_id ~= nil then local se_obj = alife():object(story_obj_id) if se_obj.position:distance_to_sqr(db.actor:position()) < p[1] * p[1] then return false end end end return true end Код -- Расстояние просто от точки с координатами function dist_to_point_ge(actor, npc, p) local d = p[1] local pos = vector():set(-123.25936889648,-26.306539535522,-475.29595947266) return d and pos:distance_to_sqr(actor:position()) > d * d end [/cut]
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
| |
|
| Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
| Korvo | Дата: Пт, 06.09.2013, 21:44 | Сообщение # 630 |
 Тихий Малый
Пользователи
Сообщений: 356
| Добрый вечер. Я возможно обращаюсь не в ту тему. Я просто не знаю, куда с этим идти. Из-за чего происходит вот этот вылет: [cut]FATAL ERROR [error]Expression : ai().level_graph().valid_vertex_id(vertex->data().level_vertex_id()) [error]Function : CPatrolPathManager::select_point [error]File : E:\stalker\patch_1_0004\xr_3da\xrGame\patrol_path_manager.cpp [error]Line : 164 [error]Description : patrol path[gar_seriywff_walk], point on path [name00],object [gar_seriywff]
stack trace:[/cut]
При свете дня, во тьме ночной, Темный сталкер следит за тобой.
|
| |
|
| Эти 0 пользователя(ей) поблагодарили Korvo за это полезное сообщение: |
|
|
|