|
Модостроение. Спавн и логика
|
|
| 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 | Дата: Ср, 21.05.2014, 00:48 | Сообщение # 916 |
 Рожденный в СССР
Разработчики
Сообщений: 1294
| sergej5500, зачем вы в каждой точке прописывает flags ? По моему они тут лишние. Я бы сделал так, или в последней точке ( 21 ) прописал p21:flags = 0x1 и сделал точку look с таким же флагом flags = 0x1 или дописал бы в 21 точку
p21:links = p0(1) Перехода к нулевой точке не будет, т.к. выдан сигнал и произойдёт переключение схемы.
Терпение...... И все получится!
Сообщение отредактировал makdm - Ср, 21.05.2014, 00:55 |
| |
|
| Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
| sergej5500 | Дата: Ср, 21.05.2014, 10:42 | Сообщение # 917 |
 Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Доброе утро. Вернусь к предыдущему вопросу. Исправил проблему зависания непися на 20 точке. Видимо, 21 точка маршрута попала в зону "миролюбия" на Скадовске и тот не хотел туда заходить. После правки пути и выдачи сигнала на 20 точке сигнал стал выдаваться.
Возник новый вопрос.
[cut=Логика][logic@zat_accompany_stalker] active = walker@walker suitable = {=check_npc_name(zat_accompany_stalker)} true prior = 200 on_death = death
[death] on_info = {-zat_accompany_to_boat_start} %+zat_accompany_stalker_death%,{+zat_accompany_to_boat_start -zat_accompany_to_boat_daleko} %+zat_accompany_stalker_death +zat_accompany_to_boat_i_am_alone%
[walker@walker] path_walk = zat_accompany_stalker_patrol_walk on_info = {+zat_accompany_to_boat_start -zat_accompany_to_boat_complete} walker@walker_2
[walker@walker_2] path_walk = zat_accompany_stalker_pursue_walk def_state_moving = assault on_signal = zat_accompany_to_boat_sms | walker@walker %=send_tip(zat_accompany_final_text:portrait_neutral_1:zat_accompany_stalker_title:5000)% on_info = {+zat_accompany_to_boat_start -zat_accompany_to_boat_complete -zat_accompany_to_boat_daleko =dist_to_actor_ge(90)} walker@walker %+zat_accompany_to_boat_daleko =release_npc% on_info2 = {+zat_accompany_to_boat_complete} walker@walker on_info3 = {=zat_accompany_stalker_ambush_cond -zat_accompany_to_boat_ambush} %+zat_accompany_to_boat_ambush =zat_accompany_stalker_ambush_action%[/cut]
При получении сигнала НПС должен перейти на секцию walker@walker и ГГ приходит текстовое сообщение. Но непись зависает. Сообщения приходят непрерывно по 2-3 штуки в секунду. Непись переключается на секцию walker@walker только после прихода инфопорции zat_accompany_to_boat_complete. Она выдается после приближения игрока к Скадовску на определенную дистанцию.
Почему НПС капризничает?
|
| |
|
| Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
| denis2000 | Дата: Ср, 21.05.2014, 13:01 | Сообщение # 918 |
 Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| sergej5500, Он капризничает потому что постоянно переключается между секциями walker@walker и walker@walker_2
Цитата sergej5500 (  ) Непись переключается на секцию walker@walker только после прихода инфопорции zat_accompany_to_boat_complete Вы ошибаетесь! Он переключается по этому услоувию: on_signal = zat_accompany_to_boat_sms | walker@walker %=send_tip
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
| |
|
| Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
| alex_xp_77 | Дата: Пн, 09.06.2014, 18:31 | Сообщение # 919 |
|
Научный сотрудник.
Ученые сталкеры
Сообщений: 242
| Добрый день всем !! У меня вопрос, при пробежке по локации, происходит вылет, без лога, просто вылет, очень похоже на непонятную команду, когда нпс незнает что ему заданно, какую команду необходимо выполнять, прилогаю скрины : 1) общая картина http://SSMaker.ru/671c90e0/ 2) логика http://SSMaker.ru/3925a430/ http://SSMaker.ru/82fa3bfd/ 3) пути http://SSMaker.ru/5ebdac11/ http://SSMaker.ru/1e6717b7/ http://SSMaker.ru/bdfdeaa8/ http://SSMaker.ru/c17b665f/ смарт этот, потому что при подходе к смарту происходит вылет, в тот момент когда должны спавнится нпс!! может и разобрался бы сам если бы был лог, помогите пожалуста, хоть советом, как исправить вылет??
|
| |
|
| Эти 0 пользователя(ей) поблагодарили alex_xp_77 за это полезное сообщение: |
|
|
| denis2000 | Дата: Пн, 09.06.2014, 19:13 | Сообщение # 920 |
 Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| alex_xp_77, 1. Вы отдаете НПС под смарт и тут-же назначаете индивидуальную логику! Возможно только что-то одно. 2. Привыкайте выносить логику в отдельный файл - так намного проще потом редактировать.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
| |
|
| Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
| alex_xp_77 | Дата: Пн, 09.06.2014, 19:17 | Сообщение # 921 |
|
Научный сотрудник.
Ученые сталкеры
Сообщений: 242
| По другому не умею к сожалению Денис, уроки смотрел только от Андрея Непряхина
|
| |
|
| Эти 0 пользователя(ей) поблагодарили alex_xp_77 за это полезное сообщение: |
|
|
| denis2000 | Дата: Пн, 09.06.2014, 19:59 | Сообщение # 922 |
 Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| alex_xp_77, Да вижу. [cut]Однако в оригинале или так: Код [smart_terrains] esc_lager = true Или так: Код [logic] active = walker
[walker] path_walk = agr_factory_spetsnaz_walk1 path_look = agr_factory_spetsnaz_look1 .... Или так: Код [smart_terrains] none = true [logic] active = walker .... Одновременно никому смарт и логика не назначена. Для проверки уберите назначение смарта своим НПС.[/cut]
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
| |
|
| Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
| alex_xp_77 | Дата: Пн, 09.06.2014, 20:38 | Сообщение # 923 |
|
Научный сотрудник.
Ученые сталкеры
Сообщений: 242
| У меня как раз вся схема логики, и смартов прописана именно так как я привел выше, работает норм, для вашей логики Денис нужно создать тестовый уровень, что бы попрактиковаться, если не ошибаюсь, что бы привести в работу lager, нужно править lager.ltx, раньше пытался но не получилось, информации было крайне мало, нужно время, но логику скопировал, слышал что так проще. Мне по идее нужны двое парней сидяших у костра, изначально назначил walk и look для общей компиляции, но теперь буду строить камп зону, то есть именно по сценарию игры тут : http://SSMaker.ru/3ad3fab0/ там обрати внимания вдали собачки, они тоже необходимы!!
Ну если другие нормально работают, то ничего не могу больше посоветовать. Придется методом тыка искать в чем отличие от других НПС. И приводят ли эти отличия к вылету. denis2000
Сделал камп зону все заработало!! Наверно ошибка была в названии числа то есть stalker_71_walk, где то там Денис, я не стал разбираться!!
Сообщение отредактировал alex_xp_77 - Ср, 11.06.2014, 21:23 |
| |
|
| Эти 0 пользователя(ей) поблагодарили alex_xp_77 за это полезное сообщение: |
|
|
| denis2000 | Дата: Пт, 13.06.2014, 19:56 | Сообщение # 924 |
 Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| sergej5500, Что мешает спавнить на дистанции 140м, а удалять на 200м? Удалять можно одной командой: Код %=clear_smart_terrain(zat_b38)% А спавнить можно в принципе в одной строке: Код %=create_squad(zat_b38_alfa_squad_1:zat_b38) =create_squad(zat_b38_alfa_squad_2:zat_b38) =create_squad(zat_b38_alfa_squad_3:zat_b38) =create_sq uad(zat_b38_alfa_squad_4:zat_b38) =create_squad(zat_b38_alfa_squad_5:zat_b38)%
К стати можно и при спавне проверять появился ли сквад, а как только появился переключаться на следующую секцию.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
| |
|
| Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
| sergej5500 | Дата: Сб, 14.06.2014, 01:24 | Сообщение # 925 |
 Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| denis2000, Попробовал разные варианты. Вот один из них. [cut=Рестриктор][logic] active = sr_idle@1
[sr_idle@1] on_info = {=distance_to_smart_le(zat_b38:100)} sr_idle@2 %=zat_b38_alfa_base_spawn%
[sr_idle@2] on_info = {=distance_to_smart_ge(zat_b38:270)} sr_idle@1 %=zat_b38_alfa_base_clean%[/cut]
[cut=Функции] function zat_b38_alfa_base_spawn() create_force("zat_b38_alfa_squad_1","zat_b38") create_force("zat_b38_alfa_squad_2","zat_b38") create_force("zat_b38_alfa_squad_3","zat_b38") create_force("zat_b38_alfa_squad_4","zat_b38") create_force("zat_b38_alfa_squad_5","zat_b38") end function zat_b38_alfa_base_clean() set_squad_removed("zat_b38_alfa_squad_1") set_squad_removed("zat_b38_alfa_squad_2") set_squad_removed("zat_b38_alfa_squad_3") set_squad_removed("zat_b38_alfa_squad_4") set_squad_removed("zat_b38_alfa_squad_5") end[/cut]
1. Наблюдается следующая ситуация. При первом приближении к ВНЗ все 5 сквадов (30 НПС) на местах. Дистанция спавна здесь значения не имеет.
2. Удаление сквадов работает корректно. При тестовом уменьшении дистанции спавна до 10 метров обошел ВНЗ. Оно пустое. Все сквады удалились.
3. Повторный спавн при дистанциях более 200 метров спавнит только два сквада. Видимо, на ближайших к игроку спавн-пойнтах. Спавн-пойнты расположены по углам здания ВНЗ.
4. При уменьшении дистанции спавна до 150 метров отреспилось 3 сквада. При 130 метрах 4 сквада. При 100 метрах все 5. До дальнего спавн-пойнта в этот момент примерно 150-160 метров.
5. Форма команд для спавна значения не имеет. Без разницы, что писать. create_squad в логике или create_force в скрипте. Ситуация одна и та же.
6. В порядке гипотезы. Возможно, сквады респятся, но куда-то исчезают.Добавлено (14.06.2014, 01:24) ---------------------------------------------
Цитата sergej5500 (  ) Что мешает спавнить на дистанции 140м, а удалять на 200м? В этом случае спавн происходит на глазах игрока. Это нежелательно.
|
| |
|
| Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
| makdm | Дата: Сб, 14.06.2014, 09:14 | Сообщение # 926 |
 Рожденный в СССР
Разработчики
Сообщений: 1294
| Цитата sergej5500 (  ) В порядке гипотезы. Возможно, сквады респятся, но куда-то исчезают. sergej5500, при спавне отрядов, поставьте на них метку ( spot ), и посмотрите на карте, где реально находятся сквады. Отсюда и двигайтесь дальше.
Терпение...... И все получится!
|
| |
|
| Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
| denis2000 | Дата: Сб, 14.06.2014, 09:42 | Сообщение # 927 |
 Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Цитата sergej5500 (  ) В порядке гипотезы. Возможно, сквады респятся, но куда-то исчезают А мне кажется вообще не спавняться несмотря на вызов соответствующей функции. В любом случае стоит поставить метки на отряды и включить подробное логирование используемых функций (вполне возможно что там не выполняется какое-то условие и спавн не проходит).
И ли просто пробовать отказаться от точек спавна, тогда спавн будет происходить в районе самого смарта (расстояние от которого вы и измеряете), или измерять расстояния для спавна от точек респавна индивидуально для каждого сквада.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
| |
|
| Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
| sergej5500 | Дата: Сб, 14.06.2014, 11:00 | Сообщение # 928 |
 Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| makdm, denis2000,
Попробовал поставить метки. Получилось следующее.
[cut=Скрины]1. Спавн еще не произошел.
2. Сквады отреспились. Все хорошо.
3. Прошел мимо ВНЗ. Маркеры чуть поменяли положение. Видимо, из-за расстановки неписей по работам. Все хорошо.
4. Отхожу от ВНЗ. Удаления сквадов пока не было.
5. Сквады удалились.
6. Возвращаюсь к ВНЗ, Респятся только два сквада.
[/cut]Добавлено (14.06.2014, 11:00) --------------------------------------------- Пока вижу 2 направления решения проблемы.
1. Спавнить неписей одним сквадом в 30 НПС или двумя по 15 НПС.
2. Попробовать сделать для каждого сквада отдельный рестриктор в точке спавн-пойнта этого сквада. Каждый сквад спавнить и убирать индивидуально из своего рестриктора.
P.S. Просто интересно, в чем "затык". Почему движок прекрасно спавнит сквады в первый раз и "капризничает" во второй раз.
|
| |
|
| Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
| makdm | Дата: Сб, 14.06.2014, 11:32 | Сообщение # 929 |
 Рожденный в СССР
Разработчики
Сообщений: 1294
| Цитата sergej5500 (  ) Почему движок прекрасно спавнит сквады в первый раз и "капризничает" во второй раз Возможно потому, что считает, что количество НПС в смарте уже достигло максимально разрешённого количества. Т.е. удаление сквадов из смарта происходит некорректно. Попробуйте заменить функцию удаления сквадов на такую
function zat_b38_alfa_base_clean() xr_effects.clear_smart_terrain(db.actor, nil, {"zat_b38"}) end
Если не поможет, то попробуйте сделать количество НПС меньше 30, например по 5 НПС в скваде.
Терпение...... И все получится!
|
| |
|
| Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
| sergej5500 | Дата: Сб, 14.06.2014, 13:36 | Сообщение # 930 |
 Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| makdm,
Функцию clear_smart_terrain(db.actor, nil, {"zat_b38"}) попробовал. Результат нулевой. Все 5 сквадов удаляются. При повторном приближении к смарту респятся два сквада.
Уменьшение чмсла НПС в скваде так же не дает результата. Уменьшил число ботов в скваде до 3. При первом проходе. как и ожидалось, были 15 НПС. При втором приближении 6 НПС (два сквада). То есть ограничение действует по числу сквадов. (Не больше 2). Это ограничение не действует, если дистанция до точки спавна менее 150 метров (примерно). Но это уже на глазах игрока.
Спавн всех неписей одним сквадом дает заметное подвисание игры при входе смарта в онлайн. При пяти сквадах тормозов заметно меньше.
|
| |
|
| Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
|