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)