Эксклюзив Софт LuaCEF - приватный CEF-биндинг под Lua

LuaCEF - библиотека для Lua, но также имеющая C-API интерфейс (чем собственно и пользуется библиотека-обертка под Lua), позволяющая работать с Chromium Embedded Framework (CEF)



Основная проблема существующей реализации это то, что она не работает с 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

1784158813650.png






Credits:
Ethereum Longer (спонсор)
@хуега52 (реализация)
@ARMOR - помощь с адаптация под DL и R5 версии​
 
Последнее редактирование:

sibuxiang

Участник
57
16
LuaCEF - библиотека для Lua, но также имеющая C-API интерфейс (чем собственно и занимается библиотека-обертка под Lua), позволяющая работать с Chromium Embedded Framework (CEF)



Основная проблема существующей реализации это то, что она не работает с 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

Посмотреть вложение 296833





Credits:
Ethereum Longer (спонсор)
@хуега52 (реализация)
@ARMOR - помощь с адаптация под DL и R5 версии
Браво босс
 
  • Влюблен
Реакции: вайега52

Орк

Известный
548
524
Upd: а это разве проблема? 🙃
Пока не знаю
1784184698533.png

а с твоим сколько будет дополнительно кушать?

Код:
[ML] (error) testluacef.lua: ...ona Games Launcher\bin\arizona\moonloader\lib\luacef.lua:60: plugin not found
stack traceback:
    [C]: in function 'error'
    ...ona Games Launcher\bin\arizona\moonloader\lib\luacef.lua:60: in main chunk
    [C]: in function 'require'
    ...ona Games Launcher\bin\arizona\moonloader\testluacef.lua:3: in main chunk

Да и не работает на аризоне. перекинуть все файлы из [URL='https://mega.nz/file/ahR0wayD#15zgVmKpHORPEmxi22Y6_uEuuuTyYwH5MA194QvOc3E']архива [/URL]в папку с gta_sa.exe непрокатило что-то
 

MSIshka

Участник
108
19
Скрипт из примера застревает на цикле

Lua:
while not luacef.inited() do
    wait(100)
    print(luacef.inited())
end



moonloader.log:
[10:51:12.560023] (system)    Loading script 'D:\Games\FT\GTA San Andreas\moonloader\AutoReboot.lua'...
[10:51:12.560023] (debug)    New script: 1D6C887C
[10:51:12.561053] (system)    ML-AutoReboot: Loaded successfully.
[10:51:12.561053] (system)    Loading script 'D:\Games\FT\GTA San Andreas\moonloader\check-moonloader-updates.lua'...
[10:51:12.561053] (debug)    New script: 1D6C761C
[10:51:12.562052] (system)    Check MoonLoader Updates: Loaded successfully.
[10:51:12.562052] (system)    Loading script 'D:\Games\FT\GTA San Andreas\moonloader\n0ps.lua'...
[10:51:12.562052] (debug)    New script: 1D6C8A04
[10:51:12.565051] (system)    N0ps: Loaded successfully.
[10:51:12.565051] (system)    Loading script 'D:\Games\FT\GTA San Andreas\moonloader\reload_all.lua'...
[10:51:12.565051] (debug)    New script: 1D6C8D14
[10:51:12.566445] (system)    ML-ReloadAll: Loaded successfully.
[10:51:12.566445] (system)    Loading script 'D:\Games\FT\GTA San Andreas\moonloader\SF Integration.lua'...
[10:51:12.566445] (debug)    New script: 1D6C7F4C
[10:51:12.567473] (system)    SF Integration: Loaded successfully.
[10:51:12.567473] (system)    Loading script 'D:\Games\FT\GTA San Andreas\moonloader\testluacef.lua'...
[10:51:12.567473] (debug)    New script: 1D6C8E9C
[10:51:12.575004] (system)    testluacef.lua: Loaded successfully.
[10:51:12.575004] (system)    Loading script 'D:\Games\FT\GTA San Andreas\moonloader\UltraFuck.luac'...
[10:51:12.575004] (debug)    New script: 09B06324
[10:51:12.583666] (system)    UltraFuck: Loaded successfully.
[10:52:13.231417] (script)    ML-AutoReboot: Reloading "testluacef.lua"...
[10:52:13.238932] (system)    testluacef.lua: Script terminated. (1D6C8E9C)
[10:52:13.239932] (system)    Loading script 'D:\Games\FT\GTA San Andreas\moonloader\testluacef.lua'...
[10:52:13.239932] (debug)    New script: 1D816CAC
[10:52:13.247147] (system)    testluacef.lua: Loaded successfully.
[10:52:31.632979] (script)    ML-AutoReboot: Reloading "testluacef.lua"...
[10:52:31.638493] (system)    testluacef.lua: Script terminated. (1D816CAC)
[10:52:31.639522] (system)    Loading script 'D:\Games\FT\GTA San Andreas\moonloader\testluacef.lua'...
[10:52:31.639522] (debug)    New script: 1D6C8E9C
[10:52:31.648029] (system)    testluacef.lua: Loaded successfully.
[10:52:31.738547] (script)    testluacef.lua: false
[10:52:31.838959] (script)    testluacef.lua: false
[10:52:31.938927] (script)    testluacef.lua: false

UPD: Пофиксил удалив папку cef от webcore
 
Последнее редактирование:
  • Нравится
Реакции: вайега52

вайега52

Налуашил состояние
Автор темы
Модератор
3,025
3,206
Пока не знаю
Посмотреть вложение 296836
а с твоим сколько будет дополнительно кушать?

Код:
[ML] (error) testluacef.lua: ...ona Games Launcher\bin\arizona\moonloader\lib\luacef.lua:60: plugin not found
stack traceback:
    [C]: in function 'error'
    ...ona Games Launcher\bin\arizona\moonloader\lib\luacef.lua:60: in main chunk
    [C]: in function 'require'
    ...ona Games Launcher\bin\arizona\moonloader\testluacef.lua:3: in main chunk

Да и не работает на аризоне. перекинуть все файлы из [URL='https://mega.nz/file/ahR0wayD#15zgVmKpHORPEmxi22Y6_uEuuuTyYwH5MA194QvOc3E']архива [/URL]в папку с gta_sa.exe непрокатило что-то
Ошибка говорит о том, что luacef.asi не подгружен. Тестил только на лаунчере адванса, в ближайшее время гляну Аризону
 

Орк

Известный
548
524
Ошибка говорит о том, что luacef.asi не подгружен. Тестил только на лаунчере адванса, в ближайшее время гляну Аризону
!GAMELOG.txt лаунчера выдал 12:21:20 | [info] Load ASI "luacef.asi" failed 45a

upd plugin.log пустой
 
Последнее редактирование:
  • Нравится
Реакции: вайега52

mallow123

Известный
3
0
Сайт грузит, Hello World показывает, а нажать на что либо, или же ввести что нибудь в поисковик/строку не дает.