Эксклюзив Софт 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 версии​
 
Последнее редактирование:

вайега52

Налуашил состояние
Автор темы
Модератор
3,025
3,206
  • Нравится
Реакции: 2elnwndrer. и Орк

MrCreepTon

Неизвестный
Всефорумный модератор
2,386
5,484
Посмотреть вложение 296851
Скомпилировал в /MT и убрал хуки, которые конфликтовали с лаунчером ARZ, обновил файл по ссылке. В скором времени подготовлю сурсы
Мне кажется разумнее в релизы совать, а не на файлообменник лить.
Даже если бы исходник был бы закрыт, можно было бы сделать репозиторий с общей информацией и собранные бинари в релизах.
 

вайега52

Налуашил состояние
Автор темы
Модератор
3,025
3,206
Мне кажется разумнее в релизы совать, а не на файлообменник лить.
Даже если бы исходник был бы закрыт, можно было бы сделать репозиторий с общей информацией и собранные бинари в релизах.
основная проблема в том, чтобы все ресы цефа засунуть, не помню, схавает ли гитхаб 100мб, мб чуть позже сделаю
 

SR_team

like pancake
BH Team
4,942
6,671
То есть на аризоне у меня будет в процессах висеть две реализации cef?
1.5 - мы свою фулл вынесли в cef_host.exe, потому что CEF все ресурсы браузеров шарит между всеми процессами, из-за чего в игре висели ресурсы шрифтов и картинок, которые подгрузил CEF. Теперь висят в отдельном процессе
 
  • Нравится
Реакции: вайега52 и Орк

вайега52

Налуашил состояние
Автор темы
Модератор
3,025
3,206
1.5 - мы свою фулл вынесли в cef_host.exe, потому что CEF все ресурсы браузеров шарит между всеми процессами, из-за чего в игре висели ресурсы шрифтов и картинок, которые подгрузил CEF. Теперь висят в отдельном процессе
о, у меня также)
 

Gorskin

t.me/gorskintgk
Проверенный
1,430
1,275
А че нельзя сделать чтобы в реал тайме перемещать окно браузера? или хотя-бы чтобы можно было его в имгуи окно засунуть как ту же картинку.
Так то прикольно, мне как раз надо было сделать браузер в телефоне, если ты сделаешь возможность впихнуть браузер в имгуи окно с пропорциями (а не как ща растяг) то я смогу смотреть тик ток в сампе или ютуб шортс.
p.s я про
1784294033432.png
 

вайега52

Налуашил состояние
Автор темы
Модератор
3,025
3,206
мгуи окно засунуть как ту же картинку.
метод getTexture, а по поводу растяга да, я забыл добавить метод setRect в луа, хотя из dll он экспортируется, в скором времени справлю
 

Gorskin

t.me/gorskintgk
Проверенный
1,430
1,275
метод getTexture, а по поводу растяга да, я забыл добавить метод setRect в луа, хотя из dll он экспортируется, в скором времени справлю
ну я юзал его, там текстурка браузера была но нажать мышкой куда то я не мог, только клавой управление работало.
 

вайега52

Налуашил состояние
Автор темы
Модератор
3,025
3,206
ну я юзал его, там текстурка браузера была но нажать мышкой куда то я не мог, только клавой управление работало.
да, надо создавать браузер на нужных координатах и пропорциях (либо ждать setRect)