WhereiamL
fivez_darts

Configuration

Modes, economy, wagers, sync and board geometry.

it's all in config.lua, a returned table (ox style). the bits you'll touch:

boards & props

boardModel = 'prop_dart_bd_cab_01',
dartModels = { 'prop_dart_1', 'prop_dart_2' },
locations  = {},  -- optional seed: { coords = vec4(x, y, z, heading), label = '...' }
blip       = { sprite = 459, color = 47, scale = 0.75, shortRange = true },

use /dartcreate to place boards at runtime instead of editing locations.

modes

modes = {
  arcade  = { players = 1, dartsTotal = 9, visitDarts = 9, clearPerVisit = false, wager = false },
  ['301'] = { players = 2, start = 301, doubleOut = true, visitDarts = 3, clearPerVisit = true, wager = true, maxVisits = 30 },
  ['501'] = { players = 2, start = 501, doubleOut = true, visitDarts = 3, clearPerVisit = true, wager = true, maxVisits = 40 },
  cricket = { players = 2, visitDarts = 3, clearPerVisit = true, wager = true, maxVisits = 25 },
},
modeOrder = { '501', '301', 'cricket', 'arcade' },

players is 1 (arcade solo) or 2 (1v1). visitDarts is darts per visit, clearPerVisit wipes the stuck darts at the end of a visit (the 1v1 default).

economy & wagers

wager     = { item = 'scrap', min = 0, max = 200, presets = { 0, 10, 25, 50 } },
rakePct   = 0.0,   -- house cut on the 1v1 pot

-- arcade (solo): payout = min(payoutCap, floor(score * payoutScrapPerPoint)), xp = floor(score * xpPerPoint)
entryCost           = 8,
payoutScrapPerPoint = 0.03,
payoutCap           = 150,
xpPerPoint          = 0.04,

the currency item is scrap by default. change wager.item if your server runs on something else.

tournaments

tournament = {
  sizes        = { 4, 8, 16 },
  modes        = { '501', '301', 'cricket' },
  entryMin     = 0, entryMax = 500,
  rakePct      = 0.0,
  top3         = { 0.5, 0.3, 0.2 },  -- used if the admin picks a top-3 split
  noShowMs     = 60000,              -- forfeit if a player doesn't show at the board
  summonRadius = 30.0,
},

match & performance

syncRadius    = 30.0,    -- players inside this see the board / darts / scoreboard
throwCdMs     = 350,     -- min time between throws (anti-spam)
turnTimeoutMs = 35000,   -- idle active player gets their visit skipped
joinDistance  = 3.0,     -- how close you have to be to join a match
elo           = { start = 1000, k = 24 },

geometry, camera & feel

the board geometry, the cam, sway and the stuck-dart pose are all calibrated visually with /dartstune and saved to board.json, so you don't normally hand-edit these.

board = { centerOffset = vec3(0.0, -0.69, 0.0), radius = 0.26 },
cam   = { back = -0.8, side = 0.0, up = 0.5, fov = 36.0 },
sway  = { amp = 0.07, accel = 0.0015, damp = 0.9, spring = 0.022 },
spread = 0.0,  -- leave at 0, difficulty is the visible sway, not a hidden roll
rings  = { bull = 0.037, ring25 = 0.094, tripleIn = 0.58, tripleOut = 0.63, doubleIn = 0.95, doubleOut = 1.0 },

keep spread at 0. the difficulty is the reticle sway you can see. a hidden spread would break the "what you see is what you score" thing.

locale & debug

locale = 'bs',   -- fallback if the ox:locale convar isn't set
debug  = true,   -- set false for production, it strips the calibration / debug commands

On this page