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


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


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

[off]sergej5500, не согласен чуть менее, чем полностью. Разрешение спавнить сквад при наличии определённой инфопорции, так же как и target_smart пишется в squad_descr_локация.ltx. Мне нужно не отправить его на другой смарт, а полностью передать управление компьютеру. Хотя, м.б. target = {+условие} nil? Все-таки думаю, что без указания sim_avail = {+инфо} true, false работать не будет.

Будем считать, я немного не разобрался в том, что было написано ранее.[/off]


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

Сообщение отредактировал NIV - Пт, 20.09.2013, 14:10
 
sergej5500Дата: Пт, 20.09.2013, 13:52 | Сообщение # 662
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

NIV,
В squad_descr_ прописывается состав сквада (число НПС, группировка). Сквады движутся по определённым участкам - смартам. Строка target_smart определяет целевой смарт сквада. Сквад будет стремиться на этот смарт попасть. Если указано nil, то сквад попадает под управление движка. Строка sim_avail = true даёт разрешение игре самостоятельно спавнить сквад. Сквады спавнят по разному. В simulation прописаны сквады, которые спвнятся на старте НИ. Команда create_squad в логике рестриктора спавнит сквад по какому-нибудь условию. Симуляционные сквады прописываются в файлах смартов.


Сообщение отредактировал sergej5500 - Пт, 20.09.2013, 13:52
 
NIVДата: Пт, 20.09.2013, 13:57 | Сообщение # 663
Полевой исследователь
Ученые сталкеры
Сообщений: 167
Награды: 4
Репутация: [ 180 ]

Цитата (sergej5500)
Строка sim_avail = true даёт разрешение игре самостоятельно спавнить сквад.

[off] Спасибо, будем знать. Я что-то думал, что это переключение на симуляцию. Ошибался, наверное...[/off]

Блин, пришёл домой - вспомнил, в чём была проблема. У этого НПС есть эксклюзивная работа на смарте. Я хочу, чтобы после выполнения условия он переключился на другую работу на ЭТОМ же смарте, поработал немного, и ушел в симуляцию. А так, да - target = {+условие} nil, это то, что нужно.


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

Сообщение отредактировал NIV - Пт, 20.09.2013, 14:07
 
makdmДата: Пт, 20.09.2013, 16:03 | Сообщение # 664
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

NIV, посмотрите, как это сделано в ЗП на примере сквада Валета и его охранников jup_a10_bandit_squad_3.
Сначала он выполняет работу на смарте, а после выполнения, по условию - уходит в "свободное плавание".

Добавлено (20.09.2013, 16:03)
---------------------------------------------

Цитата (NIV)
после выполнения условия он переключился на другую работу на ЭТОМ же смарте

Другая работа также,как и первая, состоит из схем поведения НПС. Не проще ли просто переключить на другую схему?

Попробуйте так:
В первой логике работы

suitable = {- поршень =check_npc_name(имя_сталкера)} true

Во второй логике работы

suitable = {+ поршень =check_npc_name(имя_сталкера)} true

Выдаёте поршень. По идее должен перейти с первой работы на вторую.


Терпение......
И все получится!
 
strelok200Дата: Сб, 12.10.2013, 16:52 | Сообщение # 665
Бывалый
Свобода
Сообщений: 126
Награды: 0
Репутация: [ 33 ]

Почему после перезагрузки игры в скваде становится в два раза больше нпс? Как это устранить?

Добавлено (06.10.2013, 12:19)
---------------------------------------------
Я спавнил эти же сквады, с этой же логикой, все нормально было. А теперь заспавнил смарт через сдк и такая фигня получается

Так это все объясняет! denis2000

Добавлено (12.10.2013, 16:52)
---------------------------------------------

Цитата strelok200 ()
Я спавнил эти же сквады, с этой же логикой, все нормально было. А теперь заспавнил смарт через сдк и такая фигня получается

Так это все объясняет! denis2000

Не знаю как это объяснить вам, но это действительно так

Возвращаюсь к старому вопросу по анимациям. Убрал по вашему совету stop at end, сталкер телепортируется в точку начала проигрывания (кость root настроена верно)
 
sergej5500Дата: Вс, 13.10.2013, 22:05 | Сообщение # 666
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Добрый Вечер.
Я сделал квест на зачистку ВНЗ. Описание квеста тут. Квест Меч выдает после выполнения нескольких предварительных квестов. Альфа на ВНЗ спавнится на старте игры. Чтобы ГГ не смог облегчить себе жизнь и вынести Альфу до взятия квеста, в рестрикторе предусмотрен повторный спавн Альфы после гибели. Строки типа:
[cut=код]on_info = {+zat_b38_alfa1_death =dist_to_actor_ge(300)} %-zat_b38_alfa1_death =spawn_object(zat_b38_alfa1:zat_b38_alfa1_look)%
on_info2 = {+zat_b38_alfa2_death =dist_to_actor_ge(300)} %-zat_b38_alfa2_death =spawn_object(zat_b38_alfa2:zat_b38_alfa2_look)%
on_info3 = {+zat_b38_alfa3_death =dist_to_actor_ge(300)} %-zat_b38_alfa3_death =spawn_object(zat_b38_alfa3:zat_b38_alfa3_look)%[/cut]
Рестриктор спавна находится на ВНЗ и повторный спавн работает нормально. Спавн Альфы отключается после начала атаки, или если сталкеры штурмового отряда стали враждебны ГГ. Сталкеры штурмовой группы не бессмертны, за исключением командира. Тот бессмертен до начала атаки, или когда он не враг ГГ. Чтобы штурмовая группа стала враждебна, достаточно убить кого-нибудь из сталкеров. Чтобы сталкеры в ожидании ГГ не погибли от бешеных кабанов, например, для них тоже предусмотрен респавн. Код аналогичный.
[cut=код]on_info31 = {+zat_b38_stalker2_death =dist_to_actor_ge(300)} %-zat_b38_stalker2_death =spawn_object(zat_b38_stalker2:zat_b38_stalker2_look)%[/cut]
Вопрос такой, можно ли объединить респавн альфы и сталкеров в одном рестрикторе. Если респавн нормально работает для альфы, то от ВНЗ до баржи Ноя явно больше 300 метров. Заспавнил на точке сбора сталкеров 10 библиотекарей. Они половину сталкеров вынесли. Сталкеры спавнились прямо на глазах ГГ. Как полагаю, функция dist_to_actor_ge измеряет расстояние от рестриктора (ВНЗ) до ГГ. Есть ли функция, которую можно вызвать из рестриктора, измеряющая расстояние от ГГ до произвольной точки? Можно ли эту точку прописать в way_zaton, или нужно делать спецобъект на локации? default_spot, например. Как эта функция может выглядеть в xr_conditions и в логике рестриктора? В конкретном квесте проблему можно решить, сделав два рестриктора. Просто я планирую для другого квеста сделать на локации 10 бандитских снайперов и респавнить их аналогичным способом. Делать для каждого отдельный рестриктор нежелательно. Нужна функция определения дистанции до произвольной точки на локации. Заранее благодарен за советы.
 
makdmДата: Пн, 14.10.2013, 01:20 | Сообщение # 667
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

sergej5500, вы сами себе усложняете задачи. У вас в рестрикторе - три проверки. Зачем?
Спавните Альфу сквадом на смарте. Тогда можно просто проверить жив ли сквад (в вашем случае из трёх НПС ).

1 вариант:
Если нет - спавните новый сквад.

on_info = {!squad_exist(стори_айди_сквада)} переход_на_секцию %=create_squad(секция_сквада:имя_смарта)%

2 вариант:

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

on_info = %=clear_smart_terrain(имя_смарта) =create_squad(секция_сквада:имя_смарта)%

Из любого рестриктора можно проверить расстояние от ГГ до смарта, на котором спавните альфу

dist_between_actor_and_smart_ge(имя_смарта:расстояние_от_гг_до_смарта)

Функция пишется в xr_conditions

function dist_between_actor_and_smart_ge(actor, npc, p)
local smart = sim_board.get_sim_board():get_smart_by_name(p[1])
local d = p[2]
return d and actor:position():distance_to_sqr(smart.position) >= d * d
end


Терпение......
И все получится!
 
strelok200Дата: Пн, 14.10.2013, 11:59 | Сообщение # 668
Бывалый
Свобода
Сообщений: 126
Награды: 0
Репутация: [ 33 ]

Я прописал в avail_animations, чтобы сталкер ел хлеб animpoint_sit_normal_eat_bread
Сталкер анимку проигрывает, но в руке у него нет хлеба. Как это можно исправить?


Сообщение отредактировал strelok200 - Пн, 14.10.2013, 12:29
 
makdmДата: Пн, 14.10.2013, 12:36 | Сообщение # 669
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

Цитата strelok200 ()
Как это можно исправить?

Попробуйте ему в рюкзак прописать батон хлеба.


Терпение......
И все получится!
 
FantomICWДата: Сб, 19.10.2013, 23:37 | Сообщение # 670
Лидер «Свободы»
Свобода
Сообщений: 4438
Награды: 44
Репутация: [ 1340 ]

Доброго вечера!
Я хотел бы в ЗП запустить anm-файл из ЧН. Так вот вопрос, возможно ли это без особой сложности сделать, или камера строится и запоминает значения вей-поинтов (старых координат)?



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

FantomICW, Запустить не проблема. Только есть два типа анимации и соответственно два типа проигрывания:
1. Анимация привязанная к конкретному месту на локации - например пролет камеры при первом посещении Агропрома.
2. Анимация привязанная к ГГ - например анимация алкогольного опьянения.
В первом случае анимация сделана в абсолютных координатах локации, во втором анимация привязана к нулю координат.


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
FantomICWДата: Вс, 20.10.2013, 12:57 | Сообщение # 672
Лидер «Свободы»
Свобода
Сообщений: 4438
Награды: 44
Репутация: [ 1340 ]

denis2000, спасибо!
Еще пара вопросов.
1. Можно ли где-то просмотреть ppe- и anm-файлы, кроме как в игре? В состав СДК входить Postproccess Editor, но либо я чего-то не понимаю, либо там все очень схематично и просмотреть финальный вид нельзя.
2. Есть ли в Сталкере стандартный постпроцесс а-ля световая глушительная граната (экран становится ярко-белым на пару секунд)?



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

FantomICW,
1. Наглядно можно видеть только в игре. ppe-файлы, создаются и редактируются Postproccess Editor. anm-файлы, соответственно в Level Editor.
2. Насколько помню вроде такого постпроцесса нет, разве что в каком-то моде.


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

как сделать неписей сквада враждебными к ГГ после сюжетного момента?
 
sergej5500Дата: Ср, 23.10.2013, 19:01 | Сообщение # 675
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

strelok200,
Можно применить функцию
=set_squad_goodwill(zat_b103_lost_merc_squad1:enemy)

Вместо zat_b103_lost_merc_squad1 вставляете ID Вашего сквада. Пример кода:
on_info = {+zat_b103_merc_fight -zat_b103_angry_6} %=hit_npc_from_actor =set_squad_goodwill(zat_b103_lost_merc_squad1:enemy) +zat_b103_angry_6%

Код из оригинала ЗП. Определяет враждебность к ГГ отряда Тесака.
 
Поиск: