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


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


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
denis2000Дата: Сб, 02.05.2015, 10:24 | Сообщение # 1171
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

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

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

Добрый день.

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

Можно воспользоваться проверкой !squad_exist и перебрать все сквады. Есть ли другая функция?
 
makdmДата: Вс, 03.05.2015, 16:25 | Сообщение # 1173
Рожденный в СССР
Разработчики
Сообщений: 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 | Сообщение # 1174
Гражданский
Пользователи
Сообщений: 2
Награды: 4
Репутация: [ 69 ]

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

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

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


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

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

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

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

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

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

 
denis2000Дата: Чт, 07.05.2015, 18:21 | Сообщение # 1179
Полевой исследователь
Ученые сталкеры
Сообщений: 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 | Сообщение # 1180
Гражданский
Пользователи
Сообщений: 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 | Сообщение # 1181
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

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


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

Цитата denis2000 ()
Элементы можно пропускать, но не переставлять местами.

Пол года писал по своему и вылетов не было. Но я всёравно попробовал сделать как вы написали вылет некуда не делся.
Вот что удалось выудить благодаря учебника Хована.

Код
! Cannot find saved game ~~~dbg:adding_object_%s
! Cannot find saved game ~~~dbg:adding_object_m_crow2309
! Cannot find saved game ~~~dbg:*info*:_npc='%s'_id='%s'
! Cannot find saved game ~~~dbg:*info*:_npc='actor'_id='e4_no_sim_punitive_3_dues_path_end_info'
! Cannot find saved game ~~~dbg:reset_invulnerability._npc[%s]_=_[%s]
! Cannot find saved game ~~~dbg:reset_invulnerability._npc[esc_e4_punitive_30582]_=_[false]
stack trace:

0023:0773E8B3 xrGame.dll, CDialogHolder::CDialogHolder()
0023:0773FB45 xrGame.dll, CDialogHolder::CDialogHolder()
0023:05AA2EA3 lua.JIT.1.1.4.dll, luaopen_io()


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

Цитата Сахар ()
Пол года писал по своему и вылетов не было.

Ну вот вам и счастливый момент инициации. Идем далее: покажите патрульный путь.
И к стати:
Код
=crete_sms(e4_no_sim_punitive_1_attack:neutral_1:5000:default)

5000 и default можно и не писать - это значения по умолчанию, а в таблицу иконок neutral_1 вы добавили, если ее используете?


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

denis2000, Пожалуйста.
Код
[e4_no_sim_patrol_punitive_walk]
points = p0,p1,p2,p3,p4
p0:name = wp00
p0:position = -3.02870607376099,-5.24072694778442,-70.6412811279297
p0:game_vertex_id = 35
p0:level_vertex_id = 274905
p0:links = p1(1)

p1:name = wp01
p1:position = 26.4389953613281,-0.50626802444458,-64.3615798950195
p1:game_vertex_id = 36
p1:level_vertex_id = 306902
p1:links = p2(1)

p2:name = wp02
p2:position = 59.9830055236816,-10.5589723587036,-50.9293441772461
p2:game_vertex_id = 37
p2:level_vertex_id = 348769
p2:links = p3(1)

p3:name = wp03
p3:position = 79.9495162963867,-8.02896881103516,-47.1616821289063
p3:game_vertex_id = 37
p3:level_vertex_id = 374536
p3:links = p4(1)

p4:name = wp04
p4:position = 104.468391418457,-7.56253576278687,-41.3653335571289
p4:game_vertex_id = 26
p4:level_vertex_id = 405777

Ещё такой вопрос появился на локаций присутствует статический пулемёт. При распаковки спавна получаю ошибку.
Код
C:\Users\!\Desktop\ACDC>del sections.ini

C:\Users\!\Desktop\ACDC>universal_acdc.pl -d all.spawn -out la -scan configs/ -s
ort complex
defined(@array) is deprecated at stkutils/ini_file.pm line 146.
         (Maybe you should just omit the defined()?)
defined(@array) is deprecated at stkutils/data_packet.pm line 859.
         (Maybe you should just omit the defined()?)
log inited: console
Universal ACDC v.1.38
checking version of all.spawn...
         This is a spawn of S.T.A.L.K.E.R. Call Of Pripyat (any patch)
scanning configs...
problems occured while scanning configs. Try again...
done!
opening all.spawn...
reading header...
reading alife objects...
handling error with m_car, template C

FATAL ERROR!
Function: stkutils::data_packet::error_handler
Line: 1548
Description: unhandled exception

Добавлено (10.05.2015, 16:00)
---------------------------------------------

Цитата denis2000 ()
а в таблицу иконок neutral_1 вы добавили, если ее используете?

Да.


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

Сахар, В патрульном пути ничего криминального нет. Как добавляли иконку neutral_1?



Цитата sergej5500 ()
Нужно отследить, не находится ли в шаре рестриктора игрок, сталкер или монстр.

К стати в оригинеле мина сделана просто аномалией с эффектами взрыва причем в конфиге выставлена реагировать единажды: blowout_once = true. Но такая "мина" не реагирует на НПС и не подрывается от выстрела, а только на попадание предмета (болта), ГГ или монстра.


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