Configuration
All settings live in the config/ files. The global values act as defaults: each arena can override them individually from the arena builder.
Framework & inventory
The framework is chosen with a single option. The resource then automatically adapts notifications, inventory, currencies and admin detection.
Config.Framework = "vorp" -- "vorp" | "rsg" | "auto"
Config.Inventory = "auto" -- "vorp" | "ox" | "rsg" | "auto""vorp"— VORP server (vorp_core)."rsg"— RSG server, QB-RedM style (rsg-core)."auto"— detects the running framework at launch (RSG takes priority if present, otherwise VORP).
Behaviours adapted per framework
| Aspect | VORP | RSG |
|---|---|---|
| Core | vorp_core | rsg-core |
| Notifications | native VORP tips | ox_lib |
| Default inventory | vorp_inventory | ox_inventory |
| Admin detection | admin group | admin / god permission, or ace |
| Available currencies | cash, gold, rol | cash, bank, crypto |
Decoupled inventory
Config.Inventory is intentionally separated from the framework, to cover mixed servers (e.g. a VORP server using ox_inventory).
| Value | Effect |
|---|---|
"vorp" | vorp_inventory |
"ox" | ox_inventory |
"rsg" | native rsg-inventory |
"auto" | VORP → vorp_inventory, RSG → ox_inventory |
Currencies: RSG has no native gold. If a "gold" currency is configured, it is treated as cash on RSG. See Betting for the
currencysetting.
Access & map
| Option | Effect |
|---|---|
Config.requiredJob | Jobs allowed to use the arena. Empty = everyone. |
Config.blipsName | Blip name shown on the map. |
Config.blipsArena | Blip sprite. |
Config.requiredJob = {} -- e.g. { "police", "boxer" }
Config.blipsName = "Arene de combat"
Config.blipsArena = "blip_ambient_bounty_hunter"Rewards
Payout multiplier applied based on the difficulty of the defeated opponent (Player vs NPC).
Config.Rewards = {
weak = 0.25,
average = 0.5,
strong = 1,
legend = 2,
}Pre- / post-fight auto-heal
Two independent flags control HP refills, on the way into the ring and on the way out.
Config.autoHealAfterCombat = true
Config.autoHealBeforeCombat = falseAfter the fight (autoHealAfterCombat)
At the end of a fight (solo, PvP, Royal Rumble), the player gets their HP back to full before leaving the ring.
true(default) — clean ending, the player walks out at full HP.false— tougher RP: the player keeps the HP they had when the fight ended (they need a doctor / a consumable to heal).
Before the fight (autoHealBeforeCombat)
At the start of a PvP or Royal Rumble fight, the player's HP is reset to max for fairness (so nobody starts at 30% HP because they ate a bullet earlier).
true— fair fight, but most server-side anti-cheats flag any client-side HP increase as cheating.false(default) — the player keeps whatever HP they walked into the ring with. Recommended if you run an anti-cheat (AnyAC, Badger, similar). To keep fairness anyway, set it totrueAND whitelistjosk_arenain your anti-cheat.
Fighters
-- Solo roster (Player vs NPC): displayed name, model, HP, level
Config.adversaires = {
{ label = "Le champion", modele = "CS_WELSHFIGHTER", health = 1500, level = "legend" },
{ label = "Le chétif", modele = "cs_sunworshipper", health = 100, level = "weak" },
-- ...
}
-- Fighters used in NPC vs NPC and Royal Rumble
Config.adversairesPNJ = {
{ label = "Le champion", modele = "CS_WELSHFIGHTER" },
-- ...
}Config.adversaires— the solo opponent roster. Thelevelfield (weak/average/strong/legend) determines combat behaviour.Config.adversairesPNJ— fighters for the NPC vs NPC and Royal Rumble modes.Config.levelCombat— AI behaviour per level (accuracy, aggression, range, ability). Adjusting a level makes opponents tougher or easier.
Banned ped models (blacklist)
List of ped models you don't want to see in the arena. A banned model can't be added from the builder tablet (the field turns red and saving is refused) and is ignored if present in a global or per-arena roster.
Config.PedBlacklist = {
"RE_RALLYDISPUTE_MALES_01",
"RE_RALLYSETUP_MALES_01",
-- add models to ban here
}Case-insensitive.
Betting
Config.Betting = {
enabled = true,
allowManagerBet = false, -- a manager can bet on their own arena (rigged-fight RP -- see Betting docs)
currency = 0, -- 0 = cash | 1 = gold | 2 = rol (gold -> cash on RSG)
minBet = 1,
maxBet = 500, -- max bet per player per fight
rakePercent = 5, -- house cut (%)
refundOnCancel = true, -- refund if the fight is cancelled
refundIfNoWinnerBets = false, -- no bet on the winner: false = house keeps, true = refund
interactionDistance = 2.5, -- interaction distance with the bookmaker
bookmakerPedModel = "cs_jeb",
allowedModes = {
player = false, -- Player vs NPC
npc = true, -- NPC vs NPC
rumble = true, -- Royal Rumble
pvp = true, -- Duel
tournament = true, -- Tournament match
},
}Each arena can override enabled, minBet, maxBet, rakePercent, allowedModes and allowManagerBet from the builder (see builder).
Management tablet
Config.Tablet = {
enabled = true,
openMode = "item", -- "command" | "item"
command = "boxing", -- chat command (if openMode == "command")
openItem = "boxing_tablet", -- inventory item (if openMode == "item")
requiredJob = {}, -- allowed jobs (empty = Config.requiredJob, then everyone)
locale = "en", -- tablet language: "fr" | "en"
useClipboardAnim = true, -- play the writing animation while open
}Arena builder
Config.Builder = {
enabled = true,
command = "arena_builder",
adminGroups = { "admin" }, -- allowed groups (VORP)
entryPedModels = { -- models offered for the welcome NPC
{ label = "Bounty hunter", modele = "blip_ambient_bounty_hunter" },
{ label = "Brawler", modele = "mp_u_m_m_saloonbrawler_01" },
-- ...
},
}On VORP, access is granted to the groups listed in adminGroups. On RSG, it relies on the josk_arena.builder ace permission (see Installation).
Emotes
Config.kitEmote = { "KIT_EMOTE_TAUNT_BEST_SHOT_1", "KIT_EMOTE_ACTION_FLEX_1" } -- staging / preview
Config.kitEmoteFinish = { "KIT_EMOTE_REACTION_APPLAUSE_1", "KIT_EMOTE_TAUNT_WAR_CRY_1" } -- victoryAdd or remove entries freely.
Language (i18n)
Two languages ship by default: English (default) and French. The selection is server-wide; every player sees the same language.
Switch between included languages
The locale is set via the tablet config:
Config.Tablet = {
...
locale = "en", -- "fr" | "en"
}That single line drives both the tablet UI and the in-game text (notifications, prompts, NPC labels, Discord embeds). Restart the resource to apply — no rebuild needed (both dictionaries are already bundled).
Add a new language
Adding a third language (e.g. Spanish) requires editing two layers — the Lua side (in-game text) and the NUI side (tablet UI):
1. Lua side — duplicate config/arena_language.lua and translate the values into your target language. The keys must stay identical. Then point fxmanifest.lua to the new file:
shared_scripts {
'config/arena_config.lua',
'config/arena_language_es.lua', -- instead of arena_language.lua
'config/arena_shared.lua',
}2. NUI side — duplicate web/src/i18n/en.js into a new file (e.g. es.js) and translate the values. Then register the new locale in web/src/i18n/index.js:
import fr from './fr.js';
import en from './en.js';
import es from './es.js'; // <-- new
export const T = { fr, en, es }; // <-- newRebuild the NUI bundle:
cd web && npm run build3. Activate — set Config.Tablet.locale = "es" and restart the resource.
Fallback chain
If a key is missing in the active locale, the tablet falls back to EN first, then FR, then the raw key. So a partial translation will still work — missing strings just appear in English instead of the new language.
Server settings
Defined in server/server_config.lua (never sent to clients — this is where secrets like webhook URLs live).
Discord (optional)
ServerConfig.Discord = {
enabled = false,
webhook = "", -- "https://discord.com/api/webhooks/<id>/<token>"
username = "Maitre d'arene", -- empty = default identity from the webhook
avatarUrl = "", -- empty = default avatar from the webhook
}Announcements for RP events (bets paid out, contracts signed/ended, tournaments finished, stables created/disbanded, arenas created/deleted). Setting enabled = false or leaving webhook = "" disables everything — no HTTP calls, zero cost.
Stable contracts
ServerConfig.Contracts = {
itemName = "josk_item_contract", -- "paper contract" item
issueOnSign = true, -- hand out the item on signing
}See Installation for the items to create.