SA:MP CR:MP ASI LuaExecutor - Lua скрипты с API MoonLoader и редактор кода прямо в GTA SA и SA-MP

yorenov

Участник
Автор темы
57
58
Версия SA-MP
  1. 0.3.7 (R1)
  2. 0.3.7-R2
  3. 0.3.7-R3
  4. 0.3.7-R4
  5. 0.3.7-R5
  6. 0.3DL
  7. Любая
LuaExecutor by yorenov
Lua-скрипты с API в стиле MoonLoader и среда разработки прямо в GTA San Andreas и SA-MP

GitHub • Скачать релиз 0.2.0 • Руководство • Справочник API • Примеры

editor.png

Что это такое

LuaExecutor — ASI-плагин, который запускает Lua-скрипты в GTA San Andreas и SA-MP и приносит с собой целую среду разработки прямо в игру. Жмёшь F12 — поверх игры открывается окно с редактором кода, списком скриптов, справочником API и консолью. Написал, запустил, увидел ошибку, поправил — и всё это не сворачивая игру.

Скрипты пишутся так же, как под MoonLoader: main, wait, lua_thread, script_name, те же события и имена функций. LuaJIT 2.1.0-beta3 (LUA52COMPAT) встроен в сам LuaExecutor.asi, поэтому рядом с игрой не нужны ни lua51.dll, ни MoonLoader, ни SAMPFUNCS, ни CLEO, ни BASS.

Зачем я это сделал. Обычно Lua-скрипт пишется вслепую: блокнот, перезапуск, поиск ошибки в логе, снова перезапуск. Хотелось, чтобы подсказки, проверка ошибок, справка по функциям и запуск были прямо в игре — нажал F5 и сразу видишь результат.

Как выглядит работа

  1. F12 → Редактор → Создать.
  2. Пишешь код: подсказки по функциям всплывают сами, над вызовом видно, какой аргумент ты сейчас вводишь.
  3. Ошибки подсвечиваются до запуска: пропущенный end, незакрытая строка, опечатка в имени функции (sampAddChatMesage → редактор подскажет sampAddChatMessage), неверное число аргументов.
  4. F5 — файл сохраняется и сразу запускается. Поправил — F5 ещё раз, скрипт перезапускается без перезахода в игру. Shift+F5 — остановить.

Lua:
script_name("HelloCommand")
script_author("yorenov")

function main()
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand("hello", function(argument)
        local name = argument ~= "" and argument or "player"
        sampAddChatMessage("Hello, " .. name:gsub("%%", "%%%%") .. "!", 0x33CCFF)
    end)
    wait(-1)
end

Lua:
script_name("ChatFilter")
script_author("yorenov")

local RPC_CLIENT_MESSAGE = 93
local blocked = { "[AD]", "www.", "http" }
local hidden = 0

function onReceiveRpc(id, stream)
    if id ~= RPC_CLIENT_MESSAGE then return end
    raknetBitStreamReadInt32(stream)
    local length = raknetBitStreamReadInt32(stream)
    local text = raknetBitStreamReadString(stream, length)
    raknetBitStreamResetReadPointer(stream)
    for _, word in ipairs(blocked) do
        if text:find(word, 1, true) then
            hidden = hidden + 1
            print(string.format("hidden #%d: %s", hidden, text))
            return false
        end
    end
end

function main()
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand("filter", function()
        sampAddChatMessage(string.format("ChatFilter: %d messages hidden", hidden), 0xFFD27A)
    end)
    wait(-1)
end
samp_filter.png

Lua:
script_name("RenderOverlay")
script_author("yorenov")

local font = nil
local visible = true

local function chatActive()
    return isSampAvailable() and (sampIsChatInputActive() or sampIsDialogActive())
end

function main()
    font = renderCreateFont("Arial", 11, 5)
    while true do
        wait(0)
        if isKeyJustPressed(0x78) and not chatActive() then
            visible = not visible
        end
        if visible and doesCharExist(PLAYER_PED) then
            local x, y, z = getCharCoordinates(PLAYER_PED)
            local screenX, screenY = getScreenResolution()
            local text = string.format("{FFD27A}LuaExecutor{FFFFFF}   X %.1f   Y %.1f   Z %.1f", x, y, z)
            local width = renderGetFontDrawTextLength(font, text)
            renderDrawBox(screenX - width - 40, screenY - 64, width + 24, 28, 0x96000000)
            renderFontDrawText(font, text, screenX - width - 28, screenY - 59, 0xFFFFFFFF)
        end
    end
end

function onScriptTerminate(script, quitGame)
    if script == thisScript() and font then
        renderReleaseFont(font)
        font = nil
    end
end

Lua:
local inicfg = require("inicfg")

local config = inicfg.load({ main = { enabled = true, interval = 60 } }, "config_demo")

function main()
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand("cfg", function(argument)
        if argument == "toggle" then config.main.enabled = not config.main.enabled end
        if inicfg.save(config, "config_demo") then
            sampAddChatMessage("ConfigDemo: enabled=" .. tostring(config.main.enabled), 0xA0FFA0)
        end
    end)
    wait(-1)
end
inicfg встроен, отдельный файл библиотеки не нужен. Полная версия с JSON — в examples/04_config_inicfg.lua.

Что умеет

  • Меню по F12 (клавиша меняется, можно с Ctrl/Shift/Alt): Редактор, Скрипты, API, Консоль, Настройки. Пока меню открыто, клавиатура и мышь не уходят в игру. Размер шрифта и масштаб — под любой монитор.
  • Редактор: подсветка Lua, вкладки, поиск и замена, переход к строке, подсказки (Ctrl+Space и сами после двух символов), подсказка аргумента, переход к определению (Ctrl+B), справка по F1, подсказки модулей в require из папки lib, парные скобки.
  • Проверка кода на лету: синтаксические ошибки LuaJIT с объяснением на русском, возможные опечатки в именах функций, неверное число аргументов. F8 — к следующей проблеме.
  • Безопасное сохранение: атомарная запись и копия .bak рядом. Кодировка UTF-8 или CP1251 определяется сама.
  • Скрипты: состояние каждого (выполняется, ошибка, завершён), запуск, перезапуск, остановка, открытие в редакторе. Автозагрузка: выключена, только выбранные или все.
  • Справочник API в игре — 2233 записи: функции MoonLoader и SAMPFUNCS, события, 1400+ опкодов игры, стандартная библиотека LuaJIT. У каждой записи — сигнатура, параметры, результаты, ограничения, пример и статус проверки. Пример можно вставить прямо в открытый файл.
  • Консоль: print, ошибки с файлом и строкой, системные сообщения, фильтр по тексту и уровням, копирование, консольные команды скриптов (sampfuncsRegisterConsoleCommand).
  • API в стиле MoonLoader v.026: директивы script_*, main, wait, lua_thread, import, события, inicfg, memory, ffi, bit, jit, JSON.
  • SA-MP 0.3.7 R1, R2, R3-1, R4, R4-2, R5: чат, команды, диалоги, игроки, транспорт, текстдравы; onReceiveRpc, onSendRpc, события пакетов — читать, менять, блокировать. Клиент с другим именем DLL (например, azmp.dll) указывается в настройках.
  • Функции SAMPFUNCS (консольные команды, глобальные переменные, SCM-потоки) реализованы в самом LuaExecutor — SAMPFUNCS.asi не нужен.
  • Встроенный CLEO 4.4.4: если скрипт запускает CLEO-скрипт, а CLEO.asi нет, включается встроенный.
  • Рендер, спрайты, DXUT-диалоги, звук MP3/WAV/FLAC/OGG (miniaudio, без BASS).
  • Псевдоним lua51.dll: бинарные модули из lib, которые импортируют lua51.dll, получают встроенный LuaJIT.
  • Загрузочный экран с заставкой LuaExecutor.

problems.png


api.png


scripts.png


showcase.png

Сравнение с MoonLoader

Сразу скажу: это не замена MoonLoader для всех. MoonLoader — эталон API и огромная база скриптов и библиотек. LuaExecutor — про то, чтобы писать и отлаживать скрипты прямо в игре.

LuaExecutorMoonLoader
Что эторантайм Lua-скриптов и среда разработки в одном ASIрантайм Lua-скриптов, эталон API
Редактор в игреесть: подсказки, проверка ошибок, запуск по F5нет, код пишется во внешнем редакторе
Справочник APIвстроен в игру, 2233 записи с примерамивики BlastHack
Функции SAMPFUNCSреализованы в самом ASIнужен SAMPFUNCS
Файлы рядом с игройодин LuaExecutor.asiMoonLoader.asi, lua51.dll и библиотеки
LuaJIT2.1.0-beta3, LUA52COMPATта же ветка
СовместимостьAPI в стиле v.026, у каждой функции указан статус проверкиэталон
Библиотеки сообщества (mimgui, SAMP.Lua и т. д.)отдельно не проверялисьработают, это их родная среда
Исходникизакрытызакрыты
Сообществоновый проектогромное

Когда брать LuaExecutor: пишешь свои скрипты и хочешь видеть ошибки и результат сразу, без перезапусков и поиска по логам; нужен один ASI без MoonLoader и SAMPFUNCS.
Когда брать MoonLoader: нужны готовые большие скрипты и библиотеки сообщества, проверенные годами.

Если рядом стоит MoonLoader с той же папкой moonloader, автозагрузка LuaExecutor пропускается, чтобы скрипты не запустились дважды.

Плюсы
  • Среда разработки прямо в игре: редактор, подсказки, проверка ошибок, справочник, консоль.
  • F5 — сохранить и запустить, перезапуск без перезахода в игру.
  • Один ASI: LuaJIT, функции SAMPFUNCS, CLEO 4, звук и рендер уже внутри.
  • Знакомый API MoonLoader — скрипты пишутся так же.
  • SA-MP 0.3.7 R1–R5, свой клиент по имени DLL.
  • Справочник на 2233 записи с примерами — и в игре, и на GitHub.
  • Руководство на русском и 7 примеров.

Минусы (честно)
  • Закрытый исходный код. Баги чинятся только новыми версиями.
  • Версия 0.2.0. У большинства опкодов в справочнике статус «зарегистрировано, совместимость не подтверждена» — они привязаны через таблицу опкодов без отдельной проверки каждого.
  • Библиотеки сообщества (mimgui, SAMP.Lua и другие) отдельно не проверялись.
  • Только GTA SA 1.0 US, x86.
  • Строки для SA-MP и рендера — в CP1251 без автоматического перевода из UTF-8 (как и в MoonLoader). Как выводить русский текст из UTF-8, показано в examples/07_russian_text.lua.
  • Проект молодой: готовых скриптов именно под LuaExecutor пока мало.

Как установить
  1. Скачай LuaExecutor-0.2.0.zip со страницы релиза.
  2. Положи LuaExecutor.asi в папку игры рядом с gta_sa.exe (нужен любой ASI Loader).
  3. Запусти игру и нажми F12.
Скрипты лежат в папке moonloader, настройки и журнал — в папке LuaExecutor рядом с игрой. Автозагрузка по умолчанию выключена: включи её в настройках или запускай скрипты из вкладки «Скрипты».

Примеры
  • 01_hello_command.lua — команда чата и сообщение (/hello)
  • 02_render_overlay.lua — панель с координатами поверх игры (F9)
  • 03_threads.lua — фоновый поток и поток, который перезапускается (F10)
  • 04_config_inicfg.lua — INI через inicfg и JSON (/cfg)
  • 05_chat_filter.lua — перехват и блокировка входящего RPC (/filter)
  • 06_console_and_dialog.lua — консольная команда и диалог SA-MP (lx_info, /lxmenu)
  • 07_russian_text.lua — кириллица из UTF-8 в CP1251 для чата и рендера (/privet)
Все примеры компилируются встроенным LuaJIT и загружаются в игре без ошибок. Лежат в архиве релиза и в examples.

Требования
GTA San Andreas 1.0 US (в том числе HOODLUM), любой ASI Loader. Для SA-MP — клиент 0.3.7 R1, R2, R3-1, R4, R4-2 или R5.

Ссылки

Баги, предложения и вопросы — пишите в теме или в Issues на GitHub. Если напишете свой скрипт прямо в редакторе LuaExecutor — кидайте сюда, интересно посмотреть.