Configuration
Every key in DashKart's config files, with defaults.
All files in config/ are open (not escrowed) and commented. Restart the resource after changes (restart dashkart; riders on duty are clocked out and their rental deposits refunded in full).
Files marked server only are never sent to players. Money values are whole numbers in your currency.
- main.lua · stores.lua · catalog.lua · rider.lua · wholesale.lua · assets.lua · npc.lua · economy.lua · webhooks.lua · promos.lua
config/main.lua
| Key | Default | Meaning |
|---|---|---|
Config.Debug |
convar dashkart:debug, default false |
setup mode: verbose logs, zone drawing and the /dk_* admin commands. Turn on with setr dashkart:debug "true" in server.cfg. Keep it off on a live server. |
Config.DebugTest.item |
nil (auto) |
item used by /dk_bridgetest (added and removed). Auto = water_bottle on QBCore/QBox-style inventories, water otherwise. |
Config.DebugTest.cleanupSeconds |
60 |
lifetime of the test box / scooter. |
Config.Locale |
nil |
'en', 'hi' or 'te' for chat messages and the tablet. nil follows setr ox:locale. |
Config.Currency.symbol / position |
'₹' / 'prefix' |
currency display; 'suffix' puts the symbol after the number. |
Config.Customers.npc |
true |
NPC customers (V1). |
Config.Customers.players |
false |
reserved for player customers (V2). Leave false. |
Config.Bridge.* |
'auto' (notify: 'ox') |
force an adapter per category: framework (qbox, qb, esx, custom), inventory (ox, qs, codem, core, qb, native), target (ox, qb, textui), vehiclekeys (qbx, qb, wasabi, mrnewb, none), fuel (ox, legacy, cdn, ps, native), emote (auto, rpemotes, scully, native), notify (ox, framework). |
Config.Accounts.payout |
'bank' |
account for rider pay, and for store purchase, sale, deposit and withdraw. |
Config.Accounts.deposit |
'cash' |
account rental deposits are taken from first (falls back to bank). |
Config.Accounts.fine |
'bank' |
account fines are taken from (cancelled order, abandoned rental). |
Config.Admin.command |
'dashkart' |
/dashkart admin. |
Config.Admin.ace |
'dashkart.admin' |
ace that grants admin rights. |
Config.Admin.groups |
admin, god, superadmin |
framework groups that count as admin (ESX groups, QBCore permissions, QBox checks them as aces). |
Config.Security.rateLimit |
burst 6, perSecond 2 |
default per-player limit for every network call. |
Config.Security.violationsBeforeFlag / violationWindow |
10 / 10 s |
rate-limit violations in the window before an exploit flag. |
Config.Security.kickAfterFlags |
0 |
exploit flags per session before the player is dropped. 0 = log only. |
Config.Security.maxStringLength |
64 |
longest string a client may send. |
Config.Database.flushInterval |
15 |
seconds between batched writes (logs, stats, stock). |
Config.Database.logRetentionDays |
30 |
dk_logs rows older than this are deleted (once a day, in small batches). 0 keeps logs forever. Orders and the money ledger are never deleted. |
config/stores.lua
Config.Stores is a list of stores. Coordinates only, no interior references (see docs/ASSETS.md).
| Field | Meaning |
|---|---|
id |
unique key, also the database key. Never rename after the first start. |
label |
display name. |
ownable / price |
whether players can buy it and for how much (bank). false = always city-owned. |
duty |
counter { coords, radius }: clock in/out, order queue, rentals, Store office. |
pickup |
packing point { coords, radius } for stores without shelves. Big orders are packed here in rounds (orderBag.carry bags each). |
vehicleSpawns |
list of vec4 rental spawns. |
vehicleReturn |
rental return { coords, radius }. |
zone |
box { coords, size, rotation }; leaving it starts the delivery. |
demand.baseRate / demand.multiplier |
NPC orders per hour at a peak hour, and a per-store scale. |
payrollPct |
% of what the customer paid that goes to the rider while the store is city-owned. A player owner sets their own. |
shelves |
optional { { coords = vec4, categories = { ... }, label = '...' } }. A layout captured with /dk_shelf (in data/shelves.json) takes priority. |
blip |
false hides the store blip. |
Default stores: Strawberry (ownable, 750 000), Mirror Park (ownable, 900 000), Sandy Shores (city-owned).
config/catalog.lua
| Key | Meaning |
|---|---|
Config.Pricing.minMult / maxMult |
owners may price items between 80 % and 150 % of the default price, unless an item sets its own min / max. |
Config.Categories |
product categories with an icon and sort order. Shelf layouts use these names. |
Config.Catalog |
products: item (internal name), label, category, price, stock (default stock per store; capacity = stock × Config.Ownership.capacityMult), weight (size), optional min / max price. |
Product labels can be translated with locale keys item.<item> (e.g. "item.dk_milk": "दूध 500ml"). Products never enter player inventories in V1, so they need no item definitions. New products are added to every store on the next start; existing owner prices are kept. If you remove a product, also remove it from the baskets in config/npc.lua (the start-up check reports Basket "x" uses unknown item "y").
config/rider.lua
| Key | Default | Meaning |
|---|---|---|
Config.Rider.useFrameworkJob |
false |
true sets the framework job Config.Rider.job while on duty (the job must exist) and restores the old one after. |
Config.Rider.menuKey |
'F6' |
default tablet key (players can rebind). |
Config.Rider.requireRental |
true |
orders need a DashKart rental; arrival and handover require it within rentalRadius (40 m). |
Config.Rider.remoteDuty.clockIn / .clockOut |
false / false |
allow clocking in / out away from the duty point through the exports (phone apps, see Integration API). A remote clock out is refused while an order is active or a rental is out. |
Config.Rider.cancelFine |
100 |
fine (bank) for cancelling an accepted order. |
rental.deposit |
500 |
scooter deposit. |
rental.van.enabled / deposit |
true / 1500 |
rental van, required for bulk orders. |
rental.van.unlockDeliveries |
25 |
completed deliveries (lifetime, all stores) a rider needs before renting the van. Until then the duty point shows “Van (unlocks after 25 deliveries)” and bulk orders are hidden from them. 0 = van from the first shift. |
rental.returnRefundPct |
100 |
% of the deposit refunded on return, before damage. |
rental.damagePenaltyPerPct |
5 |
deducted per 1 % body damage. |
rental.abandonDistance / abandonSeconds / abandonPenalty |
300 m / 180 s / 250 |
leaving the rental this far for this long forfeits the deposit plus the penalty. |
rental.fuelLevel |
100 |
fuel on spawn. |
pack.secondsBase / secondsPerItem / secondsMax |
3 / 0.5 / 10 |
packing time at the pickup point. |
pick.secondsBase / secondsPerItem / secondsMax |
1.25 / 0.4 / 4 |
time per shelf when shelf picking. |
pick.markerDistance |
15 |
shelf markers draw within this distance. |
handover.radius |
3 |
max distance to the door for the handover (server-checked). |
handover.arriveRadius |
25 |
distance at which the order switches to “arrived”. |
orderBag.required |
true |
the packed order must be put into the delivery bag on the rental (target at the back of the scooter / van) and taken out again at the door before the handover. false = no stow step. |
orderBag.seconds |
2 |
stow / take-out animation length (the bag opens, the order goes in or out, the bag closes; see Config.Assets.vehicleProps.scooterBox.openable). |
orderBag.radius |
{ scooter = 3, van = 5 } |
max distance from the rider to the rental’s centre for stowing (server-checked). |
orderBag.ratingPenalty |
1 |
stars lost when the rider rides with the order in hand. |
orderBag.minSpeed |
4 |
m/s; slower than this in a vehicle does not count as riding. |
orderBag.bagCapacity |
6 |
big orders on the van: catalog weight units per bag (bags = basket weight / this, rounded up). Scooter orders are always one bag. |
orderBag.maxBags |
5 |
most bags per order (also the van’s cargo slots in Config.Assets.vanCargo). |
orderBag.carry |
2 |
bags the rider carries per trip, one per hand. Big orders are packed in rounds of this many bags: pack, load them into the van, come back for the next round; the van then delivers them to the customer the same way. |
orderBag.extraMinutesPerBag |
1 |
the delivery target (Config.Npc.targetMinutes) grows by this per bag beyond the first (rating, speed bonus, late penalty, tablet history). |
uniform |
see file | per-gender clothing, onApply / onRestore hooks, enabled. See docs/ASSETS.md. |
Config.Tablet.enabled |
true |
false = F6 opens ox_lib menus instead of the tablet. |
Config.Tablet.item |
'dashkart_tablet' |
tablet item (docs/ITEMS.md). |
Config.Tablet.requireItem |
true |
F6 needs the item. |
Config.Tablet.giveOnClockIn |
true |
give a tablet to riders without one. |
config/wholesale.lua
| Key | Default | Meaning |
|---|---|---|
coords / vanSpawn / blip |
docks | warehouse counter, van spawn, blip. |
costMult |
0.6 |
wholesale cost = default catalog price × 0.6. |
vanRun.enabled |
true |
owners can fetch stock themselves with a van (no fee). |
vanRun.deposit |
1500 |
van deposit, refunded on return minus damage. |
vanRun.maxCrates × crateCapacity |
8 × 40 |
units per van run. |
vanRun.timeLimit |
1800 s |
late, destroyed or abandoned vans lose the goods and the deposit. |
delivery.enabled |
true |
owners can order delivery (tablet or warehouse). |
delivery.feePct / minFee |
12 % / 250 |
delivery fee on top of the goods. |
delivery.delaySeconds |
600 |
real-time delay until stock arrives (survives restarts). |
autoRestock.enabled / threshold / checkInterval |
true / 25 % / 300 s |
city-owned stores refill items below the threshold. |
config/assets.lua
Vehicles (scooter, bulk, restockVan) with vehicleTypes, vehicleStyle (colours, livery, plate prefix), props, animations, customer ped pool, blips. The scooter can be set from server.cfg with setr dashkart:scooter "model". Full details: docs/ASSETS.md.
config/npc.lua (server only)
| Key | Default | Meaning |
|---|---|---|
tickSeconds |
15 |
demand check interval. Nothing runs while nobody is on duty. |
offerTimeout |
180 s |
an unaccepted order expires after this. |
targetMinutes |
10 |
the delivery promise; used for the speed bonus, late penalty and rating. |
maxOpenOrdersPerStore |
4 |
unaccepted orders on the board per store. |
minDistance / maxDistance |
350 / 2600 m |
delivery distance range from the store. |
pedSpawnRadius |
60 m |
the customer ped spawns when the rider is this close. |
noAnswerWait |
45 s |
wait before the rider can call / give up on a no-answer customer. |
maxDeliveryMinutes |
30 |
accepted orders not delivered in time are cancelled (counts as failed). |
clock |
'auto' |
hour source for the demand curve: 'auto' (in-game hour from GlobalState.currentTime, e.g. Renewed-Weathersync, else server time), 'real', or function() return hour end. |
tips |
20 % chance, 10-50, 5 stars | small tips on great deliveries. |
timeCurve |
24 values | demand multiplier per hour. |
riderFactor |
perExtraRider 0.6, maxFactor 3 |
more riders on duty → more orders, capped. |
idleFloorPerHour |
20 |
minimum order pace while riders wait with an empty board. |
maxIdleWait |
30 s |
a free rider with an empty board gets an order within this time (caps still apply). |
readyOrderDelay |
5 s |
first order after clock-in or after finishing a delivery. |
baskets |
9 templates | { id, weight, hours, hourBoost, items = { { item, qty = {min,max}, chance, core } } }. A template is skipped when a core item is out of stock. |
events |
see file | weights and params for none, big_tip, no_answer, wrong_gate, rude, bulk. |
names |
list | customer names on order cards. |
dropoffs |
72 points in 6 zones | delivery doors (see docs/ASSETS.md). |
Orders per hour per store = demand.baseRate × timeCurve[hour] × riderFactor × demand.multiplier.
config/economy.lua (server only)
Config.Economy
| Key | Default | Meaning |
|---|---|---|
deliveryFee.base / perKm / max |
30 / 12 / 90 |
fee the customer pays the store on top of the basket. |
payroll.minPct / maxPct / default |
20 / 60 / 30 |
range owners can set for rider pay (% of what the customer paid). |
payout.speedBonus |
25 |
delivered within targetMinutes. |
payout.latePenaltyPerMin / latePenaltyMax |
5 / 40 |
per minute late, capped. |
payout.streakBonus |
every 5 on time: 50 |
|
payout.minPayout |
30 |
minimum pay for a successful delivery. |
shortfall |
'server' |
when a store cannot afford the rider: 'server' covers the difference, 'cap' pays only what the store has. |
caps.maxRiderEarningsPerHour |
6000 |
per rider, rolling hour (0 = off). |
caps.maxNpcOrdersPerStorePerHour |
30 |
|
caps.diminishing |
85 % after 2 h, 65 % after 4 h, 40 % after 6 h | pay multiplier by hours on duty today. |
caps.dailyNpcBudget |
0 |
server-wide NPC money per day; demand pauses when used up (0 = unlimited). |
antiFarm.afkSeconds |
600 |
no movement and no action → no new orders until the rider moves. |
antiFarm.minDeliveryDistance |
300 m |
|
antiFarm.maxPlausibleSpeed |
45 m/s |
faster deliveries are flagged and pay nothing. |
antiFarm.fastDeliveryCooldown |
120 s |
no offers after a flagged delivery. |
antiFarm.heartbeatSeconds |
30 |
server position sampling interval. |
Config.Ownership
| Key | Default | Meaning |
|---|---|---|
maxStoresPerPlayer |
1 |
|
sellBackPct |
60 |
% of the price returned when selling to the city (plus the store balance). |
actionRadius |
25 m |
owner actions at the counter work within this distance. |
maxStaff |
8 |
hired riders per store. |
staffPrioritySeconds |
20 |
new orders are reserved for staff and owner this long. |
capacityMult |
3 |
max stock per item = catalog stock × 3. |
maxDeposit |
1000000 |
largest single deposit / withdrawal. |
tablet.remote |
true |
owners with the tablet item manage the store from anywhere (reports, prices, payroll, staff, delivery restock). |
tablet.remoteMoney |
false |
allow deposit / withdraw from the tablet too. Selling the store and van runs always need the owner in person. |
tablet.chartDays |
7 |
days in the revenue chart (max 14). |
Config.AdminPanel
| Key | Default | Meaning |
|---|---|---|
maxBalanceAdjust |
1000000 |
largest single store balance correction. |
maxCompensation |
5000 |
largest rider compensation when force-cancelling an order. |
config/webhooks.lua (server only)
| Key | Meaning |
|---|---|
username / avatar / color |
sender name, avatar URL, default embed colour. |
channels.orders / payouts / stores / admin / exploits / economy |
webhook URL per channel. Empty = off. |
colors.* |
embed colour per channel (decimal RGB). |
orders.delivered / failed_no_answer / cancelled / expired |
which finished orders are posted (expired off by default: unaccepted NPC orders expire often). |
mentions.exploits |
Discord role id to ping on exploit flags. |
batchSeconds |
5: embeds are batched (max 10 per message) and Discord rate limits are respected. |
The admin panel (Economy tab) has a button to send a test message to every configured channel. The economy channel receives a daily summary (orders, money created, payouts, flags, top stores and riders).
config/promos.lua (server only)
Reserved for player customers (coming in V2). Not used in V1.