LuaCEF - библиотека для Lua, но также имеющая C-API интерфейс (чем собственно и пользуется библиотека-обертка под Lua), позволяющая работать с Chromium Embedded Framework (CEF)
Основная проблема существующей реализации это то, что она не работает с ENB и конфликтует с лаунчерами других проектов, эта же реализация полностью независима от окружения вашей игры, тем самым, избегая эту проблему.
Проект изначально был спонсирован Ethereum Longer специально для Advance RP, но в дальнейшем было принято решение выложить его в общий доступ для всех проектов
Установка: перекинуть все файлы из архива в папку с gta_sa.exe
Credits:
Ethereum Longer (спонсор)
@хуега52 (реализация)
@ARMOR - помощь с адаптация под DL и R5 версии
Основная проблема существующей реализации это то, что она не работает с ENB и конфликтует с лаунчерами других проектов, эта же реализация полностью независима от окружения вашей игры, тем самым, избегая эту проблему.
Lua:
LuaCEF::version() -- возвращает версию библиотеки
LuaCEF::inited() -- проверяет, инициализирована ли библиотека
LuaCEF::isAnyInputActive() -- проверяет, активен ли ввод хотя бы в одном браузере
LuaCEF::create(url, x, y, width, height, cb) -- создает браузер по указанным координатам и размерам
LuaCEF::createFullscreen(url, cb) -- создает полноэкранный браузер
RemoteWebView::close() -- закрывает браузер
RemoteWebView::getTexture() -- возвращает указатель на Direct3D-текстуру браузера
RemoteWebView::isInputActive() -- возвращает состояние ввода
RemoteWebView::setInput(enable) -- устанавливает состояние ввода браузера
RemoteWebView::isFocused() -- возвращает состояние фокуса браузера
RemoteWebView::setFocused(enable) -- устанавливает состояние фокуса браузера
RemoteWebView::isEnabledFocusMode() -- возвращает состояние режима фокусировки
RemoteWebView::setEnabledFocusMode(enable) -- включает или отключает режим фокусировки
RemoteWebView::isRenderEnabled() -- возвращает состояние рендеринга браузера
RemoteWebView::setRenderEnabled(enable) -- включает или отключает рендеринг браузера
RemoteWebView::isOffscreenRenderingEnabled() -- возвращает состояние offscreen-рендеринга
RemoteWebView::setOffscreenRenderingEnabled(enable) -- включает или отключает offscreen-рендеринг
RemoteWebView::getURL() -- возвращает текущий URL страницы
RemoteWebView::loadURL(url) -- загружает указанный URL
RemoteWebView::reloadPage(ignoreCache) -- перезагружает страницу
RemoteWebView::goBack() -- переходит на предыдущую страницу
RemoteWebView::goForward() -- переходит на следующую страницу
RemoteWebView::executeJS(code) -- выполняет указанный JavaScript-код
RemoteWebView::addBindFunction(name, cb) -- регистрирует функцию для вызова из JavaScript
RemoteWebView::addOnAfterCreateCallback(cb) -- добавляет callback, вызываемый после создания браузера
RemoteWebView::addOnLoadingCallback(cb) -- добавляет callback, вызываемый после завершения загрузки страницы
RemoteWebView::addOnCloseCallback(cb) -- добавляет callback, вызываемый при закрытии браузера
RemoteWebView::setFPS(fps) -- устанавливает частоту обновления браузера
RemoteWebView::clearCallbacks() -- удаляет все зарегистрированные callback'и
Lua:
---@diagnostic disable: undefined-global
local luacef = require("luacef")
local imgui = require("mimgui")
local vkeys = require("vkeys")
local windowsMessage = require("windows.message")
local webView = nil
local webView2 = nil
function main()
while not isSampAvailable() do
wait(100)
end
while not luacef.inited() do
wait(100)
end
sampAddChatMessage("LuaCEF version: " .. luacef.VERSION, 0xFFFF00)
local pathUrl = "file:///" .. getWorkingDirectory() .. "\\resource\\testcef\\index.html"
webView = luacef.create(
pathUrl, 500, 500, 500, 500, function(_)
sampAddChatMessage("[1] WebView created!", 0x00FF00)
end)
webView:setEnabledFocusMode(false)
webView:setOffscreenRenderingEnabled(true)
webView:addBindFunction("test", function(_, args)
for k, v in pairs(args) do
print(k, v)
end
end)
webView:addBindFunction("inputChanged", function(_, args)
sampAddChatMessage("Input: " .. args[1], -1)
end)
webView:addOnLoadingCallback(function(_, httpStatusCode)
sampAddChatMessage("[1] Loading status: " .. httpStatusCode, 0x00FF00)
if httpStatusCode == 200 then
webView:setFPS(120)
webView:setInput(true)
webView:executeJS([[document.getElementById("title").style.color = "red";]])
end
end)
webView:addOnCloseCallback(function(_)
sampAddChatMessage("WebView closed!", 0x00FF00)
notifications:remove(webView)
end)
--
webView2 = luacef.create(
"https://music.wntn.ru", 0, 0, 500, 500, function(_)
sampAddChatMessage("[2] WebView created!", 0x00FF00)
end)
webView2:addOnLoadingCallback(function(_, httpStatusCode)
sampAddChatMessage("[2] Loading status: " .. httpStatusCode, 0x00FF00)
if httpStatusCode == 200 then
webView2:setFPS(120)
webView2:setInput(true)
end
end)
wait(-1)
end
imgui.OnFrame(
function() return true end,
function(player)
if webView ~= nil then
local size = imgui.ImVec2(500, 500)
local start = imgui.ImVec2(500, 500)
local texture = webView:getTexture()
imgui.GetBackgroundDrawList():AddImage(texture, start,
start + size)
end
end
).HideCursor = true
addEventHandler("onWindowMessage", function(msg, wparam, lparam)
if msg == windowsMessage.WM_KEYDOWN or msg == windowsMessage.WM_KEYUP then
if wparam == vkeys.VK_F9 then
if webView2 then
consumeWindowMessage(true, false)
if msg == windowsMessage.WM_KEYUP then
if webView2:isRenderEnabled() then
webView2:setRenderEnabled(false)
webView2:setInput(false)
else
webView2:setRenderEnabled(true)
webView2:setInput(true)
end
end
end
end
end
end)
HTML:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>LuaCEF Test</title>
</head>
<body>
<script>
function test() {
lua.call(
"test",
"abc",
123,
true,
null,
undefined,
{ a: 1, b: 2 }
);
}
function sendInput() {
const text =
document.getElementById("input").value;
lua.call(
"inputChanged",
text
);
}
function changeTitleColor(color) {
document.getElementById("title").style.color = color;
}
</script>
<h1 id="title">Hello World!</h1>
<button onclick="test()">
Test
</button>
<br><br>
<input id="input" type="text" placeholder="Type something..." style="width: 300px;">
<button onclick="sendInput()">
Send Input
</button>
<br><br>
<button onclick="changeTitleColor('red')">
Red
</button>
<button onclick="changeTitleColor('green')">
Green
</button>
<button onclick="changeTitleColor('blue')">
Blue
</button>
</body>
</html>
Проект изначально был спонсирован Ethereum Longer специально для Advance RP, но в дальнейшем было принято решение выложить его в общий доступ для всех проектов
Установка: перекинуть все файлы из архива в папку с gta_sa.exe
Credits:
Ethereum Longer (спонсор)
@хуега52 (реализация)
@ARMOR - помощь с адаптация под DL и R5 версии
Последнее редактирование:
