Skip to content

Admin Menu: config files ​

These files stay readable in every build (escrow too), so you can change them. Shown as shipped in version 1.0.3.

config.lua ​

lua
Config = {}

-- Debug prints in the server and client console (dependency checks, callbacks).
Config.Debug = false

-- 'auto' detects qbx_core > qb-core > es_extended > standalone.
-- Force one with 'qbx', 'qb', 'esx' or 'standalone'.
Config.Framework = 'auto'

-- Language file in locales/ (en ships; copy it to add your own).
Config.Locale = 'en'

-- Shown on kick and ban screens. Empty = QBCore's QBConfig.Server.Discord.
Config.DiscordLink = ''

-- ── Opening the menu ──────────────────────────────────────────────────────────
Config.OpenMenuCommand = 'adminmenu'
Config.OpenMenuAliases = { 'admin' }          -- extra chat commands that open it
Config.OpenMenuKey = 'F10'                    -- players can rebind in Settings > Key Bindings
Config.OpenMenuKeyDescription = 'Open Admin Menu'

-- Match lumo-ui's HUD preset: Circle gives the menu its white Circle theme.
-- Needs lumo-ui; without it the menu always uses the lime theme.
Config.FollowHudPreset = false

-- Chat commands. Rename any of them, or set false to leave one out (ESX already
-- has /noclip and /coords, for example; a later resource replaces an earlier
-- command of the same name).
Config.Commands = {
    report = 'report',                        -- everyone: /report <message>
    reportReply = 'reportr',                  -- /reportr <id> <message>
    reportToggle = 'reporttoggle',            -- stop / start receiving reports
    staffChat = 'staffchat',
    announce = 'announce',
    warn = 'warn',                            -- /warn <id> <reason>
    warnings = 'warnings',                    -- /warnings <id>
    delWarn = 'delwarn',                      -- /delwarn <warning number>
    kickAll = 'kickall',
    noclip = 'noclip',
    coords = 'coords',
    blips = 'blips',
    names = 'names',
    adminCar = 'admincar',
    maxMods = 'maxmods',
    setModel = 'setmodel',
    setSpeed = 'setspeed',
    setAmmo = 'setammo',
    restoreAppearance = 'restoreappearance',
    fixAll = 'fixall',
    reviveAll = 'reviveall',
    deleteGun = 'deletegun',
    vector2 = 'vector2',
    vector3 = 'vector3',
    vector4 = 'vector4',
    heading = 'heading',
}

-- ── Staff ranks ───────────────────────────────────────────────────────────────
-- Highest first. A player has a rank when ANY of these is true:
--   * the ACE `lumoadmin.<rank>` is allowed   (add_ace group.admin lumoadmin.admin allow)
--   * one of `aces` is allowed                 (QBCore 'admin', Qbox 'group.admin', ...)
--   * their ESX group maps to it in Config.ESXGroups
--   * it was saved from the menu's Permission Manager
-- Anyone allowed the plain `command` ACE counts as the top rank.
Config.Ranks = {
    { name = 'god',   label = 'God',   aces = { 'god', 'group.god' } },
    { name = 'admin', label = 'Admin', aces = { 'admin', 'group.admin' } },
    { name = 'staff', label = 'Staff', aces = { 'staff', 'mod', 'group.mod' } },
}

-- ESX group -> rank above.
Config.ESXGroups = {
    superadmin = 'god',
    admin = 'admin',
    mod = 'staff',
    moderator = 'staff',
}

-- Lowest rank that may open the menu.
Config.OpenMenuRank = 'staff'

-- Lowest rank for each action. Ranks inherit downwards (god can do admin things).
Config.ActionPermissions = {
    kill = 'admin',
    revive = 'staff',
    freeze = 'staff',
    spectate = 'staff',
    ['goto'] = 'staff',
    bring = 'staff',
    intovehicle = 'staff',
    inventory = 'admin',
    clothing = 'staff',
    heal = 'staff',
    armor = 'staff',
    kick = 'staff',
    ban = 'staff',
    warn = 'staff',
    privatemessage = 'staff',
    giveitem = 'admin',
    giveweapon = 'admin',
    clearinv = 'admin',
    setjob = 'admin',
    setmoney = 'admin',
    bankfreeze = 'admin',
    jail = 'admin',
    communityservice = 'admin',
    fun = 'admin',
    noclip = 'admin',
    announce = 'admin',
    weather = 'admin',
    spawnvehicle = 'admin',
    admincar = 'god',
    kickall = 'god',
    server_restart = 'staff',
    resource_restart = 'admin',
    config_editor = 'god',
    manage_perms = 'god',
    objects = 'admin',
    reports = 'staff',                        -- see and answer report tickets
    teleport = 'staff',                       -- teleport a player to a place or another player
    mute = 'staff',                           -- voice mute (pma-voice / mumble)
    clear_chat = 'staff',
    logs = 'admin',                           -- read the audit log
    unban = 'admin',
    setgang = 'admin',
    givevehicle = 'admin',                    -- put a vehicle into a player's garage
    vehicle_cleanup = 'admin',                -- delete every empty vehicle after a countdown
    restart_warning = 'god',                  -- restart countdown announcements
}

-- Teleport list on the Self page and in the player teleport picker.
Config.TeleportLocations = {
    { label = 'Legion Square', coords = vector4(195.17, -933.77, 30.69, 144.5) },
    { label = 'Mission Row PD', coords = vector4(428.23, -984.28, 29.76, 3.5) },
    { label = 'Pillbox Hospital', coords = vector4(298.67, -584.48, 43.26, 70.0) },
    { label = 'LS Airport', coords = vector4(-1037.51, -2737.62, 20.17, 330.0) },
    { label = 'Sandy Shores', coords = vector4(1853.45, 3686.21, 34.27, 210.0) },
    { label = 'Paleto Bay', coords = vector4(-448.17, 6013.27, 31.72, 315.0) },
    { label = 'Mount Chiliad', coords = vector4(501.77, 5604.53, 797.91, 175.0) },
    { label = 'Maze Bank Tower', coords = vector4(-75.02, -818.22, 326.18, 0.0) },
}

-- Report tickets (/report). Kept in memory; the newest `keep` survive.
Config.Reports = {
    keep = 100,
}

-- Restart countdown: announcements at these minutes left. With quitAtZero the
-- server shuts down at 0 (txAdmin then restarts it); otherwise it only warns.
Config.RestartWarning = {
    announceAt = { 30, 15, 10, 5, 3, 1 },
    quitAtZero = false,
}

-- Vehicle cleanup: seconds of warning before empty vehicles are deleted.
Config.VehicleCleanup = {
    warnSeconds = 30,
}

-- Save staff ranks to the database from the menu (Players > Permissions).
Config.PermissionManager = {
    enabled = true,
    requiredRank = 'god',
    identifierType = 'license',               -- which identifier a saved rank follows
}

-- ── Logs ──────────────────────────────────────────────────────────────────────
-- Discord webhooks are read from server.cfg so they never sit in a file you
-- might share:
--   set lumo_admin_webhook_high "https://discord.com/api/webhooks/..."   # bans, ranks, money, items
--   set lumo_admin_webhook      "https://discord.com/api/webhooks/..."   # kicks, teleports, announcements
-- With neither set, logs go to qb-log when it runs, otherwise the console.
Config.Logs = {
    username = 'Admin Log',
    footer = 'Lumo Admin',
    console = true,
    database = true,                          -- keep every entry in lumo_admin_logs (Logs page)
}

-- ── Bans & warnings ───────────────────────────────────────────────────────────
Config.Bans = {
    -- Check lumo_admin_bans when players connect. Leave on unless another
    -- resource already enforces these bans.
    enforce = true,
    -- Also write bans into the framework's own table (QBCore/Qbox `bans`) so
    -- its tools see them too.
    mirrorFrameworkTable = true,
    -- Ban anyone who fires an admin event without the rank for it.
    banOnExploit = true,
    -- Tell the whole server in chat when someone is banned.
    announce = true,
}

Config.BanLengths = {
    { label = '1 Hour', value = 3600 },
    { label = '6 Hours', value = 21600 },
    { label = '12 Hours', value = 43200 },
    { label = '1 Day', value = 86400 },
    { label = '3 Days', value = 259200 },
    { label = '1 Week', value = 604800 },
    { label = '1 Month', value = 2678400 },
    { label = '3 Months', value = 8035200 },
    { label = '6 Months', value = 16070400 },
    { label = '1 Year', value = 32140800 },
    { label = 'Permanent', value = 0 },
}

-- ── Announcements & fun actions ───────────────────────────────────────────────
Config.Announcements = {
    maxLength = 280,
    displayMs = 9000,
    cooldownMs = 1200,
    senderName = '',                          -- empty = sv_projectName
    showSender = false,
}

Config.FunActions = {
    cooldownMs = 900,
    syncRadius = 120.0,
}

-- ── Config editor ─────────────────────────────────────────────────────────────
-- Lets the listed identifiers read and overwrite config.lua files of running
-- resources from the menu. Powerful: off by default, identifiers only.
Config.ConfigEditor = {
    enabled = false,
    access = {
        -- 'license:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
    },
}

-- ── Integrations ──────────────────────────────────────────────────────────────
-- 'auto' picks the first running resource it knows; 'none' switches a feature
-- off; or name one resource. Any entry can be a table with your own functions
-- instead, e.g. revive = { provider = 'custom', server = function(target) ... end }.
Config.Integrations = {
    -- lumo-inventory, ox_inventory, qb-inventory, qs-inventory, ESX built-in
    inventory = 'auto',
    -- give-item checks the name exists in the framework's item list first
    validateItems = true,
    -- qbx_medical, qb-ambulancejob, esx_ambulancejob, wasabi_ambulance, else a native revive
    revive = 'auto',
    -- sn_appearance, lumo-clothing, illenium-appearance, fivem-appearance, qb-clothing, esx_skin
    clothing = 'auto',
    -- qb-weathersync, Renewed-Weathersync, cd_easytime, vSync, else a native broadcast
    weather = 'auto',
    -- qbx_vehiclekeys, qb-vehiclekeys, wasabi_carlock, qs-vehiclekeys
    vehicleKeys = 'auto',
    -- ox_fuel, cdn-fuel, LegacyFuel, ps-fuel, qb-fuel, lj-fuel, else the native fuel level
    fuel = 'auto',
    -- qb-prison / qbx_prison (jail time in months); 'none' hides jail tools
    jail = 'auto',
    -- object_gizmo (free, GPLv3, install it yourself) for the Object Mapper
    gizmo = 'auto',

    -- Server-specific extras. Each only shows when its resource runs.
    communityService = { enabled = false, resource = 'doj-extras' },
    bankFreeze = { enabled = false, resource = 'qb-banking' },
    dealers = { enabled = false, resource = 'qb-drugs' },
    raceAccess = { enabled = false, resource = 'qb-lapraces' },
    lumoCoins = { enabled = false, resource = 'lumo-phone' },
}