SA
MoonLoader
Development
MoonLoader
Development
НОВЫЙ ГАЙД: Информация - Гайд - Всё о Lua скриптинге для MoonLoader(https://blast.hk/threads/22707/)
Информация в этом неполная и устаревшая!
Чем же так хорош MoonLoader для разработчика? Чем Lua лучше SCM (CLEO)?
Ну, во-первых, всем. Нет ничего, чем SCM может похвастаться перед Lua. Серьёзно, смотрите:
Да. MoonLoader - это не только загрузчик Lua-скриптов, это ещё и библиотека с огромным набором функций для моддинга. MoonLoader не нужно никак настраивать, для того чтобы начать разработку под него. Нет необходимости в компиляции и скрипты очень просто загружать, выгружать, перезагружать, что значительно ускоряет разработку. Тем, кто не знаком с программированием или языками Delphi\C\C++ (и проч.), начать разрабатывать модификации на Lua будет гораздо проще. При этом простота разработки не означает, что Lua-скрипты не могут быть масштабными модификациями - MoonLoader включает в себя всю необходимую функциональность. Олдскульным разработчикам он тоже окажется полезным, ведь быстро написать простой скрипт на Lua куда проще, чем создавать для этого отдельный плагин.
MoonLoader использует технику эмуляции существующих опкодов, чтобы вобрать в себя все возможности CLEO. Конечно, в MoonLoader есть и свои функции, и ещё добавится много своих функций, но пока-что основную часть составляют именно опкоды, и в связи с этим документацию для большинства функций писать не придётся - она уже существует. Однако, некоторые опкоды либо не нужны, либо не подходят в чистом виде для Lua, документация по ним и остальным функциям находится на Wiki.
Ну, во-первых, всем. Нет ничего, чем SCM может похвастаться перед Lua. Серьёзно, смотрите:
- Никаких лимитов: строки, массивы, количество переменных - всё это может быть любого размера и количества.
- Не нужно вручную контролировать распределение памяти.
- Нет необходимости компилировать: это даёт возможность редактировать Lua-скрипты в любом текстовом редакторе без нужды в настройке. "Нет необходимости" - это не означает, что компилировать нельзя вовсе.
- Скорость работы: MoonLoader использует реализацию Lua 'LuaJIT', который стал популярен именно благодаря своей скорости работы, и до сих пор находится в топе лидирующих по скорости языков (пруф: Programming Languages Benchmarks (https://attractivechaos.github.io/plb/))
- Доступность к изучению: несмотря на то, что Lua прост и любой сможет выучить его за короткое время, в сети полным полно примеров, уроков, статей, учебников и разных сервисов для обучения.
- Доступность решений: на любую универсальную задачу гарантированно найдутся уже готовые решения на Lua, а разнообразие библиотек и модулей поможет в достижении любой цели.
- FFI: в LuaJIT есть FFI, позволяющий почти как в C и C++ обращаться к машинному коду и памяти, что является неотъемлемой составляющей моддинга. Вдобавок к этому для Lua есть ещё библиотека DynASM, дающая возможность использовать ассемблерные инструкции прямо в Lua.
- Стабильность и отладка: если в CLEO-скрипте есть фатальная ошибка, то он просто падает, и чаще всего вместе с ним падает и сама игра, при этом иногда найти причину бывает крайне сложно. В Lua, если в скрипте ошибка, он просто завершится, сообщив об этом и о самой ошибке в лог. Кроме того в Lua есть встроенные средства для отладки скриптов.
- Среда разработки: можно выбрать любую на ваш вкус, пользуйтесь даже обычным блокнотом, если Вам так удобнее.
- Сам язык: Lua давно зарекомендовал себя одним из самых лучших скриптовых языков. Lua действительно простой язык, и в то же время очень мощный ввиду своей гибкости. На Lua пишут целые игры и он даже используется в веб-разработке.
Да. MoonLoader - это не только загрузчик Lua-скриптов, это ещё и библиотека с огромным набором функций для моддинга. MoonLoader не нужно никак настраивать, для того чтобы начать разработку под него. Нет необходимости в компиляции и скрипты очень просто загружать, выгружать, перезагружать, что значительно ускоряет разработку. Тем, кто не знаком с программированием или языками Delphi\C\C++ (и проч.), начать разрабатывать модификации на Lua будет гораздо проще. При этом простота разработки не означает, что Lua-скрипты не могут быть масштабными модификациями - MoonLoader включает в себя всю необходимую функциональность. Олдскульным разработчикам он тоже окажется полезным, ведь быстро написать простой скрипт на Lua куда проще, чем создавать для этого отдельный плагин.
MoonLoader использует технику эмуляции существующих опкодов, чтобы вобрать в себя все возможности CLEO. Конечно, в MoonLoader есть и свои функции, и ещё добавится много своих функций, но пока-что основную часть составляют именно опкоды, и в связи с этим документацию для большинства функций писать не придётся - она уже существует. Однако, некоторые опкоды либо не нужны, либо не подходят в чистом виде для Lua, документация по ним и остальным функциям находится на Wiki.
Списки функций и изменений
- Все функции, включая опкоды - moonloader - functions | BlastHack — DEV_WIKI (https://www.blast.hk/wiki/moonloader:functions)
- Функции, основанные на опкодах, но отличающиеся от оригинала - moonloader - changed_opcodes | BlastHack — DEV_WIKI (https://www.blast.hk/wiki/moonloader:changed_opcodes)
- Удаленные и не добавленные опкоды, имеющие замену - moonloader - removed_opcodes | BlastHack — DEV_WIKI (https://www.blast.hk/wiki/moonloader:removed_opcodes)
- Вырезанные опкоды ненужные в Lua и не имеющие назначения - moonloader - missing_opcodes | BlastHack — DEV_WIKI (https://www.blast.hk/wiki/moonloader:missing_opcodes)
Прежде чем начать говорить непосредственно о разработке, нужно сказать пару слов про стандарт.
Стандарт необходим в любой сфере разработки. Наличие стандарта и следование ему позволяет избежать конфликтов между разными продуктами, а также способствует качеству разработки. MoonLoader тоже старается придерживаться кое-каких стандартов.
Первое - это иерархия директорий.
- 'moonloader' - основная директория MoonLoader. В ней располагаются скрипты, лог-файл 'moonloader.log' и остальные поддиректории, имеющие отношение к Lua-скриптам.
- 'moonloader\lib' - эта директория предназначена для библиотек и модулей.
- 'moonloader\config' - для конфигов любого вида, в т.ч. и конфигов в виде скриптов.
- 'moonloader\resource' - здесь располагаются все ресурсы, используемые скриптами. В настоящий момент из подпапки 'txd' в этой директории загружаются .txd-файлы скриптовой функцией 'loadTextureDictionary'.
- 'moonloader' - инклуд, содержащий константы, относящиеся к MoonLoader
- 'sampfuncs' - константы плагина SAMPFUNCS
- 'bitex' - расширение стандартной библиотеки 'bit'
- 'vector3d' - класс 3D-вектора
- 'matrix3x3' - класс трёхмерной матрицы вращения
- 'game.models' - список идентификаторов основных моделей игры
- 'game.globals' - список идентификаторов глобальных переменных игры
Задаётся внутри скрипта с помощью функций. Использовать вовсе не обязательно, но желательно.
- script_name(string name) - задаёт название скрипта
- script_author(string author) - псевдоним функции 'script_authors', отличается только более подходящим названием для указания одного автора
- script_description(string description) - задаёт описание скрипта
- script_version_number(int version) - задаёт числовую версию скрипта, предназначен преимущественно для системы проверки обновлений
- script_version(string version) - задаёт текстовую версию скрипта
- script_authors(string author, ...) - задаёт список авторов (разработчиков) скрипта
- script_dependencies(string name, ...) - задаёт зависимости скрипта, предназначен для вывода. в будущем получит дополнительную функциональность
- script_moonloader(int version) - задаёт минимальную требуемую версию MoonLoader, выводит сообщение об ошибке, если версия не соответствует (не прекращает работу скрипта)
Hello, World!
Lua:
print("Hello, World!")
В MoonLoader-е глобальная область скрипта не используется для выполнения основной части скрипта. Вместо этого весь основной код скрипта вызывается из функции 'main'. Так что "Hello world" в MoonLoader-е должен выглядеть так:
Lua:
function main()
print("Hello, World!")
end
-- Будет выведено "Hello, World!" и скрипт завершит работу.
Глобальная область скрипта предназначена для определения информации о скриптах, загрузки библиотек и конфигов. Её код выполняется ещё до того, как игра начинает загружаться. Функция 'main', же, выполняется уже после того, как игра загружена и внутри этой функции могут быть использованы задержки с помощью 'wait':
Lua:
-- устанавливаем информацию о скрипте
script_name("Restore health")
script_author("noname_noob")
-- загружаем константы MoonLoader, в этом файле содержатся коды клавиш
require "lib.moonloader"
function main()
while true do -- бесконечный цикл
wait(0) -- в бесконечных циклах задержка необходима, хотя бы нулевая
if isKeyDown(VK_1) and isPlayerPlaying(playerHandle) then -- если клавиша '1' нажата и игрок уже создан
setCharHealth(playerPed, 100) -- устанавливаем себе 100 очков здоровья
while isKeyDown(VK_1) do wait(100) end -- и ждём, пока клавиша не будет отпущена
end
end
end
Задержка 'wait' может быть использована только внутри тела подпрограммы 'main' (естественно и во вложенных вызовах тоже) и в скриптовых потоках, добавленных в версии .021. Говорю об этом заранее, потому что дальше будет о событиях и в них задержку таким методом использовать нельзя.
Грубо говоря, события - это функции, которые выполняются сами, когда происходит какое-то действие. Например, загружается новый скрипт или завершается игра.
Текущая версия MoonLoader уже включает в себя несколько событий.
Этот скрипт использует событие onScriptMessage для перехвата всех скриптовых сообщений и вывода их в чат:
Lua:
-- выполняется когда какой-то скрипт выводит сообщение функцией 'print'
function onScriptMessage(msg, script)
-- желательно проверить, т.к. скрипты могут выводить сообщения и до того, как всё это будет доступно
if isOpcodesAvailable() and isSampfuncsLoaded() and isSampAvailable() then
sampAddChatMessage(script.name .. ": ".. msg, 0xFFFFFF) -- добавляем сообщение в чат SA:MP
end
end
function main()
wait(-1) -- бесконечная задержка
-- если скрипт больше не выполняет никаких действий,
-- но надо чтобы он продолжал работать и обрабатывать события, то
-- в нём можно сделать бесконечную задержку таким способом, чтобы он не завершился сам
end
AutoReboot - использование сторонних библиотек, управление Lua скриптами, работа с файлами
ClickWarp - использование библиотек matrix3x3 и vector3d, использование функции processLineOfSight, рендер текста средствами SAMPFUNCS, рендер текстдравов средствами игры, работа с памятью
Fake Whisper - добавление чат-команд и вывод сообщений в чат средствами SAMPFUNCS
GM Patch - патчинг кода с восстановлением
hBar - рендер текста и примитивов средствами SAMPFUNCS, форматирование строк
MapLimit 260 - патчинг памяти с восстановлением, использование FFI для выделения памяти
nameTag - использование встроенного модуля 'memory' для чтения и записи памяти
Quick Map - работа с памятью
SAMP-VL Autopin - работа с lua-конфигом, обработка входящего RPC
ScriptManager - использование библиотеки bitex, рендер средствами SAMPFUNCS, простой GUI, обработка ввода, ООП, управление Lua скриптами
Set Weather & Time - добавление чат-команд и патчинг кода SAMP
SF Integration - использование событий onSystemMessage и onScriptMessage для обработки сообщений скриптов и MoonLoader-а, добавление команд и вывод в консоль SAMPFUNCS, безопасное динамическое выполнение Lua-кода
Warp To Player - регистрация команд с описанием, вывод в чат, форматирование строк, получение позиции игроков вне зоны стрима
Weapon Menu - рендер текстур и текста средствами игры, загрузка модели
ML-ReloadAll - использование функции reloadScripts
AntiCarJack - перехват и обработка входящей синхронизации транспорта при помощи библиотеки SAMP.Lua, игнорирование входящего RPC с помощью SAMP.Lua, использование функций принудительной отправки синхронизации, создание потока с передачей параметров, вывод цветного текстового сообщения средствами игры, активация/деактивация чит-кодом
Bubble Sniffer - обработка входящего RPC 'ChatBubble' при помощи библиотеки SAMP.Lua, форматирование текста, рендер текста средствами SAMPFUNCS, работа с RGB-цветом
Crosshair Hack - рендер стандартных текстур игры, рендер примитивов средствами игры, активация/деактивация чит-кодом, патчинг кода, использование встроенного модуля 'memory' для работы с памятью
DerpCam - перехват исходящей синхронизации камеры с перезаписью данных при помощи SAMP.Lua, вывод цветного текстового сообщения средствами игры, активация/деактивация чит-кодом
RapidFire - вызов функций игры по адресу при помощи FFI, работа со структурами с помощью FFI, вывод цветного текстового сообщения средствами игры, активация/деактивация чит-кодом
SprintFire - проверка на нажатие игровых клавиш, эмуляция нажатия клавиш игры
TwoDriversHack - использование функций принудительной отправки синхронизации, пример использования findAllRandomCharsInSphere для поиска ближайшего игрока с особыми условиями
Useful Commands - показ SAMP-диалога, регистрация команд чата и обработка их параметров, использование анонимных (лямбда) функций Lua, создание потока с передачей аргументов, загрузка модели
Chat Bliss - перехват и перезапись исходящих сообщений и чат-команд
ClickWarp - использование библиотек matrix3x3 и vector3d, использование функции processLineOfSight, рендер текста средствами SAMPFUNCS, рендер текстдравов средствами игры, работа с памятью
Fake Whisper - добавление чат-команд и вывод сообщений в чат средствами SAMPFUNCS
GM Patch - патчинг кода с восстановлением
hBar - рендер текста и примитивов средствами SAMPFUNCS, форматирование строк
MapLimit 260 - патчинг памяти с восстановлением, использование FFI для выделения памяти
nameTag - использование встроенного модуля 'memory' для чтения и записи памяти
Quick Map - работа с памятью
SAMP-VL Autopin - работа с lua-конфигом, обработка входящего RPC
ScriptManager - использование библиотеки bitex, рендер средствами SAMPFUNCS, простой GUI, обработка ввода, ООП, управление Lua скриптами
Set Weather & Time - добавление чат-команд и патчинг кода SAMP
SF Integration - использование событий onSystemMessage и onScriptMessage для обработки сообщений скриптов и MoonLoader-а, добавление команд и вывод в консоль SAMPFUNCS, безопасное динамическое выполнение Lua-кода
Warp To Player - регистрация команд с описанием, вывод в чат, форматирование строк, получение позиции игроков вне зоны стрима
Weapon Menu - рендер текстур и текста средствами игры, загрузка модели
ML-ReloadAll - использование функции reloadScripts
AntiCarJack - перехват и обработка входящей синхронизации транспорта при помощи библиотеки SAMP.Lua, игнорирование входящего RPC с помощью SAMP.Lua, использование функций принудительной отправки синхронизации, создание потока с передачей параметров, вывод цветного текстового сообщения средствами игры, активация/деактивация чит-кодом
Bubble Sniffer - обработка входящего RPC 'ChatBubble' при помощи библиотеки SAMP.Lua, форматирование текста, рендер текста средствами SAMPFUNCS, работа с RGB-цветом
Crosshair Hack - рендер стандартных текстур игры, рендер примитивов средствами игры, активация/деактивация чит-кодом, патчинг кода, использование встроенного модуля 'memory' для работы с памятью
DerpCam - перехват исходящей синхронизации камеры с перезаписью данных при помощи SAMP.Lua, вывод цветного текстового сообщения средствами игры, активация/деактивация чит-кодом
RapidFire - вызов функций игры по адресу при помощи FFI, работа со структурами с помощью FFI, вывод цветного текстового сообщения средствами игры, активация/деактивация чит-кодом
SprintFire - проверка на нажатие игровых клавиш, эмуляция нажатия клавиш игры
TwoDriversHack - использование функций принудительной отправки синхронизации, пример использования findAllRandomCharsInSphere для поиска ближайшего игрока с особыми условиями
Useful Commands - показ SAMP-диалога, регистрация команд чата и обработка их параметров, использование анонимных (лямбда) функций Lua, создание потока с передачей аргументов, загрузка модели
Chat Bliss - перехват и перезапись исходящих сообщений и чат-команд
Примечание: для корректного отображения русских символов в игре переключите кодировку в своём редакторе на "ANSI" или "Windows-1251".
Компиляция
Как уже было сказано ранее, компиляция вообще не нужна. Но если по какой-то причине вы всё же хотите скомпилировать свой скрипт, сделать это можно с помощью компилятора LuaJIT. MoonLoader загружает и скомпилированные скрипты с расширением '.luac'.
В принципе, этой информации уже достаточно, чтобы начать разрабатывать Lua-скрипты под MoonLoader.
Вдобавок я хотел бы порекомендовать какой-нибудь хороший учебник по языку, но, к сожалению сам изучал его как попало и точно не знаю что лучше предложить. Если есть какие-то предложения - делитесь, закреплю их тут.
"Lua за 15 минут": Learn Lua in Y Minutes (https://learnxinyminutes.com/docs/ru-ru/lua-ru/)
Очень рекомендую установить скрипты "SF Integration", "ML AutoReload", "ML ReloadAll", "ScriptManager" - они сильно помогают в разработке (описание см. в основной теме).
Что будет дальше
MoonLoader продолжит развиваться. С выходом последних обновлений уже были добавлены встроенные библиотеки для работы с памятью, конфигами, потоками, добавлено большое количество встроенных функций, а сейчас в планах добавление обширного апи DirectX, более обширная поддержка одиночной игры и полное избавление от зависимости в SAMPFUNCS и CLEO. Любые ваши предложения тоже приветствуются.
Эта тема создана для обсуждения вопросов, касающихся разработки под MoonLoader, а так же для предложений по изменению/дополнению функциональности, касающейся разработки. Для всего остального - основная тема.
Вся дополнительная информация по MoonLoader располагается на Wiki.
Официальная тема с руководством по началу разработки на GTAForums (Official "getting started guide" in English on GTAForums)
Напоминаю, если вы заинтересованы, рекомендую подписаться на тему, чтобы ничего не пропустить.
Последнее редактирование: