Main/resources/[tools]/menu_default/client/main.lua

238 lines
5.8 KiB
Lua
Raw Permalink Normal View History

2025-06-07 08:51:21 +02:00
ESXMenu = {}
ESXMenu.UI = {}
ESXMenu.UI.Menu = {}
ESXMenu.UI.Menu.RegisteredTypes = {}
ESXMenu.UI.Menu.Opened = {}
ESXMenu.UI.Menu.RegisterType = function(type, open, close)
ESXMenu.UI.Menu.RegisteredTypes[type] = {
open = open,
close = close
}
end
ESXMenu.UI.Menu.Open = function(type, namespace, name, data, submit, cancel, change, close)
local menu = {}
menu.type = type
menu.namespace = namespace
menu.name = name
menu.data = data
menu.submit = submit
menu.cancel = cancel
menu.change = change
menu.close = function()
ESXMenu.UI.Menu.RegisteredTypes[type].close(namespace, name)
for i=1, #ESXMenu.UI.Menu.Opened, 1 do
if ESXMenu.UI.Menu.Opened[i] then
if ESXMenu.UI.Menu.Opened[i].type == type and ESXMenu.UI.Menu.Opened[i].namespace == namespace and ESXMenu.UI.Menu.Opened[i].name == name then
ESXMenu.UI.Menu.Opened[i] = nil
end
end
end
if close then
close()
end
end
menu.update = function(query, newData)
for i=1, #menu.data.elements, 1 do
local match = true
for k,v in pairs(query) do
if menu.data.elements[i][k] ~= v then
match = false
end
end
if match then
for k,v in pairs(newData) do
menu.data.elements[i][k] = v
end
end
end
end
menu.refresh = function()
ESXMenu.UI.Menu.RegisteredTypes[type].open(namespace, name, menu.data)
end
menu.setElement = function(i, key, val)
menu.data.elements[i][key] = val
end
menu.setElements = function(newElements)
menu.data.elements = newElements
end
menu.setTitle = function(val)
menu.data.title = val
end
menu.removeElement = function(query)
for i=1, #menu.data.elements, 1 do
for k,v in pairs(query) do
if menu.data.elements[i] then
if menu.data.elements[i][k] == v then
table.remove(menu.data.elements, i)
break
end
end
end
end
end
table.insert(ESXMenu.UI.Menu.Opened, menu)
ESXMenu.UI.Menu.RegisteredTypes[type].open(namespace, name, data)
return menu
end
ESXMenu.UI.Menu.Close = function(type, namespace, name)
for i=1, #ESXMenu.UI.Menu.Opened, 1 do
if ESXMenu.UI.Menu.Opened[i] then
if ESXMenu.UI.Menu.Opened[i].type == type and ESXMenu.UI.Menu.Opened[i].namespace == namespace and ESXMenu.UI.Menu.Opened[i].name == name then
ESXMenu.UI.Menu.Opened[i].close()
ESXMenu.UI.Menu.Opened[i] = nil
end
end
end
end
ESXMenu.UI.Menu.CloseAll = function()
for i=1, #ESXMenu.UI.Menu.Opened, 1 do
if ESXMenu.UI.Menu.Opened[i] then
ESXMenu.UI.Menu.Opened[i].close()
ESXMenu.UI.Menu.Opened[i] = nil
end
end
end
ESXMenu.UI.Menu.GetOpened = function(type, namespace, name)
for i=1, #ESXMenu.UI.Menu.Opened, 1 do
if ESXMenu.UI.Menu.Opened[i] then
if ESXMenu.UI.Menu.Opened[i].type == type and ESXMenu.UI.Menu.Opened[i].namespace == namespace and ESXMenu.UI.Menu.Opened[i].name == name then
return ESXMenu.UI.Menu.Opened[i]
end
end
end
end
ESXMenu.UI.Menu.GetOpenedMenus = function()
return ESXMenu.UI.Menu.Opened
end
ESXMenu.UI.Menu.IsOpen = function(type, namespace, name)
return ESXMenu.UI.Menu.GetOpened(type, namespace, name) ~= nil
end
Citizen.CreateThread(function()
local GUI, MenuType = {}, 'default'
GUI.Time = 0
local openMenu = function(namespace, name, data)
SendNUIMessage({
action = 'openMenu',
namespace = namespace,
name = name,
data = data
})
end
local closeMenu = function(namespace, name)
SendNUIMessage({
action = 'closeMenu',
namespace = namespace,
name = name,
data = data
})
end
ESXMenu.UI.Menu.RegisterType(MenuType, openMenu, closeMenu)
RegisterNUICallback('menu_submit', function(data, cb)
local menu = ESXMenu.UI.Menu.GetOpened(MenuType, data._namespace, data._name)
if menu.submit ~= nil then
menu.submit(data, menu)
end
cb('OK')
end)
RegisterNUICallback('menu_cancel', function(data, cb)
local menu = ESXMenu.UI.Menu.GetOpened(MenuType, data._namespace, data._name)
if menu.cancel ~= nil then
menu.cancel(data, menu)
end
cb('OK')
end)
RegisterNUICallback('menu_change', function(data, cb)
local menu = ESXMenu.UI.Menu.GetOpened(MenuType, data._namespace, data._name)
for i=1, #data.elements, 1 do
menu.setElement(i, 'value', data.elements[i].value)
if data.elements[i].selected then
menu.setElement(i, 'selected', true)
else
menu.setElement(i, 'selected', false)
end
end
if menu.change ~= nil then
menu.change(data, menu)
end
cb('OK')
end)
Citizen.CreateThread(function()
while true do
Citizen.Wait(15)
if IsControlPressed(0, 18) and IsInputDisabled(0) and (GetGameTimer() - GUI.Time) > 150 then
SendNUIMessage({action = 'controlPressed', control = 'ENTER'})
GUI.Time = GetGameTimer()
end
if IsControlPressed(0, 177) and IsInputDisabled(0) and (GetGameTimer() - GUI.Time) > 150 then
SendNUIMessage({action = 'controlPressed', control = 'BACKSPACE'})
GUI.Time = GetGameTimer()
end
if IsControlPressed(0, 27) and IsInputDisabled(0) and (GetGameTimer() - GUI.Time) > 200 then
SendNUIMessage({action = 'controlPressed', control = 'TOP'})
GUI.Time = GetGameTimer()
end
if IsControlPressed(0, 173) and IsInputDisabled(0) and (GetGameTimer() - GUI.Time) > 200 then
SendNUIMessage({action = 'controlPressed', control = 'DOWN'})
GUI.Time = GetGameTimer()
end
if IsControlPressed(0, 174) and IsInputDisabled(0) and (GetGameTimer() - GUI.Time) > 150 then
SendNUIMessage({action = 'controlPressed', control = 'LEFT'})
GUI.Time = GetGameTimer()
end
if IsControlPressed(0, 175) and IsInputDisabled(0) and (GetGameTimer() - GUI.Time) > 150 then
SendNUIMessage({action = 'controlPressed', control = 'RIGHT'})
GUI.Time = GetGameTimer()
end
end
end)
end)
exports('GetMenu', function()
return ESXMenu
end)
function GetMenu()
return ESXMenu
end