Before You Begin#
Before installing Darts, make sure your server meets the minimum requirements. Three things are mandatory; everything else is optional and detected on its own.
Requirement | Status | Notes |
|---|---|---|
OneSync | Required | Declared as a dependency — the resource does not start without it. |
| Required | Stores the dartboards placed with the creator. The table creates itself. |
| Required | Callbacks, the game menu and notifications. |
Framework | Optional |
|
| Optional | Notifications in its style, and its HUD hidden during a game. |
| Optional | Draws the [E] - Play Darts prompt instead of the built-in 3D text. |
Darts uses GTA V's own dartboard (prop_dart_bd_cab_01), darts and throwing animations, so there is nothing to stream and no asset pack to install.
Downloading Darts#
After purchasing Darts, the resource is automatically linked to your CFX Portal account.
Sign in to the CFX Portal using the same account used during checkout, open Granted Assets, and download Darts.
After extracting the download, you should have the following folder:
qs-darts/
├── config/ -- config.lua: everything you may edit
├── client/custom/ -- notifications, HUD and 3D prompts (editable)
├── server/custom/ -- money, permission and names per framework (editable)
├── database/ -- sql.sql, only if you prefer importing by hand
├── locales/ -- 41 languages
└── web/build/ -- the interface, ready to useOnly
config/,client/custom/,server/custom/andlocales/are open for editing. Everything else is protected by the CFX asset escrow and is replaced as a whole by each update.
Installing the Resource#
Move the qs-darts folder into your server's resources directory. It can live anywhere inside it, including a category folder:
resources/
└── [qs]/
└── qs-darts/Once copied, open your server.cfg and make sure every dependency — and everything it should detect — starts before Darts:
ensure oxmysql
ensure ox_lib
# Framework
ensure es_extended
# ensure qb-core
# ensure qbx_core
# Optional
ensure qs-interface
ensure qs-textui
ensure qs-dartsThe loading order matters. The framework and qs-textui are detected once, when Darts starts, so one that starts later is not found: a late framework leaves Darts in standalone mode — nobody is charged — and a late qs-textui leaves the built-in prompt in place.
The Database#
There is no SQL file you have to import. On every start Darts checks for its table, qs_darts_boards, and creates it if it is missing. It holds the dartboards placed with the creator, one row per board:
Column | Holds |
|---|---|
| The board's identifier, worked out from where it stands. Moving a board gives it a new one. |
| Position and heading as JSON: |
| The name given in the creator. |
| The entry fee. |
|
|
If your database user is not allowed to create tables, import database/sql.sql by hand once — it is the same table.
Only boards placed with the creator are stored. Boards listed in
Config.Boardsand boards found on maps are registered again on every start, so they never need a row.
Granting Creator Access#
The creator and the calibration tools are behind an ACE permission, command.dartscreator by default. Give it to your admin group in server.cfg and put yourself in that group:
add_ace group.admin command.dartscreator allow
add_principal identifier.license:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx group.adminIf your staff are already in group.admin, the first line is all you need. Aces in server.cfg are read when it is executed, so restart the server after adding them.
The permission's name is Config.Creator.permission. Set it to an ace of your own and grant that one instead:
Config.Creator = {
permission = 'qs-darts.admin',
}Prefer your framework's admin groups? The check is one small function you can extend — see Integrations.
Configuring the Resource#
Everything lives in one commented file, config/config.lua. It is read when the resource starts, so restart qs-darts after editing it.
Section | Contents |
|---|---|
| The language — one of 41 codes. |
| How close a player must be to play, to see boards and darts, to be challenged and to watch a game. |
| The area a player must stay inside during a game, and how it is drawn. |
| The board and dart models, picking up dartboards already on maps, and boards written by hand. |
| The X01 modes, darts per turn, double out and the turn clock. |
| Bets between players: on or off, the maximum, the step and the account. |
| How throwing feels: aim speed, sway, the power bar and its sweet spot, the flight. |
| Geometry: where the rings sit on the prop, how a dart is held and sticks, the throwing line and the camera. Set with the calibration tools. |
| The interact and cancel keys, the creator permission, and the calibration tools. |
The values worth reviewing first:
Config.Locale = 'en' -- ar, bg, bn ... uk, ur, vi, zh
Config.Game = {
startModes = { 301, 501 }, -- selectable X01 modes
dartsPerTurn = 3, -- darts before walking up to collect them
doubleOut = false, -- finishing dart must be a double or the bull
turnSeconds = 90, -- seconds per turn (0 = no limit)
}
Config.Betting = {
enabled = true,
max = 5000,
step = 100,
paymentMethod = 'money', -- 'money' or 'bank'
}The geometry sections ship calibrated for GTA V's dartboard. Leave them alone unless you change the board model or want the camera elsewhere — Usage explains the calibration tools.
Verifying the Installation#
Restart your server and read the console. On a working install you will see:
[qs-darts] Loaded 0 board(s) from SQL.The number is how many boards the creator has saved. If the line never appears, oxmysql is not connected, or it starts after Darts.
Then join your server and work through the first loop:
Place a dartboard
Type
/dartscreator, press +, name the board and press Place. Aim at a wall, left click to pin it, then Save dartboard.Play a solo game
Walk up to the board and press
E→ Play solo → 501 → Start. Hold the left mouse button, let go at about three quarters of the bar, and watch the dart land.Challenge somebody
With a second player within 15 m, choose Player vs Player, pick them from the list and send the challenge. They accept on their own screen.
Nothing in the creator needs a restart: boards, names and entry fees reach every player at once. Usage covers everything a game can do.



