Исходник Гайд mimhotkey - бинды в mimgui!

chapo

🫡 В армии с 17.10.2023. В ЛС НЕ ОТВЕЧАЮ
Автор темы
Друг
8,747
11,157
Данная мини-библиотека создана для добавления биндов в меню mimgui
1657733935297.png

Функции:
Lua:
bool result, string code = <module>.RegisterCallback(string name, table keys, function callback)

    Описание:
        "Создает" бинд и "привязывает" функцию к нему. (При срабатывании бинда будет вызвана функция из 3 аргумента)

    Аргументы:
        string name: название бинда (используется в качестве "уникального идентификатора")
        table keys: массив с клавишами (если в массиве 2 клавиши, то для срабатывания бинда первая клавиша (keys[1]) должна быть зажата)
        function callback: функция, которая будет выполнятся при "срабатывании" бинда
KeyEditor:
<module>.KeyEditor(string name, string text, (imgui)ImVec2 size)

    Описание:
        Рисует в mimgui окне кнопку, через которую можно будет смотреть/изменять клавиши бинда

    Аргументы:
        string name: название бинда (первый аргумент, указанный при вызове RegisterCallback)
        string text: текст, который будет отображатся на кнопке (например если text == 'KNOPKA', то текст на кнопке будет "KNOPKA: *клавиши*")
        (imgui)ImVec2 size: размер кнопки с биндом

Готовый код с пояснениями:
Lua:
local imgui = require 'mimgui'

local renderWindow = imgui.new.bool(true)

local hotkey = require('mimhotkey') -- подключаем библиотеку
local bindKeys = {16, 49} -- начальные клавиши (если их 2, то необходимо что бы первая клавиша была зажата ДО нажатия на вторую клавишу)
local bindCallback = function() -- функция, которая сработает при нажатии на кнопки бинда
    sampAddChatMessage('BIND ACTIVATED', 0xFFff004d)
end

local newFrame = imgui.OnFrame(
    function() return renderWindow[0] end,
    function(self)
        if imgui.Begin('MimHotKey example', renderWindow) then
            imgui.Text('Bind Example')
            hotkey.KeyEditor('myBind', 'Chat message')
            --[[
                рисуем кнопку изменения бинда, привязанную к бинду с айди "mybind"
                текст на кнопке: "Chat message"
                размер кнопки не указан (следовательно он будет менятся в зависимости от размеров текста)
            ]]
            imgui.End()
        end
    end
)

function main()
    while not isSampAvailable() do wait(0) end
    sampRegisterChatCommand('mimkotkey', function()
        renderWindow[0] = not renderWindow[0]
    end)

    hotkey.RegisterCallback('myBind', bindKeys, bindCallback)
    --[[
        создаем бинд с айди "myBind", задаем ему "начальные" клавиши из массива bindKeys
        , а так же привязываем бинд к функции bindCallback
    ]]
    wait(-1)
end
Пример сохранения через inicfg:
Lua:
local inicfg = require 'inicfg'
local directIni = 'bindkeys.ini'
local ini = inicfg.load(inicfg.load({
    main = {
        keys = '[16,49]'
    },
}, directIni))
inicfg.save(ini, directIni)

local bindKeys = decodeJson(ini.main.keys)

-- сохраняем клавиши при выгрузке скрипта
function onScriptTerminate(s, q)
    if s == thisScript() then
        ini.main.keys = encodeJson(bindKeys)
    end
end
Установка: перенести файл mimhotkey.lua в папку moonloader\lib
Обновил файл в теме, изменения:
- добавлена возможность изменить текст если бинда нет и текст ожидания нажатия клавиши
Lua:
hotkey.Text.wait_for_key = u8'Нажмите клавишу'
hotkey.Text.no_key = u8'Нет'
- теперь функция KeyEditor вернет массив с клавишами, если бинд был изменен
Lua:
            local NewKeys_Lock = hotkey.KeyEditor('Lock', u8'Открать/закрыть машину')
            if NewKeys_Lock then
                sampAddChatMessage('Бинд изменен на: '..hotkey.GetBindKeys(NewKeys_Lock), -1)
            end
- добавлена функция GetBindKeys
- добавлена возможность удалить бинд нажатием клавиши BACKSPACE
- добавлена возможность включить/выключить флуд при зажатии клавиши

Пример скрипта с использованием хоткеев и сохранением их в INICFG
1657813959391.png

Lua:
local imgui = require 'mimgui'
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8
local hotkey = require('mimhotkey') -- подключаем библиотеку

local inicfg = require 'inicfg'
local directIni = 'mimhotkey_example_2.ini'
local ini = inicfg.load(inicfg.load({
    main = {
        lock_keys = '[80]',
        phone_keys = '[76]'
    },
}, directIni))
inicfg.save(ini, directIni)

local renderWindow = imgui.new.bool(true)
local noBindFlood = imgui.new.bool(true)
local Binds = {
    Lock = {
        desc = u8'Бинд на /lock',
        keys = decodeJson(ini.main.lock_keys),
        callback = function()
            if not sampIsCursorActive() then
                sampSendChat('/lock')
                sampAddChatMessage('машина открыта/закрыта', -1)
            end
        end
    },
    Phone = {
        desc = u8'Бинд на /phone',
        keys = decodeJson(ini.main.phone_keys),
        callback = function()
            if not sampIsCursorActive() then
                sampSendChat('/phone')
                sampAddChatMessage('достаю телефон...', -1)
            end
        end
    }
}

local newFrame = imgui.OnFrame(
    function() return renderWindow[0] end,
    function(self)
        if imgui.Begin('mimhotkey example #2', renderWindow) then
            local NewKeys_Lock = hotkey.KeyEditor('Lock', u8'Открать/закрыть машину')
            if NewKeys_Lock then
                sampAddChatMessage('Бинд изменен на: '..hotkey.GetBindKeys(NewKeys_Lock), -1)
                ini.main.lock_keys = encodeJson(NewKeys_Lock)
                inicfg.save(ini, directIni)
            end

            local NewKeys_Phone = hotkey.KeyEditor('Phone', u8'Достать телефон')
            if NewKeys_Phone then
                sampAddChatMessage('Бинд изменен на: '..hotkey.GetBindKeys(NewKeys_Phone), -1)
                ini.main.phone_keys = encodeJson(NewKeys_Phone)
                inicfg.save(ini, directIni)
            end
            if imgui.Checkbox('No key flood', noBindFlood) then
                hotkey.no_flood = noBindFlood[0]
            end
            imgui.End()
        end
    end
)

function main()
    while not isSampAvailable() do wait(0) end
    sampRegisterChatCommand('mimhk', function()
        renderWindow[0] = not renderWindow[0]
    end)
    hotkey.RegisterCallback('Lock', Binds.Lock.keys, Binds.Lock.callback)
    hotkey.RegisterCallback('Phone', Binds.Phone.keys, Binds.Phone.callback)
    hotkey.Text.wait_for_key = u8'Нажмите клавишу'
    hotkey.Text.no_key = u8'Нет'
    wait(-1)
end
 

Вложения

  • mimhotkey.lua
    6.4 KB · Просмотры: 1,673
Последнее редактирование:

#SameLine

Активный
412
35
Данная мини-библиотека создана для добавления биндов в меню mimgui
Посмотреть вложение 157197
Функции:
Lua:
bool result, string code = <module>.RegisterCallback(string name, table keys, function callback)

    Описание:
        "Создает" бинд и "привязывает" функцию к нему. (При срабатывании бинда будет вызвана функция из 3 аргумента)

    Аргументы:
        string name: название бинда (используется в качестве "уникального идентификатора")
        table keys: массив с клавишами (если в массиве 2 клавиши, то для срабатывания бинда первая клавиша (keys[1]) должна быть зажата)
        function callback: функция, которая будет выполнятся при "срабатывании" бинда
KeyEditor:
<module>.KeyEditor(string name, string text, (imgui)ImVec2 size)

    Описание:
        Рисует в mimgui окне кнопку, через которую можно будет смотреть/изменять клавиши бинда

    Аргументы:
        string name: название бинда (первый аргумент, указанный при вызове RegisterCallback)
        string text: текст, который будет отображатся на кнопке (например если text == 'KNOPKA', то текст на кнопке будет "KNOPKA: *клавиши*")
        (imgui)ImVec2 size: размер кнопки с биндом

Готовый код с пояснениями:
Lua:
local imgui = require 'mimgui'

local renderWindow = imgui.new.bool(true)

local hotkey = require('mimhotkey') -- подключаем библиотеку
local bindKeys = {16, 49} -- начальные клавиши (если их 2, то необходимо что бы первая клавиша была зажата ДО нажатия на вторую клавишу)
local bindCallback = function() -- функция, которая сработает при нажатии на кнопки бинда
    sampAddChatMessage('BIND ACTIVATED', 0xFFff004d)
end

local newFrame = imgui.OnFrame(
    function() return renderWindow[0] end,
    function(self)
        if imgui.Begin('MimHotKey example', renderWindow) then
            imgui.Text('Bind Example')
            hotkey.KeyEditor('myBind', 'Chat message')
            --[[
                рисуем кнопку изменения бинда, привязанную к бинду с айди "mybind"
                текст на кнопке: "Chat message"
                размер кнопки не указан (следовательно он будет менятся в зависимости от размеров текста)
            ]]
            imgui.End()
        end
    end
)

function main()
    while not isSampAvailable() do wait(0) end
    sampRegisterChatCommand('mimkotkey', function()
        renderWindow[0] = not renderWindow[0]
    end)

    hotkey.RegisterCallback('myBind', bindKeys, bindCallback)
    --[[
        создаем бинд с айди "myBind", задаем ему "начальные" клавиши из массива bindKeys
        , а так же привязываем бинд к функции bindCallback
    ]]
    wait(-1)
end
Пример сохранения через inicfg:
Lua:
local inicfg = require 'inicfg'
local directIni = 'bindkeys.ini'
local ini = inicfg.load(inicfg.load({
    main = {
        keys = '[16,49]'
    },
}, directIni))
inicfg.save(ini, directIni)

local bindKeys = decodeJson(ini.main.keys)

-- сохраняем клавиши при выгрузке скрипта
function onScriptTerminate(s, q)
    if s == thisScript() then
        ini.main.keys = encodeJson(bindKeys)
    end
end
Установка: перенести файл mimhotkey.lua в папку moonloader\lib
Обновил файл в теме, изменения:
- добавлена возможность изменить текст если бинда нет и текст ожидания нажатия клавиши
Lua:
hotkey.Text.wait_for_key = u8'Нажмите клавишу'
hotkey.Text.no_key = u8'Нет'
- теперь функция KeyEditor вернет массив с клавишами, если бинд был изменен
Lua:
            local NewKeys_Lock = hotkey.KeyEditor('Lock', u8'Открать/закрыть машину')
            if NewKeys_Lock then
                sampAddChatMessage('Бинд изменен на: '..hotkey.GetBindKeys(NewKeys_Lock), -1)
            end
- добавлена функция GetBindKeys
- добавлена возможность удалить бинд нажатием клавиши BACKSPACE
- добавлена возможность включить/выключить флуд при зажатии клавиши

Пример скрипта с использованием хоткеев и сохранением их в INICFG
Посмотреть вложение 157343
Lua:
local imgui = require 'mimgui'
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8
local hotkey = require('mimhotkey') -- подключаем библиотеку

local inicfg = require 'inicfg'
local directIni = 'mimhotkey_example_2.ini'
local ini = inicfg.load(inicfg.load({
    main = {
        lock_keys = '[80]',
        phone_keys = '[76]'
    },
}, directIni))
inicfg.save(ini, directIni)

local renderWindow = imgui.new.bool(true)
local noBindFlood = imgui.new.bool(true)
local Binds = {
    Lock = {
        desc = u8'Бинд на /lock',
        keys = decodeJson(ini.main.lock_keys),
        callback = function()
            if not sampIsCursorActive() then
                sampSendChat('/lock')
                sampAddChatMessage('машина открыта/закрыта', -1)
            end
        end
    },
    Phone = {
        desc = u8'Бинд на /phone',
        keys = decodeJson(ini.main.phone_keys),
        callback = function()
            if not sampIsCursorActive() then
                sampSendChat('/phone')
                sampAddChatMessage('достаю телефон...', -1)
            end
        end
    }
}

local newFrame = imgui.OnFrame(
    function() return renderWindow[0] end,
    function(self)
        if imgui.Begin('mimhotkey example #2', renderWindow) then
            local NewKeys_Lock = hotkey.KeyEditor('Lock', u8'Открать/закрыть машину')
            if NewKeys_Lock then
                sampAddChatMessage('Бинд изменен на: '..hotkey.GetBindKeys(NewKeys_Lock), -1)
                ini.main.lock_keys = encodeJson(NewKeys_Lock)
                inicfg.save(ini, directIni)
            end

            local NewKeys_Phone = hotkey.KeyEditor('Phone', u8'Достать телефон')
            if NewKeys_Phone then
                sampAddChatMessage('Бинд изменен на: '..hotkey.GetBindKeys(NewKeys_Phone), -1)
                ini.main.phone_keys = encodeJson(NewKeys_Phone)
                inicfg.save(ini, directIni)
            end
            if imgui.Checkbox('No key flood', noBindFlood) then
                hotkey.no_flood = noBindFlood[0]
            end
            imgui.End()
        end
    end
)

function main()
    while not isSampAvailable() do wait(0) end
    sampRegisterChatCommand('mimhk', function()
        renderWindow[0] = not renderWindow[0]
    end)
    hotkey.RegisterCallback('Lock', Binds.Lock.keys, Binds.Lock.callback)
    hotkey.RegisterCallback('Phone', Binds.Phone.keys, Binds.Phone.callback)
    hotkey.Text.wait_for_key = u8'Нажмите клавишу'
    hotkey.Text.no_key = u8'Нет'
    wait(-1)
end
У меня такая проблемка, все работает, но не сохраняет, я сделал все как на статье
 

why ega

РП игрок
Модератор
2,521
2,184
Данная мини-библиотека создана для добавления биндов в меню mimgui
Посмотреть вложение 157197
Функции:
Lua:
bool result, string code = <module>.RegisterCallback(string name, table keys, function callback)

    Описание:
        "Создает" бинд и "привязывает" функцию к нему. (При срабатывании бинда будет вызвана функция из 3 аргумента)

    Аргументы:
        string name: название бинда (используется в качестве "уникального идентификатора")
        table keys: массив с клавишами (если в массиве 2 клавиши, то для срабатывания бинда первая клавиша (keys[1]) должна быть зажата)
        function callback: функция, которая будет выполнятся при "срабатывании" бинда
KeyEditor:
<module>.KeyEditor(string name, string text, (imgui)ImVec2 size)

    Описание:
        Рисует в mimgui окне кнопку, через которую можно будет смотреть/изменять клавиши бинда

    Аргументы:
        string name: название бинда (первый аргумент, указанный при вызове RegisterCallback)
        string text: текст, который будет отображатся на кнопке (например если text == 'KNOPKA', то текст на кнопке будет "KNOPKA: *клавиши*")
        (imgui)ImVec2 size: размер кнопки с биндом

Готовый код с пояснениями:
Lua:
local imgui = require 'mimgui'

local renderWindow = imgui.new.bool(true)

local hotkey = require('mimhotkey') -- подключаем библиотеку
local bindKeys = {16, 49} -- начальные клавиши (если их 2, то необходимо что бы первая клавиша была зажата ДО нажатия на вторую клавишу)
local bindCallback = function() -- функция, которая сработает при нажатии на кнопки бинда
    sampAddChatMessage('BIND ACTIVATED', 0xFFff004d)
end

local newFrame = imgui.OnFrame(
    function() return renderWindow[0] end,
    function(self)
        if imgui.Begin('MimHotKey example', renderWindow) then
            imgui.Text('Bind Example')
            hotkey.KeyEditor('myBind', 'Chat message')
            --[[
                рисуем кнопку изменения бинда, привязанную к бинду с айди "mybind"
                текст на кнопке: "Chat message"
                размер кнопки не указан (следовательно он будет менятся в зависимости от размеров текста)
            ]]
            imgui.End()
        end
    end
)

function main()
    while not isSampAvailable() do wait(0) end
    sampRegisterChatCommand('mimkotkey', function()
        renderWindow[0] = not renderWindow[0]
    end)

    hotkey.RegisterCallback('myBind', bindKeys, bindCallback)
    --[[
        создаем бинд с айди "myBind", задаем ему "начальные" клавиши из массива bindKeys
        , а так же привязываем бинд к функции bindCallback
    ]]
    wait(-1)
end
Пример сохранения через inicfg:
Lua:
local inicfg = require 'inicfg'
local directIni = 'bindkeys.ini'
local ini = inicfg.load(inicfg.load({
    main = {
        keys = '[16,49]'
    },
}, directIni))
inicfg.save(ini, directIni)

local bindKeys = decodeJson(ini.main.keys)

-- сохраняем клавиши при выгрузке скрипта
function onScriptTerminate(s, q)
    if s == thisScript() then
        ini.main.keys = encodeJson(bindKeys)
    end
end
Установка: перенести файл mimhotkey.lua в папку moonloader\lib
Обновил файл в теме, изменения:
- добавлена возможность изменить текст если бинда нет и текст ожидания нажатия клавиши
Lua:
hotkey.Text.wait_for_key = u8'Нажмите клавишу'
hotkey.Text.no_key = u8'Нет'
- теперь функция KeyEditor вернет массив с клавишами, если бинд был изменен
Lua:
            local NewKeys_Lock = hotkey.KeyEditor('Lock', u8'Открать/закрыть машину')
            if NewKeys_Lock then
                sampAddChatMessage('Бинд изменен на: '..hotkey.GetBindKeys(NewKeys_Lock), -1)
            end
- добавлена функция GetBindKeys
- добавлена возможность удалить бинд нажатием клавиши BACKSPACE
- добавлена возможность включить/выключить флуд при зажатии клавиши

Пример скрипта с использованием хоткеев и сохранением их в INICFG
Посмотреть вложение 157343
Lua:
local imgui = require 'mimgui'
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8
local hotkey = require('mimhotkey') -- подключаем библиотеку

local inicfg = require 'inicfg'
local directIni = 'mimhotkey_example_2.ini'
local ini = inicfg.load(inicfg.load({
    main = {
        lock_keys = '[80]',
        phone_keys = '[76]'
    },
}, directIni))
inicfg.save(ini, directIni)

local renderWindow = imgui.new.bool(true)
local noBindFlood = imgui.new.bool(true)
local Binds = {
    Lock = {
        desc = u8'Бинд на /lock',
        keys = decodeJson(ini.main.lock_keys),
        callback = function()
            if not sampIsCursorActive() then
                sampSendChat('/lock')
                sampAddChatMessage('машина открыта/закрыта', -1)
            end
        end
    },
    Phone = {
        desc = u8'Бинд на /phone',
        keys = decodeJson(ini.main.phone_keys),
        callback = function()
            if not sampIsCursorActive() then
                sampSendChat('/phone')
                sampAddChatMessage('достаю телефон...', -1)
            end
        end
    }
}

local newFrame = imgui.OnFrame(
    function() return renderWindow[0] end,
    function(self)
        if imgui.Begin('mimhotkey example #2', renderWindow) then
            local NewKeys_Lock = hotkey.KeyEditor('Lock', u8'Открать/закрыть машину')
            if NewKeys_Lock then
                sampAddChatMessage('Бинд изменен на: '..hotkey.GetBindKeys(NewKeys_Lock), -1)
                ini.main.lock_keys = encodeJson(NewKeys_Lock)
                inicfg.save(ini, directIni)
            end

            local NewKeys_Phone = hotkey.KeyEditor('Phone', u8'Достать телефон')
            if NewKeys_Phone then
                sampAddChatMessage('Бинд изменен на: '..hotkey.GetBindKeys(NewKeys_Phone), -1)
                ini.main.phone_keys = encodeJson(NewKeys_Phone)
                inicfg.save(ini, directIni)
            end
            if imgui.Checkbox('No key flood', noBindFlood) then
                hotkey.no_flood = noBindFlood[0]
            end
            imgui.End()
        end
    end
)

function main()
    while not isSampAvailable() do wait(0) end
    sampRegisterChatCommand('mimhk', function()
        renderWindow[0] = not renderWindow[0]
    end)
    hotkey.RegisterCallback('Lock', Binds.Lock.keys, Binds.Lock.callback)
    hotkey.RegisterCallback('Phone', Binds.Phone.keys, Binds.Phone.callback)
    hotkey.Text.wait_for_key = u8'Нажмите клавишу'
    hotkey.Text.no_key = u8'Нет'
    wait(-1)
end
Сижу час, не понимаю из-за чего не робит, в чом дело?
Lua:
local mainIni = inicfg.load({
    config =
    {
        menu_keys = "[123]"
    }
}, "raknet.ini")

local binds = {
    menu = {
        desc = u8"Активация меню:",
        keys = decodeJson(mainIni.config.menu_keys),
        callback = function()
            consumeWindowMessage(true, false)
            if msg == 0x101 then
                config.mainWindow[0], config.titleWindow[0] = not config.mainWindow[0], not config.titleWindow[0]
            end
        end
    }
}

-- main

hotkey.RegisterCallback("myBind", binds.menu.keys, binds.menu.callback)
------------------------

-- imgui callback

local NewKeys_Menu = hotkey.KeyEditor("menu", mainIni.config.menu_keys)
    if NewKeys_Menu then
    notification.Show("Бинд изменен на: " .. hotkey.GetBindKeys(NewKeys_Menu), notification.TYPE.INFO, 5, customColors)
    mainIni.config.menu_keys = encodeJson(NewKeys_Menu)
    inicfg.save(mainIni, "raknet.ini")
end
1667276436827.png


Сижу час, не понимаю из-за чего не робит, в чом дело?
Lua:
local mainIni = inicfg.load({
    config =
    {
        menu_keys = "[123]"
    }
}, "raknet.ini")

local binds = {
    menu = {
        desc = u8"Активация меню:",
        keys = decodeJson(mainIni.config.menu_keys),
        callback = function()
            consumeWindowMessage(true, false)
            if msg == 0x101 then
                config.mainWindow[0], config.titleWindow[0] = not config.mainWindow[0], not config.titleWindow[0]
            end
        end
    }
}

-- main

hotkey.RegisterCallback("myBind", binds.menu.keys, binds.menu.callback)
------------------------

-- imgui callback

local NewKeys_Menu = hotkey.KeyEditor("menu", mainIni.config.menu_keys)
    if NewKeys_Menu then
    notification.Show("Бинд изменен на: " .. hotkey.GetBindKeys(NewKeys_Menu), notification.TYPE.INFO, 5, customColors)
    mainIni.config.menu_keys = encodeJson(NewKeys_Menu)
    inicfg.save(mainIni, "raknet.ini")
end
1667276436827.png
@chapo
 
Последнее редактирование:
  • Нравится
Реакции: Willy4ka

chapo

🫡 В армии с 17.10.2023. В ЛС НЕ ОТВЕЧАЮ
Автор темы
Друг
8,747
11,157
Сижу час, не понимаю из-за чего не робит, в чом дело?
Lua:
local mainIni = inicfg.load({
    config =
    {
        menu_keys = "[123]"
    }
}, "raknet.ini")

local binds = {
    menu = {
        desc = u8"Активация меню:",
        keys = decodeJson(mainIni.config.menu_keys),
        callback = function()
            consumeWindowMessage(true, false)
            if msg == 0x101 then
                config.mainWindow[0], config.titleWindow[0] = not config.mainWindow[0], not config.titleWindow[0]
            end
        end
    }
}

-- main

hotkey.RegisterCallback("myBind", binds.menu.keys, binds.menu.callback)
------------------------

-- imgui callback

local NewKeys_Menu = hotkey.KeyEditor("menu", mainIni.config.menu_keys)
    if NewKeys_Menu then
    notification.Show("Бинд изменен на: " .. hotkey.GetBindKeys(NewKeys_Menu), notification.TYPE.INFO, 5, customColors)
    mainIni.config.menu_keys = encodeJson(NewKeys_Menu)
    inicfg.save(mainIni, "raknet.ini")
end
Посмотреть вложение 175490


@chapo
1667241407765.png
 
  • Нравится
  • Влюблен
Реакции: Willy4ka и why ega

XRLM

Известный
2,508
843
не понимаю почему не изменяет клавишу. меняю бинд с 2 на K, бинд работает, но bindKeys почему то не меняет своё значение, как было "[50]", так и осталось
Lua:
local ini = inicfg.load({
    DT = {
        Keys = '[50]',
    },
}, directIni)
local bindKeys = decodeJson(ini.DT.Keys)
local bindCallback = function()
    sampAddChatMessage('BIND ACTIVATED', 0xFFff004d)
end
--main
hotkey.RegisterCallback('myBind', bindKeys, bindCallback)
--frame
hotkey.KeyEditor('myBind', 'Chat message')

function onScriptTerminate(s, q)
    if s == thisScript() then
        ini.DT.Keys = encodeJson(bindKeys)
        inicfg.save(ini, directIni)
    end
end

@chapo
 
Последнее редактирование:

why ega

РП игрок
Модератор
2,521
2,184
шот туплю жостка, как можно пофиксить?
Lua:
-- v jope

local hotkey = require("mimhotkey")

local binds = {
    scenarios = {}
}

-- render imgui

binds.scenarios[#binds.scenarios+1] = {                         
    name = new.char[256]("Bind " .. #binds.scenarios+1),
    keys = "[49]",
    callback = function()

    end
}
hotkey.RegisterCallback(u8:decode(str(binds.scenarios[#binds.scenarios].name)), binds.scenarios[#binds.scenarios].keys, binds.scenarios[#binds.scenarios].callback)

if #binds.scenarios > 0 then
    for i, bind in pairs(binds.scenarios) do
        if bind ~= nil then 
            local KeysBind = hotkey.KeyEditor(str(bind.name), nil, imgui.ImVec2(100,25))
        end
    end
end
Lua:
[20:10:36.873559] (error)    RakNet Changer: C:\ВАЖНОЕ\sborka soft\moonloader\lib\mimhotkey.lua:142: bad argument #1 to 'ipairs' (table expected, got string)
stack traceback:
    [C]: in function 'ipairs'
    C:\ВАЖНОЕ\sborka soft\moonloader\lib\mimhotkey.lua:142: in function 'GetKeysText'
    C:\ВАЖНОЕ\sborka soft\moonloader\lib\mimhotkey.lua:169: in function 'KeyEditor'
    C:\ВАЖНОЕ\sborka soft\moonloader\raknet.lua:1649: in function '_draw'
    C:\ВАЖНОЕ\sborka soft\moonloader\lib\mimgui\init.lua:107: in function <C:\ВАЖНОЕ\sborka soft\moonloader\lib\mimgui\init.lua:91>
[20:10:36.877555] (error)    RakNet Changer: Script died due to an error. (1356517C)

mimhotkey:
--[[
  
     ???????????    ??    ???????????      ??    ??     ????????      ???        ??   ???    ????????? ???   ? 
   ??????????????? ???  ???????????????   ???    ???   ???    ??? ???????????   ??? ?????   ???    ??? ???   ???
   ???   ???   ??? ???? ???   ???   ???   ???    ???   ???    ???    ????????   ???????     ???    ??  ?????????
   ???   ???   ??? ???? ???   ???   ???  ????????????? ???    ???     ???   ?  ???????     ???????     ?????????
   ???   ???   ??? ???? ???   ???   ??? ?????????????  ???    ???     ???     ????????    ????????     ???   ???
   ???   ???   ??? ???  ???   ???   ???   ???    ???   ???    ???     ???       ???????     ???    ??  ???   ???
   ???   ???   ??? ???  ???   ???   ???   ???    ???   ???    ???     ???       ??? ?????   ???    ??? ???   ???
    ??   ???   ??  ??    ??   ???   ??    ???    ??     ????????     ??????     ???   ???   ??????????  ???????
                                                                                ?                             
    Author: chapo
    Links:
        - https://www.blast.hk/members/112329/
        - https://vk.com/ya_chapo
        - https://vk.com/chaposcripts

]]
require('lib.moonloader')
local imgui = require('mimgui')
local vk = require 'vkeys'

HOTKEY = {
    no_flood = true,
    lastkey = 9999,
    MODULEINFO = {
        version = 2,
        author = 'chapo'
    },
    Text = {
        wait_for_key = 'Press any key...',
        no_key = 'None'
    },
    List = {},
    EditKey = nil,
    Edit = {
        backup = {},
        new = {}
    },
    Ret = {name = nil, data = {}}
}

local LargeKeys = {
    VK_SHIFT,
    VK_SPACE,
    VK_CONTROL,
    VK_LMENU,
    VK_RETURN
}

local IsKeyLarge = function(key)
    for k, v in ipairs(LargeKeys) do
        if v == key then
            return true
        end
    end
    return false
end

addEventHandler('onWindowMessage', function(msg, key)
    if msg == 0x0100 --[[ WM_KEYDOWN ]] then
        if HOTKEY.EditKey == nil then
            if (HOTKEY.no_flood and key ~= HOTKEY.lastkey) or (not HOTKEY.no_flood) then
                HOTKEY.lastkey = key
                for name, data in pairs(HOTKEY.List) do
                    keys = data.keys
                    if (#keys == 1 and key == keys[1]) or (#keys == 2 and isKeyDown(keys[1]) and key == keys[2]) then
                        data.callback(name)
                    end
                end
            end
            if HOTKEY.EditKey ~= nil then
                if #HOTKEY.List[HOTKEY.EditKey] < 2 then
                    table.insert(HOTKEY.List[HOTKEY.EditKey], key)
                end
            end
        else
            if key == VK_ESCAPE then
                HOTKEY.List[HOTKEY.EditKey].keys = HOTKEY.Edit.backup
                HOTKEY.EditKey = nil
                consumeWindowMessage(true, true)
            elseif key == VK_BACK then
                HOTKEY.List[HOTKEY.EditKey].keys = {}
                HOTKEY.EditKey = nil
                consumeWindowMessage(true, true)
            end
        end     
    elseif msg == 0x0101 --[[ WM_KEYUP ]] then
        if HOTKEY.EditKey ~= nil and key ~= VK_LMENU then
            if key == VK_BACK then
                HOTKEY.List[HOTKEY.EditKey].keys = {}
                HOTKEY.EditKey = nil
            else
                local PressKey = getDownKeys()
                local LargeKey = PressKey[#PressKey]
                HOTKEY.List[HOTKEY.EditKey].keys = {#PressKey > 0 and PressKey[#PressKey] or key, #PressKey > 0 and key or nil}
                if HOTKEY.List[HOTKEY.EditKey].keys[1] == HOTKEY.List[HOTKEY.EditKey].keys[2] then
                    HOTKEY.List[HOTKEY.EditKey].keys[2] = nil
                end
                HOTKEY.Ret.name = HOTKEY.EditKey
                HOTKEY.Ret.data = HOTKEY.List[HOTKEY.EditKey].keys
                HOTKEY.EditKey = nil
            end
        end
    end
end)

getDownKeys = function()
    local t = {}
    for index, KEYID in ipairs(LargeKeys) do
        if isKeyDown(KEYID) then
            table.insert(t, KEYID)
        end
    end
    return t
end

HOTKEY.GetBindKeys = function(bind)
    local keys = {}
    local t = {}
    if type(bind) == 'string' then
        if HOTKEY.List[bind] then
            keys = HOTKEY.List[bind].keys
        else
            return 'BIND NOT FOUND'
        end
    elseif type(bind) == 'table' then
        keys = bind
    else
        return 'INCORRECT DATA TYPE'
    end

    for k, v in ipairs(keys) do
        table.insert(t, vk.id_to_name(v) or 'UNK')
    end
    return table.concat(t, ' + ')
end

HOTKEY.GetKeysText = function(bind)
    local t = {}
    if HOTKEY.List[bind] then
        for k, v in ipairs(HOTKEY.List[bind].keys) do
            table.insert(t, vk.id_to_name(v) or 'UNK')
        end
    end
    return table.concat(t, ' + ')
end

HOTKEY.GetHotkeyKeys = function(name)
    return {HOTKEY.List[name].keys == nil and 'bind not found' or HOTKEY.GetKeysText(name)}
end

HOTKEY.RegisterCallback = function(name, keys, callback)
    if HOTKEY.List[name] == nil then
        HOTKEY.List[name] = {
            keys = keys,
            callback = callback
        }
        return true, 'vse zaebis, mojno najimat knopo4ku!'
    else
        return false, 'error, hotkey '..name..' already registred'
    end
end

--HOTKEY.KeyEditCallback

HOTKEY.KeyEditor = function(bindname, text, size)
    if HOTKEY.List[bindname] then
        local keystext = #HOTKEY.List[bindname].keys == 0 and HOTKEY.Text.no_key or HOTKEY.GetKeysText(bindname)--table.concat(HOTKEY.List[bindname].keys, ' + ')--
        if HOTKEY.EditKey ~= nil then
            if HOTKEY.EditKey == bindname then
                keystext = HOTKEY.Text.wait_for_key
            end
        end
        if imgui.Button((text ~= nil and text..': ' or '')..keystext..'##HOTKEY_EDITOR:'..bindname, size) then
            HOTKEY.Edit.backup = HOTKEY.List[bindname].keys
            HOTKEY.List[bindname].keys = {}
            HOTKEY.EditKey = bindname
        end
        if HOTKEY.Ret.name ~= nil then
            if HOTKEY.Ret.name == bindname then
                HOTKEY.Ret.name = nil
                return HOTKEY.Ret.data
            end
        end
    else
        imgui.Button('Bind "'..tostring(bindname)..'" not found##HOTKEY_EDITOR:BINDNAMENOTFOUND', size)
    end
end

return HOTKEY
 

chapo

🫡 В армии с 17.10.2023. В ЛС НЕ ОТВЕЧАЮ
Автор темы
Друг
8,747
11,157
@egaa ты не перевел JSON в таблицу
не понимаю почему не изменяет клавишу. меняю бинд с 2 на K, бинд работает, но bindKeys почему то не меняет своё значение, как было "[50]", так и осталось
Lua:
local ini = inicfg.load({
    DT = {
        Keys = '[50]',
    },
}, directIni)
local bindKeys = decodeJson(ini.DT.Keys)
local bindCallback = function()
    sampAddChatMessage('BIND ACTIVATED', 0xFFff004d)
end
--main
hotkey.RegisterCallback('myBind', bindKeys, bindCallback)
--frame
hotkey.KeyEditor('myBind', 'Chat message')

function onScriptTerminate(s, q)
    if s == thisScript() then
        ini.DT.Keys = encodeJson(bindKeys)
        inicfg.save(ini, directIni)
    end
end

@chapo
тут честно говоря хз, позже проверю сам
 

Deboshirich

Новичок
17
4
Хэллоу, делаю свой скрипт для Администирования, и есть такой забавный баг, что если мы открыли окно по назначенной клавише, закрыть его уже не получается нажав на эту же клавишу повторно, только после нажатия любой другой клавиши получается закрыть окно. Так же это сказывается очень сильно и на других функциях, например с сендчатом и так далее, если есть возможность, пофикси пжешко @chapo
 

chapo

🫡 В армии с 17.10.2023. В ЛС НЕ ОТВЕЧАЮ
Автор темы
Друг
8,747
11,157
Хэллоу, делаю свой скрипт для Администирования, и есть такой забавный баг, что если мы открыли окно по назначенной клавише, закрыть его уже не получается нажав на эту же клавишу повторно, только после нажатия любой другой клавиши получается закрыть окно. Так же это сказывается очень сильно и на других функциях, например с сендчатом и так далее, если есть возможность, пофикси пжешко @chapo
hotkey.no_flood = false
 

Hero_0_

Участник
37
4
Данная мини-библиотека создана для добавления биндов в меню mimgui
Посмотреть вложение 157197
Функции:
Lua:
bool result, string code = <module>.RegisterCallback(string name, table keys, function callback)

    Описание:
        "Создает" бинд и "привязывает" функцию к нему. (При срабатывании бинда будет вызвана функция из 3 аргумента)

    Аргументы:
        string name: название бинда (используется в качестве "уникального идентификатора")
        table keys: массив с клавишами (если в массиве 2 клавиши, то для срабатывания бинда первая клавиша (keys[1]) должна быть зажата)
        function callback: функция, которая будет выполнятся при "срабатывании" бинда
KeyEditor:
<module>.KeyEditor(string name, string text, (imgui)ImVec2 size)

    Описание:
        Рисует в mimgui окне кнопку, через которую можно будет смотреть/изменять клавиши бинда

    Аргументы:
        string name: название бинда (первый аргумент, указанный при вызове RegisterCallback)
        string text: текст, который будет отображатся на кнопке (например если text == 'KNOPKA', то текст на кнопке будет "KNOPKA: *клавиши*")
        (imgui)ImVec2 size: размер кнопки с биндом

Готовый код с пояснениями:
Lua:
local imgui = require 'mimgui'

local renderWindow = imgui.new.bool(true)

local hotkey = require('mimhotkey') -- подключаем библиотеку
local bindKeys = {16, 49} -- начальные клавиши (если их 2, то необходимо что бы первая клавиша была зажата ДО нажатия на вторую клавишу)
local bindCallback = function() -- функция, которая сработает при нажатии на кнопки бинда
    sampAddChatMessage('BIND ACTIVATED', 0xFFff004d)
end

local newFrame = imgui.OnFrame(
    function() return renderWindow[0] end,
    function(self)
        if imgui.Begin('MimHotKey example', renderWindow) then
            imgui.Text('Bind Example')
            hotkey.KeyEditor('myBind', 'Chat message')
            --[[
                рисуем кнопку изменения бинда, привязанную к бинду с айди "mybind"
                текст на кнопке: "Chat message"
                размер кнопки не указан (следовательно он будет менятся в зависимости от размеров текста)
            ]]
            imgui.End()
        end
    end
)

function main()
    while not isSampAvailable() do wait(0) end
    sampRegisterChatCommand('mimkotkey', function()
        renderWindow[0] = not renderWindow[0]
    end)

    hotkey.RegisterCallback('myBind', bindKeys, bindCallback)
    --[[
        создаем бинд с айди "myBind", задаем ему "начальные" клавиши из массива bindKeys
        , а так же привязываем бинд к функции bindCallback
    ]]
    wait(-1)
end
Пример сохранения через inicfg:
Lua:
local inicfg = require 'inicfg'
local directIni = 'bindkeys.ini'
local ini = inicfg.load(inicfg.load({
    main = {
        keys = '[16,49]'
    },
}, directIni))
inicfg.save(ini, directIni)

local bindKeys = decodeJson(ini.main.keys)

-- сохраняем клавиши при выгрузке скрипта
function onScriptTerminate(s, q)
    if s == thisScript() then
        ini.main.keys = encodeJson(bindKeys)
    end
end
Установка: перенести файл mimhotkey.lua в папку moonloader\lib
Обновил файл в теме, изменения:
- добавлена возможность изменить текст если бинда нет и текст ожидания нажатия клавиши
Lua:
hotkey.Text.wait_for_key = u8'Нажмите клавишу'
hotkey.Text.no_key = u8'Нет'
- теперь функция KeyEditor вернет массив с клавишами, если бинд был изменен
Lua:
            local NewKeys_Lock = hotkey.KeyEditor('Lock', u8'Открать/закрыть машину')
            if NewKeys_Lock then
                sampAddChatMessage('Бинд изменен на: '..hotkey.GetBindKeys(NewKeys_Lock), -1)
            end
- добавлена функция GetBindKeys
- добавлена возможность удалить бинд нажатием клавиши BACKSPACE
- добавлена возможность включить/выключить флуд при зажатии клавиши

Пример скрипта с использованием хоткеев и сохранением их в INICFG
Посмотреть вложение 157343
Lua:
local imgui = require 'mimgui'
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8
local hotkey = require('mimhotkey') -- подключаем библиотеку

local inicfg = require 'inicfg'
local directIni = 'mimhotkey_example_2.ini'
local ini = inicfg.load(inicfg.load({
    main = {
        lock_keys = '[80]',
        phone_keys = '[76]'
    },
}, directIni))
inicfg.save(ini, directIni)

local renderWindow = imgui.new.bool(true)
local noBindFlood = imgui.new.bool(true)
local Binds = {
    Lock = {
        desc = u8'Бинд на /lock',
        keys = decodeJson(ini.main.lock_keys),
        callback = function()
            if not sampIsCursorActive() then
                sampSendChat('/lock')
                sampAddChatMessage('машина открыта/закрыта', -1)
            end
        end
    },
    Phone = {
        desc = u8'Бинд на /phone',
        keys = decodeJson(ini.main.phone_keys),
        callback = function()
            if not sampIsCursorActive() then
                sampSendChat('/phone')
                sampAddChatMessage('достаю телефон...', -1)
            end
        end
    }
}

local newFrame = imgui.OnFrame(
    function() return renderWindow[0] end,
    function(self)
        if imgui.Begin('mimhotkey example #2', renderWindow) then
            local NewKeys_Lock = hotkey.KeyEditor('Lock', u8'Открать/закрыть машину')
            if NewKeys_Lock then
                sampAddChatMessage('Бинд изменен на: '..hotkey.GetBindKeys(NewKeys_Lock), -1)
                ini.main.lock_keys = encodeJson(NewKeys_Lock)
                inicfg.save(ini, directIni)
            end

            local NewKeys_Phone = hotkey.KeyEditor('Phone', u8'Достать телефон')
            if NewKeys_Phone then
                sampAddChatMessage('Бинд изменен на: '..hotkey.GetBindKeys(NewKeys_Phone), -1)
                ini.main.phone_keys = encodeJson(NewKeys_Phone)
                inicfg.save(ini, directIni)
            end
            if imgui.Checkbox('No key flood', noBindFlood) then
                hotkey.no_flood = noBindFlood[0]
            end
            imgui.End()
        end
    end
)

function main()
    while not isSampAvailable() do wait(0) end
    sampRegisterChatCommand('mimhk', function()
        renderWindow[0] = not renderWindow[0]
    end)
    hotkey.RegisterCallback('Lock', Binds.Lock.keys, Binds.Lock.callback)
    hotkey.RegisterCallback('Phone', Binds.Phone.keys, Binds.Phone.callback)
    hotkey.Text.wait_for_key = u8'Нажмите клавишу'
    hotkey.Text.no_key = u8'Нет'
    wait(-1)
end
Оч круто, как всегда молодец!)))
 

EX4MPLYCH

Участник
42
5
не понимаю почему не изменяет клавишу. меняю бинд с 2 на K, бинд работает, но bindKeys почему то не меняет своё значение, как было "[50]", так и осталось
Lua:
local ini = inicfg.load({
    DT = {
        Keys = '[50]',
    },
}, directIni)
local bindKeys = decodeJson(ini.DT.Keys)
local bindCallback = function()
    sampAddChatMessage('BIND ACTIVATED', 0xFFff004d)
end
--main
hotkey.RegisterCallback('myBind', bindKeys, bindCallback)
--frame
hotkey.KeyEditor('myBind', 'Chat message')

function onScriptTerminate(s, q)
    if s == thisScript() then
        ini.DT.Keys = encodeJson(bindKeys)
        inicfg.save(ini, directIni)
    end
end

@chapo
Пофикшено?