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


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


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
Hanter0718Дата: Вс, 08.04.2012, 18:39 | Сообщение # 61
Гражданский
Пользователи
Сообщений: 24
Награды: 0
Репутация: [ -20 ]

Не знаю куда написать,так что пишу сюда:
Подскажите как в список спавна "Повелителя зоны" добавить скажем учёных(нормальных,а не Новикова с Озёрским)и рассветовцев например


Windows XP,Intel core 2 duo,NVIDIA GeForse G105M
 
DestroyДата: Пн, 09.04.2012, 02:22 | Сообщение # 62
Разработчик SGM
Вольные сталкеры
Сообщений: 308
Награды: 10
Репутация: [ 235 ]

Здравствуйте, Профы.

Прошу напомнить, в каком из скриптовых файлов производится расчёт параметров оружия, которые преобразуются в эти полоски:
Точность
Скорострельность
Повреждение

Помню, что находил это в скриптах, но уже не помню, в каких именно. Спасибо.

ui_wpn_params.script. denis2000
Благодарю.


Сообщение отредактировал Destroy - Пн, 09.04.2012, 11:37
 
denis2000Дата: Пн, 09.04.2012, 12:20 | Сообщение # 63
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Hanter0718, Нужно в файле extracontent.ltx добавить спан секцию НПС. А в файле scripts\god_tbl.script в таблицу god_stalker_table добавить субтаблицу с именем спавн секции и названием НПС.

"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
DestroyДата: Пн, 09.04.2012, 13:21 | Сообщение # 64
Разработчик SGM
Вольные сталкеры
Сообщений: 308
Награды: 10
Репутация: [ 235 ]

Функция нажатия клавиш в главном меню:
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
 
denis2000Дата: Пн, 09.04.2012, 14:26 | Сообщение # 65
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Destroy, Не self:OnMessageQuitWin(), а ui_main_menu.main_menu:OnMessageQuitWin()

"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
DestroyДата: Пн, 09.04.2012, 14:28 | Сообщение # 66
Разработчик SGM
Вольные сталкеры
Сообщений: 308
Награды: 10
Репутация: [ 235 ]

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
 
denis2000Дата: Пн, 09.04.2012, 15:01 | Сообщение # 67
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Destroy,
[cut]Родные объекты в Lua отсутствуют, и нам придется их эмулировать. Гибкость синтаксиса это позволяет, но прежде необходимо понимать основы реализации ООП в других языках. В первом приближении, объект – это совокупность структур данных и методов для оперирования ими. Если структура данных и набор методов у двух объектов совпадают, эти объекты могут принадлежать (а могут и не принадлежать) одному классу. Как правило, в программе используется несколько объектов одного класса. Для каждого из них создается своя область данных (чем же иначе объекты будут отличаться друг от друга?), но для ее обработки у всех объектов одного класса используются (физически) одни и те же методы. Каким образом метод, который мало чем отличается от обычной функции, узнает, с какой именно структурой данных ему предстоит работать? Для этой цели у него есть скрытый параметр self.[/cut]
self - это ссылка на текущий объект (указатель на структуру данных объекта) для которого вызывается метод.
Например в скрипте ui_main_menu.script инициализирован класс объектов main_menu, для корых определен метод OnMessageQuitWin().
В своем примере ты передаешь управление другому скрипту, который понятия не имеет об этом объекте и его методах, а значит нужно явно укзать Скрипт.Объект:Метод.
Code
ui_main_menu.main_menu:OnMessageQuitWin()


db.actor~=nil - это стандартный прием, для определения наличия объекта actor (Главный Герой), грубо говоря проверка на то, что игра запущена и ГГ жив.


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
DestroyДата: Ср, 11.04.2012, 13:30 | Сообщение # 68
Разработчик SGM
Вольные сталкеры
Сообщений: 308
Награды: 10
Репутация: [ 235 ]

Благодарю за помощь, Денис.
Ещё вопросец:
Как проверить, с каким ключём запущена игра?
Имеется ввиду, что например, при вызове игрового меню клавишей F6 будет стоять проверка, запущена ли игра с ключем
"-test".

Насчёт снятия координат... Есть ли на каком-нибудь ресурсе код, который будет их записывать в текстовый файл? Если нет, можно ли взять этот код из SGM? Или Николай наложил вето на это дело? ; )
 
denis2000Дата: Ср, 11.04.2012, 14:21 | Сообщение # 69
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Quote (Destroy)
Как проверить, с каким ключём запущена игра?

Code
if string.find(command_line(), "-test") then
...   
else
...   
end


Quote (Destroy)
Насчёт снятия координат...
Или Николай наложил вето на это дело?

Может и есть, а насчет вето у него и спроси.


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



Подскажите пожалуйста как добавить кнопку в меню и новый диалог настроек например...
Спасибо.
 
XecatorДата: Пн, 07.05.2012, 19:46 | Сообщение # 71
Отмычка
Пользователи
Сообщений: 31
Награды: 0
Репутация: [ 14 ]

Есть несколько предметов, например "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, там была функция по проверке наличия у ГГ продуктов для наемников, которые на цехах подстанции сидят. Уж она то точно рабочая должна быть.
 
denis2000Дата: Пн, 07.05.2012, 22:08 | Сообщение # 72
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Xecator, Перепутал оператор присвоения и сравнения!
Code
return count == needed


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
БабайДата: Вт, 08.05.2012, 16:58 | Сообщение # 73
Ветеран
Пользователи
Сообщений: 483
Награды: 9
Репутация: [ 233 ]

Как у альфы убрать иммунитет к выбросу? Я в скрипте 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
 
sergej5500Дата: Вт, 15.05.2012, 21:24 | Сообщение # 74
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Всем Добрый Вечер!
Возник вопрос, есть ли ограничение на объем скриптовых файлов, и конкретно sgm_dialogs. Когда я в него добавил несколько скриптов для новых квестов, начались вылеты с ошибкой lua.JIT.1.1.4.dll. Методом проб и ошибок выяснил, что вылеты происходят при попытке поговорить с НПС, у которого есть фраза: Расскажи какую-нибудь историю. Функция
mod_dialog_precond, которая отвечает за эти диалоги, стоит в этом файле одной из первых

Явного ограничения нет (к тому же файл ui_mod_elements.script даже немного больше), в крайнем случае никто не мешает сделать несколько файлов, а не класть все в один. denis2000


Сообщение отредактировал sergej5500 - Вт, 15.05.2012, 21:47
 
Rocket1972Дата: Ср, 16.05.2012, 20:59 | Сообщение # 75
Гражданский
Пользователи
Сообщений: 10
Награды: 0
Репутация: [ 0 ]

Парни, прошу помощи. Тема беды такая:
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
 
Поиск: