[MoonLoader, mimgui] BinderSystem | Система биндера с переменными и функциями

Loverxzc

Участник
Автор темы
37
11
BinderSystem | Продвинутая система биндера с переменными и функциями в любом скрипте

Описание:
BinderSystem - это гибкая система биндера для MoonLoader, которая позволяет вставить биндер в mimgui интерфейс своего скрипта с поддержкой встроенных переменных и функций.

Основные возможности:
  • Создание бесконечного количества биндов
  • Использование встроенных переменных
  • Использование встроенных функций
  • Возможность добавления собственных переменных и функций
  • Два типа активации бинда (при нажатии/при отпускании клавиши)
  • Сохранение настроек биндов в JSON файл, выбирая путь и название файла



Встроенные функции:
Код:
chat(текст) - отправка сообщения в чат
input(текст) - ввод текста в строку чата
notif(текст) - вывод уведомления
wait(мс) - ожидание в миллисекундах

Встроенные переменные:
Код:
{mynick} - ваш никнейм
{myid} - ваш ID


Примеры использования:
Код:
chat(/me достал документы)
wait(1000)
chat(/do Документы в руках.)

chat(/me {mynick} поправил форму)
notif(Мое здоровье: {FF1FFF}{health})

МетодФункционалПример
BinderSystem.init(config_path)Инициализирует систему биндера, создает конфиг, если его нет, загружает существующие бинды, регистрирует активные хоткеи
Lua:
BinderSystem.init(getWorkingDirectory() .. '\\config\\my_binders.json')
BinderSystem.registerVariable(name, callback, description, example)Регистрирует новую переменную
Lua:
BinderSystem.registerVariable('myhealth',
    function() return getCharHealth(PLAYER_PED) end,
    u8"Возвращает здоровье игрока",
    u8"chat(Мое здоровье: {myhealth})"
)
BinderSystem.registerCommand(name, callback, description, example)Регистрирует новую функцию
Lua:
BinderSystem.registerCommand('heal',
    function(amount)
        setCharHealth(PLAYER_PED, tonumber(amount) or 100)
    end,
    u8"Восстановление здоровья",
    u8"heal(100)"
)
BinderSystem.renderBinderTab()Рендерит бинды, управление биндами и изменение активаций/хоткеев
Lua:
if imgui.Begin(u8'Мой биндер', window) then
    BinderSystem.renderBinderTab()
    imgui.End()
end
BinderSystem.getVariablesWithInfo()Возвращает таблицу переменных со всей информацией
Lua:
local variables = BinderSystem.getVariablesWithInfo()
                  
for _, var in ipairs(variables) do
    imgui.TextWrapped(var.description)
    imgui.TextColored(imgui.ImVec4(0.7, 0.7, 0.7, 1.0), u8'Пример:')
    imgui.TextWrapped(var.example)
end
BinderSystem.getCommandsWithInfo()Возвращает таблицу функций со всей информацией
Lua:
local commands = BinderSystem.getCommandsWithInfo()

for _, cmd in ipairs(commands) do
    if cmd.name == 'chat' or cmd.name == 'input' or cmd.name == 'notif' or cmd.name == 'wait' then
        if imgui.CollapsingHeader(cmd.name..'##'..cmd.name) then
            imgui.TextWrapped(cmd.description)
            imgui.TextColored(imgui.ImVec4(0.7, 0.7, 0.7, 1.0), u8'Пример:')
            imgui.TextWrapped(cmd.example)
        end
    end
end
BinderSystem.getVariableInfo(name)Возвращает таблицу с информацией о переменнойСм. в BinderSystem.getVariablesWithInfo()
BinderSystem.getCommandInfo(name)Возвращает таблицу с информацией о функцииСм. в BinderSystem.getCommandsWithInfo()

Скрипт с использованием библиотеки:


Lua:
require('lib.moonloader')
local imgui = require('mimgui')
local encoding = require('encoding')
encoding.default = 'CP1251'
local u8 = encoding.UTF8


function getMyNickName()
    return sampGetPlayerNickname(getMyId())
end

function getMyId()
    return select(2, sampGetPlayerIdByCharHandle(PLAYER_PED))
end

-- Подключаем нашу систему биндеров
local BinderSystem = require('bindersystem')

-- Создаем окно
local window = imgui.new.bool(false)

function main()
    while not isSampAvailable() do wait(0) end
 
    -- Инициализируем систему биндеров
    BinderSystem.init(getWorkingDirectory() .. '\\config\\my_binders.json')
 
    -- Регистрируем новую переменную
    BinderSystem.registerVariable('myhealth',
        function() return getCharHealth(PLAYER_PED) end,
        u8"Возвращает текущее здоровье игрока",
        u8"notif(Мое здоровье: {myhealth}) -- покажет текущее здоровье"
    )
 
    -- Регистрируем свои функции с описаниями и примерами
 
    -- Функция для телепорта к метке
    BinderSystem.registerCommand('tptomark',
        function()
            local x, y, z = getTargetBlipCoordinates()
            if x ~= 0 and y ~= 0 and z ~= 0 then
                setCharCoordinates(PLAYER_PED, x, y, z)
            else
                sampAddChatMessage('{414f93}[Binder]: {FFFFFF}Метка не найдена!', -1)
            end
        end,
        u8"Телепортация к метке на карте",
        u8"tptomark() -- телепортирует персонажа к активной метке"
    )
 
    -- Функция для восстановления здоровья
    BinderSystem.registerCommand('heal',
        function(amount)
            amount = tonumber(amount) or 100
            setCharHealth(PLAYER_PED, amount)
        end,
        u8"Восстановление здоровья персонажа",
        u8"heal(50) -- установить 50 HP\nheal() -- установить 100 HP"
    )
 
    -- Функция для отправки серии сообщений
    BinderSystem.registerCommand('multichat',
        function(messages)
            for msg in messages:gmatch('[^;]+') do
                sampSendChat(msg:match('^%s*(.-)%s*$'))
                wait(1000)
            end
        end,
        u8"Отправка нескольких сообщений с задержкой",
        u8"multichat(/me снял форму; /do Форма снята.) -- отправит два сообщения с задержкой"
    )
    BinderSystem.registerVariable('myarmor',
        function() return getCharArmour(PLAYER_PED) end,
        u8"Возвращает текущее брони игрока",
        u8"notif(Моя броня: {myarmor}) -- покажет текущую броню"
    )
    -- Регистрируем команду для открытия меню
    sampRegisterChatCommand('mybinder', function()
        window[0] = not window[0]
    end)
 
    while true do
        wait(0)
    end
end

-- Создаем окно ImGui
local newFrame = imgui.OnFrame(
    function() return window[0] end,
    function(player)
        local resX, resY = getScreenResolution()
        local sizeX, sizeY = 600, 400
        imgui.SetNextWindowPos(imgui.ImVec2(resX / 2, resY / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
        imgui.SetNextWindowSize(imgui.ImVec2(sizeX, sizeY), imgui.Cond.FirstUseEver)
    
        if imgui.Begin(u8'Мой биндер', window) then
            if imgui.BeginTabBar('##tabs') then
                if imgui.BeginTabItem(u8'Биндер') then
                    -- Рендерим интерфейс биндера
                    BinderSystem.renderBinderTab()
                    imgui.EndTabItem()
                end
            
                if imgui.BeginTabItem(u8'Доступные функции') then
                    imgui.TextWrapped(u8'Список всех доступных функций для использования в биндере:')
                    imgui.Separator()
                
                    -- Получаем список всех функций с описаниями
                    local commands = BinderSystem.getCommandsWithInfo()
                
                    -- Встроенные функции
                    imgui.TextColored(imgui.ImVec4(0.5, 0.8, 1.0, 1.0), u8'Встроенные функции')
                    for _, cmd in ipairs(commands) do
                        if cmd.name == 'chat' or cmd.name == 'input' or cmd.name == 'notif' or cmd.name == 'wait' then
                            if imgui.CollapsingHeader(cmd.name..'##'..cmd.name) then
                                imgui.TextWrapped(cmd.description)
                                imgui.TextColored(imgui.ImVec4(0.7, 0.7, 0.7, 1.0), u8'Пример:')
                                imgui.TextWrapped(cmd.example)
                            end
                        end
                    end
                
                    imgui.Spacing()
                    imgui.Separator()
                    imgui.Spacing()
                
                    -- Пользовательские функции
                    imgui.TextColored(imgui.ImVec4(0.5, 1.0, 0.5, 1.0), u8'Пользовательские функции:')
                    for _, cmd in ipairs(commands) do
                        if cmd.name ~= 'chat' and cmd.name ~= 'input' and cmd.name ~= 'notif' and cmd.name ~= 'wait' then
                            if imgui.CollapsingHeader(cmd.name..'##'..cmd.name) then
                                imgui.TextWrapped(cmd.description)
                                imgui.TextColored(imgui.ImVec4(0.7, 0.7, 0.7, 1.0), u8'Пример:')
                                imgui.TextWrapped(cmd.example)
                            end
                        end
                    end
                
                    imgui.EndTabItem()
                end
            
                if imgui.BeginTabItem(u8'Доступные переменные') then
                    imgui.TextWrapped(u8'Список всех доступных переменных для использования в биндере:')
                    imgui.TextWrapped(u8'Переменные используются в формате {имя_переменной}')
                    imgui.Separator()
                
                    -- Получаем список всех переменных с описаниями
                    local variables = BinderSystem.getVariablesWithInfo()
                
                    for _, var in ipairs(variables) do
                        if imgui.CollapsingHeader('{'..var.name..'}'..'##'..var.name) then
                            imgui.TextWrapped(var.description)
                            imgui.TextColored(imgui.ImVec4(0.7, 0.7, 0.7, 1.0), u8'Пример:')
                            imgui.TextWrapped(var.example)
                        end
                    end
                
                    imgui.EndTabItem()
                end
                imgui.EndTabBar()
            end
            imgui.End()
        end
    end
)

Установка:
1. Скачать файл bindersystem.lua
2. Поместить bindersystem.lua в папку moonloader/lib/

Требования:
  • SAMP 0.3.7-R1 или выше
  • MoonLoader
  • mimgui
  • encoding

Примечание:
  • Я скриптер - любитель, раньше вообще не занимался серьезными скриптами/библиотеками
  • Код написан за пару дней, шибко его не тестировал. Если найдете баги/недоработки - пишите в тему!
 

Вложения

  • example_usage.lua
    6.4 KB · Просмотры: 0
  • bindersystem.lua
    21.7 KB · Просмотры: 3
Последнее редактирование:
  • Нравится
Реакции: Theopka и kyrtion