Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions package/client/interface/radial.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ export const registerRadial = (radial: { id: string; items: Omit<RadialItem, 'id

export const getCurrentRadialId = () => exports.ox_lib.getCurrentRadialId();

export const showRadialMenu = (menuId: string) => exports.ox_lib.showRadialMenu(menuId);

export const hideRadial = () => exports.ox_lib.hideRadial();

export const disableRadial = (state: boolean) => exports.ox_lib.disableRadial(state);
90 changes: 57 additions & 33 deletions resource/interface/client/radial.lua
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@

local isOpen = false

local isDisabled = false

---@type table<string, RadialMenuProps>
local menus = {}

Expand All @@ -38,6 +40,10 @@ local menuHistory = {}
---@type RadialMenuProps?
local currentRadial = nil

---The registered menu opened directly with lib.showRadialMenu.
---@type RadialMenuProps?
local rootRadial = nil

---Open a the global radial menu or a registered radial submenu with the given id.
---@param id string?
---@param option number?
Expand Down Expand Up @@ -65,7 +71,7 @@ local function showRadial(id, option)
action = 'openRadialMenu',
data = {
items = radial and radial.items or menuItems,
sub = radial and true or nil,
sub = radial and radial ~= rootRadial or nil,
option = option
}
})
Expand Down Expand Up @@ -110,6 +116,46 @@ local function refreshRadial(menuId)
showRadial()
end

---Validates requirements and shows the requested radial menu.
---@param id string? If not provided, the global radial menu will be shown.
local function onRadialOpen(id)
local radial = id and menus[id]

if isDisabled or (id and not radial) then return end

if isOpen then
if rootRadial == radial then
return lib.hideRadial()
end

rootRadial = radial
table.wipe(menuHistory)
return showRadial(id)
end

local items = radial and radial.items or menuItems
if #items == 0 or IsNuiFocused() or IsPauseMenuActive() then return end

isOpen = true
rootRadial = radial
table.wipe(menuHistory)

lib.setNuiFocus(true)
SetCursorLocation(0.5, 0.5)

showRadial(id)

while isOpen do
DisablePlayerFiring(cache.playerId, true)
DisableControlAction(0, 1, true)
DisableControlAction(0, 2, true)
DisableControlAction(0, 142, true)
DisableControlAction(2, 199, true)
DisableControlAction(2, 200, true)
Wait(0)
end
end

---Registers a radial sub menu with predefined options.
---@param radial RadialMenuProps
function lib.registerRadial(radial)
Expand Down Expand Up @@ -138,6 +184,7 @@ function lib.hideRadial()

isOpen = false
currentRadial = nil
rootRadial = nil
end

---Registers an item or array of items in the global radial menu.
Expand Down Expand Up @@ -304,6 +351,7 @@ RegisterNUICallback('radialClose', function(_, cb)

isOpen = false
currentRadial = nil
rootRadial = nil
end)

RegisterNUICallback('radialTransition', function(_, cb)
Expand All @@ -315,8 +363,6 @@ RegisterNUICallback('radialTransition', function(_, cb)
cb(true)
end)

local isDisabled = false

---Disallow players from opening the radial menu.
---@param state boolean
function lib.disableRadial(state)
Expand All @@ -327,40 +373,18 @@ function lib.disableRadial(state)
end
end

---Shows a registered menu as root without affecting global menus.
---@param id string
function lib.showRadialMenu(id)
onRadialOpen(id)
end

lib.addKeybind({
name = 'ox_lib-radial',
description = locale('open_radial_menu'),
defaultKey = 'z',
onPressed = function()
if isDisabled then return end

if isOpen then
return lib.hideRadial()
end

if #menuItems == 0 or IsNuiFocused() or IsPauseMenuActive() then return end

isOpen = true

SendNUIMessage({
action = 'openRadialMenu',
data = {
items = menuItems
}
})

lib.setNuiFocus(true)
SetCursorLocation(0.5, 0.5)

while isOpen do
DisablePlayerFiring(cache.playerId, true)
DisableControlAction(0, 1, true)
DisableControlAction(0, 2, true)
DisableControlAction(0, 142, true)
DisableControlAction(2, 199, true)
DisableControlAction(2, 200, true)
Wait(0)
end
onRadialOpen()
end,
-- onReleased = lib.hideRadial,
})
Expand All @@ -373,4 +397,4 @@ AddEventHandler('onClientResourceStop', function(resource)
table.remove(menuItems, i)
end
end
end)
end)