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


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


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

sergej5500, можно сделать всё гораздо проще, если тебе нужно, чтобы собака не реагировала на Сталкеров.

Для этого в файл xr_conditions.script добавишь функцию

Код
function check_enemy_stalker( actor , npc )
   local enemy_id = db.storage[ npc:id() ].enemy_id
   local enemy = db.storage[ enemy_id ] and db.storage[ enemy_id ].object
   if enemy and enemy:alive() and IsStalker( enemy ) then
    return true
   end
   return false
end


Ну и проверка в логике:

combat_ignore_cond = {=check_enemy_stalker} true, false

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


Терпение......
И все получится!


Сообщение отредактировал makdm - Вт, 24.03.2015, 09:43
 
sergej5500Дата: Вт, 24.03.2015, 19:41 | Сообщение # 1157
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

makdm,

С функцией check_enemy_stalker все понятно. А как написать условие игнорирования всех сталкеров, кроме игрока?

Добавлено (24.03.2015, 19:41)
---------------------------------------------
И еще один вопрос. В логике собаки Ноя используется функция =set_visual_memory_enabled(0). Видимо, чтобы не реагировал индикатор видимости игрока противником.

Для сквадов неписей иногда применяется параметр relationship = enemy, = neutral, = friend. Для сквадов монстров он будет работать?

 
makdmДата: Вт, 24.03.2015, 20:34 | Сообщение # 1158
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

Цитата sergej5500 ()
А как написать условие игнорирования всех сталкеров, кроме игрока?

Честно говоря не понял "юмора".
Ты же сам пишешь в своих проверках
Цитата sergej5500 ()
{=check_enemy_name(actor)} true


А теперь вдруг игрок должен стать врагом для собаки.

Ну так добавить проверку на игрока и поставить её первой.

combat_ignore_cond = {=check_enemy_name(actor)} false, {=check_enemy_stalker} true, false

Цитата sergej5500 ()
Для сквадов монстров он будет работать?

Проверь и сразу будет понятно.
Только, раз уж разрабы Сталкера добавили функцию set_visual_memory_enabled в игру, то, наверное, это было сделано не просто так?


Терпение......
И все получится!
 
sergej5500Дата: Сб, 02.05.2015, 01:05 | Сообщение # 1159
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Цитата makdm ()
Честно говоря не понял "юмора".


Это нужно для конечной секции логики собаки. Если игрок атаковал смарт, то вояки и собака становятся ему врагами.
У собаки указано combat_ignore_cond = {=check_enemy_stalker} true. В том числе и актор. Если эту функцию убрать, то псина кинется на первого подвернувшегося солдата. А если не убирать, то под условие попадает и актор.

combat_ignore_cond = {=check_enemy_name(actor)} false, {=check_enemy_stalker} true, false

Добавлено (08.04.2015, 00:03)
---------------------------------------------
Добрый вечер.

Столкнулся с такой проблемой. При выполнении квеста в лесничестве из оригинала Зова Припяти Спартак не хочет говорить с ГГ.

При получении задания у Бороды спавнится сквад из 4-х сталкеров. Затем к ним 5-м доспавнивают Спартака. 4 сталкера без проблем выполняют свою работу. Спартак не хочет занимать свое место. Не хочет говорить. Квест виснет.

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

Радиус загрузки локации в сборке - 225 метров.

Единственное, что приходит в голову - спавн Спартака отдельным сквадом. С соответствующими переделками рестрикторов и конфигов.

Вопрос такой. Поможет ли вот эта наработка? Если сквад после спавна Спартака перевести в оффлайн, затем в онлайн, то логика неписей перезагрузится?

Добавлено (02.05.2015, 01:05)
---------------------------------------------
Добрый вечер.

Для своего мода сделал Сидоровича. Прописал ему его озвучку из ТЧ.

[cut=Логика][logic@esc_b2_trader_1]
active = remark@esc_b2_trader_1
suitable = {=check_npc_name(esc_b2_trader)} true
prior = 300
level_spot = trader
post_combat_time = 0,0
can_select_weapon = false
trade = misc\trade\order_traders\esc_b2_trader.ltx

[remark@esc_b2_trader_1]
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@trader_1
invulnerable = {-esc_b2_stalker_squad_enemy} true, false
target = story | actor
on_info = %=control_npc_position(esc_b2_trader_control_spawn_point:1)%

[meet@trader_1]
close_snd_hello = esc_b2_sidor_hello
close_snd_bye = esc_b2_sidor_exit
use = {!actor_enemy !actor_has_weapon !has_enemy} true, false
allow_break = false
trade_enable = true[/cut]

Все нормально работало.

Далее решил несколько квестовых персонажей: торговец, медик, сберегатель, банкир объединить в один сквад.
До этого все эти персы спавнились каждый отдельным сквадом. Сидорович попал в этот сквад. Рядовым бойцом.

И перестал приветствовать. Строки

close_snd_hello = esc_b2_sidor_hello
close_snd_bye = esc_b2_sidor_exit

перестали работать.

Можно ли исправить ситуацию? Спавн Сидора отдельным сквадом нежелателен.

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

sergej5500, Делайте walker вместо remark в активной логике.

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

Добрый день.

Имеется смарт. К нему приписано несколько сквадов. Из логики рестриктора нужно проверить, свободен ли смарт.
То есть погибли ли все сквады или нет.

Можно воспользоваться проверкой !squad_exist и перебрать все сквады. Есть ли другая функция?
 
makdmДата: Вс, 03.05.2015, 16:25 | Сообщение # 1162
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

Цитата sergej5500 ()
Есть ли другая функция?

Её можно добавить в файл xr_conditions.script

Проверка:

on_info = { =smart_terrain_empty( ИМЯ_СМАРТА ) }

Функция:

function smart_terrain_empty(actor, obj, p)
local smart_name = p[1]
local board = sim_board.get_sim_board()
local smart = board.smarts_by_names[smart_name]
local smart_id = smart.id
for k,v in pairs(board.smarts[smart_id].squads) do
return false
end
return true
end

З.Ы. Но имей ввиду, что если это смарт для симуляции, то если в него идёт сквад, который, например, находится в другой части локации, то смарт уже будет считаться занятым, хотя реально в смарте ещё никого не будет.


Терпение......
И все получится!


Сообщение отредактировал makdm - Вс, 03.05.2015, 16:36
 
СахарДата: Пн, 04.05.2015, 17:18 | Сообщение # 1163
Гражданский
Пользователи
Сообщений: 2
Награды: 4
Репутация: [ 69 ]

Доброго здравия хотелось бы узнать можно просмотреть так называемы оверрайды то есть необязательные дополнительные ключи в логике?

 
makdmДата: Пн, 04.05.2015, 19:23 | Сообщение # 1164
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

Сахар, открой файл xr_logic.script
Найди функцию cfg_get_overrides
Все оверрайды в ней перечислены.


Терпение......
И все получится!
 
СахарДата: Чт, 07.05.2015, 14:45 | Сообщение # 1165
Гражданский
Пользователи
Сообщений: 2
Награды: 4
Репутация: [ 69 ]

Доброго времени суток. Возможно ли проверить что НПС (без story id) находится в спейс рескрипторе?

 
denis2000Дата: Чт, 07.05.2015, 15:23 | Сообщение # 1166
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Сахар, Чтобы идентифицировать объект, нужно хоть что-то о нем знать.

"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
СахарДата: Чт, 07.05.2015, 16:39 | Сообщение # 1167
Гражданский
Пользователи
Сообщений: 2
Награды: 4
Репутация: [ 69 ]

denis2000, А если создать таблицу визуалов НПС и проверять все объекты которые попадут в рескриптор на совпадение с таблицей(то есть возвращать визуал get_visual_name()). Это возможно или я бред несу?

 
denis2000Дата: Чт, 07.05.2015, 18:21 | Сообщение # 1168
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Цитата Сахар ()
проверять все объекты которые попадут в рескриптор

Нашелся колбек на вход объекта в зону и выход из зоны: zone_enter и zone_exit. Применяется в скрипте xr_zones.script. Регистрация колбеков:
Код
self.object:set_callback(callback.zone_enter, self.on_enter, self)
self.object:set_callback(callback.zone_exit, self.on_exit, self)

Использование:
Код
function arena_zone_binder:on_enter(zone, obj)
function arena_zone_binder:on_exit(zone, obj)

Как видим возвращается два параметра зона и попавший объект. Работу на ЗП не проверял.


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
СахарДата: Вс, 10.05.2015, 10:12 | Сообщение # 1169
Гражданский
Пользователи
Сообщений: 2
Награды: 4
Репутация: [ 69 ]

Доброго здравия.
Код
;=================================================1==========================
[logic@e4_no_sim_punitive_1]
active = walker@punitive_1_start
suitable = {=check_npc_name(esc_e4_punitive_1)} true

[walker@punitive_1_start]
path_walk = punitive_1_wait_walk
path_look = punitive_1_wait_look
on_game_timer = 252000 | %+e4_no_sim_npc_attack_e4_no_actor_info% patrol@punitive_1
on_info = {+e4_talk_gusar_done_info} %=crete_sms(e4_no_sim_punitive_1_dues_start:neutral_1:5000:default)% walker@building_punitive_1
danger = punitive_start_all
meet = meet@punitive_1_start
show_spot = false

[walker@building_punitive_1]
path_walk = punitive_1_dues_walk
path_look = punitive_1_dues_look
on_signal = punitive_1_dues_path_end | %+e4_no_sim_punitive_1_dues_path_end_info%
on_info = {+e4_no_sim_punitive_1_dues_path_end_info +e4_no_sim_punitive_2_dues_path_end_info +e4_no_sim_punitive_3_dues_path_end_info} %=crete_sms(e4_no_sim_punitive_1_attack:neutral_1:5000:default)% patrol@punitive_1
show_spot = false

[patrol@punitive_1]
path_walk = e4_no_sim_patrol_punitive_walk
commander = true
formation = back
meet = no_meet
show_spot = false

[meet@punitive_1_start]
trade_enable = false
meet_dialog = e4_gusar_start_talk
allow_break = false

;=================================================2==============================
[logic@e4_no_sim_punitive_2]
active = walker@punitive_2_start
suitable = {=check_npc_name(esc_e4_punitive_2)} true

[walker@punitive_2_start]
path_walk = punitive_2_wait_walk
path_look = punitive_2_wait_look
on_info1 = {+e4_no_sim_npc_attack_e4_no_actor_info} patrol@punitive_2_and_3
on_info2 = {+e4_talk_gusar_done_info} walker@building_punitive_2
show_spot = false
danger = punitive_start_all

[walker@building_punitive_2]
path_walk = punitive_2_dues_walk
path_look = punitive_2_dues_look
on_signal = punitive_2_dues_path_end | %+e4_no_sim_punitive_2_dues_path_end_info%
on_info = {+e4_no_sim_punitive_1_dues_path_end_info +e4_no_sim_punitive_2_dues_path_end_info +e4_no_sim_punitive_3_dues_path_end_info} patrol@punitive_2_and_3
show_spot = false

;=================================================3==============================
[logic@e4_no_sim_punitive_3]
active = walker@punitive_3_start
suitable = {=check_npc_name(esc_e4_punitive_3)} true

[walker@punitive_3_start]
path_walk = punitive_3_wait_walk
path_look = punitive_3_wait_look
on_info1 = {+e4_no_sim_npc_attack_e4_no_actor_info} patrol@punitive_2_and_3
on_info2 = {+e4_talk_gusar_done_info} walker@building_punitive_3
show_spot = false
danger = punitive_start_all

[walker@building_punitive_3]
path_walk = punitive_3_dues_walk
path_look = punitive_3_dues_look
on_signal = punitive_3_dues_path_end | %+e4_no_sim_punitive_3_dues_path_end_info%
on_info = {+e4_no_sim_punitive_1_dues_path_end_info +e4_no_sim_punitive_2_dues_path_end_info +e4_no_sim_punitive_3_dues_path_end_info} patrol@punitive_2_and_3
show_spot = false

;=================================================2and3===========================
[patrol@punitive_2_and_3]
path_walk = e4_no_sim_patrol_punitive_walk
commander = false
formation = back
meet = no_meet
;=================================================other===========================
[punitive_start_all]
ignore_distance = 10

При переход на секций patrol происходит вылет.
Код
stack trace:

0023:07E3E8B3 xrGame.dll, CDialogHolder::CDialogHolder()
0023:07E3FB45 xrGame.dll, CDialogHolder::CDialogHolder()
0023:061E2EA3 lua.JIT.1.1.4.dll, luaopen_io()

Заранее спасибо за помощь.


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

Сахар, on_info = {<Условие>} <Следующя секция> %<Дествия>%
Элементы можно пропускать, но не переставлять местами.


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
Поиск: