Случайная подборка модов
Тёмное Братство – Проклятые Зоной
3.1
Золотой Обоз 2
3.0
Опасный Вирус
2.4
Ф.О.Т.О.Г.Р.А.Ф
4.2
Долг. Философия Войны
4.0
Время Перемен 2.5
4.0
Последние обновленные темы Прямой эфир Самые популярные темы Последние новости
  • Страница 1 из 1
  • 1
Модератор форума: FanG, Аdmin, FantomICW, Overfirst  
Форум » S.T.A.L.K.E.R. Модификации » Помощь в моддинге » Скрипты, конфиги, логика, движок » Способ редактирования скрипта без выхода из игры (Способ редактирования скрипта без выхода из игры.)
Способ редактирования скрипта без выхода из игры
Украина  BozKurt
Пятница, 25.07.2014, 17:24 | Сообщение # 1
Статус:
Опытный:
Сообщений: 1753
Награды: 3
Регистрация: 25.05.2012

Способ редактирования скрипта без выхода из игры.


Это небольшой пересказ одного очень полезного, но по какой-то причине мало известного, урока.
Ориентирован в большей степени на тех мододелов, которые умеют ковыряться в скриптах игры и могут сказать чем отличается функция от метода.


Не для кого не секрет каким образом зачастую отлаживаются скрипты на ошибки, алгоритм до безобразия прост:
1. Пишем скрипт.
2. Запускаем игру.
3. Получаем вылет.
4. Смотрим в лог и правим скрипт.
5. Повторяем п. 2 - 4 до тех пор, пока вылеты не прекратятся.
Ко всему, скрипт зачастую вызывается не на прямую, а через какое-то игровое действие - через диалог, поднятие/использование предмета и т.д.
Как по мне - это чистой воды мазохизм. "Но что делать?" - скажите Вы, - "Если так устроена игра." Решать проблему, а точнее две!
Первая проблема - это "бесконечные" вылеты.
Вторая проблема - определённое действие для вызова скрипта, дабы проверить работоспособность.



Первая проблема решается при помощи двух стандартных функций самого Lua, а именно dofile и pcall.

Совместив эти две функции можно получить крайне полезную конструкцию, которая позволит выявлять ошибки не приводя к вылетам игры, и легко выводить описание ошибки непосредственно в лог.
Для этого заведём для себя функцию, где pcall будет вызвать функцию dofile, которая в свою очередь будет выполнять нужный нам файл со скриптом. Выглядеть эта функция будет так:
Код
function ProtectedFunction()
      local status, result = pcall(dofile, [[..\gamedata\scripts\__test.script]])
      get_console():execute(status and "Successful!" or string.gsub(result, " ", "_"))
end
Всё очень просто. Вызываем pcall, в качестве параметра передаём функцию dofile и аргумент для неё - путь до нашего файла __test.scrip, который нужно предварительно создать в папке scripts.
Опытным путём было установлено, что в ТЧ корневым каталогом Lua считает папку bin, поэтому путь пишем относительно неё. В ЧН и ЗП - это корневая папка установленной игры, поэтому путь для этих частей будет таким: "[[gamedata\scripts\__test.script]]"
Вторая строка выводит в консоль сообщение "Successful!" если скрипт в файле _test.script выполнился без ошибок или же сообщение ошибки выполнения, если произошла ошибка. Сообщение выводится со знаком подчёркивания вместо пробела. Это необходимая мера для метода execute.
Результат выводить в консоль не имеет смысла, т.к. результат нам покажет сама игра.
Теперь если вызвать функцию ProtectedFunction, то выполнится код написанный в файле __test.script. При этом, сам код в этом файле можно менять не выходя из игры, а просто свернув её.
Поэтому, получив ошибку внутри вызываемого файла - в консоле появится сообщение с описанием данной ошибки. Далее: сворачиваете игру; правите ошибку; восстанавливаете игру; запускаете вызов функции ProtectedFunction по новой; смотрите на результаты работы исправленного скрипта.

Хочу ещё раз обратить Ваше внимание на то, что в файле __test.script должен присутствовать именно блок операторов!

Важно понимать, что pcall перехватывает ошибки только той функции, которую вызывает, то беж в нашем случае dofile, а это, в свою очередь, вызов нашего файла __test.script. Поэтому, если в этом файле будет вызов функции из другого файла и ошибка произойдёт уже в нём (в другом файле), то игра вылетит с логом ошибки другого файла. Тоже самое касается работы движковых функций; если Вы передаёте неверный аргумент, не правильно вызываете какую-нибудь функцию экспортированную в скрипты из движка, то игра вылетит.
В большинстве случаев, допускаются именно ошибки выполнения скрипта, поэтому данная конструкция позволяет избежать большого количества перезапуска игры, что сохранит и время, и нервы.


Что касается второй проблемы, то самым удачным вариантом её решения будет простое нажатие клавиши на клавиатуре, т.е. собственная горячая клавиша.
В качестве наилучшего исключительно скриптового метода горячих клавиш я предлагаю использовать способ предоставленный здесь: ссылка на статью, конкретно интересует действие на нажатие (первый способ).
[j]
Перед запуском игры, Вам нужно определится какую из не задействованных клавиш Вы будете использовать как "горячую".
Список клавиш в Сталкере, которые можно задействовать под это дело, можно посмотреть здесь: DIK_keys. Это перечисление констант класса DIK_keys, имена которых используются в качестве имени функций для горячих клавиш.
Я выберу клавишу Scroll Lock, чтобы хоть как-то оправдать её присутствие на клавиатуре. Код этой клавиши - dik_scroll, именно так и должна называться функция, которую будет вызывать выбранная мной клавиша.
Имена функций, которые непосредственно будет вызывать Ваши горячие клавиши, должны быть написаны строчными литерами (маленькими буквами).
Теперь, всё что остаётся сделать, это написать функцию с именем dik_scroll в файле, в котором находится функция update горячих клавиш. Выглядеть она будет так:
Код
function dik_scroll()
      local status, result = pcall(dofile, [[..\gamedata\scripts\__test.script]])
      get_console():execute(status and "Successful!" or string.gsub(result, " ", "_"))
end

Как видите, в тело функции я написал содержимое нашей "защищённой функции", а не вызывал отдельно её - зачем лишний раз без необходимости плодить код?


Всё, друзья мои!
Теперь, зайдя в игру и загрузив сохранение (или начав её заново), Вы можете полюбопытствовать работой нашей конструкции. Нажимаете Scroll Lock (или другую выбранную Вами клавишу) и видите запуск содержимого в файле __test.script. Если в файле не было ошибок, то в консоле вы увидите надпись "Successful!" или же сообщение об ошибке. Попытайтесь не выходя из игры, свернуть её при помощи комбинации Alt+Tab, изменить содержимое файла, а затем в восстановленной игре опять нажать горячую клавишу - как Вы сами убедитесь, результат будет основываться на изменённых данных.

Готовую мини-gamedat'у, можно скачать здесь: Яндекс.Диск
Всё, что Вам потребуется сделать - поместить два скрипта в вашу рабочую папку scripts и прописать в апдейте актора следующую строку:
Код
bind_keys.update()
Зайти в игру и нажать на клавишу Scroll Lock.
Сообщение отредактировал BozKurt - Пятница, 25.07.2014, 18:01
  Злобная реклама
Пятница, 25.07.2014, 17:24
Статус:
Сообщений: 666
Регистрация: 25.05.2012
Украина  PHombie
Понедельник, 25.04.2016, 22:18 | Сообщение # 2
Статус:
Зевака:
Сообщений: 19
Награды: 0
Регистрация: 24.04.2016

Спасибо большое, пригодится!
  Злобная реклама
Понедельник, 25.04.2016, 22:18
Статус:
Сообщений: 666
Регистрация: 24.04.2016
Российская Федерация  Groghan
Вторник, 26.04.2016, 14:06 | Сообщение # 3
Статус:
Отмычка:
Сообщений: 84
Награды: 0
Регистрация: 04.03.2016

Нормалёк cool
  Злобная реклама
Вторник, 26.04.2016, 14:06
Статус:
Сообщений: 666
Регистрация: 04.03.2016
Форум » S.T.A.L.K.E.R. Модификации » Помощь в моддинге » Скрипты, конфиги, логика, движок » Способ редактирования скрипта без выхода из игры (Способ редактирования скрипта без выхода из игры.)
  • Страница 1 из 1
  • 1
Поиск: