Everything a server owner needs is in shared/config.lua. It is the only file left open in the escrowed resource. Game-feel values (movement, camera, painting, hunter weapon) are fixed on purpose and cannot be changed.
General
FRKN.Locale = 'en'
| Option | Description |
|---|---|
Locale | Language of the whole script: en, tr, de, fr, es, pt, it, nl, pl, ru, cs. Unknown codes fall back to English |
Match Rules
FRKN.Game = {
MinPainters = 1,
MinHunters = 1,
MaxPlayers = 10,
RequireReady = true,
LobbyIdleTimeout = 600,
LeaderboardFile = 'leaderboard.json',
LeaderboardLimit = 500,
DefaultMap = 'bennys',
EndDelay = 5,
Godmode = true,
BlindHunters = true,
MapLoadTime = 8,
OutOfBoundsGrace = 10
}
| Option | Description |
|---|---|
MinPainters / MinHunters | Players needed on each side before a match can start |
MaxPlayers | Players per lobby. Hard limit of 10 (there are 10 paint texture slots) |
RequireReady | The leader can only start once every player is ready |
LobbyIdleTimeout | An idle lobby closes after this many seconds. Does not apply during a match |
LeaderboardFile | File the leaderboard is saved to, inside the resource folder |
LeaderboardLimit | How many players the leaderboard keeps |
DefaultMap | Map used when a lobby is created without picking one |
EndDelay | Seconds the result screen stays up before everyone returns |
Godmode | Players cannot die or drown during a match |
BlindHunters | The hunter's screen is black while painters hide |
MapLoadTime | Seconds of loading screen after the teleport so the map can stream in. 0 turns it off |
OutOfBoundsGrace | Seconds a player may stay outside the arena before being eliminated |
Lobby Sliders
FRKN.LobbySettings = {
SearchTime = { Min = 60, Max = 600, Step = 30, Default = 300 },
HideTime = { Min = 10, Max = 180, Step = 10, Default = 60 },
Ammo = { Min = 1, Max = 250, Step = 1, Default = 30 },
Hunters = { Min = 1, Max = 9, Step = 1, Default = 1 },
Painters = { Min = 1, Max = 9, Step = 1, Default = 4 },
Reward = { Min = 0, Max = 100000, Step = 50, Default = 0 },
WhistleInterval = { Min = 20, Max = 90, Step = 5, Default = 45 }
}
Each entry controls one slider in the "Create Lobby" menu: its lowest value, highest value, step size and starting value.
| Option | Description |
|---|---|
SearchTime | How long hunters have to find everyone, in seconds |
HideTime | How long painters have to hide and paint, in seconds |
Ammo | Hunter ammo when the leader turns the ammo limit on |
Hunters / Painters | Team sizes. In Double mode, Painters is the players per team |
Reward | Entry fee per player |
WhistleInterval | Seconds between automatic whistles |
Entry Fee & Prize Pool
FRKN.Reward = {
Enabled = true,
Account = 'cash',
Min = 0,
Max = 100000,
Step = 50,
Default = 0,
PayEliminated = true
}
| Option | Description |
|---|---|
Enabled | false removes the entry fee option from the lobby menu |
Account | 'cash', 'bank', or an ESX account name |
PayEliminated | Caught players still get a share if their side wins |
The fee is taken from every player when the match starts and the pool is paid to the winning side. No money is created: if a match is cancelled or ends in a draw, everyone gets their fee back.
Team Radio
FRKN.Voice = {
Radio = true,
RadioBase = 6000,
EliminatedKeepRadio = false,
RadioDefault = true,
RadioKeyLabel = 'N'
}
| Option | Description |
|---|---|
Radio | false turns the team radio off completely |
RadioBase | First radio channel used. Every lobby gets its own channels starting here, so pick a range no other resource uses |
EliminatedKeepRadio | Caught players stay on the team radio while spectating |
RadioDefault | Starting position of the radio switch in the lobby menu |
RadioKeyLabel | Key shown on the HUD. Match it to your pma-voice radio key |
Requires pma-voice. If it is not running, the radio switch is hidden automatically.
Whistle
FRKN.Whistle = {
Enabled = true,
Key = 'B',
KeyLabel = 'B',
CooldownMs = 1200,
AutoDefault = true,
AutoInterval = 45,
OnlyWhileSearching = true,
Range = 42.0,
NearRange = 5.0,
Volume = 0.9,
OcclusionVolume = 0.55,
OcclusionFlags = 1,
RippleAudience = 'painters',
RippleDuration = 1500,
RippleColor = { r = 66, g = 216, b = 105 }
}
| Option | Description |
|---|---|
Enabled | false removes the whistle key and its lobby switch |
Key / KeyLabel | Default key and the label shown on the HUD |
CooldownMs | Milliseconds between two manual whistles |
AutoDefault | Starting position of the auto-whistle switch |
AutoInterval | Fallback interval in seconds (the lobby slider decides the real one) |
OnlyWhileSearching | No whistling while painters are still hiding |
Range / NearRange | Distance the whistle can be heard / distance it plays at full volume |
Volume / OcclusionVolume | Normal volume / volume when a wall is in the way |
OcclusionFlags | What counts as a wall: 1 = map geometry, 17 = also objects |
RippleAudience | Who sees the ripple on the ground: 'painters', 'all' or 'none' |
If you change Key, also tell your players: FiveM keeps each player's existing binding until they change it in the key settings.
Match Chat
FRKN.Chat = {
Enabled = true,
Key = 'Y',
KeyLabel = 'Y',
MaxLength = 120,
CooldownMs = 600,
ShowMs = 9000,
History = 40
}
| Option | Description |
|---|---|
Key / KeyLabel | Key that opens the chat box |
MaxLength | Characters per message |
CooldownMs | Milliseconds between two messages from the same player |
ShowMs | How long a message stays on screen while the chat box is closed |
History | Messages kept on screen while the chat box is open |
Death Markers
FRKN.DeathMarker = {
Enabled = true,
Audience = 'all',
Duration = 0,
DrawDistance = 45.0,
Radius = 0.42,
TextHeight = 0.55,
TextScale = 1.0,
Color = { r = 239, g = 68, b = 68 },
ShowKiller = true
}
| Option | Description |
|---|---|
Audience | Who sees the marker: 'all', 'painters' or 'hunters' |
Duration | Seconds the marker stays. 0 keeps it until the match ends |
DrawDistance | Metres past which the marker is not drawn |
Radius / TextHeight / TextScale | Size of the ring, height and size of the text |
ShowKiller | Shows which hunter made the catch |
Job NPC
FRKN.JobNpc = {
Enabled = true,
Coords = { x = -213.5340, y = -1333.4371, z = 30.8904, h = 0.7685 },
Model = 'as_big_idel_charactor_giant',
GunModel = 'as_mc_gun_prop_giant',
AnimDictionary = 'as_big_idel_charactor_giant@animation',
Scale = 3.0,
Height = 1.80,
Gun = true,
Animate = true,
GroundLift = 0.0,
TargetDistance = 2.5,
TargetIcon = 'fa-solid fa-paint-roller',
ReturnAfterDisconnect = true,
StreamDistance = 150.0,
Blip = { Enabled = true, Sprite = 1, Colour = 2, Scale = 0.8 }
}
| Option | Description |
|---|---|
Enabled | Keep this true: the NPC is the only way to open the lobby menu |
Coords | Where the NPC stands. h is the direction it faces |
Model / GunModel / AnimDictionary / Scale | The giant hunter character. Leave these as they are |
Height | How tall the NPC appears, in metres |
Gun / Animate | Give the NPC a gun / play the idle pose |
GroundLift | Raise the NPC if it sinks into the ground |
TargetDistance / TargetIcon | Interaction distance and icon for qb-target / ox_target |
ReturnAfterDisconnect | A player who disconnects during a match comes back next to the NPC, not inside the arena |
StreamDistance | The NPC spawns within this many metres |
Blip | Map blip settings |
Maps
FRKN.Maps = {
bennys = {
label = "Benny's Garage",
center = { x = -209.76, y = -1319.62, z = 30.08 },
radius = 40.0,
painters = {
{ x = -210.5457, y = -1322.8651, z = 30.8904, h = 129.7580 }
},
hunters = {
{ x = -210.5457, y = -1322.8651, z = 30.8904, h = 129.7580 }
},
doors = {
{ model = -427498890, x = -205.68, y = -1310.68, z = 30.3 }
}
},
...
}
| Option | Required | Description |
|---|---|---|
label | Yes | Name shown in the lobby menu |
center | Yes | Centre of the arena |
radius | Yes | Play area radius in metres. Players who stay outside it are eliminated |
painters / hunters | Yes | Spawn points (x, y, z, h). Add as many painter spawns as your largest painter team |
doors | No | Doors locked for the whole match (model name or hash + position) |
scale | No | 'half' makes everyone start as small characters on this map |
maxHeight | No | Ceiling above the centre, so nobody camps on the roof |
minHeight | No | Floor below the centre (negative). Players never fall under it |
interiorLock | No | Set to false for arenas that are not an MLO interior (prop shells) |
bounds | No | The building's box (min / max). If the camera leaves it, the view switches to first person so the outside is never shown |
Adding your own map: copy one of the existing entries, give it a new key, and set the centre, radius and spawn points. Stand at each spot in game and copy your coordinates. Add your map's doors to doors so nobody can leave the building during a match.
The three custom maps (artloft, modernpenthouse, modernloft) need their map resources (frkn-paintmap-1/2/3) to be running. If you remove a map resource, remove its entry from FRKN.Maps too.
Control Lock (advanced)
FRKN.ControlLock = {
Mode = 'all',
Allowed = { 245, 249, 19, 20, 244, 38, 74 }
}
| Option | Description |
|---|---|
Mode | 'all' blocks every GTA control while the painter character is active (cheapest), except the Allowed list. 'list' only blocks a fixed list and leaves everything else usable |
Allowed | Control IDs that stay usable in 'all' mode: chat, push-to-talk, ALT, Z, M, E, H |
If another script (phone, radio, emotes…) stops working while someone is a painter, add its control ID to Allowed.