- 4,771
- 5,376
Всем привет. Слишком много текста для написания в полезные функции, но вот вам моя модификация над которой я ебался трудился последние сутки.
Что нам нужно?
- Голова, две руки (можно и одну, копировать не сложно)
- Dear ImGui
- MoonLoader v025
Приступим:
Функция получения текущих нажатых клавиш:
Функция-пара для проерки нажатия клавиши:
string.split
Сама функция Hotkey():
Событие onWindowMessage():
Теперь код
Получаем что-то такое:
PS: Если что-то не работает пишите, возможно что-то упустил
PPS: Буду дорабатывать совместно с моим модом!
Что нам нужно?
- Голова, две руки (можно и одну, копировать не сложно)
- Dear ImGui
- MoonLoader v025
Приступим:
Функция получения текущих нажатых клавиш:
Lua:
function getDownKeys()
local curkeys = ""
local bool = false
for k, v in pairs(vkeys) do
if isKeyDown(v) and (v == VK_MENU or v == VK_CONTROL or v == VK_SHIFT or v == VK_LMENU or v == VK_RMENU or v == VK_RCONTROL or v == VK_LCONTROL or v == VK_LSHIFT or v == VK_RSHIFT) then
if v ~= VK_MENU and v ~= VK_CONTROL and v ~= VK_SHIFT then
curkeys = v
end
end
end
for k, v in pairs(vkeys) do
if isKeyDown(v) and (v ~= VK_MENU and v ~= VK_CONTROL and v ~= VK_SHIFT and v ~= VK_LMENU and v ~= VK_RMENU and v ~= VK_RCONTROL and v ~= VK_LCONTROL and v ~= VK_LSHIFT and v ~= VK_RSHIFT) then
if tostring(curkeys):len() == 0 then
curkeys = v
else
curkeys = curkeys .. " " .. v
end
bool = true
end
end
return curkeys, bool
end
Функция-пара для проерки нажатия клавиши:
Lua:
function isKeysDown(keylist, pressed)
local tKeys = string.split(keylist, " ")
if pressed == nil then
pressed = false
end
if tKeys[1] == nil then
return false
end
local bool = false
local key = #tKeys < 2 and tonumber(tKeys[1]) or tonumber(tKeys[2])
local modified = tonumber(tKeys[1])
if #tKeys < 2 then
if not isKeyDown(VK_RMENU) and not isKeyDown(VK_LMENU) and not isKeyDown(VK_LSHIFT) and not isKeyDown(VK_RSHIFT) and not isKeyDown(VK_LCONTROL) and not isKeyDown(VK_RCONTROL) then
if wasKeyPressed(key) and not pressed then
bool = true
elseif isKeyDown(key) and pressed then
bool = true
end
end
else
if isKeyDown(modified) and not wasKeyReleased(modified) then
if wasKeyPressed(key) and not pressed then
bool = true
elseif isKeyDown(key) and pressed then
bool = true
end
end
end
if nextLockKey == keylist then
if pressed and not wasKeyReleased(key) then
bool = false
-- nextLockKey = ""
else
bool = false
nextLockKey = ""
end
end
return bool
end
string.split
Lua:
function string.split(inputstr, sep)
if sep == nil then
sep = "%s"
end
local t={} ; i=1
for str in string.gmatch(inputstr, "([^"..sep.."]+)") do
t[i] = str
i = i + 1
end
return t
end
Сама функция Hotkey():
Lua:
local editHotkey = nil
function imgui.Hotkey(name, keyBuf, width)
local name = tostring(name)
local keys, endkey = getDownKeys()
local keysName = ""
local ImVec2 = imgui.ImVec2
local bool = false
if editHotkey == name then
if keys == VK_BACK then
keyBuf.v = ''
editHotkey = nil
nextLockKey = keys
editKeys = 0
else
local tNames = string.split(keys, " ")
local keylist = ""
for _, v in ipairs(tNames) do
local key = tostring(vkeys.id_to_name(tonumber(v)))
if tostring(keylist):len() == 0 then
keylist = key
else
keylist = keylist .. " + " .. key
end
end
keysName = keylist
if endkey then
bool = true
keyBuf.v = keys
editHotkey = nil
nextLockKey = keys
editKeys = 0
end
end
else
local tNames = string.split(keyBuf.v, " ")
for _, v in ipairs(tNames) do
local key = tostring(vkeys.id_to_name(tonumber(v)))
if tostring(keysName):len() == 0 then
keysName = key
else
keysName = keysName .. " + " .. key
end
end
end
local style = imgui.GetStyle()
local colors = style.Colors
local clr = imgui.Col
imgui.PushStyleColor(imgui.Col.Button, colors[clr.FrameBg])
imgui.PushStyleColor(imgui.Col.ButtonActive, colors[clr.FrameBg])
imgui.PushStyleColor(imgui.Col.ButtonHovered, colors[clr.FrameBg])
imgui.PushStyleVar(imgui.StyleVar.ButtonTextAlign, ImVec2(0.04, 0.5))
imgui.Button(u8((tostring(keysName):len() > 0 or editHotkey == name) and keysName or "Нет"), ImVec2(width, 20))
imgui.PopStyleVar()
imgui.PopStyleColor(3)
if imgui.IsItemHovered() and imgui.IsItemClicked() and editHotkey == nil then
editHotkey = name
editKeys = 100
end
if name:len() > 0 then
imgui.SameLine()
imgui.Text(name)
end
return bool
end
Событие onWindowMessage():
Lua:
function onWindowMessage(msg, wparam, lparam)
if(msg == 0x100 or msg == 0x101) then
if (wparam == VK_ESCAPE or wparam == VK_RETURN or wparam == VK_TAB or wparam == VK_F6 or wparam == VK_F7 or wparam == VK_F8 or wparam == VK_T or wparam == VK_OEM_3) and msg == 0x100 and editKeys > 0 then
consumeWindowMessage(true, true)
editHotkey = nil
end
end
end
Теперь код
Lua:
-- Создаем буффер для клавиши.
-- Перед onDrawFrame()
-- keyAdminMenu - переменная для "бинда" клавиши.
-- hotKeyAdminMenu - буффер для imgui.Hotkey()
local hotKeyAdminMenu = imgui.ImBuffer(keyAdminMenu, 256)
-- В onDrawFrame()
-- В уже созданном окне (внутри Begin())
imgui.AlignTextToFramePadding()
if imgui.Hotkey(u8"Панель администратора", hotKeyAdminMenu, 80) then
nextLockKey = hotKeyAdminMenu.v
keyAdminMenu = hotKeyAdminMenu.v
end
-- nextLockKey - чтобы во время изменения клавиши не сраотал другой хоткей
-- Идём в main()
if not sampIsChatInputActive() and not sampIsDialogActive() and not isSampfuncsConsoleActive() and isPlayerPlaying(playerHandle) and editKeys == 0 then
if isKeysDown(keyAdminmenu) then
sampSendChat("/amenu")
end
end
Получаем что-то такое:
PS: Если что-то не работает пишите, возможно что-то упустил
PPS: Буду дорабатывать совместно с моим модом!
Последнее редактирование: