Войти на сайт Регистрация Лента форума Пользователи Правила сайта Поиск по форуму
Модератор форума: 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Дата: Вт, 19.03.2013, 16:30 | Сообщение # 331
Лидер «Свободы»
Свобода
Сообщений: 4438
Награды: 44
Репутация: [ 1340 ]

dendjdnk2010, в распакованном виде алл.спавн не работает


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

dendjdnk2010, Ну так вы должны были получить файл new.spawn или не получили? Если нет читайте лог universal_acdc.log. Компилятор в курсе что ему еще и файл way_map3.ltx нужно прихватить? Файл all.ltx правили?

"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
dendjdnk2010Дата: Ср, 20.03.2013, 03:35 | Сообщение # 333
Гражданский
Пользователи
Сообщений: 21
Награды: 0
Репутация: [ 0 ]

denis2000,
Получить-то получил. Но видно, что он шильный. Я пробовал - не запускается.
Да, я правил all.ltx.
В логе пишет следующее:
[cut]
Universal ACDC v.1.31
importing alife objects...
importing alife objects from file alife_map3.ltx...
importing artefact spawn places data...
importing way objects from file way_map3.ltx...
writing unpack2...
writing header...
writing alife objects...

FATAL ERROR!
Function: all_spawn::write_alife
Line: 473
Description: guids.ltx: No such file or directory[/cut]
[/cut]


Но файла guids.ltx не было в папке при распаковке. И я не знаю, где его надыбать((



[cut=Новый ACDC v.1.32 с папкой stkutils]
Добавлено (20.03.2013, 03:30)
---------------------------------------------
Ребят)))

Universal ACDC v.1.32: ACDC v.1.32
Что нового:

[!] guids.ltx больше не нужен без ключа -idx
[+] реализована сортировка way-объектов по алфавиту
[+] реализовано определение принадлежности way-секции к локации по gvid и префиксу
[+] реализована сортировка alife-объектов

И последняя версия папочки stkutils stkutils
[/cut]


Добавлено (20.03.2013, 03:35)
---------------------------------------------
Но новом вроде запаковал, но треугольник какой-то малюсенький получился.
Посему возник вопрос: координаты вводить с максимальной точностью, которая имеется? Или есть определенное число знаков, больше которых он (сталк ТЧ) не учитывает?


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

dendjdnk2010, Трех знаков после запятой вполне достаточно.

"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
dendjdnk2010Дата: Ср, 20.03.2013, 09:50 | Сообщение # 335
Гражданский
Пользователи
Сообщений: 21
Награды: 0
Репутация: [ 0 ]

denis2000,
Спасиб. А могут быть отрицательными координаты?
Просто я их снял, а они вида: x=-29.374, y=-0.000, z=-20.322.
Я их ввожу, компилирую, а он все равно по какому-то треугольнику левому ходит.

 
sergej5500Дата: Ср, 20.03.2013, 10:19 | Сообщение # 336
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

dendjdnk2010,
Отрицательные координаты будут обязательно. Точка с координатами 0, 0, 0 находится в центре локации.
 
dendjdnk2010Дата: Ср, 20.03.2013, 13:23 | Сообщение # 337
Гражданский
Пользователи
Сообщений: 21
Награды: 0
Репутация: [ 0 ]

Ребят, вопрос по уроку 3а (Спавн НПС при помощи скрипта в начале новой игры (а) ):
НарСол на ТЧ поэтому файл bind_stalker.script отличается и там нет строчки benchmark.main() после которой надо вызывать скрипт.

В этом файле функция actor_binder:net_spawn(data) имеет следующее содержание:
[cut noguest=Содержание функции]
function actor_binder:net_spawn(data)
--amk.updateGameTime()
spawn_level_changer.remove_old_teleport()
printf("actor net spawn")
-- skunk.dbglog("actor net spawn")
zamok.restore()
babah.collectBombs()
level.show_indicators()

self.bCheckStart = true
self.weapon_hide = false -- спрятано или нет оружие при разговоре.
weapon_hide = false -- устанавливаем глобальный дефолтовый флаг.

if object_binder.net_spawn(self,data) == false then
-- skunk.dbglog("actor net spawn 1")
return false
end

-- skunk.dbglog("actor net spawn 2")
db.add_actor(self.object)
if self.st.disable_input_time == nil then
level.enable_input()
end

self.weather_manager:reset()
-- game_stats.initialize ()

if(actor_stats.add_to_ranking~=nil)then
actor_stats.add_to_ranking(self.object:id())
end

--' Загружаем настройки дропа
death_manager.init_drop_settings()

-- added by xStream for AMK miniSDK
if xrs_ai then
xrs_ai.actor_net_spawn(self)
end

if rx_ai then
rx_ai.actor_net_spawn()
end

dmx_mod.dmx_net_spawn() -- DMX MOD
amk.on_game_load(obj)

--===============================
--[[local bad_object_names = {"arh2_dell2_restrictor"}
local i, se_name, se_obj

for i, se_name in ipairs(bad_object_names) do
se_obj = alife():object(se_name)
if se_obj then
news_manager.send_tip(db.actor,"Удалили глючный объект:"..se_name,nil,nil,1000)
alife():release(se_obj, true)
end
end]]
--===============================
sak.add_tail()
braad_test.false_info()
-- end of addition
meceniy_work.main()
meceniy_utils.net_spawn_callback()
-- kostya_level --
spawn_teleport.spawn_teleport_exit()
spawn_teleport.spawn_teleport_hospital()
bind_det_arts.start_update()
netpacket_pda_id = netpacket_pda_create.create_pda()
return true
end
[/cut]

Так где вызвать скрипт. чтобы при новой игре заспаунился Никитка?


Сообщение отредактировал dendjdnk2010 - Ср, 20.03.2013, 14:48
 
FantomICWДата: Ср, 20.03.2013, 17:55 | Сообщение # 338
Лидер «Свободы»
Свобода
Сообщений: 4438
Награды: 44
Репутация: [ 1340 ]

dendjdnk2010, не имеет значения, есть ли там benchmark.main() или нет. Можешь поставить вызов скрипта где угодно в функции actor_binder:net_spawn(data), главное, чтобы оно не обрывало другие под-функции и вызовы.
Можешь так
[cut=Пример]
Код
function actor_binder:net_spawn(data)   
--amk.updateGameTime()   
spawn_level_changer.remove_old_teleport()   
printf("actor net spawn")   
-- skunk.dbglog("actor net spawn")   
zamok.restore()   
babah.collectBombs()   
level.show_indicators()   

self.bCheckStart = true   
self.weapon_hide = false -- спрятано или нет оружие при разговоре.   
weapon_hide = false -- устанавливаем глобальный дефолтовый флаг.   
my_spawn.spawn_sh_nikitka()
[/cut]

А можешь и так
[cut=Пример 2]
Код
if rx_ai then   
rx_ai.actor_net_spawn()   
end   

dmx_mod.dmx_net_spawn() -- DMX MOD   
amk.on_game_load(obj)   

--===============================   
--[[local bad_object_names = {"arh2_dell2_restrictor"}   
local i, se_name, se_obj   

for i, se_name in ipairs(bad_object_names) do   
se_obj = alife():object(se_name)   
if se_obj then   
news_manager.send_tip(db.actor,"Удалили глючный объект:"..se_name,nil,nil,1000)   
alife():release(se_obj, true)   
end   
end]]   
--===============================   
sak.add_tail()   
braad_test.false_info()   
-- end of addition   
meceniy_work.main()   
meceniy_utils.net_spawn_callback()   
-- kostya_level --   
spawn_teleport.spawn_teleport_exit()   
spawn_teleport.spawn_teleport_hospital()   
bind_det_arts.start_update()   
netpacket_pda_id = netpacket_pda_create.create_pda()   
return true   
end   
my_spawn.spawn_sh_nikitka()
[/cut]

Но не так
[cut=Пример 3]
Код
-- skunk.dbglog("actor net spawn 2")   
db.add_actor(self.object)   
if self.st.disable_input_time == nil then   
my_spawn.spawn_sh_nikitka()
level.enable_input()   
end
[/cut]
Единственное, я не уверен, используется ли в ТЧ такой скрипт спавна нпс...





Сообщение отредактировал FantomICW - Ср, 20.03.2013, 17:55
 
dendjdnk2010Дата: Чт, 21.03.2013, 01:22 | Сообщение # 339
Гражданский
Пользователи
Сообщений: 21
Награды: 0
Репутация: [ 0 ]

FantomICW, на первый пример выкидывает ошибку в логе про актора (типо нулеевая переменная).
А на второй пример - ничего в лог не пишет - просто вылет.
Боюсь, что Ваши опасения по поводу этого скрипта в ТЧ оправдались.


Тогда возникает вопрос, как мне заспаунить Никитку при начале игры в ТЧ?


И ещё такой вопрос, когда спауню Никитку по кнопке. Он отходит к первой точке, а потом начинает ходить по какому-то мелкому треугольнику. Которого я не задавал. Может он его откуда-то достает?
(координаты я снял правильно - поспаунил Никитку в каждую точку)

Или может надо спаунить Никитку именно сразу в первую точку, откуда путь начинается???
 
denis2000Дата: Сб, 23.03.2013, 00:27 | Сообщение # 340
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Цитата (dendjdnk2010)
выкидывает ошибку в логе про актора

А лог привести постеснялись?

Цитата (dendjdnk2010)
Боюсь, что Ваши опасения по поводу этого скрипта в ТЧ оправдались.

Это единственный скрипт, для спавна любых объектов в любых движках и билдах сталкера.

Цитата (dendjdnk2010)
Тогда возникает вопрос, как мне заспаунить Никитку при начале игры в ТЧ?

1. Через all.spawn, 2. Через скрипт

Цитата (dendjdnk2010)
Может он его откуда-то достает?

Вы преувеличиваете возможности искусственного интеллекта.

ПС: Давайте и дальше будем вести диалог без информации с вашей стороны, может само по себе заработает.


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
dendjdnk2010Дата: Ср, 27.03.2013, 10:29 | Сообщение # 341
Гражданский
Пользователи
Сообщений: 21
Награды: 0
Репутация: [ 0 ]

denis2000, Извините пожалуйста. Согласен, что само по себе не заработает))

Лог ошибки по первому пример
[cut noguest=Лог I]
FATAL ERROR

[error]Expression : fatal error
[error]Function : CScriptEngine::lua_error
[error]File : E:\stalker\patch_1_0004\xr_3da\xrGame\script_engine.cpp
[error]Line : 73
[error]Description : <no expression>
[error]Arguments : LUA error: e:\ns2011 - dmx edition\gamedata\scripts\sak.script:487: attempt to index field 'actor' (a nil value)
[/cut]

В примере 2 игра вылетает, но лога вообще никакого нету.


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

dendjdnk2010, В скрипте sak.script параметр actor в строке 487 равен nil.

"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
ДовакинДата: Чт, 28.03.2013, 21:24 | Сообщение # 343
Командир д.г. быстрого реагирования
Пользователи
Сообщений: 688
Награды: 14
Репутация: [ 552 ]

Извините,я новичок.Не нашел или не увидел инфы в КМБ.Как созданного мной НПС поставить на одно место(никуда чтобы не уходил),и дать ему функцию приветствия и торговли как у Бороды или Сыча?
P.S Можно обозначить каждую строку?




Сообщение отредактировал ___ToRReNT___ - Чт, 28.03.2013, 21:59
 
FantomICWДата: Пт, 29.03.2013, 19:16 | Сообщение # 344
Лидер «Свободы»
Свобода
Сообщений: 4438
Награды: 44
Репутация: [ 1340 ]

___ToRReNT___, по созданию нпс есть урок КМБ №16.
Чтобы торговля была как у Бороды, под строками [logic] нужно указать
trade = misc\trade\trade_zat_a2_barmen.ltx или trade = misc\trade\trade_zat_b30_stalker_trader.ltx
Это отсылки к файлам торговли в configs/misc/trade. Можешь создать такой-же свой, если так будет удобней.
Как понимать "функцию приветствия"? Приведи пример.



 
ДовакинДата: Пт, 29.03.2013, 19:39 | Сообщение # 345
Командир д.г. быстрого реагирования
Пользователи
Сообщений: 688
Награды: 14
Репутация: [ 552 ]

Чтобы нпс здоровался,а не говорил <<Вон старший стоит,так ты к нему обращайся>>

Добавлено (29.03.2013, 19:39)
---------------------------------------------
Как заспавнить НПС на НОВОЙ локации.(Типа Деревня Новичков)


 
Поиск: