Laundromat Heist Economy & Persistence
The heist is backed by four MySQL tables (via oxmysql). Together they create a persistent, consequence-driven economy: a missed delivery has a real cost, and loyalty to a clan pays off across every heist that shares it.
The four pillars
| Pillar | Table | What it does |
|---|---|---|
| Debt | vs_laundro_debt | A missed/failed delivery puts the crew leader in debt. No new job until they repay the boss in person. |
| Reputation | vs_heist_reputation | Per (citizenid, clan). Shared across any heist using the same Config.Boss.clan. Higher tiers = bigger bonus + longer delivery window. |
| Prep | vs_laundro_prep | A finished prep is banked so the crew can resume within prepBankHours (default 24h). |
| Audit | vs_laundro_audit | Append-only log of money-moving events for dispute/fraud review. Written only, never read by the script. |
Debt
- Triggered when the package isn't delivered before the window closes.
- Always owed by one person: the crew leader (the "capo", whoever started the job). Cash only, no bank fallback.
- Blocks that player from starting a new heist until it's repaid at the boss.
Config.Contract.debt.transferOnLeaderCrashdecides what happens if the leader disconnects mid-job:true→ the new leader inherits the debt;false→ it stays pinned to the original starter (anti-dodge: you can't quit to shed it).
Some clans forgive debt at higher trust (e.g. the Petrovich Bratva's debtMult shrinks the amount owed). See Bosses & reputation.
Reputation
- Earned per on-time delivery (
Config.Reputation.perDelivery, default 1; a clan tier can override). - Keyed by
(citizenid, clan)and shared across scripts that set the sameConfig.Boss.clan. Build a heist "brand" so loyalty carries between resources. - Higher tiers grant a larger delivery bonus and a longer delivery window, and unlock clan-specific perks.
Full tier ladders per clan are on the Bosses & reputation page.
Prep banking
When the crew finishes prep but picks "Not Yet" at the boss, the completed setup is banked for Config.Heist.prepBankHours (default 24h). The starter can resume the heist later without redoing scouting, weapons, the RC Bandito, or the camera hack.
Audit trail
vs_laundro_audit is an append-only record of prep, bonus, debt, washer payout, and repayment events, kept for after-the-fact dispute or fraud investigation. It is never read back by the script. You can also mirror events to a private Discord channel (Config.Audit.discord).
Payout modes
Cash rewards (delivery bonus + wash + safe cash) are paid according to Config.Contract.payout:
type = 'cash'→ the player's wallet (cashAccount:money/cash= wallet,bank= bank).type = 'dirty'→ a launderable item (dirtyItem) to run through your own laundering loop. The item must be a registered item in your inventory (defined in your items file) or the payout is lost. The heist grants it, so the player doesn't need to hold it first.
Database schema
Tables auto-create on first start, or import install.sql up front:
CREATE TABLE IF NOT EXISTS `vs_laundro_debt` (
`citizenid` VARCHAR(64) NOT NULL,
`amount` INT NOT NULL DEFAULT 0,
`updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`citizenid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `vs_heist_reputation` (
`citizenid` VARCHAR(64) NOT NULL,
`clan` VARCHAR(64) NOT NULL,
`rep` INT NOT NULL DEFAULT 0,
`updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`citizenid`, `clan`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `vs_laundro_prep` (
`citizenid` VARCHAR(64) NOT NULL,
`location` VARCHAR(64) DEFAULT NULL,
`completed_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`citizenid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `vs_laundro_audit` (
`id` INT NOT NULL AUTO_INCREMENT,
`citizenid` VARCHAR(64) DEFAULT NULL,
`action` VARCHAR(64) NOT NULL,
`amount` INT NOT NULL DEFAULT 0,
`meta` VARCHAR(255) DEFAULT NULL,
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_citizen` (`citizenid`),
KEY `idx_created` (`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Keying reputation by (citizenid, clan) is the design's superpower: run several heist scripts under one clan and players share one progression across all of them.