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


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


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
Ay49MihasДата: Пн, 18.08.2014, 20:23 | Сообщение # 961
Полевой исследователь
Ученые сталкеры
Сообщений: 218
Награды: 9
Репутация: [ 83 ]

Здравствуйте!
В SGM 2.2 воспользовался для персонажа схемой move, типом patrol (по аналогии с проводником в Тёмной Долине).
Всё прекрасно работает, паренёк бежит по заданному пути, но тут вдруг я реил стрельнуть в лежащую далеко (от непися с логикой) бочку, которая взорвалась. После этого непись добежал до ближайшей точки в пути и остановился, дальше не бежит. Почему так?
PS: со скриптами реализации секций логики совсем не дружен, так что если это штатный режим, то посоветуйте, пожалуйста, рецепт как исправить.
Спасибо!
 
sergej5500Дата: Пн, 18.08.2014, 20:46 | Сообщение # 962
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Ay49Mihas,

Попробуй прописать в стартовую секцию логики [logic] строку:

post_combat_time = 0,0.

Или переделай логику под валкера. Валкеры зависают намного реже.
 
Ay49MihasДата: Вт, 19.08.2014, 19:08 | Сообщение # 963
Полевой исследователь
Ученые сталкеры
Сообщений: 218
Награды: 9
Репутация: [ 83 ]

Цитата sergej5500 ()
Попробуй прописать в стартовую секцию логики [logic] строку:
post_combat_time = 0,0.

Увы, не сработало.

Цитата sergej5500 ()
Или переделай логику под валкера. Валкеры зависают намного реже.

А вот это сработало smile Действительно, с валкера отвлёкшись, непись через некоторое время возвращается на свой путь и идёт как ни в чём не бывало дальше.
 
denis2000Дата: Чт, 21.08.2014, 19:09 | Сообщение # 964
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

sergej5500,

  • Во первых логика рестриктора может быть несколько проще:
    [cut=Логика рестриктора][sr_idle@stalker_gon_squad_def]
    on_info20 = {=distance_to_obj_ge(jup_b207_trapper_gon_spot:150)} sr_idle@fail %+jup_b220_stalker_gon_squad_enemy%
    on_info30 = {+jup_b220_stalker_gon_squad_enemy} sr_idle@fail

    [sr_idle@spawn_1_1]:sr_idle@stalker_gon_squad_def
    on_info = sr_idle@timer_1_1 %=jup_b220_gon_monster_spawn%

    [sr_idle@timer_1_1]:sr_idle@stalker_gon_squad_def
    on_game_timer = 10 | sr_idle@exist_1_1

    [sr_idle@exist_1_1]:sr_idle@stalker_gon_squad_def
    on_info = {!squad_exist(jup_b220_monster_gon_squad)} sr_idle@spawn_1_2 %=add_cleaner_monster%

    [sr_idle@spawn_1_2]:sr_idle@stalker_gon_squad_def
    on_info = sr_idle@timer_1_2 %=jup_b220_gon_monster_spawn%

    [sr_idle@timer_1_2]:sr_idle@stalker_gon_squad_def
    on_game_timer = 10 | sr_idle@exist_1_2

    [sr_idle@exist_1_2]:sr_idle@stalker_gon_squad_def
    on_info = {!squad_exist(jup_b220_monster_gon_squad)} sr_idle@spawn_1_3 %=add_cleaner_monster%[/cut]
  • Во вторых желательно все же увеличить интервал таймеров игровых секунд до 100-200.
  • В третьих разные волны разные story_id сквадов!
  • В четвертых настройки сквадов сами по себе могут дать некоторый рандом по составу и численности, зачем именно такие сквады?
  • В пятых функция спавна может быть заметно проще, если параметры спавна забить в таблицы и одним движением извлечь нужные параметры.


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
sergej5500Дата: Чт, 21.08.2014, 21:19 | Сообщение # 965
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

denis2000,
Спасибо за информацию.

Цитата denis2000 ()
В пятых функция спавна может быть заметно проще, если параметры спавна забить в таблицы и одним движением извлечь нужные параметры.

Как это сделать на практике? Допустим, есть 2 варианта сквадов и 2 точки спавна.

Цитата denis2000 ()
В третьих разные волны разные story_id сквадов!

У меня 11 вариантов сквадов. Потребуется проверять 11 стори-ид. Мы же не знаем, какой сквад отреспился в этот раз.
Может быть, стоит стори-ид убрать и выдавать при гибели сквада инфопорцию. При спавне следующего сквада её сбрасывать.

Цитата denis2000 ()
В четвертых настройки сквадов сами по себе могут дать некоторый рандом по составу и численности, зачем именно такие сквады?


Я пробовал спавнить такой сквад.

[cut=Сквад][jup_b220_monster_dog_squad]:online_offline_group
faction = monster_predatory_day
npc = sgm_monster_dog_normal
story_id = jup_b220_monster_gon_squad
target_smart = jup_b207
always_arrived = true
npc_in_squad = 2, 6[/cut]

Спавнился сквад из одной собаки. Или кол-во собак в строке npc = надо писать так:

npc = sgm_monster_dog_normal, sgm_monster_dog_normal, sgm_monster_dog_normal, sgm_monster_dog_normal, sgm_monster_dog_normal, sgm_monster_dog_normal, sgm_monster_dog_normal, sgm_monster_dog_normal, sgm_monster_dog_normal, sgm_monster_dog_normal, sgm_monster_dog_normal, sgm_monster_dog_normal

Число собак в строке должно быть больше максимального кол-ва нпс в скваде?
 
denis2000Дата: Чт, 21.08.2014, 21:51 | Сообщение # 966
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Цитата sergej5500 ()
У меня 11 вариантов сквадов. Потребуется проверять 11 стори-ид. Мы же не знаем, какой сквад отреспился в этот раз.

Знаете! Одна волна - один стори_ид на все варианты сквадов, другая волна другой стори_ид.
Цитата sergej5500 ()
Может быть, стоит стори-ид убрать и выдавать при гибели сквада инфопорцию. При спавне следующего сквада её сбрасывать.

А вот это правильная мысль, только на разные волны мутантов разные инфопорции.
Цитата sergej5500 ()
npc = sgm_monster_dog_normal

Вообще то не npc, а npc_random:
Код
npc_random = sgm_monster_dog_normal
npc_in_squad = 2, 6


Цитата sergej5500 ()
Как это сделать на практике?

Как то так:
[cut]
Код
local jup_b220_gon_monster_squad_tabl = {
[1] = "jup_b220_monster_bloodsucker_squad",
...
[11] = "jup_b220_monster_dog_squad"
}

local jup_b220_gon_monster_pos_tabl = {
[1] = {[1]=69.019668579102,[2]=-1.3870533704758,[3]=146.45944213867,[4]=833767,[5]=648},
...
[6] = {[1]=123.03616333008,[2]=-5.6287517547607,[3]=120.73503875732,[4]=926221,[5]=650}
}

function jup_b220_gon_monster_spawn()
local pos_random=math.random(1,6)
local squad_random=math.random(1,11)
create_force(jup_b220_gon_monster_squad_tabl[squad_random],jup_b220_gon_monster_pos_tabl[pos_random][1],jup_b220_gon_monster_pos_tabl[pos_random][2],jup_b220_gon_monster_pos_tabl[pos_random][3],jup_b220_gon_monster_pos_tabl[pos_random][4],jup_b220_gon_monster_pos_tabl[pos_random][5])
end
[/cut]


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
sergej5500Дата: Сб, 23.08.2014, 20:28 | Сообщение # 967
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Всем привет. Встретил забавный глюк.

Неписи грабят тайники из оригинала ЗП. Между Копачами и Яновом в болотце под мостками есть тайник. Там лежит СПАС-12, патроны, граната и еще что-то.

Получил наводку на этот тайник. СПАС не нашел. Неподалеку долговцы ссорились со свободовцами. СПАС обнаружился в инвентаре убитого долговца. После этого тайник засчитался.

В чем может быть причина данного глюка?
 
denis2000Дата: Сб, 23.08.2014, 21:40 | Сообщение # 968
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

sergej5500, Почему глюк? Тайники так и работают, в принципе любой НПС которому разрешено поднимать оружие может взять его из тайника. Поэтому тайники и расположены обычно в местах где НПС или не ходят или достать предмет не могут.

"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
gamerДата: Чт, 04.09.2014, 16:33 | Сообщение # 969
Новичок
Пользователи
Сообщений: 82
Награды: 0
Репутация: [ 0 ]

При переносе в зп актору задаю исходные координат, также пробовал задать 0,0,0 .Мой актор при всех попытках спавнитса за локацией.В чём может быть проблема?
 
sergej5500Дата: Чт, 04.09.2014, 17:04 | Сообщение # 970
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

gamer,

Проверь совпадение координат в строках

position = 253.482116699219, 8.78786945343018, 169.996673583984

и

upd:position = 253.482116699219, 8.78786945343018, 169.996673583984

в секции actor в all.spawn. У меня была похожая проблема.
 
gamerДата: Чт, 04.09.2014, 19:35 | Сообщение # 971
Новичок
Пользователи
Сообщений: 82
Награды: 0
Репутация: [ 0 ]

Не понимаю

В Alife_ltx записал ети координаты 45.6969795227051,0,-356.334716796875 ,а меня выкидует вопще на другие координати
 
FantomICWДата: Чт, 04.09.2014, 19:38 | Сообщение # 972
Лидер «Свободы»
Свобода
Сообщений: 4438
Награды: 44
Репутация: [ 1340 ]

gamer, еще раз проверь upd:position.


 
gamerДата: Чт, 04.09.2014, 21:51 | Сообщение # 973
Новичок
Пользователи
Сообщений: 82
Награды: 0
Репутация: [ 0 ]

кажись проблема с компилятором , появился дополнительный way файл
 
denis2000Дата: Пт, 05.09.2014, 08:19 | Сообщение # 974
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

gamer, Значит в нем пути с геймвертексами вне диапазона.

"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
sergej5500Дата: Ср, 10.09.2014, 18:21 | Сообщение # 975
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Добрый день.

Имеется НПС с логикой.

[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_***? Если можно, то как это сделать?
 
Поиск: