Войти на сайт Регистрация Лента форума Пользователи Правила сайта Поиск по форуму
Модератор форума: denis2000, FantomICW  
Модостроение. Спавн и логика
denis2000Дата: Пн, 10.10.2011, 21:20 | Сообщение # 1
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Спавн и логика

Создание объектов на локации и логика поведения этих объектов

Если у вас появились вопросы по созданию динамических объектов в игре (НПС, монстры, аномалии, и т.п.) и настройке их "поведения". Задавайте их в этой теме - умные головы,
модосторители и просто разбирающиеся в программировании люди вам ответят.


Много интересного материала здесь (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 по ссылке из шапки и соседнюю тему "Курс молодого бойца",
возможно Ваш вопрос уже рассматривался.


Если произошел вылет - выкладываем лог! Вопрос ставим четко, не забываем указывать версию игры, установленные моды их версии, установленные фиксы модов и подробно ваши правки.
Помните чем подробнее вопрос, тем точнее ответ.


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
makdmДата: Ср, 21.05.2014, 00:48 | Сообщение # 916
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

sergej5500, зачем вы в каждой точке прописывает flags ? По моему они тут лишние.
Я бы сделал так,
или в последней точке ( 21 ) прописал p21:flags = 0x1 и сделал точку look с таким же флагом flags = 0x1
или дописал бы в 21 точку

p21:links = p0(1)
Перехода к нулевой точке не будет, т.к. выдан сигнал и произойдёт переключение схемы.


Терпение......
И все получится!


Сообщение отредактировал makdm - Ср, 21.05.2014, 00:55
 
sergej5500Дата: Ср, 21.05.2014, 10:42 | Сообщение # 917
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Доброе утро. Вернусь к предыдущему вопросу. Исправил проблему зависания непися на 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. Она выдается после приближения игрока к Скадовску на определенную дистанцию.

Почему НПС капризничает?
 
denis2000Дата: Ср, 21.05.2014, 13:01 | Сообщение # 918
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

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


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
alex_xp_77Дата: Пн, 09.06.2014, 18:31 | Сообщение # 919
Научный сотрудник.
Ученые сталкеры
Сообщений: 242
Награды: 6
Репутация: [ 41 ]

Добрый день всем !! У меня вопрос, при пробежке по локации, происходит вылет, без лога, просто вылет, очень похоже на непонятную команду, когда нпс незнает что ему заданно, какую команду необходимо выполнять, прилогаю скрины :
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/
смарт этот, потому что при подходе к смарту происходит вылет, в тот момент когда должны спавнится нпс!!
может и разобрался бы сам если бы был лог, помогите пожалуста, хоть советом, как исправить вылет??


 
denis2000Дата: Пн, 09.06.2014, 19:13 | Сообщение # 920
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

alex_xp_77,
1. Вы отдаете НПС под смарт и тут-же назначаете индивидуальную логику! Возможно только что-то одно.
2. Привыкайте выносить логику в отдельный файл - так намного проще потом редактировать.


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
alex_xp_77Дата: Пн, 09.06.2014, 19:17 | Сообщение # 921
Научный сотрудник.
Ученые сталкеры
Сообщений: 242
Награды: 6
Репутация: [ 41 ]

По другому не умею к сожалению Денис, уроки смотрел только от Андрея Непряхина

 
denis2000Дата: Пн, 09.06.2014, 19:59 | Сообщение # 922
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

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]


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
alex_xp_77Дата: Пн, 09.06.2014, 20:38 | Сообщение # 923
Научный сотрудник.
Ученые сталкеры
Сообщений: 242
Награды: 6
Репутация: [ 41 ]

У меня как раз вся схема логики, и смартов прописана именно так как я привел выше, работает норм, для вашей логики Денис нужно создать тестовый уровень, что бы попрактиковаться, если не ошибаюсь, что бы привести в работу lager, нужно править lager.ltx, раньше пытался но не получилось, информации было крайне мало, нужно время, но логику скопировал, слышал что так проще.
Мне по идее нужны двое парней сидяших у костра, изначально назначил walk и look для общей компиляции, но теперь буду строить камп зону, то есть именно по сценарию игры тут : http://SSMaker.ru/3ad3fab0/ там обрати внимания вдали собачки, они тоже необходимы!!

Ну если другие нормально работают, то ничего не могу больше посоветовать. Придется методом тыка искать в чем отличие от других НПС. И приводят ли эти отличия к вылету. denis2000

Сделал камп зону все заработало!! Наверно ошибка была в названии числа то есть stalker_71_walk, где то там Денис, я не стал разбираться!!




Сообщение отредактировал alex_xp_77 - Ср, 11.06.2014, 21:23
 
denis2000Дата: Пт, 13.06.2014, 19:56 | Сообщение # 924
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

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)%


К стати можно и при спавне проверять появился ли сквад, а как только появился переключаться на следующую секцию.


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
sergej5500Дата: Сб, 14.06.2014, 01:24 | Сообщение # 925
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

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м?

В этом случае спавн происходит на глазах игрока. Это нежелательно.
 
makdmДата: Сб, 14.06.2014, 09:14 | Сообщение # 926
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

Цитата sergej5500 ()
В порядке гипотезы. Возможно, сквады респятся, но куда-то исчезают.

sergej5500, при спавне отрядов, поставьте на них метку ( spot ), и посмотрите на карте, где реально находятся сквады. Отсюда и двигайтесь дальше.


Терпение......
И все получится!
 
denis2000Дата: Сб, 14.06.2014, 09:42 | Сообщение # 927
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Цитата sergej5500 ()
В порядке гипотезы. Возможно, сквады респятся, но куда-то исчезают

А мне кажется вообще не спавняться несмотря на вызов соответствующей функции. В любом случае стоит поставить метки на отряды и включить подробное логирование используемых функций (вполне возможно что там не выполняется какое-то условие и спавн не проходит).

И ли просто пробовать отказаться от точек спавна, тогда спавн будет происходить в районе самого смарта (расстояние от которого вы и измеряете), или измерять расстояния для спавна от точек респавна индивидуально для каждого сквада.


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
sergej5500Дата: Сб, 14.06.2014, 11:00 | Сообщение # 928
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

makdm, denis2000,

Попробовал поставить метки. Получилось следующее.

[cut=Скрины]1. Спавн еще не произошел.


2. Сквады отреспились. Все хорошо.


3. Прошел мимо ВНЗ. Маркеры чуть поменяли положение. Видимо, из-за расстановки неписей по работам. Все хорошо.


4. Отхожу от ВНЗ. Удаления сквадов пока не было.


5. Сквады удалились.


6. Возвращаюсь к ВНЗ, Респятся только два сквада.


[/cut]

Добавлено (14.06.2014, 11:00)
---------------------------------------------
Пока вижу 2 направления решения проблемы.

1. Спавнить неписей одним сквадом в 30 НПС или двумя по 15 НПС.

2. Попробовать сделать для каждого сквада отдельный рестриктор в точке спавн-пойнта этого сквада.
Каждый сквад спавнить и убирать индивидуально из своего рестриктора.

P.S. Просто интересно, в чем "затык". Почему движок прекрасно спавнит сквады в первый раз и "капризничает" во второй раз.

 
makdmДата: Сб, 14.06.2014, 11:32 | Сообщение # 929
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

Цитата sergej5500 ()
Почему движок прекрасно спавнит сквады в первый раз и "капризничает" во второй раз

Возможно потому, что считает, что количество НПС в смарте уже достигло максимально разрешённого количества.
Т.е. удаление сквадов из смарта происходит некорректно.
Попробуйте заменить функцию удаления сквадов на такую

function zat_b38_alfa_base_clean()
xr_effects.clear_smart_terrain(db.actor, nil, {"zat_b38"})
end

Если не поможет, то попробуйте сделать количество НПС меньше 30, например по 5 НПС в скваде.


Терпение......
И все получится!
 
sergej5500Дата: Сб, 14.06.2014, 13:36 | Сообщение # 930
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

makdm,

Функцию clear_smart_terrain(db.actor, nil, {"zat_b38"}) попробовал. Результат нулевой. Все 5 сквадов удаляются. При повторном приближении к смарту респятся два сквада.

Уменьшение чмсла НПС в скваде так же не дает результата. Уменьшил число ботов в скваде до 3. При первом проходе. как и ожидалось, были 15 НПС. При втором приближении 6 НПС (два сквада). То есть ограничение действует по числу сквадов. (Не больше 2). Это ограничение не действует, если дистанция до точки спавна менее 150 метров (примерно). Но это уже на глазах игрока.

Спавн всех неписей одним сквадом дает заметное подвисание игры при входе смарта в онлайн. При пяти сквадах тормозов заметно меньше.
 
Поиск: