XS-Arena
Eight game modes, killstreaks and wagers, with a map builder that runs in game. Every lobby runs in its own routing bucket, and every match plays out like a live sports broadcast.
Requirements
ox_lib and oxmysql, plus Qbox or QBCore. A target resource is optional, and pma-voice gives each team its own radio during a match.
Installation
- Import
sql/xs_arena.sql. - Drop the folder into your resources and
ensure XS-Arenaafterox_libandoxmysql. - Set your entry point in
Config.EntryPoints, or setConfig.OpenAnywhere = trueand use/arena. - Set
Config.Staging.coordsto wherever players should gather. They have to be standing there to join a match. - Give yourself the admin ace:
add_ace group.admin xs.arena allow. Without it,/arenabuildand the other admin commands do nothing.
Two maps ship with it and load on first start. They are built from props on open tarmac, so they work anywhere and are a decent thing to pull apart in the builder. Turn them off with Config.LoadPresetMaps = false.
Coming from XS-Paintball
XS-Arena is the same script under a new name. Your maps, stats, loadouts, outfits and settings come across the first time it starts, even if you imported the new SQL file first.
- Remove the
XS-Paintballfolder and addXS-Arena. - Change your
ensureline. - Copy anything you changed from your old
config.luainto the new one. - Change your ace to
xs.arena. Commands start with/arenanow.
Anything that called exports['XS-Paintball'] calls exports['XS-Arena'].
The builder
/arenabuild, or the Maps tab if you are an admin. Every button drops you into a free camera: WASD flies, the mouse aims, ENTER places and BACKSPACE cancels. SPACE pins the point so you can fly round and look at it, X drops it to the floor below and Z cycles grid snapping. Look around closes the panel so you can walk the arena with everything still marked: E brings the builder back and BACKSPACE leaves it. ESC, the X and the other tabs leave the builder too, and ask first if the map is not saved.
- Boundary: a circle, or a polygon you walk the corners of. Leaving it starts a countdown.
- Spawns: one set per team, plus a shared pool for the solo modes.
- Flags and capture points: two flags switch Capture The Flag on, one capture point switches Domination on.
- Props: anything your server streams. This is how an arena gets built in an empty field.
- Spectator cameras, weather and time: optional.
The panel tells you which modes a map can run and why the others are greyed out. Maps export to JSON and import back, so an arena can move between servers.
Game modes and lobbies
Team Deathmatch, Free For All, Capture The Flag, Domination, Kill Confirmed, Gun Game, One In The Chamber and Hold Your Own. Any of them can be switched off in config.lua.
Up to eight matches run at once, each in its own routing bucket, so nobody outside a match sees it or can shoot into it. The host picks the mode, map, limits, wager and player cap, and can lock the lobby with a passcode. Everyone else joins from the list or with the five-character code. A match can be one round or a best of three, five or seven, it ends on a map vote, and Quick play drops players into a lobby as soon as enough are queued.
Going down
Getting shot out of a match looks like a real death: you ragdoll where you fell, blood shows, and the camera turns to whoever got you while a banner names them and the weapon. It never is a real death. No medical script, hospital or lost items are involved, and you are back in when the respawn timer runs out.
Turn the ragdoll, the killcam and the effects up or down in Config.Elimination and Config.Effects.
Staging and dispatch
The staging area is the only way in, and it runs in its own routing bucket. Joining puts you there and leaving puts you back exactly where you were. Config.JoinRules is checked on the server: players have to be at the staging area, cannot have been in a fight in the last 45 seconds, and cannot join from behind the wheel or while down. That stops anyone diving into a match to lose a chase.
Gunfire in a match is reported by your dispatch or MDT resource, not by this one. Ask before alerting with exports['XS-Arena']:IsPlayerInMatch() on the client or exports['XS-Arena']:IsInMatch(source) on the server, or name your dispatch's mute function in Config.Dispatch.mute.
Before going live
- Set
Config.Staging.coords. Without it nobody can join anything. - Add the admin ace before you try to build a map.
- The preset maps are starting points on open tarmac, not finished arenas.
- Check your voice resource before promising team radio.
Troubleshooting
Players cannot join a match
They are not standing in the staging area, or a join rule stopped them. Check Config.Staging.coords and its radius, and the message they were shown.
The menu will not open
You are not at an entry point. Add one to Config.EntryPoints or set Config.OpenAnywhere = true.
/arenabuild does nothing
You do not have the admin ace. Add add_ace group.admin xs.arena allow, or put your group in Config.Admin.groups.
My XS-Paintball maps did not come across
Check the server console on start. It prints which tables it brought over from XS-Paintball, or why a rename failed. A table that already holds XS-Arena data is never replaced.
People outside the match can see it
Another resource is changing player routing buckets. Anything else that sets a player's bucket will fight this.
Updating
- Back up the database first.
- Keep a copy of your edited
config.lua. - Replace the resource folder, merge your config back and restart.
Your maps, stats and settings live in the database, so nothing you built is lost.
Support
Bugs and questions go to the Discord. Include your server's console output — the resource prints the reason when it refuses to do something, and that line is usually the whole answer.