Config

config.lua is shared between client and server and holds everything a creator sees or uses: command names, keybinds, branding, the feature settings and every piece of text on screen.

General

CreatorPanel.DevMode = false
OptionTypeDefaultDescription
DevModebooleanfalseEnables developer helpers such as additional console output while you are testing the resource. Keep it false on a live server.

Commands

CreatorPanel.Command        = "creatorpanel"
CreatorPanel.MenuCommand    = "creatormenu"
CreatorPanel.CreatorCommand = "creator"
OptionDefaultOpensWho may use it
CommandcreatorpanelThe main panel with factions, members and teleportCreators
MenuCommandcreatormenuThe quick menu for noclip, nametags, killfeed, Aduty …Creators
CreatorCommandcreatorThe creator managementAdmins only — see Creator management

Enter the names without the leading slash. Pick names that do not collide with other resources on your server; if a command silently does nothing, another resource is almost always registering the same name.

Keybinds

CreatorPanel.Keybinds = {
    panel = {
        description = "Creator Panel öffnen",
        key = "",
    },
    menu = {
        description = "Creator Menü öffnen",
        key = "",
    },
}
FieldDescription
descriptionThe label shown in FiveM → Settings → Key Bindings → FiveM
keyThe default key, e.g. "F6" or "HOME". Leave it empty ("") to ship without a default binding and let every player choose their own key

Because these are real FiveM keybinds, a player can always rebind them in the game settings — the value here is only the default. Changing key later does not overwrite a binding a player has already set for themselves.

Branding and titles

CreatorPanel.Title      = "X-STUDIOS"
CreatorPanel.Subtitle   = "CREATORPANEL"
CreatorPanel.ListLabel  = "Fraktionen"
CreatorPanel.MenuTitle  = "CREATOR MENÜ"
CreatorPanel.MenuFooter = "↑/↓ oder Mausrad wählen · Enter bestätigen · Backspace schließen"
OptionWhere it appears
TitleLarge heading in the panel header — put your server name here
SubtitleSmaller line underneath the title
ListLabelHeading above the faction list in the sidebar
MenuTitleHeading of the quick menu
MenuFooterControl hints at the bottom of the quick menu

Member list

CreatorPanel.ShowOfflineMembers = true
OptionTypeDefaultDescription
ShowOfflineMembersbooleantruetrue lists every member of a faction and marks who is currently online; false shows only players who are connected right now

The three counters above the list (Mitglieder gesamt, Davon online, Davon am Leben) follow this setting.

Teleport

CreatorPanel.Teleport = {
    requireNoclip = true,
    heightOffset  = 1.0,
}
OptionTypeDefaultDescription
requireNoclipbooleantrueOnly allow teleporting while the creator is in noclip. This keeps creators from dropping into a scene on foot; with false they can teleport at any time
heightOffsetnumber1.0Metres added above the target's position on arrival, so the creator does not land inside the target ped

With requireNoclip = true, a teleport attempt outside of noclip is refused with Locales.notify.teleportNoclip, and the button in the panel shows the hint from Locales.panel.teleportHint.

Killfeed

CreatorPanel.Killfeed = {
    duration     = 8,
    maxEntries   = 8,
    position     = { x = 1.5, y = 22 },
    ranges       = { 50, 150, 300, 500 },
    defaultRange = 150,
    minRange     = 10,
    maxRange     = 2000,
}
OptionTypeDefaultDescription
durationseconds8How long a single kill entry stays on screen
maxEntriesnumber8Maximum number of entries visible at the same time; older ones drop off
positiontable{ x = 1.5, y = 22 }Starting position of the killfeed on screen, in percent of screen width and height. Creators can move it in-game via Kartenanzeige → Position ändern
rangestable{ 50, 150, 300, 500 }The quick-select radius buttons, in metres
defaultRangemetres150Radius a creator starts with
minRange / maxRangemetres10 / 2000Bounds for a manually typed radius. A value outside of them is rejected with Locales.notify.killfeedInvalid

Only kills that happen inside the selected radius around the creator are shown, which keeps the feed relevant during a stream instead of listing the whole server.

Live check

CreatorPanel.LiveCheck = {
    enabled       = false,
    includeAdmins = false,
}
OptionTypeDefaultDescription
enabledbooleanfalseWhen true, a creator may only use the panel while the Twitch or TikTok link stored for them is actually live. Otherwise they get Locales.notify.notLive
includeAdminsbooleanfalsefalse exempts admins from the live check so staff can always open the panel; true holds admins to the same rule

If a creator has no usable link on their entry, the check fails with Locales.notify.noLink. Add the link when you create the entry — see Creator management.

Features

Noclip

noclip = {
    allowed          = true,
    speed            = 14.0,
    sprintMultiplier = 3.0,
},
OptionTypeDefaultDescription
allowedbooleantrueMaster switch. With false, noclip is unavailable and the attempt is answered with Locales.notify.noclipDenied
speednumber14.0Base movement speed of the free camera
sprintMultipliernumber3.0Multiplier applied while the sprint key is held (14.0 × 3.0 = 42.0)

If Teleport.requireNoclip is enabled, turning allowed off also disables teleporting in practice.

Nametags

nametags = {
    hpOwnFactionOnly = false,

    ranges       = { 25, 50, 100, 150 },
    defaultRange = 150,

    colours = {
        neutral = 0,
        alive   = 18,
        dead    = 6,
    },
},
OptionTypeDefaultDescription
hpOwnFactionOnlybooleanfalsetrue shows HP values only for players in the creator's own faction; everyone else keeps name and status but no HP
rangestable{ 25, 50, 100, 150 }Selectable draw distances in metres
defaultRangemetres150Draw distance a creator starts with
colourstablesee belowGTA HUD colour indices used for the tag

The three colours use GTA's built-in HUD colour list:

KeyDefaultColourUsed for
neutral0Pure whiteNormal state / no status information
alive18GreenPlayer is alive
dead6RedPlayer is down

Any other index from that list works too — for example 12 for yellow or 9 for blue.

Aduty clothing

Aduty = {
    clothing = {
        male = {
            mask   = { 135, 7 },
            arms   = { 3, 7 },
            pants  = { 114, 7 },
            bags   = { 0, 7 },
            shoes  = { 78, 7 },
            chain  = { 0, 7 },
            tshirt = { 15, 7 },
            bproof = { 0, 7 },
            decals = { 0, 7 },
            torso  = { 287, 7 },
            props  = {
                helmet   = { -1, 0 },
                glasses  = { -1, 0 },
                ears     = { -1, 0 },
                watch    = { -1, 0 },
                bracelet = { -1, 0 },
            },
        },
        female = {
            -- same structure, separate values
        },
    },
},

Aduty is the outfit a creator switches into when they go on admin duty. There is one set per gender, and every entry is a pair of { drawable, texture } values — the same numbers your skin menu or clothing shop displays.

GroupKeys
Componentsmask, arms, pants, bags, shoes, chain, tshirt, bproof, decals, torso
Propshelmet, glasses, ears, watch, bracelet

Use { -1, 0 } on a prop to leave that slot empty, and { 0, 0 } on a component to reset it to the default. The quickest way to build your own outfit is to dress a character in your skin menu, write down the drawable and texture number of every component and copy them in here.

If a player's gender has no set defined, the switch is refused with Locales.notify.AdutyNoClothing.

Framework integration

The two functions at the bottom of config.lua are the only places where the resource talks to your framework. Replace their bodies and everything else keeps working.

CreatorPanel.Notify = function(type, message)
    local ok = pcall(function()
        local ESX = exports["es_extended"]:getSharedObject()

        ESX.ShowNotification(message, type, 5000)
    end)

    if ok then return end

    TriggerEvent("esx:showNotification", message, type, 5000)
end

CreatorPanel.Revive = function()
    TriggerEvent("esx_ambulancejob:revive")
end

Notify(type, message) is called for every string in Locales.notify. type is a notification type such as "success", "error" or "info", message is the finished text. The default implementation tries the ESX export first and falls back to the esx:showNotification event, so it works on older and newer ESX versions alike.

Examples for other setups:

-- ox_lib
CreatorPanel.Notify = function(type, message)
    exports.ox_lib:notify({ type = type, description = message })
end

-- QBCore
CreatorPanel.Notify = function(type, message)
    TriggerEvent("QBCore:Notify", message, type, 5000)
end

Revive() runs on the client when a creator uses the revive action. Point it at whatever your ambulance job listens to:

-- QBCore / qb-ambulancejob
CreatorPanel.Revive = function()
    TriggerServerEvent("hospital:server:RevivePlayer")
end

Locales

Every string a creator sees lives in CreatorPanel.Locales, grouped by where it appears:

GroupCovers
panelThe main panel: search fields, sort buttons, column headers, statistics, killfeed and nametag controls
nametagLabels inside a floating nametag
killfeedKillfeed wording, e.g. the label for the creator themselves
creatorsThe /creator management window — tabs, columns, form fields, buttons, duration units
notifyEvery notification sent through CreatorPanel.Notify

Some notification strings contain a placeholder that is filled in at runtime:

StringPlaceholder
killfeedRange%s → the selected radius in metres
killfeedInvalidTwo %s → minRange and maxRange
creatorSaved%s → the name of the player who was made a creator

Keep the placeholders in place and in the same order when you translate, otherwise the message renders incorrectly.

Switching the UI to English

The resource ships in German. Replacing the locale table is all it takes:

CreatorPanel.Title      = "X-STUDIOS"
CreatorPanel.Subtitle   = "CREATOR PANEL"
CreatorPanel.ListLabel  = "Factions"
CreatorPanel.MenuTitle  = "CREATOR MENU"
CreatorPanel.MenuFooter = "↑/↓ or mouse wheel to select · Enter to confirm · Backspace to close"

CreatorPanel.Locales = {

    panel = {
        search            = "Search name or ID...",
        jobSearch         = "Search faction...",
        sortId            = "ID",
        sortName          = "Name",
        sortHp            = "HP",
        sortTime          = "Time",
        sortDistance      = "Distance",
        columnName        = "Name",
        columnId          = "ID",
        columnHp          = "HP",
        columnGrade       = "Rank",
        teleport          = "Teleport",
        dead              = "Dead",
        teleportHint      = "Noclip only",
        noJob             = "No faction selected",
        loading           = "Loading members...",
        noMembers         = "No members",
        noMatch           = "No results",
        statTotal         = "Total members",
        statOnline        = "Online",
        statAlive         = "Alive",
        modeTime          = "Lifetime",
        modeHp            = "HP",
        modeDist          = "Distance",
        groupMode         = "Map display",
        groupNametag      = "Nametag",
        groupNametagRange = "Nametag range",
        groupKillfeed     = "Killfeed radius",
        killfeedPlace     = "Move position",
        killfeedPlaceDone = "Done",
    },

    nametag = {
        hp    = "HP",
        dist  = "Distance",
        job   = "Faction",
        alive = "Status",
    },

    killfeed = {
        self = "You",
    },

    creators = {
        title          = "CREATOR MANAGEMENT",
        tabList        = "Creator list",
        tabAdd         = "Add creator",
        columnName     = "Name",
        columnLink     = "Link",
        columnDuration = "Duration",
        fieldTarget    = "Server ID",
        fieldLink      = "Link",
        fieldDays      = "Duration in days",
        holderTarget   = "e.g. 1",
        holderLink     = "twitch.tv/name or tiktok.com/@name",
        holderDays     = "empty = permanent",
        add            = "Add",
        save           = "Save",
        reset          = "Reset",
        edit           = "Edit",
        remove         = "Remove",
        empty          = "No creators added yet",
        permanent      = "Permanent",
        expired        = "Expired",
        days           = "days",
        hours          = "hrs",
        minutes        = "min",
    },

    notify = {
        AdutyOn         = "Aduty enabled.",
        AdutyOff        = "Aduty disabled.",
        AdutyNoClothing = "No Aduty clothing is configured for your gender.",
        noclipOn        = "Noclip enabled.",
        noclipOff       = "Noclip disabled.",
        noclipDenied    = "Noclip is not unlocked for you.",
        killfeedOn      = "Killfeed enabled.",
        killfeedOff     = "Killfeed disabled.",
        killfeedRange   = "Killfeed radius: %sm.",
        killfeedInvalid = "The radius must be between %s and %s.",
        nametagsOn      = "Nametags enabled.",
        nametagsOff     = "Nametags disabled.",
        revived         = "You have been revived.",
        teleported      = "Teleported.",
        teleportNoclip  = "Teleporting only works in noclip.",
        teleportFailed  = "Player is not reachable.",
        noPermission    = "No permission.",
        noCreator       = "You are not a creator.",
        notAdmin        = "Only admins may open the creator management.",
        notLive         = "You are currently not live. Start your stream and try again.",
        noLink          = "No valid Twitch or TikTok link is stored for you.",
        creatorSaved    = "%s is now a creator.",
        creatorRemoved  = "Creator removed.",
        creatorMissing  = "Player not found.",
        creatorFailed   = "Saving failed.",
    },
}

The labels in CreatorPanel.Keybinds are not part of this table — translate them there as well.