Модостроение. Спавн и логика
|
|
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 за это полезное сообщение: |
|
|
sergej5500 | Дата: Ср, 10.09.2014, 18:21 | Сообщение # 991 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Добрый день.
Имеется НПС с логикой.
[cut=Логика][logic@zat_stalker_trader] active = remark@zat_stalker_trader suitable = {=check_npc_name(zat_stalker_trader)} true prior = 300 post_combat_time = 0,0 trade = misc\trade\order_traders\zat_stalker_trader.ltx
[remark@zat_stalker_trader] gather_items_enabled = false help_wounded_enabled = false corpse_detection_enabled = false combat_ignore_cond = true combat_ignore_keep_when_attacked = true anim = ward_noweap meet = meet invulnerable = true target = story | actor on_info = %=control_npc_position(zat_stalker_trader_spawn_point:0.3)%
[meet] abuse = true use = {!actor_enemy} true, false trade_enable = true meet_on_talking = false [/cut]
Можно ли в качестве target указать не актора, а точку в way_zaton? Или объект обязательно должен иметь стори-ид? Подойдет ли для этой цели объект типа спот?
[cut=Спот][zat_noah_barge_firepos_spot]:default_spot story_id = zat_noah_barge_firepos_spot
[default_spot]:device_pda $spawn = "devices\default_spot" visual = dynamics\scene_objects\part\part_none.ogf can_take = false [/cut]
Или ему можно прописать строку path_look? Будет ли она работать в схеме remark?
Переделывать непися под валкера не хочется. С текущей логикой его можно поставить в место, где нет AI-сетки. Он не мешает передвижениям сталкеров. Непись должен смотреть на игрока. Он так и делает. Но если сохраниться рядом и с ним и загрузить сейв, то непись смотрит в любую сторону, куда ему угодно. Это немного портит впечатление от игры.
И еще вопрос. Можно ли неписю при данной логике прописать направление взгляда? Например, смотреть на север. Или на запад. Можно ли это сделать, не используя споты или точки в way_***? Если можно, то как это сделать?
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
denis2000 | Дата: Ср, 10.09.2014, 19:56 | Сообщение # 992 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Цитата sergej5500 ( ) Можно ли в качестве target указать не актора, а точку в way_zaton? Да конечно есть четыре варианта указания цели: 1. nil - нет цели 2. story - объект со стори_ид (пример: target = story | pri_a28_heli) 3. path - точка пути (пример: target = path | pri_a28_horror_look, 3) 4. job - имя работы на смарте (пример: target = job | zat_b29_stalker_rival, zat_stalker_base_smart)
Цитата sergej5500 ( ) Но если сохраниться рядом и с ним и загрузить сейв, то непись смотрит в любую сторону, куда ему угодно. Это немного портит впечатление от игры. Данная схема не предназначена для продолжительного использования НПС поэтому никак не сохраняет свое состояние! Направление взгляда задается только в момент инициализации схемы, а значит после загрузки сейва НПС в этой схеме смотрит куда угодно.
Цитата sergej5500 ( ) Можно ли неписю при данной логике прописать направление взгляда? Например, смотреть на север. Или на запад. Можно ли это сделать, не используя споты или точки в way_***? Если можно, то как это сделать? Да конечно нужно будет дополнить своими правками функцию init_target из скрипта xr_remark.script.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
sergej5500 | Дата: Вт, 23.09.2014, 18:41 | Сообщение # 993 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Спасибо за информацию. Цитата denis2000 ( ) Направление взгляда задается только в момент инициализации схемы
Если попробовать сделать логику двухсекционной, remark_1 и remark_2, и переключаться между ними через 15-20 секунд по принципу маятника. Секции будут идентичными. В момент переключения на другую секцию непись развернется в нужную сторону, если до этого он смотрел не туда?
Да такой подход по идее сработает. Но все же я не рекомендую использовать эту схему на постоянной основе. denis2000Добавлено (23.09.2014, 18:41) --------------------------------------------- Всем добрый день.
Возник вопрос. Функция create_squad_member позволяет заспавнить непися в уже существующий сквад. Есть ли обратная функция? Можно ли удалить непися из сквада?
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
makdm | Дата: Вт, 23.09.2014, 18:59 | Сообщение # 994 |
Рожденный в СССР
Разработчики
Сообщений: 1294
| sergej5500, вопрос немного некорректен, так как не понятно, какой аргумент указывать при вызове функции то ли секцию НПС, то ли story_id, то ли его имя. А вообще - то , можно удалить любого НПС хоть он в скваде, хоть он не в скваде функцией destroy_object, что в файле xr_effects.script
Терпение...... И все получится!
|
|
|
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
denis2000 | Дата: Вт, 23.09.2014, 19:13 | Сообщение # 995 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| sergej5500, Примерно так: Код function quite_squad(actor, obj, p) local squad_story_id = p[1] local squad = get_story_squad(squad_story_id) local npc_id = obj.id squad:remove_npc(npc_id) squad:update() end Соответственно вызов функции из логики НПС с скваде: Код on_info = {<Условие>} quite_squad(<стори_ид_сквада>) Или изменив функцию можно удалить НПС зная например его стори_ид, по которому можно вычислить ид объекта для удаления.
В результате НПС отрегистрируется из сквада и удалиться как объект.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
Kosha | Дата: Сб, 27.09.2014, 21:26 | Сообщение # 996 |
Отмычка
Пользователи
Сообщений: 32
| Скажите а возможен ли спавн вертолета в ЧН? И его последующий убор (если его не уничтожил ГГ а он прошел заданный маршрут) Мысль такова: после разноса ГГ военного блокпоста (на кордоне) спавниться вертолет, идет по заданному логикой маршруту, и если противник (ГГ) не обнаружен то он убирается (Деспавн или как это назвать)
|
|
|
Эти 0 пользователя(ей) поблагодарили Kosha за это полезное сообщение: |
|
|
denis2000 | Дата: Сб, 27.09.2014, 21:43 | Сообщение # 997 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Kosha, Да, такое возможно только учтите, что вертолет обычно спавниться в all.spawn размещается под локацией с выключенным звуком, а в нужный момент появляется, убрать его можно обычным путем: alife():release()
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
Kosha | Дата: Сб, 27.09.2014, 21:48 | Сообщение # 998 |
Отмычка
Пользователи
Сообщений: 32
| А просто поставить спавн скриптом, проход маршрута и его деспавн не получится?
|
|
|
Эти 0 пользователя(ей) поблагодарили Kosha за это полезное сообщение: |
|
|
Kaриб | Дата: Пн, 29.09.2014, 23:09 | Сообщение # 999 |
Отмычка
Пользователи
Сообщений: 41
| Доброго времени суток. В Sgm 2.2 + все фиксы + AI Aditions заметил такую проблему: NPC стреляют в ГГ строго тогда, когда он находится на расстоянии меньше 30 метров. В других неписей стреляют с более дальнего расстояния, как и положено. Решил проверить в оригинальной игре - такая же ерунда. Сквады атакуют ГГ только если он ближе к ним чем на 30 метров. Я так понял тут дело в логике (Т.к правка Eye_Range и Eye_fov ничего не принесла, да и как я уже писал, друг в друга неписи стреляют с более дальнего расстояния). Какой файл отвечает за это расстояние ? Заранее спасибо!
Сообщение отредактировал Kaриб - Вт, 30.09.2014, 11:42 |
|
|
Эти 0 пользователя(ей) поблагодарили Kaриб за это полезное сообщение: |
|
|
makdm | Дата: Вт, 30.09.2014, 13:00 | Сообщение # 1000 |
Рожденный в СССР
Разработчики
Сообщений: 1294
| Цитата Kaриб ( ) Какой файл отвечает за это расстояние ?
Файл xr_combat_ignore.script
Причём это расстояние проверяется, только для членов сквада, работающего под симуляцией (sim_avail = true).
Терпение...... И все получится!
|
|
|
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
Kaриб | Дата: Вт, 30.09.2014, 14:15 | Сообщение # 1001 |
Отмычка
Пользователи
Сообщений: 41
| makdm, Большое спасибо! У меня всё получилось. В общем в файле xr_combat_ignore.script находим строчку se_obj.position:distance_to_sqr(se_enemy.position) > 900 then return false.
И вот это число 900 (30м * 30м) мне и нужно было изменить.
|
|
|
Эти 0 пользователя(ей) поблагодарили Kaриб за это полезное сообщение: |
|
|
makdm | Дата: Вт, 30.09.2014, 14:30 | Сообщение # 1002 |
Рожденный в СССР
Разработчики
Сообщений: 1294
| Kaриб, можно сделать и так. Но более правильно ( так как в вашем случае под "раздачу" попадут и уникальные сквады ) перед строчкой
local se_enemy = alife():object(enemy:id())
прописать
if enemy:id() == db.actor:id() then return true end
Терпение...... И все получится!
|
|
|
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
denis2000 | Дата: Вт, 30.09.2014, 18:16 | Сообщение # 1003 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Kosha, Попробуй и отпишись. Но разработчики в ТЧ и ЗП поступали именно так, как я тебе написал.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
sergej5500 | Дата: Вс, 05.10.2014, 00:11 | Сообщение # 1004 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Всем добрый день.
Имеются два сквада со стори ид: squad_1 и squad_2. С помощью какой функции в xr_conditions можно проверить, не являются ли эти сквады врагами друг другу? Если не являются, то их надо будет поссорить. Вызов функции из рестриктора. Один сквад после гибели должен будет отреспиться по новой. Можно бы обойтись без проверки враждебности. Но тогда функцию set_squads_enemies надо будет вызывать каждый раз после очередного спавна сквада.
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
makdm | Дата: Вс, 05.10.2014, 02:32 | Сообщение # 1005 |
Рожденный в СССР
Разработчики
Сообщений: 1294
| Цитата sergej5500 ( ) С помощью какой функции в xr_conditions можно проверить
Готовой функции нет, но можно добавить:
Код function is_squads_enemies( actor, obj, p ) local squad_1 = get_story_squad(p[1]) local squad_2 = get_story_squad(p[2]) if squad_1 and squad_2 then return game_relations.is_factions_enemies(squad_1:get_squad_community(), squad_2:get_squad_community()) end return false end
Терпение...... И все получится!
Сообщение отредактировал makdm - Вс, 05.10.2014, 02:35 |
|
|
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
|