Войти на сайт Регистрация Лента форума Пользователи Правила сайта Поиск по форуму
Модератор форума: denis2000, FantomICW  
Модостроение. Редактирование и создание скриптов
denis2000Дата: Пн, 10.10.2011, 21:17 | Сообщение # 1
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Редактирование и создание скриптов

Редактирование и создание скриптов на языке LUA

Если у вас появились вопросы по применению скриптов в игре. Задавайте их в этой теме - умные головы,
модосторители и просто разбирающиеся в программировании люди вам ответят.


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


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


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
АазДата: Сб, 11.05.2013, 14:03 | Сообщение # 181
Хозяин Зоны
Зомби
Награды: 30
Репутация: [ 0 ]

[cut noguest=Лог вылета]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. cop\gamedata\scripts\bind_stalker.script:412: attempt to index global 'fcop_spawn' (a nil value)[/cut]

[cut noguest=412-я строка в bind_stalker.script]fcop_spawn.spawn_all()[/cut]

[cut noguest=Содержимое указанной функции в fcop_spawn.script]function spawn_all() --Функция спавна
local level_name=level.name()
----------------------------
------------Затон-----------
----------------------------
if level_name=="zaton" then
if has_alife_info("zat_noah_shotgun_quest_init") and not has_alife_info("zat_noah_quest_shotgun_spawn") then
alife():create("wpn_spas12_noah_quest",vector():set(-207.994598,26.896700,-471.805176),526906,89)
db.actor:give_info_portion("zat_noah_quest_shotgun_spawn")
end
if not has_alife_info("spawn_demiurg_complite") then
alife():create("zat_demiurg",vector():set(113.776520,-7.348208,186.347198),1162412,316)
db.actor:give_info_portion("spawn_demiurg_complite")
end
if has_alife_info("zat_noah_shotgun_quest_end") and not has_alife_info("zat_demiurg_search_documents_init") then
news_manager.send_tip(db.actor, "Привет, это Демиург. Есть дело, подходи на Скадовск.", nil, nil, 25000)
db.actor:give_info_portion("sms_ot_demiurg_1")
end

end
end[/cut]

Вылет появился, как только в скрипт добавил кусок, отвечающий за приход СМС-ки на ПДА ГГ. Инфопоршень, выдаваемый при приходе СМС, указан в info_fcop.xml, а он зарегистрирован в system.ltx. Неужели end снова где-то не хватает?


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

Ааз,
В spawn_all последний end лишний.
 
АазДата: Сб, 11.05.2013, 14:45 | Сообщение # 183
Хозяин Зоны
Зомби
Награды: 30
Репутация: [ 0 ]

sergej5500, убрал лишний end, лог при вылете прежний.

 
FantomICWДата: Сб, 11.05.2013, 14:51 | Сообщение # 184
Лидер «Свободы»
Свобода
Сообщений: 4438
Награды: 44
Репутация: [ 1340 ]

Ааз, sergej5500, в конце как-раз и должно быть три end. Возможно, then стоит не на той строчке...


 
АазДата: Сб, 11.05.2013, 14:58 | Сообщение # 185
Хозяин Зоны
Зомби
Награды: 30
Репутация: [ 0 ]

FantomICW, специально показываю еще раз, но с уменьшенным размером шрифта (там then просто на нужную строку не влезло):
[cut noguest=Содержимое функции]function spawn_all() --Функция спавна
local level_name=level.name()
----------------------------
------------Затон-----------
----------------------------
if level_name=="zaton" then
if has_alife_info("zat_noah_shotgun_quest_init") and not has_alife_info("zat_noah_quest_shotgun_spawn") then
alife():create("wpn_spas12_noah_quest",vector():set(-207.994598,26.896700,-471.805176),526906,89)
db.actor:give_info_portion("zat_noah_quest_shotgun_spawn")
end
if not has_alife_info("spawn_demiurg_complite") then
alife():create("zat_demiurg",vector():set(113.776520,-7.348208,186.347198),1162412,316)
db.actor:give_info_portion("spawn_demiurg_complite")
end
if has_alife_info("zat_noah_shotgun_quest_end") and not has_alife_info("zat_demiurg_search_documents_init") then
news_manager.send_tip(db.actor, "Привет, это Демиург. Есть дело, подходи на Скадовск.", nil, nil, 25000)
db.actor:give_info_portion("sms_ot_demiurg_1")
end
end
end
[/cut]

Еще у меня есть подозрение, что функция отправки СМС на ПДА ГлавГероя неправильная сама по себе.




Сообщение отредактировал Ааз - Сб, 11.05.2013, 15:06
 
sergej5500Дата: Сб, 11.05.2013, 15:04 | Сообщение # 186
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Ааз,
Возможно, функция сообщения написана с ошибкой. Пример рабочих функций:
news_manager.send_tip(db.actor, "st_ach_pioneer", nil, "pioneer", nil, nil) сообщение о достижении из оригинала.
news_manager.send_tip(db.actor,"zat_general_staff_about_refer_parcel_intro_tip_1_text",0,"top_secret",20000,nil,"jup_general_staff_title") сообщение из СГМ.
В обоих функциях после db.actor стоит 5 элементов через запятые. У Вас в функции 4 элемента. В логе указание, что не определена переменная. Попробуйте переделать строку news_manager.
 
АазДата: Сб, 11.05.2013, 15:19 | Сообщение # 187
Хозяин Зоны
Зомби
Награды: 30
Репутация: [ 0 ]

Цитата (denis2000)
function send_tip(actor, news_id, timeout, sender, showtime, sender_id)
actor - объект ГГ получатель новости (обычно параметр равен db.actor)
news_id - сообщение (текст или имя xml ноды)
timeout - задержка перед отображением новости
sender - объект - отправитель используется для отображения иконки персонажа отправившего сообщение
showtime - время отображения новости
sender_id - идентификатор отправителя - используется для определения жив отправитель или нет (если мертв сообщение не отправиться)

У меня не хватает только sender_id, что туда вписать? Я попробовал вписать story_id персонажа, который должен отправить ГГ СМС, но получил вылет с тем же самым логом.

Строка news_manager.send_tip теперь выглядит так:
news_manager.send_tip(db.actor, "Привет, это Демиург. Есть дело, подходи на Скадовск.", nil, nil, 25000, zat_demiurg)


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

Ааз,
1. Ищите ошибку синтаксиса, а не добавляйте параметр в функцию, который она может легко и проигнорировать (вообще этой функции достаточно только первых двух - остальные не обязательны!)
2. Количество end верное
3. Не уверены в вызове функции send_tip - закоментируйте ее. Вылет пропал - виновата она.
4. Вместо текста неплохо бы использовать xml ноду или на крайний случай убрать знаки препинания (особенно запятые!)


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

Ааз, вот Вам готовая рабочая функция.
Вызывается из логики любого объекта.
Написана для Гладиатор аддон.

[cut=Функция]function send_message(actor, npc, p)
--' p[1] - id текста сообщения из папки text\rus
--' p[2] - story_id сендера
--' p[3] - id имени сендера из папки text\rus
--' p[4] - длительность показа сообщения в миллисек, по-умолчанию 5 секунд.
--' =send_message(p[1]:p[2]:p[3]:p[4]) - вызов функции
if p == nil then
abort("Wrong parameters in 'send_message' function!!!")
end
if p[4] == nil then p[4] = 5000 end
local news_text = game.translate_string(p[1])
local news_caption = game.translate_string(p[3])
local showtime = p[4]
local sender = get_story_object(p[2])
local texture = "ui_iconsTotal_grouping"
if sender then
texture = sender:character_icon()
end
xr_sound.set_sound_play(db.actor:id(), "pda_tips")
db.actor:give_game_news(news_caption, news_text, texture, 0, showtime, 0)
end[/cut]


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


Сообщение отредактировал makdm - Сб, 11.05.2013, 16:29
 
kvantДата: Сб, 11.05.2013, 21:34 | Сообщение # 190
Удаленные



Всем доброго времени суток,создаю мод на сталкер чистое небо.Добавил худ брони (маску) с эффектом дыхания.но не хватает звука дыхания,не можете помочь?

Добавлено (11.05.2013, 21:34)
---------------------------------------------
может как-то можно было бы взять из SGM мода?не можете хоть подсказать какие файлы редактировать?

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

kvant, В SGM звук дыхания файл sound_effects\gas_mask_idle.ogg

"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
kvantДата: Сб, 11.05.2013, 22:13 | Сообщение # 192
Удаленные



но ведь нужен же скрипт,правильно?ну когда на гг броня - был звук дыхания

Добавлено (11.05.2013, 22:13)
---------------------------------------------
и есть еще пара вопросиков которые очень интересуют,вот вывел на худ часы,а худ (маска) брони перекрывает сами часы,как можно сделать чтобы часы были поверх маски?в Shoker моде на чн видел в этом скрипте функцию апдейта,но сам прописать не смог((

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

Цитата (kvant)
ну когда на гг броня - был звук дыхания

Это в биндере вешается функция проверяющая что маска надета и проигрывающая звук с определенным интервалом, можно даже делать интервал зависимым от стамины ГГ (db.actor.power)

Цитата (kvant)
как можно сделать чтобы часы были поверх маски?

По идее если у оконных элементов нет флага отображать "поверх других", то нужно их выводить последними, тогда они будут отображаться поверх остальных.


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
kvantДата: Сб, 11.05.2013, 23:25 | Сообщение # 194
Удаленные



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

kvant, По идее параметр heading="1", но я не уверен, что это сработает.

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