Модостроение. Спавн и логика
|
|
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 за это полезное сообщение: |
|
|
FantomICW | Дата: Чт, 06.03.2014, 18:33 | Сообщение # 841 |
Лидер «Свободы»
Свобода
Сообщений: 4438
| strelok200, все та же логика. Все те же НПС. Спавнится объект на основе actor_visual_stalker через функцию create_cutscene_actor_with_weapon или другим способом. Логику ему прописывают либо через смарт, либо через custom_data. Запускается через рестриктор схема sr_cutscene, в которой идет отсылка к anm-файлу движения камеры. Все это синхронно проигрывается, в нужный момент останавливается, тогда управление возвращается к актеру.
|
|
|
Эти 0 пользователя(ей) поблагодарили FantomICW за это полезное сообщение: |
|
|
alex_xp_77 | Дата: Вт, 11.03.2014, 22:36 | Сообщение # 842 |
Научный сотрудник.
Ученые сталкеры
Сообщений: 242
| Добрый вечер всем , помогите разобраться до конца, что бы сделать готовый рабочий смарт, прописал логику смарту, прописал логику boar, то есть кабану, только при простейшем спавне типа такого : [smart_terrain] type=test_smart_terrains = true
[logic] active=walk
[walkl] path_walk=test_smart_terrain_boar_walk path_look=test_smart_terrain_boar_look
выставляю точки пути :boar_walk boar_look
получаю вылет по луа, это простейший смарт, где может быть ошибка ?? Подскажите умы форума!!За мной не заржавеет !!Благодарность в моем проэкте гарантирована!! Уж очень тяжело продвигается с мутантами!! да катра называется terrain_test, сделал тестовый уровень!! логика смарта : [smart_terrain] type=test_smart_terrain capacity = 1 communities = boar
|
|
|
Эти 0 пользователя(ей) поблагодарили alex_xp_77 за это полезное сообщение: |
|
|
NIV | Дата: Вт, 11.03.2014, 22:51 | Сообщение # 843 |
Полевой исследователь
Ученые сталкеры
Сообщений: 167
| alex_xp_77, а вы сюда текст копировали или писали? Если копировали, то: Цитата alex_xp_77 ( ) active=walk [walkl] И потом, что это за логика walk? У мобов должна быть mob_home или mob_walker.
Изменяем реальность S.T.A.L.K.E.R. CoP: "Цена Новых Исследований" / "New Investigations' Value"
Сообщение отредактировал NIV - Вт, 11.03.2014, 22:52 |
|
|
Эти 0 пользователя(ей) поблагодарили NIV за это полезное сообщение: |
|
|
makdm | Дата: Вт, 11.03.2014, 23:07 | Сообщение # 844 |
Рожденный в СССР
Разработчики
Сообщений: 1294
| alex_xp_77, всё не так сложно, просто нужно немного самому приложить усилие. Подсказываю: Возьмите оригинальный ЗП и посмотрите, как сделан смарт zat_b18. Это смарт, на котором "работает" собака на барже Ноя. Посмотрите, как прописывается логика смарта. Посмотрите, как прописывается эксклюзив. Посмотрите, как прописывается логика собаке ( mob_walker ). Посмотрите в каких ещё файлах прописывается смарт zat_b18. Я думаю, что разберётесь и сами.
Терпение...... И все получится!
|
|
|
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
NIV | Дата: Ср, 12.03.2014, 21:08 | Сообщение # 845 |
Полевой исследователь
Ученые сталкеры
Сообщений: 167
| здравствуйте! makdm, я воспользовался Вашей схемой mob_companion, но почему-то моб ходит за мной только в пределах смарта, а за его границу не выходит. Пробовал в описании сквада указывать конкретный target_smart или nil - не влияет. Не могли бы Вы поделиться своими соображениями?
[cut=Логика моба][logic] active = mob_companion suitable = {=check_npc_name(all_dog_domest)} true prior = 75 monster_job = true on_hit = hit
[mob_companion] combat_ignore_cond = {=check_enemy_name(actor)} true actor_friendly = true on_info = %=set_visual_memory_enabled(0)% aggressive = false
[hit] on_info = {=hit_by_actor -zat_b18_actor_enemy} %+zat_b18_actor_enemy%[/cut]
Изменяем реальность S.T.A.L.K.E.R. CoP: "Цена Новых Исследований" / "New Investigations' Value"
|
|
|
Эти 0 пользователя(ей) поблагодарили NIV за это полезное сообщение: |
|
|
makdm | Дата: Ср, 12.03.2014, 21:41 | Сообщение # 846 |
Рожденный в СССР
Разработчики
Сообщений: 1294
| NIV, приветствую.
У Вас схема в скрипт gulag_general.script добавлена? Если нет, то добавьте схему в таблицу
local job_type_by_scheme
вот так
["mob_companion"] = "point_job"
А в файле gamedata\scripts\modules.script зарегистрируйте схему load_scheme("mob_companion","mob_companion",stype_mobile)
Терпение...... И все получится!
Сообщение отредактировал makdm - Ср, 12.03.2014, 23:35 |
|
|
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
NIV | Дата: Чт, 13.03.2014, 07:01 | Сообщение # 847 |
Полевой исследователь
Ученые сталкеры
Сообщений: 167
| [off] makdm, делал строго по инструкции :), т.е. первого не было, а второе есть. Спс, будем пробовать дальше.[/off]
Докладываю - схема mob_companion работает нормально, проблема была в том, что моб не принимал логику из кастом_даты
Код [all_dog_domest]:zat_b18_dog $spawn = "respawn\all_dog_domest" custom_data = scripts\jupiter\all_dog_domest.ltx
Когда добавил работу на смарт, логика подключилась.
Изменяем реальность S.T.A.L.K.E.R. CoP: "Цена Новых Исследований" / "New Investigations' Value"
Сообщение отредактировал NIV - Сб, 15.03.2014, 08:39 |
|
|
Эти 0 пользователя(ей) поблагодарили NIV за это полезное сообщение: |
|
|
alex_xp_77 | Дата: Вс, 16.03.2014, 10:01 | Сообщение # 848 |
Научный сотрудник.
Ученые сталкеры
Сообщений: 242
| Добрый день всем !!Вопрос непосредственно по спавну в самом sdk, как заспавнить химеру??Если ее в самом cdk нету? Может с мода какого то засунуть в sdk?? просто в LE 04 химеры нету!!У меня вопрос к скорее всего к ветеранам форума, помогите пожалуста в моем втором вопросе, есть в народной солянке варка артефактов, в моей игре будет немного другая тематика (большая просьба к модераторам, не убирайте, не удаляйте пожалуста мое сообщение.Спасибо) мне очень хочется поменять направление артефактов, пример"бросаешь лунный свет+ночная звезда= лунная звезда,или звезда лесов, или пустынный камень, вот как это все прописать, или насколько это все сложно?Помогите пожалуста примером, я бы думаю дальше справился, место в титрах в моем проекте гарантирую!
Сообщение отредактировал alex_xp_77 - Вс, 16.03.2014, 18:37 |
|
|
Эти 0 пользователя(ей) поблагодарили alex_xp_77 за это полезное сообщение: |
|
|
denis2000 | Дата: Вс, 16.03.2014, 13:18 | Сообщение # 849 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| alex_xp_77, Добавляй! Вноси нужные секции в gamedata SDK, так-же переноси модели текстуры и анимации. Очень вероятно среди анимаций не будет специальной анимации для демонстрации в редакторе, придется переименовать какую-то существующую или не обращать внимания на вопли редактора об отсутствующей анимации.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
NIV | Дата: Пн, 24.03.2014, 20:24 | Сообщение # 850 |
Полевой исследователь
Ученые сталкеры
Сообщений: 167
| Здравствуйте, хотел проконсультироваться по вопросу логики дружественного моба. Я создал собаку, наследующую от собаки Ноя. Она находиттся под логикой mob_companion (© makdm) и по инфопоршню переводится в секцию [mob_combat], где должна атаковать ближайшего к ГГ НПС или монстра, который является врагом для ГГ. [cut=Фрагмент логики][mob_companion] combat_ignore_cond = {=check_enemy_name(actor)} true actor_friendly = true npc_friendly = true on_info = %=set_visual_memory_enabled(0)% on_info2 = {+dog_domest_gulyay} mob_walker@waiting_start on_info3 = {+dog_domest_fas} mob_combat on_combat = mob_combat aggressive = false
[hit] on_info = {=hit_by_actor -zat_b18_actor_enemy} %+zat_b18_actor_enemy%
[mob_combat] actor_friendly = true npc_friendly = false combat_ignore_cond = false on_info = {+dog_domest_fu} mob_companion on_info2 = {-closest_enemy_finded} %=find_closest_enemy%[/cut] Для этого служит функция find_closest_enemy [cut=find_closest_enemy()]function find_closest_enemy()
local dist_from_nps_to_actor local dist_closest_enemy = 50 local closest_enemy_id = "" local closest_enemy = "" local dog_id = 0 local actor_id = 0 local obj local id
for id=1,65635 do obj=alife():object(id)
if obj and string.find(obj:name(),"all_dog_domest") then dog_id = id elseif obj and string.find(obj:name(),"actor") then actor_id = id end
if id~= dog_id and id~= actor_id and obj and is_object_online(id) and (IsStalker(obj) or IsMonster(obj)) and id_thinks_actor_is_enemy(id) then dist_from_nps_to_actor=distance_between_safe(db.actor,level.object_by_id(id)) if dist_from_nps_to_actor<dist_closest_enemy then closest_enemy_id = id dist_closest_enemy = dist_from_nps_to_actor end debug_to_file("otladka.txt", "id = " ..id.. ", name = " ..obj:name().. ", dist_from_nps_to_actor = " ..dist_from_nps_to_actor.. ", dist_closest_enemy = " ..dist_closest_enemy.. ", closest_enemy_id = " ..closest_enemy_id) end end db.actor:give_info_portion("closest_enemy_finded")
hit_npc_from_npc(closest_enemy_id, "all_dog_domest")
end[/cut] Т.е. находим те объекты в онлайне, которые являются враждебными сталкерами или монстрами и находим ближайшего из них. Затем этот ближайший наносит хит собаке (немного переделанная функция xr_effects.hit_npc_from_npc) [cut=hit_npc_from_npc(enemy_id, hitted_npc_sid)]function hit_npc_from_npc(enemy_id, hitted_npc_sid) local h = hit() local obj local hitter_name --h.draftsman = get_story_object(p[1])
--для теста if enemy_id ~= nil then obj = level.object_by_id(enemy_id) hitter_name = obj:name()
h.draftsman = obj end
if hitted_npc_sid ~= nil then hitted_npc = get_story_object(hitted_npc_sid) end h.type = hit.wound h.direction = h.draftsman:position():sub(hitted_npc:position()) h:bone("bip01_spine") h.power = 0.03 h.impulse = 0.03 hitted_npc:hit(h) debug_to_file("hit_npc_from_npc.txt", "hitter_name = " ..hitter_name.. ", hitted_npc_name = " ..hitted_npc:name())
end[/cut] Благодаря тому, что отладочная информация записывается в файлы, я уверен, что обе функции работают правильно - ближайший враг обнаруживается и он наносит хит именно собаке. Однако собака не атакует его, а продолжает бегать вокруг ГГ. Что_Я_Делаю_Не_Так? Может собаку надо сперва вывести из состояние mob_companion?
И еще вопрос: Мы получаем объект командой obj=alife():object(id). Однако если написать distance_between_safe(db.actor, obj), то происходит вылет (No such operator defined). А если вместо obj взять level.object_by_id(id), то все работает. Вот этого я не понял - эти объекты должны быть одинаковыми?!
Изменяем реальность S.T.A.L.K.E.R. CoP: "Цена Новых Исследований" / "New Investigations' Value"
Сообщение отредактировал NIV - Пн, 24.03.2014, 20:28 |
|
|
Эти 0 пользователя(ей) поблагодарили NIV за это полезное сообщение: |
|
|
denis2000 | Дата: Пн, 24.03.2014, 22:42 | Сообщение # 851 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Цитата NIV ( ) Может собаку надо сперва вывести из состояние mob_companion? Как вы себе это представляете? Или вы считаете что ваша собака ОДНОВРЕМЕННО подчиняется ДВУМ секциям логики? Цитата NIV ( ) Вот этого я не понял - эти объекты должны быть одинаковыми?! Это разные типы объектов с разными родителями и соответственно с разными свойствами и методами. Один серверного типа другой клиентского. Цитата NIV ( ) Что_Я_Делаю_Не_Так? Проверьте текущую цель вашего моба функцией get_enemy().
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
makdm | Дата: Вт, 25.03.2014, 14:26 | Сообщение # 852 |
Рожденный в СССР
Разработчики
Сообщений: 1294
| Цитата NIV ( ) Однако собака не атакует его, а продолжает бегать вокруг ГГ. Что_Я_Делаю_Не_Так? Может собаку надо сперва вывести из состояние mob_companion?
NIV, мягко говоря, логика не в порядке.
[cut noguest] Смотрите, on_combat = mob_combat пишется не в схеме поведения, а в секции логики и не является схемой поведения moba, а работает по принципу on_hit или on_death Например on_combat = mob_combat
[mob_combat] on_info = %+mob_start_attack% ;--При переходе mobа в combat выдаем инфопоршион
При появлении врага, переход moba в combat осуществляется посредством отключения логики и передачи moba под управление движка. Делается это в bind_monster.script в методе update :
if self.object:get_enemy() then if xr_logic.mob_captured(self.object) then xr_logic.mob_release(self.object) end return end
Поэтому выводить moba из под схемы mob_companion не нужно, за вас это уже сделал биндер монстров.
После выполнения функции xr_logic.mob_release(self.object), логика отключается, но mob иногда "тупит" и не атакует врагов.
Для этого разрабы предусмотрели движковый метод berserk(). Насколько я понимаю, он даёт "пинка" mobу и он тут же переходит в combat.
С учётом всего написанного, представленный фрагмент логики должна выглядеть как-то так
[mob_companion] combat_ignore_cond = {=check_enemy_name(actor)} true on_info = %=set_visual_memory_enabled(0)% on_info2 = {+dog_domest_gulyay} mob_walker@waiting_start on_info3 = {-closest_enemy_finded} %=find_closest_enemy% on_info4 = {=mob_has_enemy} %=mob_berserk%
[hit] on_info = {=hit_by_actor -zat_b18_actor_enemy} %+zat_b18_actor_enemy%
А в скрипт xr_effects.script добавьте функцию
function mob_berserk(actor, npc) npc:berserk() end[/cut]Добавлено (25.03.2014, 14:26) --------------------------------------------- И ещё по поводу функции find_closest_enemy()
Все он-лайновые объекты хранятся в таблицах файла db.script Например все сталкеры, которые в данный момент времени он-лайн хранятся в таблице heli_enemies Аналогично можно сделать таблицу, в которой будут храниться все монстры. Перебирая объекты в таблицах можно получить сталкера или монстра, который ближе всего к mobу И не нужно перебирать 65535 объектов игры. Тем самым увеличиваем быстродействие и убираем лишние проверки.
Терпение...... И все получится!
Сообщение отредактировал makdm - Вт, 25.03.2014, 14:19 |
|
|
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
NIV | Дата: Пт, 28.03.2014, 20:55 | Сообщение # 853 |
Полевой исследователь
Ученые сталкеры
Сообщений: 167
| Цитата denis2000 ( ) Проверьте текущую цель вашего моба функцией get_enemy(). Проверил, врага нет, разбираемся...
Как-то всё туманно получается. Функция hit_npc_from_npc должна давать хит. Проверял функцией xr_conditions.mob_was_hit - хита нет. Наверное не зря hit_npc_from_npc была закомментирована.
Пытался разозлить собаку так: Код local dog = level.object_by_id(dog_id) local closest_enemy = level.object_by_id(closest_enemy_id) dog:set_relation(game_object.enemy,closest_enemy) Результат - отношение совпадает с отношениями из game_relations.ltx. Если враг ГГ - зомби, то собаке он - нейтрал. Если враг ГГ - человек или снорк, то собаке он тоже враг. Подскажите, как сделать любого монстра врагом псевдособаке, несмотря на отношения между монстрами?Добавлено (28.03.2014, 20:55) --------------------------------------------- Подскажите, где прописаны анимации мутантов? В файлах *.omf? Если да, то как получить список анимаций?
Изменяем реальность S.T.A.L.K.E.R. CoP: "Цена Новых Исследований" / "New Investigations' Value"
Сообщение отредактировал NIV - Чт, 27.03.2014, 19:16 |
|
|
Эти 0 пользователя(ей) поблагодарили NIV за это полезное сообщение: |
|
|
denis2000 | Дата: Пт, 28.03.2014, 22:59 | Сообщение # 854 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Цитата NIV ( ) Подскажите, где прописаны анимации мутантов? В файлах *.omf? Если да, то как получить список анимаций? Да именно там. Получить список можно сконвертировав в skls и открыв полученный файл в SDK.
Цитата NIV ( ) Наверное не зря hit_npc_from_npc была закомментирована. Я ее использовал и она работает (использовал только на НПС поскольку она написана для НПС). Обратите внимание, что в данной функции хит наноситься в сустав bip01_spine, которого у монстра может и не быть! К тому-же объект источник хита передается по стори-ид объекта.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
NIV | Дата: Пн, 31.03.2014, 14:46 | Сообщение # 855 |
Полевой исследователь
Ученые сталкеры
Сообщений: 167
| Цитата denis2000 ( ) хит наноситься в сустав bip01_spine, которого у монстра может и не быть! Что-то я так и не понял - зомби - это монстр или нет? В табличке отношений они указаны вместе с мутантами.
Скелет зомбированного сталкера абсолютно идентичен скелету обычного сталкера. denis2000
Изменяем реальность S.T.A.L.K.E.R. CoP: "Цена Новых Исследований" / "New Investigations' Value"
|
|
|
Эти 0 пользователя(ей) поблагодарили NIV за это полезное сообщение: |
|
|
|