Войти на сайт Регистрация Лента форума Пользователи Правила сайта Поиск по форуму
Модератор форума: 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Дата: Чт, 05.09.2013, 00:28 | Сообщение # 616
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

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


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

9vova8, Тоесть вылет с указанным логом происходит после начала новой игры на другой локации, после перехода в Припять и захода в рестриктор?

Эти НПС получают логику? Каким образом если они не приписаны к смарту? Симуляция для смарта и сквада в каком состоянии? Почему не привели файл с логикой НПС и секции точек пути?


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
strelok200Дата: Чт, 05.09.2013, 13:06 | Сообщение # 618
Бывалый
Свобода
Сообщений: 126
Награды: 0
Репутация: [ 33 ]

Подскажите почему у меня некоторые сквады произвольно удаляются, заспавнены стандартным образом и прописаны в спавне при начале игры, но иногда можно зайти на локацию, а там нет сквада, хотя обычно все работало. Редко , но бывает так
 
denis2000Дата: Чт, 05.09.2013, 16:32 | Сообщение # 619
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

strelok200, Могут под симуляцией уходить на другие смарты.

"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
NIVДата: Чт, 05.09.2013, 17:24 | Сообщение # 620
Полевой исследователь
Ученые сталкеры
Сообщений: 167
Награды: 4
Репутация: [ 180 ]

По поводу левел-чейнджера: у меня сильное подозрение, что имя для него может быть не любое, а ДОЛЖНО оканчиваться на _level_changer, ибо стоило поменять имя, и олл.спаун собрался.
Вопрос, что такое dest_graph_point, остался.


Изменяем реальность S.T.A.L.K.E.R. CoP: "Цена Новых Исследований" / "New Investigations' Value"

Сообщение отредактировал NIV - Чт, 05.09.2013, 17:26
 
9vova8Дата: Чт, 05.09.2013, 17:57 | Сообщение # 621
Новичок
Пользователи
Сообщений: 91
Награды: 2
Репутация: [ 6 ]

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
 
strelok200Дата: Чт, 05.09.2013, 18:54 | Сообщение # 622
Бывалый
Свобода
Сообщений: 126
Награды: 0
Репутация: [ 33 ]

Цитата (denis2000)
strelok200, Могут под симуляцией уходить на другие смарты.

Это не симуляционные сквады, а эксклюзивы, целевой смарт только один
 
denis2000Дата: Чт, 05.09.2013, 21:29 | Сообщение # 623
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Цитата (NIV)
у меня сильное подозрение, что имя для него может быть не любое, а ДОЛЖНО оканчиваться на _level_changer

Подозрение не обоснованное имя может быть любое уникальное.

9vova8, А вот это у вас зачем?
Код
[smart_terrain]
none = true

9vova8, У вас смарт pri_smart_monolith, а префикс в имени пути pri_mono_base_smart - это вообще как?
9vova8, В конфиге сквада не определен целевой смарт и куда им подеться?

Цитата (strelok200)
Это не симуляционные сквады, а эксклюзивы, целевой смарт только один

Странно у меня такого нет, где назначено там и сидят. Если конечно не убьют, но убить могут только в онлайне.


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
9vova8Дата: Чт, 05.09.2013, 21:32 | Сообщение # 624
Новичок
Пользователи
Сообщений: 91
Награды: 2
Репутация: [ 6 ]

denis2000, думал что избавляет от симуляции, уборка не помогла((
Да, с именем пути протупил, но особо не повлияло, target_smart тоже ничего не дал




Сообщение отредактировал 9vova8 - Чт, 05.09.2013, 22:07
 
sergej5500Дата: Чт, 05.09.2013, 23:39 | Сообщение # 625
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Добрый Вечер. Заинтересовал такой момент. В СГМ уникальные НПС спавнятся через скрипт 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
 
denis2000Дата: Чт, 05.09.2013, 23:59 | Сообщение # 626
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

sergej5500, spawn_corpse - заспавнить труп, так что неудивительно. Используйте function spawn_object(actor, obj, p) из xr_effects.script, где
p[1] - секция кого спаунить
p[2] - имя патрульного пути где спа унить.
p[3] - индекс точки пути или 0
p[4] - угол поворота объекта или 0


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
strelok200Дата: Пт, 06.09.2013, 08:30 | Сообщение # 627
Бывалый
Свобода
Сообщений: 126
Награды: 0
Репутация: [ 33 ]

Цитата (denis2000)
Странно у меня такого нет, где назначено там и сидят. Если конечно не убьют, но убить могут только в онлайне.

Может из-за новых локаций? Хотя все правильно зарегистрировано
 
sergej5500Дата: Пт, 06.09.2013, 17:03 | Сообщение # 628
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Добрый День. Интересует такой момент. В логике рестриктора имеется строка:
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 метров. Можно ли организовать спавн через один рестриктор, или каждому НПС надо делать свой собственный?
 
denis2000Дата: Пт, 06.09.2013, 17:43 | Сообщение # 629
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Цитата (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]


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
KorvoДата: Пт, 06.09.2013, 21:44 | Сообщение # 630
Тихий Малый
Пользователи
Сообщений: 356
Награды: 5
Репутация: [ 191 ]

Добрый вечер. Я возможно обращаюсь не в ту тему. Я просто не знаю, куда с этим идти. Из-за чего происходит вот этот вылет:
[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]


При свете дня, во тьме ночной,
Темный сталкер следит за тобой.

 
Поиск: