Rewrote module with custom menus. Keybindings: All actions with the same key will be executed. Check for action existing before executing. Fixed bug with false keybind action firing
320 lines
No EOL
16 KiB
Lua
320 lines
No EOL
16 KiB
Lua
local vmf = get_mod("VMF")
|
|
|
|
local keyboard_buton_name = Keyboard.button_name
|
|
local mouse_buton_name = Mouse.button_name
|
|
|
|
vmf.keys = {
|
|
keyboard = {
|
|
[8] = {"Backspace", "backspace", keyboard_buton_name(8)},
|
|
[9] = {"Tab", "tab", keyboard_buton_name(9)},
|
|
[13] = {"Enter", "enter", keyboard_buton_name(13)},
|
|
[20] = {"Caps Lock", "caps lock", keyboard_buton_name(20)},
|
|
[32] = {"Space", "space", keyboard_buton_name(32)},
|
|
[33] = {"Page Up", "page up", keyboard_buton_name(33)},
|
|
[34] = {"Page Down", "page down", keyboard_buton_name(34)},
|
|
[35] = {"End", "end", keyboard_buton_name(35)},
|
|
[36] = {"Home", "home", keyboard_buton_name(36)},
|
|
[37] = {"Left", "left", keyboard_buton_name(37)},
|
|
[38] = {"Up", "up", keyboard_buton_name(38)},
|
|
[39] = {"Right", "right", keyboard_buton_name(39)},
|
|
[40] = {"Down", "down", keyboard_buton_name(40)},
|
|
[45] = {"Insert", "insert", keyboard_buton_name(45)},
|
|
[46] = {"Delete", "delete", keyboard_buton_name(46)},
|
|
[48] = {"0", "0", keyboard_buton_name(48)},
|
|
[49] = {"1", "1", keyboard_buton_name(49)},
|
|
[50] = {"2", "2", keyboard_buton_name(50)},
|
|
[51] = {"3", "3", keyboard_buton_name(51)},
|
|
[52] = {"4", "4", keyboard_buton_name(52)},
|
|
[53] = {"5", "5", keyboard_buton_name(53)},
|
|
[54] = {"6", "6", keyboard_buton_name(54)},
|
|
[55] = {"7", "7", keyboard_buton_name(55)},
|
|
[56] = {"8", "8", keyboard_buton_name(56)},
|
|
[57] = {"9", "9", keyboard_buton_name(57)},
|
|
[65] = {"A", "a", keyboard_buton_name(65)},
|
|
[66] = {"B", "b", keyboard_buton_name(66)},
|
|
[67] = {"C", "c", keyboard_buton_name(67)},
|
|
[68] = {"D", "d", keyboard_buton_name(68)},
|
|
[69] = {"E", "e", keyboard_buton_name(69)},
|
|
[70] = {"F", "f", keyboard_buton_name(70)},
|
|
[71] = {"G", "g", keyboard_buton_name(71)},
|
|
[72] = {"H", "h", keyboard_buton_name(72)},
|
|
[73] = {"I", "i", keyboard_buton_name(73)},
|
|
[74] = {"J", "j", keyboard_buton_name(74)},
|
|
[75] = {"K", "k", keyboard_buton_name(75)},
|
|
[76] = {"L", "l", keyboard_buton_name(76)},
|
|
[77] = {"M", "m", keyboard_buton_name(77)},
|
|
[78] = {"N", "n", keyboard_buton_name(78)},
|
|
[79] = {"O", "o", keyboard_buton_name(79)},
|
|
[80] = {"P", "p", keyboard_buton_name(80)},
|
|
[81] = {"Q", "q", keyboard_buton_name(81)},
|
|
[82] = {"R", "r", keyboard_buton_name(82)},
|
|
[83] = {"S", "s", keyboard_buton_name(83)},
|
|
[84] = {"T", "t", keyboard_buton_name(84)},
|
|
[85] = {"U", "u", keyboard_buton_name(85)},
|
|
[86] = {"V", "v", keyboard_buton_name(86)},
|
|
[87] = {"W", "w", keyboard_buton_name(87)},
|
|
[88] = {"X", "x", keyboard_buton_name(88)},
|
|
[89] = {"Y", "y", keyboard_buton_name(89)},
|
|
[90] = {"Z", "z", keyboard_buton_name(90)},
|
|
[91] = {"Win", "win", keyboard_buton_name(91)},
|
|
[92] = {"RWin", "right win", keyboard_buton_name(92)},
|
|
[96] = {"Num 0", "numpad 0", keyboard_buton_name(96)},
|
|
[97] = {"Num 1", "numpad 1", keyboard_buton_name(97)},
|
|
[98] = {"Num 2", "numpad 2", keyboard_buton_name(98)},
|
|
[99] = {"Num 3", "numpad 3", keyboard_buton_name(99)},
|
|
[100] = {"Num 4", "numpad 4", keyboard_buton_name(100)},
|
|
[101] = {"Num 5", "numpad 5", keyboard_buton_name(101)},
|
|
[102] = {"Num 6", "numpad 6", keyboard_buton_name(102)},
|
|
[103] = {"Num 7", "numpad 7", keyboard_buton_name(103)},
|
|
[104] = {"Num 8", "numpad 8", keyboard_buton_name(104)},
|
|
[105] = {"Num 9", "numpad 9", keyboard_buton_name(105)},
|
|
[106] = {"Num *", "numpad *", keyboard_buton_name(106)},
|
|
[107] = {"Num +", "numpad +", keyboard_buton_name(107)},
|
|
[109] = {"Num -", "numpad -", keyboard_buton_name(109)},
|
|
[110] = {"Num .", "numpad .", keyboard_buton_name(110)},
|
|
[111] = {"Num /", "numpad /", keyboard_buton_name(111)},
|
|
[112] = {"F1", "f1", keyboard_buton_name(112)},
|
|
[113] = {"F2", "f2", keyboard_buton_name(113)},
|
|
[114] = {"F3", "f3", keyboard_buton_name(114)},
|
|
[115] = {"F4", "f4", keyboard_buton_name(115)},
|
|
[116] = {"F5", "f5", keyboard_buton_name(116)},
|
|
[117] = {"F6", "f6", keyboard_buton_name(117)},
|
|
[118] = {"F7", "f7", keyboard_buton_name(118)},
|
|
[119] = {"F8", "f8", keyboard_buton_name(119)},
|
|
[120] = {"F9", "f9", keyboard_buton_name(120)},
|
|
[121] = {"F10", "f10", keyboard_buton_name(121)},
|
|
[122] = {"F11", "f11", keyboard_buton_name(122)},
|
|
[123] = {"F12", "f12", keyboard_buton_name(123)},
|
|
[144] = {"Num Lock", "num lock", keyboard_buton_name(144)},
|
|
[145] = {"Scroll Lock", "scroll lock", keyboard_buton_name(145)},
|
|
[166] = {"Browser Back", "browser back", keyboard_buton_name(166)},
|
|
[167] = {"Browser Forward", "browser forward", keyboard_buton_name(167)},
|
|
[168] = {"Browser Refresh", "browser refresh", keyboard_buton_name(168)},
|
|
[169] = {"Browser Stop", "browser stop", keyboard_buton_name(169)},
|
|
[170] = {"Browser Search", "browser search", keyboard_buton_name(170)},
|
|
[171] = {"Browser Favorites", "browser favorites", keyboard_buton_name(171)},
|
|
[172] = {"Browser Home", "browser home", keyboard_buton_name(172)},
|
|
[173] = {"Volume Mute", "volume mute", keyboard_buton_name(173)},
|
|
[174] = {"Volume Down", "volume down", keyboard_buton_name(174)},
|
|
[175] = {"Volume Up", "volume up", keyboard_buton_name(175)},
|
|
[176] = {"Next Track", "next track", keyboard_buton_name(176)},
|
|
[177] = {"Previous Track", "previous track", keyboard_buton_name(177)},
|
|
[178] = {"Stop", "stop", keyboard_buton_name(178)},
|
|
[179] = {"Play/Pause", "play pause", keyboard_buton_name(179)},
|
|
[180] = {"Mail", "mail", keyboard_buton_name(180)},
|
|
[181] = {"Media", "media", keyboard_buton_name(181)},
|
|
[182] = {"Start Application 1", "start app 1", keyboard_buton_name(182)},
|
|
[183] = {"Start Application 2", "start app 2", keyboard_buton_name(183)},
|
|
[186] = {";", ";", keyboard_buton_name(186)},
|
|
[187] = {"=", "=", keyboard_buton_name(187)},
|
|
[188] = {",", ",", keyboard_buton_name(188)},
|
|
[189] = {"-", "-", keyboard_buton_name(189)},
|
|
[190] = {".", ".", keyboard_buton_name(190)},
|
|
[191] = {"/", "/", keyboard_buton_name(191)},
|
|
[192] = {"`", "`", keyboard_buton_name(192)},
|
|
[219] = {"[", "[", keyboard_buton_name(219)},
|
|
[220] = {"\\", "\\", keyboard_buton_name(220)},
|
|
[221] = {"]", "]", keyboard_buton_name(221)},
|
|
[222] = {"'", "'", keyboard_buton_name(222)},
|
|
--?[226] = {"\", "oem_102 (> <)", keyboard_buton_name(226)},
|
|
[256] = {"Num Enter", "numpad enter", keyboard_buton_name(256)}
|
|
},
|
|
mouse = {
|
|
[0] = {"Mouse Left", "mouse left", mouse_buton_name(0)},
|
|
[1] = {"Mouse Right", "mouse right", mouse_buton_name(1)},
|
|
[2] = {"Mouse Middle", "mouse middle", mouse_buton_name(2)},
|
|
[3] = {"Mouse Extra 1", "mouse extra 1", mouse_buton_name(3)},
|
|
[4] = {"Mouse Extra 2", "mouse extra 2", mouse_buton_name(4)},
|
|
[10] = {"Mouse Wheel Up", "mouse wheel up", mouse_buton_name(10)},
|
|
[11] = {"Mouse Wheel Down", "mouse wheel down", mouse_buton_name(11)},
|
|
[12] = {"Mouse Wheel Left", "mouse wheel left", mouse_buton_name(12)},
|
|
[13] = {"Mouse Wheel Right", "mouse wheel right", mouse_buton_name(13)}
|
|
},--[[ -- will work on this if it will be needed
|
|
gamepad = {
|
|
[0] = {"", "d_up", gamepad_buton_name(0)},
|
|
[1] = {"", "d_down", gamepad_buton_name(1)},
|
|
[2] = {"", "d_left", gamepad_buton_name(2)},
|
|
[3] = {"", "d_right", gamepad_buton_name(3)},
|
|
[4] = {"", "start", gamepad_buton_name(4)},
|
|
[5] = {"", "back", gamepad_buton_name(5)},
|
|
[6] = {"", "left_thumb", gamepad_buton_name(6)},
|
|
[7] = {"", "right_thumb", gamepad_buton_name(7)},
|
|
[8] = {"", "left_shoulder", gamepad_buton_name(8)},
|
|
[9] = {"", "right_shoulder", gamepad_buton_name(9)},
|
|
[10] = {"", "left_trigger", gamepad_buton_name(10)},
|
|
[11] = {"", "right_trigger", gamepad_buton_name(11)},
|
|
[12] = {"", "a", gamepad_buton_name(12)},
|
|
[13] = {"", "b", gamepad_buton_name(13)},
|
|
[14] = {"", "x", gamepad_buton_name(14)},
|
|
[15] = {"", "y", gamepad_buton_name(15)},
|
|
}]]
|
|
}
|
|
|
|
vmf.readable_key_names = {}
|
|
|
|
for _, controller_keys in pairs(vmf.keys) do
|
|
for _, key_info in pairs(controller_keys) do
|
|
vmf.readable_key_names[key_info[2]] = key_info[1]
|
|
end
|
|
end
|
|
|
|
vmf.readable_key_names["ctrl"] = "Ctrl"
|
|
vmf.readable_key_names["alt"] = "Alt"
|
|
vmf.readable_key_names["shift"] = "Shift"
|
|
|
|
VMFModsKeyMap = {
|
|
win32 = {
|
|
["ctrl"] = {"keyboard", "left ctrl", "held"},
|
|
["alt"] = {"keyboard", "left alt", "held"},
|
|
["shift"] = {"keyboard", "left shift", "held"}
|
|
}
|
|
}
|
|
|
|
|
|
for _, key_info in pairs(vmf.keys.keyboard) do
|
|
VMFModsKeyMap.win32[key_info[2]] = {"keyboard", key_info[3], "held"}
|
|
end
|
|
|
|
for i = 0, 4 do
|
|
local key_info = vmf.keys.mouse[i]
|
|
VMFModsKeyMap.win32[key_info[2]] = {"mouse", key_info[3], "held"}
|
|
end
|
|
|
|
for i = 10, 13 do
|
|
local key_info = vmf.keys.mouse[i]
|
|
VMFModsKeyMap.win32[key_info[2]] = {"mouse", key_info[3], "pressed"}
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-- ["mod_name"]["setting_name"] = {"action_name", {"primary_key", "2nd_key", "3rd_key", "4th_key"}}
|
|
local raw_keybinds = {}
|
|
|
|
-- ["primary_key"] = {{"mod_name", "action_name", "2nd_key", "3rd_key", "4th_key"}, {}, {}, ...}
|
|
local optimized_keybinds = {}
|
|
|
|
|
|
local function apply_keybinds()
|
|
|
|
optimized_keybinds = {}
|
|
|
|
for mod_name, mod_keybinds in pairs(raw_keybinds) do
|
|
for setting_name, keybind in pairs(mod_keybinds) do
|
|
local action_name = keybind[1]
|
|
local primary_key = keybind[2][1]
|
|
|
|
local special_key1 = keybind[2][2]
|
|
local special_key2 = keybind[2][3]
|
|
local special_key3 = keybind[2][4]
|
|
|
|
local special_keys = {}
|
|
|
|
if special_key1 then
|
|
special_keys[special_key1] = true
|
|
end
|
|
if special_key2 then
|
|
special_keys[special_key2] = true
|
|
end
|
|
if special_key3 then
|
|
special_keys[special_key3] = true
|
|
end
|
|
|
|
optimized_keybinds[primary_key] = optimized_keybinds[primary_key] or {}
|
|
table.insert(optimized_keybinds[primary_key], {mod_name, action_name, special_keys["ctrl"], special_keys["alt"], special_keys["shift"]})
|
|
end
|
|
end
|
|
end
|
|
|
|
-- use it directly only for dedugging purposes, otherwise use keybind widget
|
|
-- setting_name [string] - keybind identifyer for certain mod
|
|
-- action_name [string] - name of some mod.function which will be called when keybind is pressed
|
|
-- keys [table] = {"primary_key", "2nd_key" [optional], "3rd_key" [optional], "4th_key" [optional]}
|
|
-- 2, 3, 4 keys can contain words "ctrl", "alt", "shift" (lowercase)
|
|
VMFMod.keybind = function (self, setting_name, action_name, keys)
|
|
|
|
if keys[1] then
|
|
|
|
local mod_keybinds = raw_keybinds[self._name] or {}
|
|
|
|
mod_keybinds[setting_name] = {action_name, keys}
|
|
|
|
raw_keybinds[self._name] = mod_keybinds
|
|
else
|
|
|
|
local mod_keybinds = raw_keybinds[self._name]
|
|
|
|
if mod_keybinds and mod_keybinds[setting_name] then
|
|
mod_keybinds[setting_name] = nil
|
|
end
|
|
end
|
|
|
|
if vmf.keybind_input_service then
|
|
apply_keybinds()
|
|
end
|
|
end
|
|
|
|
vmf.initialize_keybinds = function()
|
|
Managers.input.create_input_service(Managers.input, "VMFMods", "VMFModsKeyMap")
|
|
Managers.input.map_device_to_service(Managers.input, "VMFMods", "keyboard")
|
|
Managers.input.map_device_to_service(Managers.input, "VMFMods", "mouse")
|
|
|
|
vmf.keybind_input_service = Managers.input:get_service("VMFMods")
|
|
|
|
apply_keybinds()
|
|
end
|
|
vmf:echo("hmm")
|
|
vmf.check_pressed_keybinds = function()
|
|
|
|
local input_service = vmf.keybind_input_service
|
|
if input_service then
|
|
|
|
-- don't check for the pressed keybindings until player will release already pressed keybind
|
|
if vmf.activated_pressed_key then
|
|
if input_service:get(vmf.activated_pressed_key) then
|
|
return
|
|
else
|
|
vmf.activated_pressed_key = nil
|
|
end
|
|
end
|
|
|
|
local key_has_active_keybind = false
|
|
|
|
for key, key_bindings in pairs(optimized_keybinds) do
|
|
if input_service:get(key) then
|
|
for _, binding_info in ipairs(key_bindings) do
|
|
if (not binding_info[3] and not input_service:get("ctrl") or binding_info[3] and input_service:get("ctrl")) and
|
|
(not binding_info[4] and not input_service:get("alt") or binding_info[4] and input_service:get("alt")) and
|
|
(not binding_info[5] and not input_service:get("shift") or binding_info[5] and input_service:get("shift")) then
|
|
--@TODO: add pcall, also check for suspending, and perhaps add "toggle" event
|
|
if not pcall(get_mod(binding_info[1])[binding_info[2]]) then
|
|
get_mod(binding_info[1]):echo("ERROR(keybindings): function '" .. tostring(binding_info[2]) .. "' wasn't found.", true)
|
|
end
|
|
|
|
key_has_active_keybind = true
|
|
|
|
--table.dump(optimized_keybinds, "optimized_keybinds", 2)
|
|
|
|
vmf.activated_pressed_key = key
|
|
end
|
|
end
|
|
|
|
-- return here because some other mods can have the same keybind which also need to be executed
|
|
if key_has_active_keybind then
|
|
return
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
vmf.delete_keybinds = function()
|
|
VMFModsKeyMap = {}
|
|
end
|
|
|
|
local something = false and 1 + 1
|
|
print("SADASDASDASDASDASDASDASDASDASD: " .. tostring(something))
|
|
print("SADASDASDASDASDASDASDASDASDASD: ") |