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


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


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

Добрый день.

Возник такой вопрос.

[cut=Смарт][smart_terrain];zat_sim_10
squad_id = 26
max_population = 2
respawn_params = respawn@zat_alfa_sim_10

[respawn@zat_alfa_sim_10]
zat_alfa_force_novice
zat_alfa_force_regular
zat_alfa_force_experienced
zat_alfa_force_veteran
zat_alfa_force_master

[zat_alfa_force_novice]
spawn_squads = zat_alfa_squad_2_novice
spawn_num = {+opt_activate_alfa_force +secret_lab_quests_start =check_actor_rank(0:1000)} 1, 0

[zat_alfa_force_regular]
spawn_squads = zat_alfa_squad_2_regular
spawn_num = {+opt_activate_alfa_force +secret_lab_quests_start =check_actor_rank(1000:2000)} 1, 0

[zat_alfa_force_experienced]
spawn_squads = zat_alfa_squad_2_experienced
spawn_num = {+opt_activate_alfa_force +secret_lab_quests_start =check_actor_rank(2000:3000)} 1, 0

[zat_alfa_force_veteran]
spawn_squads = zat_alfa_squad_2_veteran
spawn_num = {+opt_activate_alfa_force +secret_lab_quests_start =check_actor_rank(3000:4000)} 1, 0

[zat_alfa_force_master]
spawn_squads = zat_alfa_squad_2_master
spawn_num = {+opt_activate_alfa_force +secret_lab_quests_start =check_actor_rank(4000)} 1, 0[/cut]

Допустим, что нужные инфопорции выданы и спавн разрешен. Произойдет ли спавн, если игрок в это время находится на другой локации?
 
СахарДата: Вс, 21.12.2014, 14:31 | Сообщение # 1067
Гражданский
Пользователи
Сообщений: 2
Награды: 4
Репутация: [ 69 ]

sergej5500, Скорее всего да так как ПЫС- ы не зря же писали проверку на нахождение ГГ на локаций actor_on_level.

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

sergej5500, Да респавн будет, даже если ГГ не находиться на этой локации. А какая собственно разница? Ведь игрок не узнает о наличие сквадов пока не приблизиться к ним на расстояние не менее алайфа.

"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
ДизельДата: Вс, 21.12.2014, 22:36 | Сообщение # 1069
Сталкер
Разработчики
Сообщений: 260
Награды: 1
Репутация: [ 136 ]

denis2000, какой логикой в рестрикторе можно отключить(убрать) на худе мини-карту (компас).

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

Дизель,
Код
on_info = {+info_disable_ui} sr_idle@qwerty %=disable_ui%


Уберется все с худа, уберется оружие, отключиться ввод пользователя ночное виденье и фонарь. На базе этой функции можно написать свою в которой отключать то, что требуется (но только карту отключить нельзя, можно отключить сразу все индикаторы на экране).


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
ДизельДата: Вс, 21.12.2014, 22:47 | Сообщение # 1071
Сталкер
Разработчики
Сообщений: 260
Награды: 1
Репутация: [ 136 ]

Цитата denis2000 ()
on_info = {+info_disable_ui} sr_idle@qwerty %=disable_ui%


У меня такое подозрение, что это убирает всё с экрана, а есть ли строго на мини-карту?


andreyholkin
 
denis2000Дата: Пн, 22.12.2014, 00:30 | Сообщение # 1072
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Цитата Дизель ()
а есть ли строго на мини-карту?

Нет.


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

Добрый вечер.

Хочу вернуться к проблеме, описанной тут. Красные надписи в консоли типа:
! Cannot find saved game ~#i#:wm:return_items[rasvet_add_clofelin_stalker23416(Макс Верный)]:not se_npc!!!

Наблюдал за их появлением. Установил, что надписи появляются всякий раз при удалении сквада командой remove_squad.
Надписи появляются, если сквад перед удалением был в онлайне. Если удаляемый сквад был в оффлайне (на другом конце локации), то таких надписей нет.

Установил так же, что в чистом ЗП или СГМ 2.1 таких проблем нет. Тест проводил на Шустром. Заказал ему пистолет. Отошел на 10 метров. Прошла команда remove_squad. Надписей не было.

Есть предположение, что проблемы создает дополнение: Улучшенный интеллект НПС.

Есть несколько вопросов:
1. Можно ли подправить дополнение, чтобы проблем не было?
2. Можно ли принудительно перевести сквад в оффлайн? Потом применить к нему команду remove_squad?
 
makdmДата: Чт, 25.12.2014, 13:40 | Сообщение # 1074
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

Цитата sergej5500 ()
Можно ли принудительно перевести сквад в оффлайн? Потом применить к нему команду remove_squad?

sergej5500, переписываем часть функции в xr_effects.script
Вместо

board:remove_squad(squad)

пишем

if not squad.online then
board:remove_squad(squad)
else
alife ():set_switch_online ( squad.id, false )
alife ():set_switch_offline ( squad.id, true )
local wait_offline = function()
if not squad.online then
return true
end
end
local squad_remove = function()
board:remove_squad(squad)
end

level.add_call( wait_offline, squad_remove )
end


Терпение......
И все получится!
 
denis2000Дата: Вс, 28.12.2014, 15:50 | Сообщение # 1075
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

sergej5500, Попробуйте сделать точки look индивидуальными для каждого НПС (координаты могут быть одинаковыми). Если не поможет еще попробуйте закоментировать в секциях walker@zat_b5_firepos_stalker_ строки def_state_standing, def_state_moving - хотя это уже очень странно будет.

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

Добрый вечер.

Известно, что труп Глухаря часто прибирает уборщик. Решил исправить этот недостаток.

Написал строку для рестриктора:

on_info = {!object_exist(zat_b38_stalker_cop_dead)} %=spawn_object(zat_b38_stalker_cop_dead:zat_medic_home_smart_zat_b22_stalker_medic_look)%

[cut=Спавн-секция][zat_b38_stalker_cop_dead]:stalker_silent,avoid_stalker
$spawn = "respawn\zat_b38_stalker_cop_dead"
character_profile = zat_b38_stalker_cop
spec_rank = novice
community = stalker
story_id = zat_b38_stalker_cop_dead
custom_data = scripts\zaton\zat_b22_stalker_cop_body.ltx
sound_death =[/cut]

[cut=Кастом-дата][dont_spawn_loot]

[dont_spawn_character_supplies]

[logic]
active = animpoint

[animpoint]
cover_name = zat_b22_sc_cop_dead
avail_animations = zat_b38_cop_dead
reach_distance = 0.5
on_info = {=animpoint_reached +zat_b38_cop_dead} %=kill_npc +zat_b22_trick_done%
;on_game_timer = 2000 | {-zat_b22_can_go_in} %=kill_npc +zat_b22_can_go_in%
;on_info2 = {+zat_b38_disappearance_stalkers_find_cop_near_port_krans_give -zat_b22_can_go_in} %+zat_b22_can_go_in =kill_npc%
;on_info3 = {+zat_b22_can_go_in} %=kill_npc%
out_restr = zat_b22_stalker_medic_identified
show_spot = false[/cut]

Рестриктор после активации наспавнил штук сто Глухарей, после чего игра вылетела.

После этого я заспавнил Глухаря как сквад, прописал ему бессмертие и работу - лежать на столе. В момент открытия двери - отключение бессмертия и команда kill_squad. Результат меня устроил. Интересует вопрос - почему движок не захотел читать стори-ид?
 
denis2000Дата: Пн, 29.12.2014, 21:07 | Сообщение # 1077
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

sergej5500, Если объект в офлайне, функция object_exist дает nil. Вот и спавн пачки НПС пока они в офлайне...

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

Добрый вечер.

При тестировании сборки обнаружился глюк.

ссылка

Во время диалога непись, с которым говорил игрок, погиб.

Возникли вопросы.

1. Можно ли принудительно отключить диалог при гибели непися?
2. Можно ли сделать непися, с которым говорит игрок, бессмертным на время диалога?
 
denis2000Дата: Пн, 29.12.2014, 23:54 | Сообщение # 1079
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Цитата sergej5500 ()
Можно ли принудительно отключить диалог при гибели непися?

Попробуй в скрипте xr_motivator.script в функции motivator_binder:death_callback(victim, who)после:
Код
local npc = self.object

добавить:
Код
if npc:is_talking() then npc:stop_talk() end


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

Добрый вечер. Хочу вернуться к проблеме, описанной в посте 1096.

Я сделал свой квест на поиск 3-х КПК с 3-х квестовых трупов. Для страховки от уборщика написал код.

[cut=Код][sr_idle@task7]
on_info = {!squad_exist(zat_b104_alfa_squad_1) =actor_has_item(zat_b104_zombied_notebook) -zat_b104_zombied_notebook_naiden} %+zat_b104_zombied_notebook_naiden =scenario_autosave(st_save_zat_b104_zombied_notebook_naiden)%
on_info2 = {+zat_b104_zombied_notebook_naiden} sr_idle@task8

[sr_idle@task8]
on_info = {=distance_to_smart_ge(zat_b104_zombied:130)} sr_idle@task9 %=zat_quests_proverka_start =create_squad(zat_b33_alfa_squad:zat_b33) =create_squad(zat_b14_alfa_squad_1:zat_b14_smart_terrain) =create_squad(zat_b100_alfa_squad:zat_b100)%

[sr_idle@task9]
on_game_timer = 120 | sr_idle@task10

[sr_idle@task10]
on_info = {-zat_proverka_1_totshka_end !object_exist(zat_army_agent_dead_body_1)} %=zat_army_agent_dead_body_1_spawn1%
on_info2 = {-zat_proverka_2_totshka_end !object_exist(zat_army_agent_dead_body_2)} %=zat_army_agent_dead_body_2_spawn1%
on_info3 = {-zat_proverka_3_totshka_end !object_exist(zat_army_agent_dead_body_3)} %=zat_army_agent_dead_body_3_spawn1%
on_info4 = {+zat_proverka_1_totshka_end +zat_proverka_2_totshka_end +zat_proverka_3_totshka_end -zat_alfa_proverka_final} %+zat_alfa_proverka_final =scenario_autosave(st_save_zat_alfa_proverka_final)%
on_info5 = {+zat_alfa_proverka_final} sr_idle@task12[/cut]

После нахождения квестового предмета на Лесопилке происходит автосейв. При удалении от смарта происходит выдача новых квестов. Затем запускается проверка наличия квестовых трупов.

[cut=Код]on_info = {-zat_proverka_1_totshka_end !object_exist(zat_army_agent_dead_body_1)} %=zat_army_agent_dead_body_1_spawn1%
on_info2 = {-zat_proverka_2_totshka_end !object_exist(zat_army_agent_dead_body_2)} %=zat_army_agent_dead_body_2_spawn1%
on_info3 = {-zat_proverka_3_totshka_end !object_exist(zat_army_agent_dead_body_3)} %=zat_army_agent_dead_body_3_spawn1%

[/cut]

[cut=Спавн-секции][zat_army_agent_dead_body_1]:stalker
$spawn = "respawn\zat_army_agent_dead_body_1"
character_profile = zat_army_agent_dead_body_1
spec_rank = experienced
community = army
story_id = zat_army_agent_dead_body_1

[zat_army_agent_dead_body_2]:stalker
$spawn = "respawn\zat_army_agent_dead_body_2"
character_profile = zat_army_agent_dead_body_2
spec_rank = experienced
community = army
story_id = zat_army_agent_dead_body_2

[zat_army_agent_dead_body_3]:stalker
$spawn = "respawn\zat_army_agent_dead_body_3"
character_profile = zat_army_agent_dead_body_3
spec_rank = experienced
community = army
story_id = zat_army_agent_dead_body_3
[/cut]

Код отлично работает. Квестовые трупы спавнятся на Земснаряде, Заправке и в Железном Лесу. Рестриктору без разницы, в онлайне объект или в оффлайне. В онлайне могут оказаться одновременно Железный Лес и Заправка. Одна, две или все три точки обязательно будут в оффлайне. При неоднократных прохождениях мною и тестерами на точке всегда только один квестовый труп.

В случае с Глухарем применение аналогичного кода приводит к бесконечному спавну. На окраине Затона можно бегать свободно. При подходе к Портовым Кранам начинаются жуткие тормоза.

Собственно, вопрос. Почему в одном случае код работает, а в другом нет?
 
Поиск: