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
| Option | Type | Default | Description |
|---|---|---|---|
DevMode | boolean | false | Enables 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"
| Option | Default | Opens | Who may use it |
|---|---|---|---|
Command | creatorpanel | The main panel with factions, members and teleport | Creators |
MenuCommand | creatormenu | The quick menu for noclip, nametags, killfeed, Aduty … | Creators |
CreatorCommand | creator | The creator management | Admins 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 = "",
},
}
| Field | Description |
|---|---|
description | The label shown in FiveM → Settings → Key Bindings → FiveM |
key | The 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"
| Option | Where it appears |
|---|---|
Title | Large heading in the panel header — put your server name here |
Subtitle | Smaller line underneath the title |
ListLabel | Heading above the faction list in the sidebar |
MenuTitle | Heading of the quick menu |
MenuFooter | Control hints at the bottom of the quick menu |
Member list
CreatorPanel.ShowOfflineMembers = true
| Option | Type | Default | Description |
|---|---|---|---|
ShowOfflineMembers | boolean | true | true 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,
}
| Option | Type | Default | Description |
|---|---|---|---|
requireNoclip | boolean | true | Only 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 |
heightOffset | number | 1.0 | Metres 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,
}
| Option | Type | Default | Description |
|---|---|---|---|
duration | seconds | 8 | How long a single kill entry stays on screen |
maxEntries | number | 8 | Maximum number of entries visible at the same time; older ones drop off |
position | table | { 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 |
ranges | table | { 50, 150, 300, 500 } | The quick-select radius buttons, in metres |
defaultRange | metres | 150 | Radius a creator starts with |
minRange / maxRange | metres | 10 / 2000 | Bounds 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,
}
| Option | Type | Default | Description |
|---|---|---|---|
enabled | boolean | false | When 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 |
includeAdmins | boolean | false | false 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,
},
| Option | Type | Default | Description |
|---|---|---|---|
allowed | boolean | true | Master switch. With false, noclip is unavailable and the attempt is answered with Locales.notify.noclipDenied |
speed | number | 14.0 | Base movement speed of the free camera |
sprintMultiplier | number | 3.0 | Multiplier applied while the sprint key is held (14.0 × 3.0 = 42.0) |
If
Teleport.requireNoclipis enabled, turningallowedoff also disables teleporting in practice.
Nametags
nametags = {
hpOwnFactionOnly = false,
ranges = { 25, 50, 100, 150 },
defaultRange = 150,
colours = {
neutral = 0,
alive = 18,
dead = 6,
},
},
| Option | Type | Default | Description |
|---|---|---|---|
hpOwnFactionOnly | boolean | false | true shows HP values only for players in the creator's own faction; everyone else keeps name and status but no HP |
ranges | table | { 25, 50, 100, 150 } | Selectable draw distances in metres |
defaultRange | metres | 150 | Draw distance a creator starts with |
colours | table | see below | GTA HUD colour indices used for the tag |
The three colours use GTA's built-in HUD colour list:
| Key | Default | Colour | Used for |
|---|---|---|---|
neutral | 0 | Pure white | Normal state / no status information |
alive | 18 | Green | Player is alive |
dead | 6 | Red | Player 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.
| Group | Keys |
|---|---|
| Components | mask, arms, pants, bags, shoes, chain, tshirt, bproof, decals, torso |
| Props | helmet, 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:
| Group | Covers |
|---|---|
panel | The main panel: search fields, sort buttons, column headers, statistics, killfeed and nametag controls |
nametag | Labels inside a floating nametag |
killfeed | Killfeed wording, e.g. the label for the creator themselves |
creators | The /creator management window — tabs, columns, form fields, buttons, duration units |
notify | Every notification sent through CreatorPanel.Notify |
Some notification strings contain a placeholder that is filled in at runtime:
| String | Placeholder |
|---|---|
killfeedRange | %s → the selected radius in metres |
killfeedInvalid | Two %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.