Модостроение. Редактирование и создание скриптов
|
|
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 за это полезное сообщение: |
|
|
Hanter0718 | Дата: Вс, 08.04.2012, 18:39 | Сообщение # 61 |
Гражданский
Пользователи
Сообщений: 24
| Не знаю куда написать,так что пишу сюда: Подскажите как в список спавна "Повелителя зоны" добавить скажем учёных(нормальных,а не Новикова с Озёрским)и рассветовцев например
Windows XP,Intel core 2 duo,NVIDIA GeForse G105M
|
|
|
Эти 0 пользователя(ей) поблагодарили Hanter0718 за это полезное сообщение: |
|
|
Destroy | Дата: Пн, 09.04.2012, 02:22 | Сообщение # 62 |
Разработчик SGM
Вольные сталкеры
Сообщений: 308
| Здравствуйте, Профы.
Прошу напомнить, в каком из скриптовых файлов производится расчёт параметров оружия, которые преобразуются в эти полоски: Точность Скорострельность Повреждение
Помню, что находил это в скриптах, но уже не помню, в каких именно. Спасибо.
ui_wpn_params.script. denis2000 Благодарю.
Сообщение отредактировал Destroy - Пн, 09.04.2012, 11:37 |
|
|
Эти 0 пользователя(ей) поблагодарили Destroy за это полезное сообщение: |
|
|
denis2000 | Дата: Пн, 09.04.2012, 12:20 | Сообщение # 63 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Hanter0718, Нужно в файле extracontent.ltx добавить спан секцию НПС. А в файле scripts\god_tbl.script в таблицу god_stalker_table добавить субтаблицу с именем спавн секции и названием НПС.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
Destroy | Дата: Пн, 09.04.2012, 13:21 | Сообщение # 64 |
Разработчик SGM
Вольные сталкеры
Сообщений: 308
| Функция нажатия клавиш в главном меню: http://pastebin.com/rtGGvk8d (залил на пастбин, чтобы удобнее было смотреть)
Когда жму F6 и выполняется функция: amenu.for_ui_main_menu_f6()
Вот она сама (в другом файле, как Вы поняли, в файле amenu):
[cut]function for_ui_main_menu_f6() self:OnMessageQuitWin() end [/cut]
Я получаю вылет: [cut]Expression : !m_error_code Function : raii_guard::~raii_guard File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp Line : 748 Description : ...s\s.t.a.l.k.e.r. - cop\gamedata\scripts\amenu.script:2: attempt to index global 'self' (a nil value) [/cut]
Я так понял, что-то с нулевым значением? П.С. чистая З/П, без СГМ.
Сообщение отредактировал Destroy - Пн, 09.04.2012, 14:08 |
|
|
Эти 0 пользователя(ей) поблагодарили Destroy за это полезное сообщение: |
|
|
denis2000 | Дата: Пн, 09.04.2012, 14:26 | Сообщение # 65 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Destroy, Не self:OnMessageQuitWin(), а ui_main_menu.main_menu:OnMessageQuitWin()
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
Destroy | Дата: Пн, 09.04.2012, 14:28 | Сообщение # 66 |
Разработчик SGM
Вольные сталкеры
Сообщений: 308
| denis2000, можно узнать, почему так? Просто хочу в будущем не допустить похожей ошибки. Спасибо. *upd Из КМБ:
elseif db.actor~=nil and dik==DIK_keys.DIK_F8 then sh.for_ui_main_menu_f8()
Зачем нужна эта проверка? Ещё раз спасибо =).
Сообщение отредактировал Destroy - Пн, 09.04.2012, 14:57 |
|
|
Эти 0 пользователя(ей) поблагодарили Destroy за это полезное сообщение: |
|
|
denis2000 | Дата: Пн, 09.04.2012, 15:01 | Сообщение # 67 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Destroy, [cut]Родные объекты в Lua отсутствуют, и нам придется их эмулировать. Гибкость синтаксиса это позволяет, но прежде необходимо понимать основы реализации ООП в других языках. В первом приближении, объект – это совокупность структур данных и методов для оперирования ими. Если структура данных и набор методов у двух объектов совпадают, эти объекты могут принадлежать (а могут и не принадлежать) одному классу. Как правило, в программе используется несколько объектов одного класса. Для каждого из них создается своя область данных (чем же иначе объекты будут отличаться друг от друга?), но для ее обработки у всех объектов одного класса используются (физически) одни и те же методы. Каким образом метод, который мало чем отличается от обычной функции, узнает, с какой именно структурой данных ему предстоит работать? Для этой цели у него есть скрытый параметр self.[/cut] self - это ссылка на текущий объект (указатель на структуру данных объекта) для которого вызывается метод. Например в скрипте ui_main_menu.script инициализирован класс объектов main_menu, для корых определен метод OnMessageQuitWin(). В своем примере ты передаешь управление другому скрипту, который понятия не имеет об этом объекте и его методах, а значит нужно явно укзать Скрипт.Объект:Метод. Code ui_main_menu.main_menu:OnMessageQuitWin()
db.actor~=nil - это стандартный прием, для определения наличия объекта actor (Главный Герой), грубо говоря проверка на то, что игра запущена и ГГ жив.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
Destroy | Дата: Ср, 11.04.2012, 13:30 | Сообщение # 68 |
Разработчик SGM
Вольные сталкеры
Сообщений: 308
| Благодарю за помощь, Денис. Ещё вопросец: Как проверить, с каким ключём запущена игра? Имеется ввиду, что например, при вызове игрового меню клавишей F6 будет стоять проверка, запущена ли игра с ключем "-test".
Насчёт снятия координат... Есть ли на каком-нибудь ресурсе код, который будет их записывать в текстовый файл? Если нет, можно ли взять этот код из SGM? Или Николай наложил вето на это дело? ; )
|
|
|
Эти 0 пользователя(ей) поблагодарили Destroy за это полезное сообщение: |
|
|
denis2000 | Дата: Ср, 11.04.2012, 14:21 | Сообщение # 69 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Quote (Destroy) Как проверить, с каким ключём запущена игра? Code if string.find(command_line(), "-test") then ... else ... end
Quote (Destroy) Насчёт снятия координат... Или Николай наложил вето на это дело? Может и есть, а насчет вето у него и спроси.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
mrdi | Дата: Ср, 18.04.2012, 22:04 | Сообщение # 70 |
Удаленные
| Подскажите пожалуйста как добавить кнопку в меню и новый диалог настроек например... Спасибо.
|
|
|
Эти 0 пользователя(ей) поблагодарили mrdi за это полезное сообщение: |
|
|
Xecator | Дата: Пн, 07.05.2012, 19:46 | Сообщение # 71 |
Отмычка
Пользователи
Сообщений: 31
| Есть несколько предметов, например "section_1","section_2","section_3". Нужно написать функцию, которая считает, сколько предметов из данного списка есть в инвентаре у ГГ. Функция имеет такой вид: [cut=функция]Code function actor_has_2_section(first_speaker, second_speaker) local item_sections = { [1] = "section_1", [2] = "section_2", [3] = "section_3" } local needed = 2 local count = 0 local item_section
local function calc(temp, item) if item:section() == item_section then count = count + 1 end end
for k,v in pairs(item_sections) do item_section = v get_story_object("actor"):iterate_inventory(calc, actor) end
return count = needed end [/cut] Лежит в dialogs_zaton.script. Также там лежат еще 3 такие же функции, которые проверяют другие количества (0,1 и 3). Так вот, функция вызывается в диалоге с определенным НПС. Но имеется вылет: [cut=лог]stack trace:
0023:055C105B lua.JIT.1.1.4.dll[/cut] Вылет происходит при попытке заговорить с совсем другими НПС. В частности, вылетает с Сычом и Карданом (дальше не проверял). Если из dialogs_zaton.script удалить все эти 4 функции, то вылет исчезает. Помогите, пожалуйста, что не так? Как правильно должна выглядеть эта функция?
P.S. этот вид я скопировал из того же dialogs_zaton.script, там была функция по проверке наличия у ГГ продуктов для наемников, которые на цехах подстанции сидят. Уж она то точно рабочая должна быть.
|
|
|
Эти 0 пользователя(ей) поблагодарили Xecator за это полезное сообщение: |
|
|
denis2000 | Дата: Пн, 07.05.2012, 22:08 | Сообщение # 72 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Xecator, Перепутал оператор присвоения и сравнения! Code return count == needed
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
Бабай | Дата: Вт, 08.05.2012, 16:58 | Сообщение # 73 |
Ветеран
Пользователи
Сообщений: 483
| Как у альфы убрать иммунитет к выбросу? Я в скрипте surge_manager.script удалил строку ["alfa_force"] = true, но они все равно с началом выброса впадают в спячку и так выживают. Я так понял, что при выбросе, когда они засыпают, срабатывает функция пропуска выброса во время сна. Так же, как и у наемников в цехах подстанции, у торговца на базе наемников. У торговца в логике я нашел параметр "Invulnerable" - бессмертие, но у остальных такого нет. Подскажите в какой стороне искать.
Скрипт также не трогает сквады у которых есть story_id. denis2000 Я там нашел что список выживших проверяется по кондлисту, а где этот кондлист?
surge_manager.ltx. denis2000 [cut=Это он?]local immuned_to_surge_squads = { ["monster_predatory_day"] = true, ["monster_predatory_night"] = true, ["monster_vegetarian"] = true, ["monster_zombied_day"] = true, ["monster_zombied_night"] = true, ["monster_special"] = true, ["monster"] = true, --здесь была альфа ["zombied"] = true }[/cut] В этом скрипте это единственный список , который я нашел.
Нет не он, внимание на расшмрение файла! denis2000 [cut=condlist]condlist = {+opt_deactivate_vibros} false, {-pri_a16_kovalski_start =actor_on_level(pripyat)} false, {+pri_a25_rfi_source_eliminated -pri_a28_actor_in_zone_stay} false, {-val_storyline_complete =actor_on_level(darkvalley)} false, {=actor_on_level(military)} false, {=actor_on_level(agroprom)} false, true[/cut] Тут перечислено, когда выброс не начинать. В следущей строке: [cut =survive] survive = {+actor_marked_by_zone_3_times} true, {+anabiotic_in_process} true, {+actor_in_sleep} true, false [/cut] условия выживания актора во время выброса. А остальное список укрытий. Про альфу ни слова.
А должно быть? denis2000
Это я и спрашиваю: где и что должно быть написано?
Тогда прочти наконец мой первый ответ на твой вопрос!!! denis2000
Правильно заданный вопрос - половина правильного ответа!
Сообщение отредактировал Бабай - Пт, 11.05.2012, 14:56 |
|
|
Эти 0 пользователя(ей) поблагодарили Бабай за это полезное сообщение: |
|
|
sergej5500 | Дата: Вт, 15.05.2012, 21:24 | Сообщение # 74 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Всем Добрый Вечер! Возник вопрос, есть ли ограничение на объем скриптовых файлов, и конкретно sgm_dialogs. Когда я в него добавил несколько скриптов для новых квестов, начались вылеты с ошибкой lua.JIT.1.1.4.dll. Методом проб и ошибок выяснил, что вылеты происходят при попытке поговорить с НПС, у которого есть фраза: Расскажи какую-нибудь историю. Функция mod_dialog_precond, которая отвечает за эти диалоги, стоит в этом файле одной из первых
Явного ограничения нет (к тому же файл ui_mod_elements.script даже немного больше), в крайнем случае никто не мешает сделать несколько файлов, а не класть все в один. denis2000
Сообщение отредактировал sergej5500 - Вт, 15.05.2012, 21:47 |
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
Rocket1972 | Дата: Ср, 16.05.2012, 20:59 | Сообщение # 75 |
Гражданский
Пользователи
Сообщений: 10
| Парни, прошу помощи. Тема беды такая: SGM 2.2 со всеми фиксами из шапки мода. приблуд нету. чистый 2.2. После сдачи квеста на 9-тайников получил задание зачистить магазин "Книги" зачищаю его и говорю с Альфом. После иду к Киборгу, сдаю задание, получаю награду. Жду сутки. Альф чинит антены. Жду вторые, третьи... Чинит. Прошло уже примерно 5 суток с момента сдачи задания Киборгу и получения награды, Альф сидит перед "антеной" и бормочет про славу монолита и т.п. Квест завис..... Николай GeJorge по моей просьбе прислал "таблетку" Таблетка от Николая
к ней аннотацию: [cut noguest]Вот файлик. Забросишь его в папку gamedata\scripts. Затем загрузившись в игру нажмешь ESC и клавишу Z. Должно помочь с Альфом.[/cut] Выполнил как доктор прописал ( положил таблетку куда надо, после нажатия "Z" получаю вот Это: [cut noguest=Вылет такой]FATAL ERROR
[error]Expression : !m_error_code [error]Function : raii_guard::~raii_guard [error]File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp [error]Line : 748 [error]Description : ...ker Зов Припяти\gamedata\scripts\ui_main_menu.script:287: attempt to call global 'queue_manager' (a nil value)
stack trace: [/cut]
Сообщение отредактировал Rocket1972 - Ср, 16.05.2012, 21:09 |
|
|
Эти 0 пользователя(ей) поблагодарили Rocket1972 за это полезное сообщение: |
|
|
|