Модостроение. Редактирование и создание скриптов
|
|
denis2000 | Дата: Пн, 10.10.2011, 21:17 | Сообщение # 1 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Редактирование и создание скриптов Редактирование и создание скриптов на языке 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 по ссылке из шапки и соседнюю тему "Курс молодого бойца", возможно Ваш вопрос уже рассматривался.
Если произошел вылет - выкладываем лог! Вопрос ставим четко, не забываем указывать версию игры, установленные моды их версии, установленные фиксы модов и подробно ваши правки. Помните чем подробнее вопрос, тем точнее ответ.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
Ааз | Дата: Сб, 11.05.2013, 14:03 | Сообщение # 181 |
Хозяин Зоны
Зомби
| [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 снова где-то не хватает?
|
|
|
Эти 0 пользователя(ей) поблагодарили Ааз за это полезное сообщение: |
|
|
sergej5500 | Дата: Сб, 11.05.2013, 14:36 | Сообщение # 182 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Ааз, В spawn_all последний end лишний.
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
Ааз | Дата: Сб, 11.05.2013, 14:45 | Сообщение # 183 |
Хозяин Зоны
Зомби
| sergej5500, убрал лишний end, лог при вылете прежний.
|
|
|
Эти 0 пользователя(ей) поблагодарили Ааз за это полезное сообщение: |
|
|
FantomICW | Дата: Сб, 11.05.2013, 14:51 | Сообщение # 184 |
Лидер «Свободы»
Свобода
Сообщений: 4438
| Ааз, sergej5500, в конце как-раз и должно быть три end. Возможно, then стоит не на той строчке...
|
|
|
Эти 0 пользователя(ей) поблагодарили FantomICW за это полезное сообщение: |
|
|
Ааз | Дата: Сб, 11.05.2013, 14:58 | Сообщение # 185 |
Хозяин Зоны
Зомби
| 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 |
|
|
Эти 0 пользователя(ей) поблагодарили Ааз за это полезное сообщение: |
|
|
sergej5500 | Дата: Сб, 11.05.2013, 15:04 | Сообщение # 186 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Ааз, Возможно, функция сообщения написана с ошибкой. Пример рабочих функций: 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.
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
Ааз | Дата: Сб, 11.05.2013, 15:19 | Сообщение # 187 |
Хозяин Зоны
Зомби
| Цитата (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)
|
|
|
Эти 0 пользователя(ей) поблагодарили Ааз за это полезное сообщение: |
|
|
denis2000 | Дата: Сб, 11.05.2013, 15:47 | Сообщение # 188 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Ааз, 1. Ищите ошибку синтаксиса, а не добавляйте параметр в функцию, который она может легко и проигнорировать (вообще этой функции достаточно только первых двух - остальные не обязательны!) 2. Количество end верное 3. Не уверены в вызове функции send_tip - закоментируйте ее. Вылет пропал - виновата она. 4. Вместо текста неплохо бы использовать xml ноду или на крайний случай убрать знаки препинания (особенно запятые!)
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
makdm | Дата: Сб, 11.05.2013, 16:22 | Сообщение # 189 |
Рожденный в СССР
Разработчики
Сообщений: 1294
| Ааз, вот Вам готовая рабочая функция. Вызывается из логики любого объекта. Написана для Гладиатор аддон.
[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 |
|
|
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
kvant | Дата: Сб, 11.05.2013, 21:34 | Сообщение # 190 |
Удаленные
| Всем доброго времени суток,создаю мод на сталкер чистое небо.Добавил худ брони (маску) с эффектом дыхания.но не хватает звука дыхания,не можете помочь? Добавлено (11.05.2013, 21:34) --------------------------------------------- может как-то можно было бы взять из SGM мода?не можете хоть подсказать какие файлы редактировать?
|
|
|
Эти 0 пользователя(ей) поблагодарили kvant за это полезное сообщение: |
|
|
denis2000 | Дата: Сб, 11.05.2013, 21:47 | Сообщение # 191 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| kvant, В SGM звук дыхания файл sound_effects\gas_mask_idle.ogg
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
kvant | Дата: Сб, 11.05.2013, 22:13 | Сообщение # 192 |
Удаленные
| но ведь нужен же скрипт,правильно?ну когда на гг броня - был звук дыхания Добавлено (11.05.2013, 22:13) --------------------------------------------- и есть еще пара вопросиков которые очень интересуют,вот вывел на худ часы,а худ (маска) брони перекрывает сами часы,как можно сделать чтобы часы были поверх маски?в Shoker моде на чн видел в этом скрипте функцию апдейта,но сам прописать не смог((
|
|
|
Эти 0 пользователя(ей) поблагодарили kvant за это полезное сообщение: |
|
|
denis2000 | Дата: Сб, 11.05.2013, 22:44 | Сообщение # 193 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Цитата (kvant) ну когда на гг броня - был звук дыхания Это в биндере вешается функция проверяющая что маска надета и проигрывающая звук с определенным интервалом, можно даже делать интервал зависимым от стамины ГГ (db.actor.power)
Цитата (kvant) как можно сделать чтобы часы были поверх маски? По идее если у оконных элементов нет флага отображать "поверх других", то нужно их выводить последними, тогда они будут отображаться поверх остальных.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
kvant | Дата: Сб, 11.05.2013, 23:25 | Сообщение # 194 |
Удаленные
| а как прописать чтобы было поверх других?
|
|
|
Эти 0 пользователя(ей) поблагодарили kvant за это полезное сообщение: |
|
|
denis2000 | Дата: Сб, 11.05.2013, 23:54 | Сообщение # 195 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| kvant, По идее параметр heading="1", но я не уверен, что это сработает.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
|