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


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


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

strelok200, все та же логика. Все те же НПС. Спавнится объект на основе actor_visual_stalker через функцию create_cutscene_actor_with_weapon или другим способом. Логику ему прописывают либо через смарт, либо через custom_data. Запускается через рестриктор схема sr_cutscene, в которой идет отсылка к anm-файлу движения камеры. Все это синхронно проигрывается, в нужный момент останавливается, тогда управление возвращается к актеру.


 
alex_xp_77Дата: Вт, 11.03.2014, 22:36 | Сообщение # 842
Научный сотрудник.
Ученые сталкеры
Сообщений: 242
Награды: 6
Репутация: [ 41 ]

Добрый вечер всем , помогите разобраться до конца, что бы сделать готовый рабочий смарт, прописал логику смарту, прописал логику 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


 
NIVДата: Вт, 11.03.2014, 22:51 | Сообщение # 843
Полевой исследователь
Ученые сталкеры
Сообщений: 167
Награды: 4
Репутация: [ 180 ]

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
 
makdmДата: Вт, 11.03.2014, 23:07 | Сообщение # 844
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

alex_xp_77, всё не так сложно, просто нужно немного самому приложить усилие.
Подсказываю:
Возьмите оригинальный ЗП и посмотрите, как сделан смарт zat_b18.
Это смарт, на котором "работает" собака на барже Ноя.
Посмотрите, как прописывается логика смарта.
Посмотрите, как прописывается эксклюзив.
Посмотрите, как прописывается логика собаке ( mob_walker ).
Посмотрите в каких ещё файлах прописывается смарт zat_b18.
Я думаю, что разберётесь и сами.


Терпение......
И все получится!
 
NIVДата: Ср, 12.03.2014, 21:08 | Сообщение # 845
Полевой исследователь
Ученые сталкеры
Сообщений: 167
Награды: 4
Репутация: [ 180 ]

здравствуйте! 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"
 
makdmДата: Ср, 12.03.2014, 21:41 | Сообщение # 846
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

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
 
NIVДата: Чт, 13.03.2014, 07:01 | Сообщение # 847
Полевой исследователь
Ученые сталкеры
Сообщений: 167
Награды: 4
Репутация: [ 180 ]

[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
 
alex_xp_77Дата: Вс, 16.03.2014, 10:01 | Сообщение # 848
Научный сотрудник.
Ученые сталкеры
Сообщений: 242
Награды: 6
Репутация: [ 41 ]

Добрый день всем !!Вопрос непосредственно по спавну в самом sdk, как заспавнить химеру??Если ее в самом cdk нету? Может с мода какого то засунуть в sdk?? просто в LE 04 химеры нету!!У меня вопрос к скорее всего к ветеранам форума, помогите пожалуста в моем втором вопросе, есть в народной солянке варка артефактов, в моей игре будет немного другая тематика (большая просьба к модераторам, не убирайте, не удаляйте пожалуста мое сообщение.Спасибо) мне очень хочется поменять направление артефактов, пример"бросаешь лунный свет+ночная звезда= лунная звезда,или звезда лесов, или пустынный камень, вот как это все прописать, или насколько это все сложно?Помогите пожалуста примером, я бы думаю дальше справился, место в титрах в моем проекте гарантирую!



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

alex_xp_77, Добавляй! Вноси нужные секции в gamedata SDK, так-же переноси модели текстуры и анимации. Очень вероятно среди анимаций не будет специальной анимации для демонстрации в редакторе, придется переименовать какую-то существующую или не обращать внимания на вопли редактора об отсутствующей анимации.

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

Здравствуйте, хотел проконсультироваться по вопросу логики дружественного моба. Я создал собаку, наследующую от собаки Ноя. Она находиттся под логикой mob_companionmakdm) и по инфопоршню переводится в секцию [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
 
denis2000Дата: Пн, 24.03.2014, 22:42 | Сообщение # 851
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Цитата NIV ()
Может собаку надо сперва вывести из состояние mob_companion?

Как вы себе это представляете? Или вы считаете что ваша собака ОДНОВРЕМЕННО подчиняется ДВУМ секциям логики?
Цитата NIV ()
Вот этого я не понял - эти объекты должны быть одинаковыми?!

Это разные типы объектов с разными родителями и соответственно с разными свойствами и методами. Один серверного типа другой клиентского.
Цитата NIV ()
Что_Я_Делаю_Не_Так?

Проверьте текущую цель вашего моба функцией get_enemy().


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

Цитата 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
 
NIVДата: Пт, 28.03.2014, 20:55 | Сообщение # 853
Полевой исследователь
Ученые сталкеры
Сообщений: 167
Награды: 4
Репутация: [ 180 ]

Цитата 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
 
denis2000Дата: Пт, 28.03.2014, 22:59 | Сообщение # 854
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Цитата NIV ()
Подскажите, где прописаны анимации мутантов? В файлах *.omf? Если да, то как получить список анимаций?

Да именно там. Получить список можно сконвертировав в skls и открыв полученный файл в SDK.

Цитата NIV ()
Наверное не зря hit_npc_from_npc была закомментирована.

Я ее использовал и она работает (использовал только на НПС поскольку она написана для НПС). Обратите внимание, что в данной функции хит наноситься в сустав bip01_spine, которого у монстра может и не быть! К тому-же объект источник хита передается по стори-ид объекта.


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

Цитата denis2000 ()
хит наноситься в сустав bip01_spine, которого у монстра может и не быть!

Что-то я так и не понял - зомби - это монстр или нет? В табличке отношений они указаны вместе с мутантами.

Скелет зомбированного сталкера абсолютно идентичен скелету обычного сталкера. denis2000


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