Эксклюзив Софт WebCore Lua [1.2] - просто и красиво

redcode

🤔
Автор темы
Друг
144
1,258
Описание: библиотека, позволяющая создавать интерфейсы с использованием HTML, CSS, JS и взаимодействовать с ними используя Lua.


Список основных функций:
Lua:
webcore.version() -- возвращает версию плагина
webcore.inited() -- возвращает true, если инициализирован
webcore.input_active() -- возвращает true, если активен ввод в любом фрейме (даже в чужом)
WebFrame webcore:create(url, x, y, w, h[, cb]) -- создаёт фрейм с указанными параметрами и вызывает callback после создания браузера
WebFrame webcore:create_fullscreen(url[, cb]) -- создаёт полноэкранный фрейм
webcore:close(WebFrame) -- закрывает фрейм и удаляет связанные с ним данные

Список функций WebFrame:
Lua:
WebFrame:close() -- закрывает фрейм. используется только с установленным колбеком
WebFrame:get_texture() -- возвращает указатель на текстуру фрейма
WebFrame:set_input(enable) -- устанавливает состояние ввода для фрейма
WebFrame:set_active(enable) -- отключает рендеринг фрейма и скрывает его с экрана
WebFrame:set_offscreen(enable) -- позволяет отключить отображение фрейма для самостоятельного рендера
WebFrame:set_rect(x, y, w, h) -- устанавливает размер и позицию фрейма
WebFrame:execute_js(code) -- запускает указанный код
WebFrame:add_function(name, cb) -- создаёт функцию с указанным именем в объекте cef и регистрирует callback (lua), который будет вызван при вызове функции (js)
WebFrame:set_create_cb(cb) -- устанавливает callback на создание фрейма
WebFrame:set_close_cb(cb) -- устанавливает callback на закрытие фрейма
WebFrame:set_loading_cb(cb) -- устанавливает callback на завершение загрузки страницы
WebFrame:load_url(url)
WebFrame:reload_page(ignore_cache)
WebFrame:can_go_back()
WebFrame:can_go_forward()
WebFrame:go_back()
WebFrame:go_forward()
WebFrame:input_active()
WebFrame:get_title()
WebFrame:get_url()
WebFrame:loading()

Примеры использования callback-функций:
Вызывается, когда был фрейм был полностью инициализирован.
На этом моменте, пока страница не загружена, можно создать JavaScript-функции либо использовать другие функции, которые не взаимодействуют со страницей.
Функция имеет всего один аргумент - ссылку на объект браузера, который возвращается при использовании функции webcore:create().

Примеры регистрации:
Lua:
local browser = webcore:create("file:///cef/webcore_test.html", 40, 300, 640, 480,
    function (browser_) -- browser_ == browser
        -- browser:add_function(...)
        -- browser:set_input(...)
        -- и пр.
    end
)
Lua:
local browser = webcore:create("file:///cef/webcore_test.html", 40, 300, 640, 480)
browser:set_create_cb(
    function(browser_)
        -- code
    end
)
Вызывается, когда страница была полностью загружена.
С этого момента можно использовать WebFrame:execute_js() для взаимодействия с функциями страницы.
Аргументы функции - ссылка на фрейм и http код ответа веб-сервера.

Пример использования:
Lua:
browser:set_loading_cb(
    function (browser_, httpStatusCode)
        sampAddChatMessage("loading done. httpStatusCode = " .. httpStatusCode, -1)
    end
)
Вызывается, когда вызвана функция с указанным именем на стороне браузера.
В качестве аргументов передаётся ссылка на фрейм, имя вызванной функции и аргументы, упакованные в таблицу.

Пример регистрации:
Lua:
browser:add_function("dump_lua",
    function (browser_, name, args) -- фрейм, имя вызванной функции и аргументы в виде таблицы
        print("browser:", browser_)
        print("name:", name)
        print("args")
        for i, v in pairs(args) do print(i, v, type(v)) end
    end
)

Пример вызова из JavaScript:
JavaScript:
cef.dump_lua(123, '123', null, undefined, true, false, 0.1 + 0.2)

Результат:
Снимок экрана (141).png

Пример скрипта с использованием библиотеки:
Клавиша B - активирует управление
Клавиша X - закрывает фрейм
Lua:
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8

local hasWebcore, webcore = pcall(require, 'webcore')

local browser = nil

function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
 
    if not hasWebcore then
        sampAddChatMessage("webcore.asi not loaded. check console for details", -1)
        print(webcore)
        return
    end
 
    sampAddChatMessage("webcore.asi version: " .. webcore.version(), -1)
 
    while not webcore.inited() do wait(100) end
 
    browser = webcore:create("file:///cef/webcore_test.html", 40, 300, 640, 480) -- create browser without create callback
 
    browser:set_create_cb( -- set create callback manually
        function (_)
            sampAddChatMessage("browser created", -1)
       
            browser:add_function("add_chat",
                function (_, name, args)
                    sampAddChatMessage(u8:decode(args[1]), args[2])
                end
            )
        end
    )
 
    browser:set_close_cb(
        function (_)
            sampAddChatMessage("browser closed", -1)
            browser = nil -- mark browser closed
        end
    )
 
    browser:set_loading_cb(
        function (_, httpStatusCode)
            sampAddChatMessage("loading done. httpStatusCode = " .. httpStatusCode, -1)
        end
    )
 
    while true do
        if browser ~= nil and not browser:input_active() then
            if isKeyJustPressed(0x42) then -- B
                browser:set_input(true)
            end
   
            if isKeyJustPressed(0x58) then -- X
                browser:close() -- close browser with callback
            end
        end
        wait(0)
    end
end

function onScriptTerminate(s, q)
    if s == thisScript() then
        webcore:close(browser) -- close without callback
        browser = nil
    end
end

Установка: распаковать архив в корень игры с заменой

Скачать: full pack (cef + webcore.asi + webcore.lua)
 
Последнее редактирование:

chapo

🫡 В армии с 17.10.2023. В ЛС НЕ ОТВЕЧАЮ
Друг
8,771
11,214
Это очень круто, стоит ли ожидать сурс?
 
  • Нравится
Реакции: why ega и Rice.

kin4stat

mq-team
Всефорумный модератор
2,730
4,710
поддерживает только простые типы данных
Легко решается.

На стороне subprocess javascript’а делаешь JSON.stringify() для каждого аргумента, и пересылаешь на сторону плагина

На стороне плагина вызываешь decodeJson для этой строки, и передаешь в луа таблицу. В итоге можно спокойно перекидывать обьекты между жс и луа
 
  • Нравится
Реакции: ChromiusJ

kin4stat

mq-team
Всефорумный модератор
2,730
4,710
Кстати, вопрос в догонку. DirtyRects используешь?
 

redcode

🤔
Автор темы
Друг
144
1,258
Это очень круто, стоит ли ожидать сурс?
Это собрано из различных исходников 2020-2023 года. В коде сейчас такой срач, что лишний раз туда лучше не соваться.
Да и нет большого смысла в открытом коде, ведь без хорошего знания структуры библиотеки и принципа её работы там делать нечего.

Легко решается.

На стороне subprocess javascript’а делаешь JSON.stringify() для каждого аргумента, и пересылаешь на сторону плагина

На стороне плагина вызываешь decodeJson для этой строки, и передаешь в луа таблицу. В итоге можно спокойно перекидывать обьекты между жс и луа
Понял принял, реализовал. ( сделаем вид что всё так и было :D )

Кстати, вопрос в догонку. DirtyRects используешь?
Естественно! ( тут тоже :D )
 
Последнее редактирование:
  • Нравится
Реакции: Z3roKwq

neverlane

t.me/neverlane00
Друг
997
1,132
при нажатии на ссылку <a href="http://www.blast.hk" target="_blank">bh</a> с помощью ЛКМ не переходит на сайт, но если нажать СКМ - перейдет как будто эта ссылка без target="_blank"
target="_blank" - указывает, что ссылка будет открыта в новой вкладке
баг, фича или что-то ещё?
 
  • Влюблен
Реакции: Mamashin

Mississippi

Активный
125
48
при нажатии на ссылку <a href="http://www.blast.hk" target="_blank">bh</a> с помощью ЛКМ не переходит на сайт, но если нажать СКМ - перейдет как будто эта ссылка без target="_blank"
target="_blank" - указывает, что ссылка будет открыта в новой вкладке
баг, фича или что-то ещё?
abxf c bydthcbtq)
 
  • Ха-ха
Реакции: Mamashin

kyrtion

Известный
649
238
я вот подумал, что можно было использовать сайт как приложение.
как тулс. нажимал кнопку в js - передает в луа и выполняет процесс и тд
второе, очень сильно напоминает CEF
 

Dark_Knight

Me, me and me.
Друг
4,062
2,077
я вот подумал, что можно было использовать сайт как приложение.
как тулс. нажимал кнопку в js - передает в луа и выполняет процесс и тд
второе, очень сильно напоминает CEF
Это и есть cef
1689906687488.png
 
  • Нравится
Реакции: kyrtion и Mamashin

redcode

🤔
Автор темы
Друг
144
1,258
при нажатии на ссылку <a href="http://www.blast.hk" target="_blank">bh</a> с помощью ЛКМ не переходит на сайт, но если нажать СКМ - перейдет как будто эта ссылка без target="_blank"
target="_blank" - указывает, что ссылка будет открыта в новой вкладке
баг, фича или что-то ещё?
Недоработка.
В обновлённой версии немного изменено поведение и теперь всё должно открываться.

Сейчас есть только такое:
 

Вложения

  • webcore-lib.zip
    2.4 KB · Просмотры: 14
Последнее редактирование:

Lolendor

вотофак
Проверенный
544
564
при размерах разных такое бывает, шо делать (к примеру 500x300 или 641x480), если только по высоте менять, то всё норм, с шириной проблемы
1690063500176.png
1690063598773.png
 
Последнее редактирование:
  • Клоун
Реакции: Mintha

kin4stat

mq-team
Всефорумный модератор
2,730
4,710
при размерах разных такое бывает, шо делать (к примеру 500x300 или 641x480), если только по высоте менять, то всё норм, с шириной проблемы
Питч съезжает, у меня тоже такая проблема была, не особо понятно как фиксить адекватно