- 57
- 58
- Версия SA-MP
-
- 0.3.7 (R1)
- 0.3.7-R2
- 0.3.7-R3
- 0.3.7-R4
- 0.3.7-R5
- 0.3DL
- Любая
LuaExecutor by yorenov
Lua-скрипты с API в стиле MoonLoader и среда разработки прямо в GTA San Andreas и SA-MP
GitHub • Скачать релиз 0.2.0 • Руководство • Справочник API • Примеры
Lua-скрипты с API в стиле MoonLoader и среда разработки прямо в GTA San Andreas и SA-MP
GitHub • Скачать релиз 0.2.0 • Руководство • Справочник API • Примеры
Что это такое
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 и сразу видишь результат.
Как выглядит работа
- F12 → Редактор → Создать.
- Пишешь код: подсказки по функциям всплывают сами, над вызовом видно, какой аргумент ты сейчас вводишь.
- Ошибки подсвечиваются до запуска: пропущенный
end, незакрытая строка, опечатка в имени функции (sampAddChatMesage→ редактор подскажетsampAddChatMessage), неверное число аргументов. - 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
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.
Сравнение с MoonLoader
Сразу скажу: это не замена MoonLoader для всех. MoonLoader — эталон API и огромная база скриптов и библиотек. LuaExecutor — про то, чтобы писать и отлаживать скрипты прямо в игре.
| LuaExecutor | MoonLoader | |
|---|---|---|
| Что это | рантайм Lua-скриптов и среда разработки в одном ASI | рантайм Lua-скриптов, эталон API |
| Редактор в игре | есть: подсказки, проверка ошибок, запуск по F5 | нет, код пишется во внешнем редакторе |
| Справочник API | встроен в игру, 2233 записи с примерами | вики BlastHack |
| Функции SAMPFUNCS | реализованы в самом ASI | нужен SAMPFUNCS |
| Файлы рядом с игрой | один LuaExecutor.asi | MoonLoader.asi, lua51.dll и библиотеки |
| LuaJIT | 2.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 пока мало.
Как установить
- Скачай
LuaExecutor-0.2.0.zipсо страницы релиза. - Положи
LuaExecutor.asiв папку игры рядом сgta_sa.exe(нужен любой ASI Loader). - Запусти игру и нажми 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)
Требования
GTA San Andreas 1.0 US (в том числе HOODLUM), любой ASI Loader. Для SA-MP — клиент 0.3.7 R1, R2, R3-1, R4, R4-2 или R5.
Ссылки
- Репозиторий: https://github.com/pnwjdw/LUA-Executor
- Релиз: https://github.com/pnwjdw/LUA-Executor/releases/latest
- Руководство: docs/guide.md
- Справочник API: docs/api
- YouTube:
Баги, предложения и вопросы — пишите в теме или в Issues на GitHub. Если напишете свой скрипт прямо в редакторе LuaExecutor — кидайте сюда, интересно посмотреть.