1255 lines
		
	
	
	
		
			39 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			1255 lines
		
	
	
	
		
			39 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
| 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)
 | 
