Skip to content

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.

lua
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

AspectVORPRSG
Corevorp_corersg-core
Notificationsnative VORP tipsox_lib
Default inventoryvorp_inventoryox_inventory
Admin detectionadmin groupadmin / god permission, or ace
Available currenciescash, gold, rolcash, bank, crypto

Decoupled inventory

Config.Inventory is intentionally separated from the framework, to cover mixed servers (e.g. a VORP server using ox_inventory).

ValueEffect
"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 currency setting.

Access & map

OptionEffect
Config.requiredJobJobs allowed to use the arena. Empty = everyone.
Config.blipsNameBlip name shown on the map.
Config.blipsArenaBlip sprite.
lua
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).

lua
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.

lua
Config.autoHealAfterCombat  = true
Config.autoHealBeforeCombat = false

After 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 to true AND whitelist josk_arena in your anti-cheat.

Fighters

lua
-- 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. The level field (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.

lua
Config.PedBlacklist = {
    "RE_RALLYDISPUTE_MALES_01",
    "RE_RALLYSETUP_MALES_01",
    -- add models to ban here
}

Case-insensitive.

Betting

lua
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

lua
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

lua
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

lua
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" } -- victory

Add 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:

lua
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:

lua
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:

js
import fr from './fr.js';
import en from './en.js';
import es from './es.js';                // <-- new

export const T = { fr, en, es };          // <-- new

Rebuild the NUI bundle:

bash
cd web && npm run build

3. 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)

lua
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

lua
ServerConfig.Contracts = {
    itemName    = "josk_item_contract", -- "paper contract" item
    issueOnSign = true,                 -- hand out the item on signing
}

See Installation for the items to create.