Main/resources/[qb]/qb-adminmenu/client/client.lua

1256 lines
39 KiB
Lua
Raw Normal View History

2025-06-07 08:51:21 +02:00
local banlength = nil
local developermode = false
local showCoords = false
local vehicleDevMode = false
local banreason = 'Unknown'
local kickreason = 'Unknown'
local menuLocation = 'topright' -- e.g. topright (default), topleft, bottomright, bottomleft
-- Main Menus
local menu1 = MenuV:CreateMenu(false, Lang:t('menu.admin_menu'), menuLocation, 220, 20, 60, 'size-125', 'none', 'menuv', 'test1')
local menu2 = MenuV:CreateMenu(false, Lang:t('menu.admin_options'), menuLocation, 220, 20, 60, 'size-125', 'none', 'menuv', 'test2')
local menu3 = MenuV:CreateMenu(false, Lang:t('menu.manage_server'), menuLocation, 220, 20, 60, 'size-125', 'none', 'menuv', 'test3')
local menu4 = MenuV:CreateMenu(false, Lang:t('menu.online_players'), menuLocation, 220, 20, 60, 'size-125', 'none', 'menuv', 'test4')
local menu5 = MenuV:CreateMenu(false, Lang:t('menu.vehicle_options'), menuLocation, 220, 20, 60, 'size-125', 'none', 'menuv', 'test5')
local menu6 = MenuV:CreateMenu(false, Lang:t('menu.dealer_list'), menuLocation, 220, 20, 60, 'size-125', 'none', 'menuv', 'test6')
local menu7 = MenuV:CreateMenu(false, Lang:t('menu.developer_options'), menuLocation, 220, 20, 60, 'size-125', 'none', 'menuv', 'test7')
--Sub Menus
local menu8 = MenuV:CreateMenu(false, Lang:t('menu.weather_conditions'), menuLocation, 220, 20, 60, 'size-125', 'none', 'menuv', 'test8')
local menu9 = MenuV:CreateMenu(false, Lang:t('menu.ban'), menuLocation, 220, 20, 60, 'size-125', 'none', 'menuv', 'test9')
local menu10 = MenuV:CreateMenu(false, Lang:t('menu.kick'), menuLocation, 220, 20, 60, 'size-125', 'none', 'menuv', 'test10')
local menu11 = MenuV:CreateMenu(false, Lang:t('menu.permissions'), menuLocation, 220, 20, 60, 'size-125', 'none', 'menuv', 'test11')
local menu12 = MenuV:CreateMenu(false, Lang:t('menu.vehicle_categories'), menuLocation, 220, 20, 60, 'size-125', 'none', 'menuv', 'test12')
local menu13 = MenuV:CreateMenu(false, Lang:t('menu.vehicle_models'), menuLocation, 220, 20, 60, 'size-125', 'none', 'menuv', 'test13')
local menu14 = MenuV:CreateMenu(false, Lang:t('menu.entity_view_options'), menuLocation, 220, 20, 60, 'size-125', 'none', 'menuv', 'test14')
local menu15 = MenuV:CreateMenu(false, Lang:t('menu.spawn_weapons'), menuLocation, 220, 20, 60, 'size-125', 'none', 'menuv', 'test15')
RegisterNetEvent('qb-admin:client:openMenu', function()
QBCore.Functions.TriggerCallback('qb-admin:isAdmin', function(isAdmin)
if not isAdmin then return end
MenuV:OpenMenu(menu1)
end)
end)
--[[
Main menu buttons
--]]
-- Admin options
menu1:AddButton({
icon = '😃',
label = Lang:t('menu.admin_options'),
value = menu2,
description = Lang:t('desc.admin_options_desc')
})
--player management
local player_management = menu1:AddButton({
icon = '🙍‍♂️',
label = Lang:t('menu.player_management'),
value = menu4,
description = Lang:t('desc.player_management_desc')
})
--server management
menu1:AddButton({
icon = '🎮',
label = Lang:t('menu.server_management'),
value = menu3,
description = Lang:t('desc.server_management_desc')
})
--vehicle spawner
menu1:AddButton({
icon = '🚗',
label = Lang:t('menu.vehicles'),
value = menu5,
description = Lang:t('desc.vehicles_desc')
})
--dealer list
local menu1_dealer_list = menu1:AddButton({
icon = '💊',
label = Lang:t('menu.dealer_list'),
value = menu6,
description = Lang:t('desc.dealer_desc')
})
--developer options
menu1:AddButton({
icon = '🔧',
label = Lang:t('menu.developer_options'),
value = menu7,
description = Lang:t('desc.developer_desc')
})
--[[
Sub Menus for the above main menu's
--]]
-- Admin Options Menu Buttons
local menu2_admin_noclip = menu2:AddCheckbox({
icon = '🎥',
label = Lang:t('menu.noclip'),
value = nil,
description = Lang:t('desc.noclip_desc')
})
local menu2_admin_revive = menu2:AddButton({
icon = '🏥',
label = Lang:t('menu.revive'),
value = 'revive',
description = Lang:t('desc.revive_desc')
})
local menu2_admin_invisible = menu2:AddCheckbox({
icon = '👻',
label = Lang:t('menu.invisible'),
value = nil,
description = Lang:t('desc.invisible_desc')
})
local menu2_admin_god_mode = menu2:AddCheckbox({
icon = '',
label = Lang:t('menu.god'),
value = nil,
description = Lang:t('desc.god_desc')
})
local menu2_admin_display_names = menu2:AddCheckbox({
icon = '📋',
label = Lang:t('menu.names'),
value = nil,
description = Lang:t('desc.names_desc')
})
local menu2_admin_display_blips = menu2:AddCheckbox({
icon = '📍',
label = Lang:t('menu.blips'),
value = nil,
description = Lang:t('desc.blips_desc')
})
--give weapons
menu2:AddButton({
icon = '🎁',
label = Lang:t('menu.spawn_weapons'),
value = menu15,
description = Lang:t('desc.spawn_weapons_desc')
})
-- Server Options Menu Buttons
local menu3_server_weather = menu3:AddButton({
icon = '🌡️',
label = Lang:t('menu.weather_options'),
value = menu8,
description = Lang:t('desc.weather_desc')
})
local menu3_server_time = menu3:AddSlider({
icon = '⏲️',
label = Lang:t('menu.server_time'),
value = GetClockHours(),
values = { {
label = '00',
value = '00',
description = Lang:t('menu.time')
}, {
label = '01',
value = '01',
description = Lang:t('menu.time')
}, {
label = '02',
value = '02',
description = Lang:t('menu.time')
}, {
label = '03',
value = '03',
description = Lang:t('menu.time')
}, {
label = '04',
value = '04',
description = Lang:t('menu.time')
}, {
label = '05',
value = '05',
description = Lang:t('menu.time')
}, {
label = '06',
value = '06',
description = Lang:t('menu.time')
}, {
label = '07',
value = '07',
description = Lang:t('menu.time')
}, {
label = '08',
value = '08',
description = Lang:t('menu.time')
}, {
label = '09',
value = '09',
description = Lang:t('menu.time')
}, {
label = '10',
value = '10',
description = Lang:t('menu.time')
}, {
label = '11',
value = '11',
description = Lang:t('menu.time')
}, {
label = '12',
value = '12',
description = Lang:t('menu.time')
}, {
label = '13',
value = '13',
description = Lang:t('menu.time')
}, {
label = '14',
value = '14',
description = Lang:t('menu.time')
}, {
label = '15',
value = '15',
description = Lang:t('menu.time')
}, {
label = '16',
value = '16',
description = Lang:t('menu.time')
}, {
label = '17',
value = '17',
description = Lang:t('menu.time')
}, {
label = '18',
value = '18',
description = Lang:t('menu.time')
}, {
label = '19',
value = '19',
description = Lang:t('menu.time')
}, {
label = '20',
value = '20',
description = Lang:t('menu.time')
}, {
label = '21',
value = '21',
description = Lang:t('menu.time')
}, {
label = '22',
value = '22',
description = Lang:t('menu.time')
}, {
label = '23',
value = '23',
description = Lang:t('menu.time')
} }
})
-- Vehicle Spawner Menu Buttons
local menu5_vehicles_spawn = menu5:AddButton({
icon = '🚗',
label = Lang:t('menu.spawn_vehicle'),
value = menu12,
description = Lang:t('desc.spawn_vehicle_desc')
})
local menu5_vehicles_fix = menu5:AddButton({
icon = '🔧',
label = Lang:t('menu.fix_vehicle'),
value = 'fix',
description = Lang:t('desc.fix_vehicle_desc')
})
local menu5_vehicles_buy = menu5:AddButton({
icon = '💲',
label = Lang:t('menu.buy'),
value = 'buy',
description = Lang:t('desc.buy_desc')
})
local menu5_vehicles_remove = menu5:AddButton({
icon = '🗑️',
label = Lang:t('menu.remove_vehicle'),
value = 'remove',
description = Lang:t('desc.remove_vehicle_desc')
})
local menu5_vehicles_max_upgrades = menu5:AddButton({
icon = '⚡️',
label = Lang:t('menu.max_mods'),
value = 'maxmods',
description = Lang:t('desc.max_mod_desc')
})
-- Developer Options Menu Buttons
local menu7_dev_copy_vec3 = menu7:AddButton({
icon = '📋',
label = Lang:t('menu.copy_vector3'),
value = 'coords',
description = Lang:t('desc.vector3_desc')
})
local menu7_dev_copy_vec4 = menu7:AddButton({
icon = '📋',
label = Lang:t('menu.copy_vector4'),
value = 'coords',
description = Lang:t('desc.vector4_desc')
})
local menu7_dev_copy_heading = menu7:AddButton({
icon = '📋',
label = Lang:t('menu.copy_heading'),
value = 'heading',
description = Lang:t('desc.copy_heading_desc')
})
local menu7_dev_toggle_coords = menu7:AddCheckbox({
icon = '📍',
label = Lang:t('menu.display_coords'),
value = nil,
description = Lang:t('desc.display_coords_desc')
})
local menu7_dev_vehicle_mode = menu7:AddCheckbox({
icon = '🚘',
label = Lang:t('menu.vehicle_dev_mode'),
value = nil,
description = Lang:t('desc.vehicle_dev_mode_desc')
})
local menu7_dev_info_mode = menu7:AddCheckbox({
icon = '',
label = Lang:t('menu.hud_dev_mode'),
value = nil,
description = Lang:t('desc.hud_dev_mode_desc')
})
local menu7_dev_noclip = menu7:AddCheckbox({
icon = '🎥',
label = Lang:t('menu.noclip'),
value = nil,
description = Lang:t('desc.noclip_desc')
})
--create dev entity view
menu7:AddButton({
icon = '🔍',
label = Lang:t('menu.entity_view_options'),
value = menu14,
description = Lang:t('desc.entity_view_desc')
})
--[[
QB Core Admin Menu button functions below.
--]]
--[[
General Functions
--]]
local function LocalInput(text, number, windows)
AddTextEntry('FMMC_MPM_NA', text)
DisplayOnscreenKeyboard(1, 'FMMC_MPM_NA', '', windows or '', '', '', '', number or 30)
while (UpdateOnscreenKeyboard() == 0) do
DisableAllControlActions(0)
Wait(0)
end
if (GetOnscreenKeyboardResult()) then
local result = GetOnscreenKeyboardResult()
return result
end
end
local function LocalInputInt(text, number, windows)
AddTextEntry('FMMC_MPM_NA', text)
DisplayOnscreenKeyboard(1, 'FMMC_MPM_NA', '', windows or '', '', '', '', number or 30)
while (UpdateOnscreenKeyboard() == 0) do
DisableAllControlActions(0)
Wait(0)
end
if (GetOnscreenKeyboardResult()) then
local result = GetOnscreenKeyboardResult()
return tonumber(result)
end
end
--[[
Admin Options functions
--]]
-- Toggle player name display
menu2_admin_display_names:On('change', function()
TriggerEvent('qb-admin:client:toggleNames')
end)
-- Toggle player blip display
menu2_admin_display_blips:On('change', function()
TriggerEvent('qb-admin:client:toggleBlips')
end)
-- Toggle NoClip
menu2_admin_noclip:On('change', function(_, _, _)
ToggleNoClip()
end)
-- Revive Self
menu2_admin_revive:On('select', function(_)
TriggerEvent('hospital:client:Revive', PlayerPedId())
end)
-- Invisible
local invisible = false
menu2_admin_invisible:On('change', function(_, _, _)
if not invisible then
invisible = true
SetEntityVisible(PlayerPedId(), false, 0)
else
invisible = false
SetEntityVisible(PlayerPedId(), true, 0)
end
end)
-- Godmode
local godmode = false
menu2_admin_god_mode:On('change', function(_, _, _)
godmode = not godmode
if godmode then
while godmode do
Wait(0)
SetPlayerInvincible(PlayerId(), true)
end
SetPlayerInvincible(PlayerId(), false)
end
end)
-- Weapons list
for _, v in pairs(QBCore.Shared.Weapons) do
menu15:AddButton({
icon = '🎁',
label = v.label,
value = v.value,
description = Lang:t('desc.spawn_weapons_desc'),
select = function(_)
TriggerServerEvent('qb-admin:giveWeapon', v.name)
QBCore.Functions.Notify(Lang:t('success.spawn_weapon'))
end
})
end
--[[
Player Management Options functions
--]]
-- Player List
local function OpenPermsMenu(permsply)
QBCore.Functions.TriggerCallback('qb-admin:server:getrank', function(rank)
if rank then
local selectedgroup = 'Unknown'
MenuV:OpenMenu(menu11)
menu11:ClearItems()
menu11:AddSlider({
icon = '',
label = 'Group',
value = 'user',
values = { {
label = 'User',
value = 'user',
description = 'Group'
}, {
label = 'Admin',
value = 'admin',
description = 'Group'
}, {
label = 'God',
value = 'god',
description = 'Group'
} },
change = function(_, newValue, _)
local vcal = newValue
if vcal == 1 then
selectedgroup = {}
selectedgroup[#selectedgroup + 1] = { rank = 'user', label = 'User' }
elseif vcal == 2 then
selectedgroup = {}
selectedgroup[#selectedgroup + 1] = { rank = 'admin', label = 'Admin' }
elseif vcal == 3 then
selectedgroup = {}
selectedgroup[#selectedgroup + 1] = { rank = 'god', label = 'God' }
end
end
})
menu11:AddButton({
icon = '',
label = Lang:t('info.confirm'),
value = 'giveperms',
description = 'Give the permission group',
select = function(_)
if selectedgroup ~= 'Unknown' then
TriggerServerEvent('qb-admin:server:setPermissions', permsply.id, selectedgroup)
QBCore.Functions.Notify(Lang:t('success.changed_perm'), 'success')
selectedgroup = 'Unknown'
else
QBCore.Functions.Notify(Lang:t('error.changed_perm_failed'), 'error')
end
end
})
else
MenuV:CloseMenu(menu1)
end
end)
end
local function OpenKickMenu(kickplayer)
MenuV:OpenMenu(menu10)
menu10:ClearItems()
menu10:AddButton({
icon = '',
label = Lang:t('info.reason'),
value = 'reason',
description = Lang:t('desc.kick_reason'),
select = function(_)
kickreason = LocalInput(Lang:t('desc.kick_reason'), 255)
end
})
menu10:AddButton({
icon = '',
label = Lang:t('info.confirm'),
value = 'kick',
description = Lang:t('desc.confirm_kick'),
select = function(_)
if kickreason ~= 'Unknown' then
TriggerServerEvent('qb-admin:server:kick', kickplayer, kickreason)
kickreason = 'Unknown'
else
QBCore.Functions.Notify(Lang:t('error.missing_reason'), 'error')
end
end
})
end
local function OpenBanMenu(banplayer)
MenuV:OpenMenu(menu9)
menu9:ClearItems()
menu9:AddButton({
icon = '',
label = Lang:t('info.reason'),
value = 'reason',
description = Lang:t('desc.ban_reason'),
select = function(_)
banreason = LocalInput(Lang:t('desc.ban_reason'), 255)
end
})
menu9:AddSlider({
icon = '⏲️',
label = Lang:t('info.length'),
value = '3600',
values = { {
label = Lang:t('time.onehour'),
value = '3600',
description = Lang:t('time.ban_length')
}, {
label = Lang:t('time.sixhour'),
value = '21600',
description = Lang:t('time.ban_length')
}, {
label = Lang:t('time.twelvehour'),
value = '43200',
description = Lang:t('time.ban_length')
}, {
label = Lang:t('time.oneday'),
value = '86400',
description = Lang:t('time.ban_length')
}, {
label = Lang:t('time.threeday'),
value = '259200',
description = Lang:t('time.ban_length')
}, {
label = Lang:t('time.oneweek'),
value = '604800',
description = Lang:t('time.ban_length')
}, {
label = Lang:t('time.onemonth'),
value = '2678400',
description = Lang:t('time.ban_length')
}, {
label = Lang:t('time.threemonth'),
value = '8035200',
description = Lang:t('time.ban_length')
}, {
label = Lang:t('time.sixmonth'),
value = '16070400',
description = Lang:t('time.ban_length')
}, {
label = Lang:t('time.oneyear'),
value = '32140800',
description = Lang:t('time.ban_length')
}, {
label = Lang:t('time.permanent'),
value = '99999999999',
description = Lang:t('time.ban_length')
}, {
label = Lang:t('time.self'),
value = 'self',
description = Lang:t('time.ban_length')
} },
select = function(_, newValue, _)
if newValue == 'self' then
banlength = LocalInputInt('Ban Length', 11)
else
banlength = newValue
end
end
})
menu9:AddButton({
icon = '',
label = Lang:t('info.confirm'),
value = 'ban',
description = Lang:t('desc.confirm_ban'),
select = function(_)
if banreason ~= 'Unknown' and banlength ~= nil then
TriggerServerEvent('qb-admin:server:ban', banplayer, banlength, banreason)
banreason = 'Unknown'
banlength = nil
else
QBCore.Functions.Notify(Lang:t('error.invalid_reason_length_ban'), 'error')
end
end
})
end
local function OpenPlayerMenus(player)
local Players = MenuV:CreateMenu(false, player.cid .. Lang:t('info.options'), menuLocation, 220, 20, 60, 'size-125', 'none', 'menuv') -- Players Sub Menu
Players:ClearItems()
MenuV:OpenMenu(Players)
local elements = {
[1] = {
icon = '💀',
label = Lang:t('menu.kill'),
value = 'kill',
description = Lang:t('menu.kill') .. ' ' .. player.cid
},
[2] = {
icon = '🏥',
label = Lang:t('menu.revive'),
value = 'revive',
description = Lang:t('menu.revive') .. ' ' .. player.cid
},
[3] = {
icon = '🥶',
label = Lang:t('menu.freeze'),
value = 'freeze',
description = Lang:t('menu.freeze') .. ' ' .. player.cid
},
[4] = {
icon = '👀',
label = Lang:t('menu.spectate'),
value = 'spectate',
description = Lang:t('menu.spectate') .. ' ' .. player.cid
},
[5] = {
icon = '➡️',
label = Lang:t('info.go_to'),
value = 'goto',
description = Lang:t('info.go_to') .. ' ' .. player.cid .. Lang:t('info.position')
},
[6] = {
icon = '⬅️',
label = Lang:t('menu.bring'),
value = 'bring',
description = Lang:t('menu.bring') .. ' ' .. player.cid .. ' ' .. Lang:t('info.your_position')
},
[7] = {
icon = '🚗',
label = Lang:t('menu.sit_in_vehicle'),
value = 'intovehicle',
description = Lang:t('desc.sit_in_veh_desc') .. ' ' .. player.cid .. ' ' .. Lang:t('desc.sit_in_veh_desc2')
},
[8] = {
icon = '🎒',
label = Lang:t('menu.open_inv'),
value = 'inventory',
description = Lang:t('info.open') .. ' ' .. player.cid .. Lang:t('info.inventories')
},
[9] = {
icon = '👕',
label = Lang:t('menu.give_clothing_menu'),
value = 'cloth',
description = Lang:t('desc.clothing_menu_desc') .. ' ' .. player.cid
},
[10] = {
icon = '🥾',
label = Lang:t('menu.kick'),
value = 'kick',
description = Lang:t('menu.kick') .. ' ' .. player.cid .. ' ' .. Lang:t('info.reason')
},
[11] = {
icon = '🚫',
label = Lang:t('menu.ban'),
value = 'ban',
description = Lang:t('menu.ban') .. ' ' .. player.cid .. ' ' .. Lang:t('info.reason')
},
[12] = {
icon = '🎟️',
label = Lang:t('menu.permissions'),
value = 'perms',
description = Lang:t('info.give') .. ' ' .. player.cid .. ' ' .. Lang:t('menu.permissions')
}
}
for _, v in ipairs(elements) do
Players:AddButton({
icon = v.icon,
label = ' ' .. v.label,
value = v.value,
description = v.description,
select = function(btn)
local values = btn.Value
if values ~= 'ban' and values ~= 'kick' and values ~= 'perms' then
TriggerServerEvent('qb-admin:server:' .. values, player)
elseif values == 'ban' then
OpenBanMenu(player)
elseif values == 'kick' then
OpenKickMenu(player)
elseif values == 'perms' then
OpenPermsMenu(player)
end
end
})
end
end
player_management:On('select', function(_)
menu4:ClearItems()
QBCore.Functions.TriggerCallback('test:getplayers', function(players)
for _, v in pairs(players) do
menu4:AddButton({
label = Lang:t('info.id') .. v['id'] .. ' | ' .. v['name'],
value = v,
description = Lang:t('info.player_name'),
select = function(btn)
local select = btn.Value -- get all the values from v!
OpenPlayerMenus(select) -- only pass what i select nothing else
end
}) -- WORKS
end
end)
end)
--[[
Server Options functions
--]]
-- Adjust weather on change
menu3_server_weather:On('select', function()
menu8:ClearItems()
local elements = {
[1] = {
icon = '☀️',
label = Lang:t('weather.extra_sunny'),
value = 'EXTRASUNNY',
description = Lang:t('weather.extra_sunny_desc')
},
[2] = {
icon = '☀️',
label = Lang:t('weather.clear'),
value = 'CLEAR',
description = Lang:t('weather.clear_desc')
},
[3] = {
icon = '☀️',
label = Lang:t('weather.neutral'),
value = 'NEUTRAL',
description = Lang:t('weather.neutral_desc')
},
[4] = {
icon = '🌁',
label = Lang:t('weather.smog'),
value = 'SMOG',
description = Lang:t('weather.smog_desc')
},
[5] = {
icon = '🌫️',
label = Lang:t('weather.foggy'),
value = 'FOGGY',
description = Lang:t('weather.foggy_desc')
},
[6] = {
icon = '',
label = Lang:t('weather.overcast'),
value = 'OVERCAST',
description = Lang:t('weather.overcast_desc')
},
[7] = {
icon = '☁️',
label = Lang:t('weather.clouds'),
value = 'CLOUDS',
description = Lang:t('weather.clouds_desc')
},
[8] = {
icon = '🌤️',
label = Lang:t('weather.clearing'),
value = 'CLEARING',
description = Lang:t('weather.clearing_desc')
},
[9] = {
icon = '☂️',
label = Lang:t('weather.rain'),
value = 'RAIN',
description = Lang:t('weather.rain_desc')
},
[10] = {
icon = '⛈️',
label = Lang:t('weather.thunder'),
value = 'THUNDER',
description = Lang:t('weather.thunder_desc')
},
[11] = {
icon = '❄️',
label = Lang:t('weather.snow'),
value = 'SNOW',
description = Lang:t('weather.snow_desc')
},
[12] = {
icon = '🌨️',
label = Lang:t('weather.blizzard'),
value = 'BLIZZARD',
description = Lang:t('weather.blizzed_desc')
},
[13] = {
icon = '❄️',
label = Lang:t('weather.light_snow'),
value = 'SNOWLIGHT',
description = Lang:t('weather.light_snow_desc')
},
[14] = {
icon = '🌨️',
label = Lang:t('weather.heavy_snow'),
value = 'XMAS',
description = Lang:t('weather.heavy_snow_desc')
},
[15] = {
icon = '🎃',
label = Lang:t('weather.halloween'),
value = 'HALLOWEEN',
description = Lang:t('weather.halloween_desc')
}
}
for _, v in ipairs(elements) do
menu8:AddButton({
icon = v.icon,
label = v.label,
value = v,
description = v.description,
select = function(btn)
local selection = btn.Value
TriggerServerEvent('qb-weathersync:server:setWeather', selection.value)
QBCore.Functions.Notify(Lang:t('weather.weather_changed', { value = selection.label }))
end
})
end
end)
-- Adjust time on change
menu3_server_time:On('select', function(_, value)
TriggerServerEvent('qb-weathersync:server:setTime', value, value)
QBCore.Functions.Notify(Lang:t('time.changed', { time = value }))
end)
--[[
Vehicle Spawner functions
--]]
-- Set vehicle Categories
local vehicles = {}
for k, v in pairs(QBCore.Shared.Vehicles) do
local category = v['category']
if vehicles[category] == nil then
vehicles[category] = {}
end
vehicles[category][k] = v
end
-- Car Categories
local function OpenCarModelsMenu(category)
menu13:ClearItems()
MenuV:OpenMenu(menu13)
for k, v in pairs(category) do
menu13:AddButton({
label = v['name'],
value = k,
description = 'Spawn ' .. v['name'],
select = function(_)
TriggerServerEvent('QBCore:CallCommand', 'car', { k })
end
})
end
end
menu5_vehicles_spawn:On('Select', function(_)
menu12:ClearItems()
for k, v in pairs(vehicles) do
menu12:AddButton({
label = QBCore.Shared.FirstToUpper(k),
value = v,
description = Lang:t('menu.category_name'),
select = function(btn)
local select = btn.Value
OpenCarModelsMenu(select)
end
})
end
end)
menu5_vehicles_fix:On('Select', function(_)
TriggerServerEvent('QBCore:CallCommand', 'fix', {})
end)
menu5_vehicles_buy:On('Select', function(_)
TriggerServerEvent('QBCore:CallCommand', 'admincar', {})
end)
menu5_vehicles_remove:On('Select', function(_)
TriggerServerEvent('QBCore:CallCommand', 'dv', {})
end)
menu5_vehicles_max_upgrades:On('Select', function(_)
TriggerServerEvent('QBCore:CallCommand', 'maxmods', {})
end)
--[[
Developer Options functions
--]]
local entity_view_distance = menu14:AddSlider({
icon = '📏',
label = Lang:t('menu.entity_view_distance'),
value = GetCurrentEntityViewDistance(),
values = { {
label = '5',
value = '5',
description = Lang:t('menu.entity_view_distance')
}, {
label = '10',
value = '10',
description = Lang:t('menu.entity_view_distance')
}, {
label = '15',
value = '15',
description = Lang:t('menu.entity_view_distance')
}, {
label = '20',
value = '20',
description = Lang:t('menu.entity_view_distance')
}, {
label = '25',
value = '25',
description = Lang:t('menu.entity_view_distance')
}, {
label = '30',
value = '30',
description = Lang:t('menu.entity_view_distance')
}, {
label = '35',
value = '35',
description = Lang:t('menu.entity_view_distance')
}, {
label = '40',
value = '40',
description = Lang:t('menu.entity_view_distance')
}, {
label = '45',
value = '45',
description = Lang:t('menu.entity_view_distance')
}, {
label = '50',
value = '50',
description = Lang:t('menu.entity_view_distance')
} }
})
local entity_view_copy_info = menu14:AddButton({
icon = '📋',
label = Lang:t('menu.entity_view_freeaim_copy'),
value = 'freeaimEntity',
description = Lang:t('desc.entity_view_freeaim_copy_desc')
})
local entity_view_freeaim = menu14:AddCheckbox({
icon = '🔫',
label = Lang:t('menu.entity_view_freeaim'),
value = nil,
description = Lang:t('desc.entity_view_freeaim_desc')
})
local entity_view_vehicle = menu14:AddCheckbox({
icon = '🚗',
label = Lang:t('menu.entity_view_vehicles'),
value = nil,
description = Lang:t('desc.entity_view_vehicles_desc')
})
local entity_view_ped = menu14:AddCheckbox({
icon = '🧍‍♂‍',
label = Lang:t('menu.entity_view_peds'),
value = nil,
description = Lang:t('desc.entity_view_peds_desc')
})
local entity_view_object = menu14:AddCheckbox({
icon = '📦',
label = Lang:t('menu.entity_view_objects'),
value = nil,
description = Lang:t('desc.entity_view_objects_desc')
})
menu7_dev_info_mode:On('change', function(_, _, _)
developermode = not developermode
TriggerEvent('qb-admin:client:ToggleDevmode')
if developermode then
SetPlayerInvincible(PlayerId(), true)
else
SetPlayerInvincible(PlayerId(), false)
end
end)
entity_view_freeaim:On('change', function(_, _, _)
ToggleEntityFreeView()
end)
local function CopyToClipboard(dataType)
local ped = PlayerPedId()
if dataType == 'coords2' then
local coords = GetEntityCoords(ped)
local x = QBCore.Shared.Round(coords.x, 2)
local y = QBCore.Shared.Round(coords.y, 2)
SendNUIMessage({
string = string.format('vector2(%s, %s)', x, y)
})
QBCore.Functions.Notify(Lang:t('success.coords_copied'), 'success')
elseif dataType == 'coords3' then
local coords = GetEntityCoords(ped)
local x = QBCore.Shared.Round(coords.x, 2)
local y = QBCore.Shared.Round(coords.y, 2)
local z = QBCore.Shared.Round(coords.z, 2)
SendNUIMessage({
string = string.format('vector3(%s, %s, %s)', x, y, z)
})
QBCore.Functions.Notify(Lang:t('success.coords_copied'), 'success')
elseif dataType == 'coords4' then
local coords = GetEntityCoords(ped)
local x = QBCore.Shared.Round(coords.x, 2)
local y = QBCore.Shared.Round(coords.y, 2)
local z = QBCore.Shared.Round(coords.z, 2)
local heading = GetEntityHeading(ped)
local h = QBCore.Shared.Round(heading, 2)
SendNUIMessage({
string = string.format('vector4(%s, %s, %s, %s)', x, y, z, h)
})
QBCore.Functions.Notify(Lang:t('success.coords_copied'), 'success')
elseif dataType == 'heading' then
local heading = GetEntityHeading(ped)
local h = QBCore.Shared.Round(heading, 2)
SendNUIMessage({
string = h
})
QBCore.Functions.Notify(Lang:t('success.heading_copied'), 'success')
elseif dataType == 'freeaimEntity' then
local entity = GetFreeAimEntity()
if entity then
local entityHash = GetEntityModel(entity)
local entityName = Entities[entityHash] or 'Unknown'
local entityCoords = GetEntityCoords(entity)
local entityHeading = GetEntityHeading(entity)
local entityRotation = GetEntityRotation(entity)
local x = QBCore.Shared.Round(entityCoords.x, 2)
local y = QBCore.Shared.Round(entityCoords.y, 2)
local z = QBCore.Shared.Round(entityCoords.z, 2)
local rotX = QBCore.Shared.Round(entityRotation.x, 2)
local rotY = QBCore.Shared.Round(entityRotation.y, 2)
local rotZ = QBCore.Shared.Round(entityRotation.z, 2)
local h = QBCore.Shared.Round(entityHeading, 2)
SendNUIMessage({
string = string.format('Model Name:\t%s\nModel Hash:\t%s\n\nHeading:\t%s\nCoords:\t\tvector3(%s, %s, %s)\nRotation:\tvector3(%s, %s, %s)', entityName, entityHash, h, x, y, z, rotX, rotY, rotZ)
})
QBCore.Functions.Notify(Lang:t('success.entity_copy'), 'success')
else
QBCore.Functions.Notify(Lang:t('error.failed_entity_copy'), 'error')
end
end
end
RegisterNetEvent('qb-admin:client:copyToClipboard', function(dataType)
CopyToClipboard(dataType)
end)
local function Draw2DText(content, font, colour, scale, x, y)
SetTextFont(font)
SetTextScale(scale, scale)
SetTextColour(colour[1], colour[2], colour[3], 255)
BeginTextCommandDisplayText('STRING')
SetTextDropShadow(0, 0, 0, 0, 255)
SetTextDropShadow()
SetTextEdge(4, 0, 0, 0, 255)
SetTextOutline()
AddTextComponentSubstringPlayerName(content)
EndTextCommandDisplayText(x, y)
end
local function ToggleShowCoordinates()
local x = 0.4
local y = 0.025
showCoords = not showCoords
CreateThread(function()
while showCoords do
local coords = GetEntityCoords(PlayerPedId())
local heading = GetEntityHeading(PlayerPedId())
local c = {}
c.x = QBCore.Shared.Round(coords.x, 2)
c.y = QBCore.Shared.Round(coords.y, 2)
c.z = QBCore.Shared.Round(coords.z, 2)
heading = QBCore.Shared.Round(heading, 2)
Wait(0)
Draw2DText(string.format('~w~' .. Lang:t('info.ped_coords') .. '~b~ vector4(~w~%s~b~, ~w~%s~b~, ~w~%s~b~, ~w~%s~b~)', c.x, c.y, c.z, heading), 4, { 66, 182, 245 }, 0.4, x + 0.0, y + 0.0)
end
end)
end
local function ToggleVehicleDeveloperMode()
local x = 0.4
local y = 0.888
vehicleDevMode = not vehicleDevMode
CreateThread(function()
while vehicleDevMode do
local ped = PlayerPedId()
Wait(0)
if IsPedInAnyVehicle(ped, false) then
local vehicle = GetVehiclePedIsIn(ped, false)
local netID = VehToNet(vehicle)
local hash = GetEntityModel(vehicle)
local modelName = GetLabelText(GetDisplayNameFromVehicleModel(hash))
local eHealth = GetVehicleEngineHealth(vehicle)
local bHealth = GetVehicleBodyHealth(vehicle)
Draw2DText(Lang:t('info.vehicle_dev_data'), 4, { 66, 182, 245 }, 0.4, x + 0.0, y + 0.0)
Draw2DText(string.format(Lang:t('info.ent_id') .. '~b~%s~s~ | ' .. Lang:t('info.net_id') .. '~b~%s~s~', vehicle, netID), 4, { 255, 255, 255 }, 0.4, x + 0.0, y + 0.025)
Draw2DText(string.format(Lang:t('info.model') .. '~b~%s~s~ | ' .. Lang:t('info.hash') .. '~b~%s~s~', modelName, hash), 4, { 255, 255, 255 }, 0.4, x + 0.0, y + 0.050)
Draw2DText(string.format(Lang:t('info.eng_health') .. '~b~%s~s~ | ' .. Lang:t('info.body_health') .. '~b~%s~s~', QBCore.Shared.Round(eHealth, 2), QBCore.Shared.Round(bHealth, 2)), 4, { 255, 255, 255 }, 0.4, x + 0.0, y + 0.075)
end
end
end)
end
RegisterNetEvent('qb-admin:client:ToggleCoords', function()
ToggleShowCoordinates()
end)
menu7_dev_copy_vec3:On('select', function()
CopyToClipboard('coords3')
end)
menu7_dev_copy_vec4:On('select', function()
CopyToClipboard('coords4')
end)
menu7_dev_copy_heading:On('select', function()
CopyToClipboard('heading')
end)
entity_view_copy_info:On('select', function()
CopyToClipboard('freeaimEntity')
end)
menu7_dev_vehicle_mode:On('change', function()
ToggleVehicleDeveloperMode()
end)
menu7_dev_noclip:On('change', function(_, _, _)
ToggleNoClip()
end)
menu7_dev_toggle_coords:On('change', function()
ToggleShowCoordinates()
end)
entity_view_distance:On('select', function(_, value)
SetEntityViewDistance(value)
QBCore.Functions.Notify(Lang:t('info.entity_view_distance', { distance = value }))
end)
entity_view_vehicle:On('change', function()
ToggleEntityVehicleView()
end)
entity_view_object:On('change', function()
ToggleEntityObjectView()
end)
entity_view_ped:On('change', function()
ToggleEntityPedView()
end)
--[[
Dealer List
--]]
local function OpenDealerMenu(dealer)
local EditDealer = MenuV:CreateMenu(false, Lang:t('menu.edit_dealer') .. dealer['name'], menuLocation, 220, 20, 60, 'size-125', 'none', 'menuv')
EditDealer:ClearItems()
MenuV:OpenMenu(EditDealer)
local elements = {
[1] = {
icon = '➡️',
label = Lang:t('info.go_to') .. ' ' .. dealer['name'],
value = 'goto',
description = Lang:t('desc.dealergoto_desc') .. ' ' .. dealer['name']
},
[2] = {
icon = '',
label = Lang:t('info.remove') .. ' ' .. dealer['name'],
value = 'remove',
description = Lang:t('desc.dealerremove_desc') .. ' ' .. dealer['name']
}
}
for _, v in ipairs(elements) do
EditDealer:AddButton({
icon = v.icon,
label = ' ' .. v.label,
value = v.value,
description = v.description,
select = function(btn)
local values = btn.Value
if values == 'goto' then
TriggerServerEvent('QBCore:CallCommand', 'dealergoto', { dealer['name'] })
elseif values == 'remove' then
TriggerServerEvent('QBCore:CallCommand', 'deletedealer', { dealer['name'] })
EditDealer:Close()
menu6:Close()
end
end
})
end
end
menu1_dealer_list:On('Select', function(_)
menu6:ClearItems()
QBCore.Functions.TriggerCallback('test:getdealers', function(dealers)
for _, v in pairs(dealers) do
menu6:AddButton({
label = v['name'],
value = v,
description = Lang:t('menu.dealer_name'),
select = function(btn)
local select = btn.Value
OpenDealerMenu(select)
end
})
end
end)
end)