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

redcode

🤔
Автор темы
Друг
147
1,282
Описание: библиотека, позволяющая создавать интерфейсы с использованием 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)
 
Последнее редактирование:

kin4stat

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

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

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

kin4stat

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

redcode

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

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

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

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

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

neverlane

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

подозрительно

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

kyrtion

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

Dark_Knight

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

redcode

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

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

Вложения

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

Lolendor

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

kin4stat

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

подозрительно

Потрачен
133
48
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
добавь декодер видео чтобы можно было смотреть ютуб без лагов!!1
 

kin4stat

mq-team · kin4@naebalovo.team
Всефорумный модератор
2,744
4,808
  • Грустно
Реакции: подозрительно