91 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			91 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
| --[[
 | |
|     https://github.com/overextended/ox_lib
 | |
| 
 | |
|     This file is licensed under LGPL-3.0 or higher <https://www.gnu.org/licenses/lgpl-3.0.en.html>
 | |
| 
 | |
|     Copyright © 2025 Linden <https://github.com/thelindat>
 | |
| ]]
 | |
| 
 | |
| if cache.game == 'redm' then return end
 | |
| 
 | |
| ---@class KeybindProps
 | |
| ---@field name string
 | |
| ---@field description string
 | |
| ---@field defaultMapper? string (see: https://docs.fivem.net/docs/game-references/input-mapper-parameter-ids/)
 | |
| ---@field defaultKey? string
 | |
| ---@field disabled? boolean
 | |
| ---@field disable? fun(self: CKeybind, toggle: boolean)
 | |
| ---@field onPressed? fun(self: CKeybind)
 | |
| ---@field onReleased? fun(self: CKeybind)
 | |
| ---@field [string] any
 | |
| 
 | |
| ---@class CKeybind : KeybindProps
 | |
| ---@field currentKey string
 | |
| ---@field disabled boolean
 | |
| ---@field isPressed boolean
 | |
| ---@field hash number
 | |
| ---@field getCurrentKey fun(): string
 | |
| ---@field isControlPressed fun(): boolean
 | |
| 
 | |
| local keybinds = {}
 | |
| 
 | |
| local IsPauseMenuActive = IsPauseMenuActive
 | |
| local GetControlInstructionalButton = GetControlInstructionalButton
 | |
| 
 | |
| local keybind_mt = {
 | |
|     disabled = false,
 | |
|     isPressed = false,
 | |
|     defaultKey = '',
 | |
|     defaultMapper = 'keyboard',
 | |
| }
 | |
| 
 | |
| function keybind_mt:__index(index)
 | |
|     return index == 'currentKey' and self:getCurrentKey() or keybind_mt[index]
 | |
| end
 | |
| 
 | |
| function keybind_mt:getCurrentKey()
 | |
|     return GetControlInstructionalButton(0, self.hash, true):sub(3)
 | |
| end
 | |
| 
 | |
| function keybind_mt:isControlPressed()
 | |
|     return self.isPressed
 | |
| end
 | |
| 
 | |
| function keybind_mt:disable(toggle)
 | |
|     self.disabled = toggle
 | |
| end
 | |
| 
 | |
| ---@param data KeybindProps
 | |
| ---@return CKeybind
 | |
| function lib.addKeybind(data)
 | |
|     ---@cast data CKeybind
 | |
|     data.hash = joaat('+' .. data.name) | 0x80000000
 | |
|     keybinds[data.name] = setmetatable(data, keybind_mt)
 | |
| 
 | |
|     RegisterCommand('+' .. data.name, function()
 | |
|         if data.disabled or IsPauseMenuActive() then return end
 | |
|         data.isPressed = true
 | |
|         if data.onPressed then data:onPressed() end
 | |
|     end)
 | |
| 
 | |
|     RegisterCommand('-' .. data.name, function()
 | |
|         if data.disabled or IsPauseMenuActive() then return end
 | |
|         data.isPressed = false
 | |
|         if data.onReleased then data:onReleased() end
 | |
|     end)
 | |
| 
 | |
|     RegisterKeyMapping('+' .. data.name, data.description, data.defaultMapper, data.defaultKey)
 | |
| 
 | |
|     if data.secondaryKey then
 | |
|         RegisterKeyMapping('~!+' .. data.name, data.description, data.secondaryMapper or data.defaultMapper, data.secondaryKey)
 | |
|     end
 | |
| 
 | |
|     SetTimeout(500, function()
 | |
|         TriggerEvent('chat:removeSuggestion', ('/+%s'):format(data.name))
 | |
|         TriggerEvent('chat:removeSuggestion', ('/-%s'):format(data.name))
 | |
|     end)
 | |
| 
 | |
|     return data
 | |
| end
 | |
| 
 | |
| return lib.addKeybind
 | 
