General settings live in shared/config.lua. Lines, products, markets, supermarkets, vans and daily tasks are in data/. Restart the resource after editing a file.
Most of the world data can also be edited in game with /supplyadmin. What you save there is stored in the database and wins over the files: lines, products, wholesale markets, shops, supermarkets, vans, carry positions, and the npc position, market, orders, reward and trade settings. To go back to the file values, restore the entry from the editor.
Coordinates, the NPC position, the lines, the wholesale jobs and the item names that come in the files are examples. Change them to fit your server.
General
| Option | Type | Default | What it does |
|---|---|---|---|
debug | boolean | false | Prints debug traces in the console. Can also be turned on with setr cuxial_supply_debug 1. The fast command only works with debug on. |
ui.accent | string | configurable | Accent colour of the interface, as a hex code. |
ui.currency.symbol | string | '$' | Currency symbol shown in the interface. |
ui.currency.locale | string | 'en-US' | Number format of the amounts ('en-US', 'es-ES'...). |
logs.convar | string | 'cuxial_supply_webhook' | Name of the convar that holds the Discord webhook. With the convar empty, nothing is sent. |
admin.auditDays | number | 60 | Days the audit rows are kept. |
admin.permission | string | 'admin' | Framework permission of the supply staff. See Commands. |
account | string | 'cash' | Account that receives the run payments and from which the van deposit is taken ('cash', 'bank'). |
job | string | table | 'all' | Who can do the supply job. 'all' for everyone, a job name, or a list of jobs. |
NPC and interaction
Block npc.
| Option | Type | Default | What it does |
|---|---|---|---|
coords | vector4 | example | Position and heading of the job NPC. |
vanSpawns | vector4[] | example | Common van spawns next to the NPC. A line without its own spawn uses the first free one. |
model | string | 'a_m_m_farmer_01' | Ped model. |
distance | number | 2.0 | Metres from which the interaction option is available. |
menuDistance | number | 6.0 | The server refuses to open the panel farther than this. |
spawnDistance | number | 60.0 | The NPC only exists on a client inside this radius. |
blip | table | see file | enabled, sprite, color, scale of the job blip. |
Block target.
| Option | Type | Default | What it does |
|---|---|---|---|
distance | number | 2.0 | Metres of the interaction options. |
showDistance | number | 40.0 | Distance at which the floating markers over work points are drawn. |
icons | table | see file | Font Awesome icon of each interaction option. |
marker | table | see file | Floating marker: type, scale, height, color ({ r, g, b, a }), bob, rotate. |
Work actions
Block work. Each action of a line has a maximum distance checked on the server and a progress bar.
| Option | Type | Default | What it does |
|---|---|---|---|
distance.<action> | number | 2.0 to 5.5 | Metres to the work point for catch, milk, slaughter, pack, bottle, plant, water, harvest, nest, pickup. |
ms.<action> | number | 2500 to 7000 | Duration of the progress bar of each action. |
slackMs | number | 500 | Tolerance on the minimum time of each action. |
anims | table | see file | Animation (dict, clip, flag) or scenario of each action. drop is the animation of putting something down. |
props | table | see file | Props during the bar: in the hand (model, bone, pos, rot), on the ground in front (ground) or on the table in front (front, z). |
fx.water | table | see file | Water particles while watering. |
Lines in the world
| Option | Type | Default | What it does |
|---|---|---|---|
carry | table | see file | Carrying in the hands: animation flag, distance at which teammates' loads are drawn (others), blocked controls (disable) and animation and position for box, crate, sack and hen. |
animals.catchDistance | number | 5.5 | Metres between the player and the hen to catch it. Hens are caught with a dive. |
animals.corralMargin | number | 3.0 | Metres outside the pen that still count. |
animals.fleeDistance / fleeMs / restMs | number | 3.0 / 2200 / 2500 | Hens run away when approached, for fleeMs, then rest. |
animals.spawnDistance | number | 90.0 | Radius in which the animals are created. |
animals.cowScenario | string | 'WORLD_COW_GRAZING' | Scenario of the cows. |
pickup.stack | table | see file | Pile of crates drawn at the import warehouse. |
stations.vanDistance | number | 90.0 | Maximum distance between the van and the processing table. |
stations.props | table | { bottle = 'prop_table_03' } | Table created per station type. Without an entry the map already has one. |
plots.growMs | number | 90000 | Growing time after watering. A line can have its own growMs. |
plots.soil / sprout / crops | table | see file | Props of the soil, the sprout and each mature crop. |
nests | table | see file | Nest prop, spawn distance and marker. |
Van
Block van. The models, deposits and slots of each van are in data/vehicles.lua.
| Option | Type | Default | What it does |
|---|---|---|---|
rearDistance | number | 2.5 | Metres to the rear door to load and unload. |
minHealth | number | 400.0 | Minimum engine and body health to get the deposit back. |
plate | string | 'SUPL' | Plate prefix. |
spawnFreeRadius | number | 6.0 | Metres that must be free of vehicles around the spawn. |
spawnTimeoutMs | number | 5000 | Time the server waits for the van to appear before cancelling the start. |
fuel | number | 100.0 | Fuel on spawn. |
keys | boolean | true | Gives the keys through cuxial_garages when that resource is running. |
bone / anchor / propDistance | see file | Where the crates are attached and from how far they are drawn. |
Block blips: stage, van, central, plant, warehouse and deliver, each with sprite, color and scale.
Crew and run
| Option | Type | Default | What it does |
|---|---|---|---|
crew.maxPlayers | number | 4 | Maximum crew size. |
crew.inviteDistance | number | 8.0 | Metres between the player who invites and the invited one. |
crew.inviteSeconds | number | 60 | Seconds until an invitation expires. |
crew.reconnectSeconds | number | 180 | Seconds a seat is kept for a member who disconnects during a run. |
crew.splitRewards | boolean | true | Lets the crew owner share the money by percentage. |
run.cooldownHours | number | 0 | Hours a player must wait between runs. 0 = no wait. |
run.exclusiveRegions | boolean | true | true = only one crew per line at a time. |
Delivery
Block deliver.
| Option | Type | Default | What it does |
|---|---|---|---|
radius | number | 3.0 | Metres to the market manager to sign the delivery note. |
palletDistance | number | 3.0 | Metres between the player and the pallet when unloading. |
palletModel | string | false | 'prop_pallet_02a' | Pallet prop. false if the map already has one. |
stack | table | see file | How the crates pile up on the pallet. |
dockRing / ringColor | 8.0 / see file | Size and colour of the dock ring. | |
showDistance | number | 80.0 | Distance at which the dock, pallet and pile are drawn. |
demand.high / demand.low | number | 0.10 / -0.10 | Thresholds of the demand indicator in the destination selector: above high is high demand, below low is saturated. |
Delivery guide
Block guide. The "Next step" line on the HUD and the markers that go with it.
| Option | Type | Default | What it does |
|---|---|---|---|
enabled | boolean | true | Shows the next step on the HUD. |
route | boolean | true | GPS route back to the van while carrying something. |
showDistance | number | 250.0 | Distance at which the dock ring is visible while delivering. |
tickMs | number | 500 | How often the guide is updated. |
marker | table | see file | Marker over the van's rear door and over the shelf slot to restock: type, scale, color, bob, rotate, distance (metres to draw it), height (over the van) and slotHeight (over the slot). |
Payout
Block reward. The money of a run is the value of the load, not a fixed amount.
| Option | Type | Default | What it does |
|---|---|---|---|
mode | string | 'split' | 'split': the value × teamMultiplier is divided among the crew. 'team': each member gets the value × teamMultiplier. 'flat': each member gets the full value. A solo player always gets the full value. |
teamMultiplier | number | 2.0 | Multiplier applied when the crew has two or more members. From 1 to 3 in the editor. |
requireScore | boolean | true | true = members who did no task are not paid and do not count for the team. |
levelBonus | number | 0.2 | Extra fraction of the value per level of the crew owner above 1. From 0 to 0.2 in the editor. |
items | table | {} | Items given on payment. Each entry: { item = 'name', count = 1, chance = 50 }. |
Wholesale markets
Block market.
| Option | Type | Default | What it does |
|---|---|---|---|
tickMinutes | number | 10 | Minutes between market updates. |
simulate | boolean | true | Simulated consumption of stock on each update. |
curve | number | 1.6 | Shape of the price curve: how fast the price drops as stock fills up. |
resaleMarkup | number | 1.35 | Margin of the market when it sells. |
trendTicks | number | 3 | Updates used to show the price trend. |
initialFill | number | 0.5 | Stock of a new market, as a fraction of its cap. |
historyHours / historyPoints | number | 48 / 36 | Length of the price history. |
ledgerDays | number | 30 | Days the ledger of movements is kept. |
terminalDistance | number | 3.0 | Metres to the terminal. |
jitter | table | { min = 0.8, max = 1.2 } | Random variation of the consumption. |
npcDistance / npcScenario | 60.0 / 'WORLD_HUMAN_CLIPBOARD' | Spawn distance and scenario of the market manager. |
Block orders: automatic orders with a bonus.
| Option | Type | Default | What it does |
|---|---|---|---|
threshold | number | 0.35 | A product below this fill can get an order. |
targetFill | number | 0.75 | Fill the order aims to reach. |
chance | number | 0.35 | Chance of an order per update. |
maxOpen | number | 3 | Open orders per market. |
min / max | number | 10 / 60 | Crates per order. |
bonus | table | { min = 0.15, max = 0.40 } | Extra pay of the crates that fill the order. |
minutes | number | 90 | Lifetime of an order. |
staffMinutes | table | { min = 10, max = 240 } | Lifetime range of orders created by staff. |
Sales and wholesalers
Block trade.
| Option | Type | Default | What it does |
|---|---|---|---|
wholesaleMarkup | number | 1.15 | Margin over the market's buy price for wholesale jobs at a market terminal. |
centralMarkup | number | 1.35 | Margin for everyone else at a market terminal. |
retailMarkup | number | 1.60 | Margin of shops without their own margin. |
maxCrates | number | 50 | Crates per purchase at a market. |
wholesale | table | example | Jobs that buy at the wholesale rate: { job = 'name', grade = 0 } per job. They also see the wholesale point of the supermarket. |
categories | table | {} | Extra product categories: { id, label, icon }. |
shopDistance / shopModel / shopBlip | see file | Distance, ped and blip of a new shop. | |
newProduct / newImport | table | see file | Defaults of a product and of an import line created in the editor. |
limits | table | { open = 6, quote = 20, buy = 6 } | Rate limits per player. |
blockedItems | table | see file | Items no product can give. A trailing * matches a prefix. |
Supermarket
Block store. Each supermarket is defined in data/stores.lua; this block holds the rules shared by all of them.
| Option | Type | Default | What it does |
|---|---|---|---|
job / society | string | 'supermarket' | Job and business account of a supermarket created in the editor. The included one sets its own in data/stores.lua. |
grades | table | { restock = 0, cashier = 1, manager = 2, boss = 3 } | Minimum grade for each role. A boss grade of the framework counts as manager and boss. |
duty | boolean | true | true = restocking and charging require being on duty. |
slotCrates | number | 6 | Crates per stockroom pallet slot. |
shelfCapacity | number | 12 | Default units of a shelf slot. |
maxTake | number | 5 | Units per take from a shelf. |
maxBasket | number | 60 | Units per basket. |
distance | table | see file | Metres checked on the server for slots, registers, customers, self-checkouts, basket racks and fridges. |
restockMs | number | 1500 | Minimum time between two restocks. |
zoneMargin | number | 6.0 | Margin of the store area when it is calculated from the slots. |
leave | table | { alarm = true, restock = true, checkMs = 2000 } | Leaving with an unpaid basket: alarm to the staff, products back on the shelf, check interval. |
chargeSeconds | number | 60 | Seconds a cashier's charge stays valid. |
unitMarkup | number | 1.6 | Default price of a unit: base price of the crate × unitMarkup / units per crate. |
demand | table | { min = 0.75, max = 1.35, curve = 1.0, retailCap = 0.9 } | What the store pays per delivered crate: base price × a multiplier between min (full store) and max (empty store), never above retailCap × the default shelf price of the crate. A product's buy price in the store wins over this. |
recent | number | 10 | Recent sales shown in the management panel. |
streamDistance | number | 80.0 | Distance at which slot changes reach a client. |
limits | table | see file | Rate limits per action. |
boxMs | number | 1200 | Progress bar when taking a box from the stockroom. |
closeMargin / exitWarn | number | 2.0 / 3.0 | Margin before a till closes when walking away, and metres before the exit at which the unpaid-basket warning appears. |
alarm | table | { seconds = 60, blip = ... } | Duration and blip of the theft alarm. |
anims | table | see file | Animations when taking a box, restocking and taking a product. |
Tills
Block store.till. Tills with a screen on the terminal glass.
| Option | Type | Default | What it does |
|---|---|---|---|
enabled | boolean | true | false = simple till points with an on-screen panel instead of the terminal screens. |
staff | table | { grade = 'cashier', zone = true } | Who counts as a cashier on duty: minimum role, and being inside the store. |
selfWhenStaffed | boolean | false | true = customers can pay by themselves even with a cashier in the store. |
distance | table | { operator = 2.0, customer = 2.5, margin = 1.5 } | Metres to the cashier's and the customer's spot. |
scanMs | number | 250 | Minimum time between two scanned products. |
callSeconds | number | 20 | How often the staff is warned of a waiting customer. |
commission | number | 0.0 | Fraction of the sale the store pays to the cashier. |
renderDistance / maxDuis / ttlMs | 14.0 / 4 / 15000 | Distance and number of screens rendered at once. | |
camera / paidSeconds / anim | see file | Camera in front of the screen, seconds the receipt stays, gestures. | |
adjust | table | {} | Fine position of each screen glass, as printed by /supplytill. |
Wholesale point
Block store.wholesale.
| Option | Type | Default | What it does |
|---|---|---|---|
enabled | boolean | true | false = no wholesale sales. |
factor | number | 0.85 | Crate price = shelf price of the unit × units per crate × factor. |
maxCrates | number | 20 | Crates per purchase. |
distance | number | 3.0 | Metres to the stockroom manager. |
model | string | 's_m_m_dockwork_01' | Default ped of the manager. |
points | table | example | Position of the manager per store. Can be moved per store in the editor. |
Basket
Block store.basket.
| Option | Type | Default | What it does |
|---|---|---|---|
required | boolean | true | A basket from the rack is needed to take from the shelves (only in stores with racks). |
keepAfterPay | boolean | false | Keep the basket after paying. |
models | table | see file | Basket models in order of preference: the first one that exists in the game is used. |
show | table | see file | Products drawn inside the basket. |
others / tick | number | 30.0 / 500 | Distance at which other players' baskets are drawn, and update interval. |
stand / stands | table | see file | Pile of baskets on each rack, and rack positions per store. |
drop | table | { vehicle = true, dead = true } | The basket is dropped when getting into a vehicle or dying; its products go back to the shelf. |
Slots, fridges and props
| Option | Type | Default | What it does |
|---|---|---|---|
slotCategories | table | see file | Product categories each slot type (and each shelf section) accepts. Without an entry, any. |
interact | table | see file | Reach of the shelf and stockroom options, how many nearby slots get one, and the label (image, price). |
fridge | table | see file | Animated fridge doors: walk-in distance, how long a door stays busy, fine placement of the player, hand positions, doors enabled or disabled per fridge. |
zones | table | see file | Prop loading by area: when a player gets close to the store, all its props are created in batches, up to max per store. enabled = false loads them by distance. |
props | table | see file | Product models per product, pallets and loads of the stockroom, collision, distances and limits, rotation per model (yaw) and full/empty freezer models. |
Editor
Block editor: movement and rotation steps of the placement ghost (normal and with Shift), pen radius limits, key repeat, ghost opacity, fallback models and the controls to add (keys.insert, default Insert) and remove (keys.delete, default Delete) points.
Profile and panel
| Option | Type | Default | What it does |
|---|---|---|---|
outfit.mode | string | 'none' | Clothes set of data/outfits.lua put on during the run. 'none' keeps the player's clothes. |
leaderboard.size / cacheSeconds | number | 10 / 60 | Rows of the ranking and cache time. |
history.size | number | 10 | Runs shown in the personal history. |
profile.flushMs | number | 30000 | How often XP and daily progress are saved. |
tips.seconds | number | 12 | Seconds a first-time tip stays on screen. |
finish.seconds | number | 15 | Seconds the end-of-run summary stays on screen. |
Commands and keys
| Option | Type | Default | What it does |
|---|---|---|---|
commands.<id>.name | string | false | see Commands | Name of the command. false disables it. |
commands.<id>.restricted | string | 'group.admin' on list, close, fast, admin | ACE group allowed to use the command. |
keys | table | see Commands | Default keys. Each player can rebind them in the game settings. |
Data files
| File | What you edit there |
|---|---|
data/regions.lua | Production lines: type, minimum level, XP, van spawn, tasks and amounts, animals, plots and crops, stations, nests, warehouse, products and yield. |
data/products.lua | Categories and products: prices, cap, consumption, crate prop and how it is carried, inventory item, units per crate, origin. |
data/stores.lua | Supermarkets: job, business account, price factors, dock, pallet, store area, prop zones, stockroom slots, shelves, tills, prices, limits and payment methods. |
data/centrals.lua | Wholesale markets: terminal, dock, pallet, area, price factors, accepted products. All come with enabled = false. |
data/vehicles.lua | Vans per level: model, minimum level, deposit, crate and hen slots. |
data/daily.lua | Daily tasks: runs, money, team, crates (crates unloaded on a pallet) and hens (hens loaded into the van). |
data/levels.lua | XP needed for each level. |
data/guide.lua | Cards of the guide tab. |
data/outfits.lua | Work clothes per mode and sex. |
data/seed/ | Shelf slots, fridges and tills of the included supermarket. They are copied into the database when the file changes. Do not delete this folder. |
Products
Each entry of list in data/products.lua:
| Field | What it does |
|---|---|
id | Stable key stored in the database. Do not reuse or rename it. |
label / category / image | Locale key with the name, category id and picture shown in the interface. |
unit | 'crate' or 'sack'. |
basePrice / minPrice / maxPrice | Reference price of a crate and the range a market pays. |
cap | Reference stock per market (× the market's capFactor). |
consume.perHour | Simulated consumption. |
item / units | Inventory item and units of it per crate. Without item the product is not sold. |
origin | 'production' (production lines), 'import' (import lines) or 'auto' (restocked by the market updates). |
crate | Prop of the crate and how it is carried (box, crate, sack). |
Supermarket
Each entry of data/stores.lua:
| Field | What it does |
|---|---|
id | Stable key. Do not reuse it. |
label | Locale key or text. The included store is supply_store_paleto, "Supermarket · Paleto Bay". |
job / society | Framework job of the staff and business account of cuxial_banking. Both 'supermarket' in the included store. |
priceFactor / capFactor | Multiplier of what it pays per crate, and of the reference stock of each product. |
dock / pallet | Where the van parks and where the crates are left and the delivery note is signed. |
zone / zones | Store area (leaving it with the basket counts as leaving without paying) and the prop loading areas. |
backroom / shelves / registers / selfcheckout | Stockroom slots, shelf slots and till points. The included store takes them from data/seed/. |
accepts | Products it accepts. Without it, every product with an item. |
buy | Fixed price per crate paid to suppliers for a product. |
prices / limits | Shelf prices set by the boss, and per-product limits set by staff (minPrice, maxPrice, maxPerSale). |
pay | Payment methods: 'cash', 'bank', 'card'. |
blip | Map blip. |
Common changes
Pay the runs into the bank
account = 'bank',Restrict the supply job to a framework job
job = { 'supplier' },Let a restaurant buy wholesale
trade = {
-- keep the rest of the block
wholesale = { { job = 'restaurant', grade = 0 } },
},Allow self-checkout while a cashier is working
till = {
-- keep the rest of the block
selfWhenStaffed = true,
},Restock and charge without going on duty
store = {
-- keep the rest of the block
duty = false,
},