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 = "Fighting Arena"
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 = "The Champion", modele = "CS_WELSHFIGHTER", health = 1500, level = "legend" },
{ label = "The Runt", modele = "cs_sunworshipper", health = 100, level = "weak" },
-- ...
}
-- Fighters used in NPC vs NPC and Royal Rumble
Config.adversairesPNJ = {
{ label = "The 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).
Customise the wording
Every in-game text — notifications, prompts, NPC labels, Discord embeds — lives in config/arena_language.lua, which stays fully editable. The file holds one dictionary per language, English and French, so you can reword any line to match your server's tone. Keep the keys exactly as they are, change only the text between the quotes, then restart the resource.
EN.victory = "Victory!"
EN.bet_menu_title = "Betting office"Add a new language
Need a language that isn't included? Get in touch on the support Discord — the resource is built to host extra dictionaries, and adding one is quick.
Fallback
If a line is missing from the active language, the resource falls back to English instead of showing an empty string, so a partially reworded dictionary always stays usable.
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 = true,
webhook = "", -- "https://discord.com/api/webhooks/<id>/<token>"
username = "Arena Master", -- 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.