GTA V · Single player
A roster and territory management game mode. You don't play a minigame — you run a business, and drive out when it generates a problem.
Saints Row business mechanics and a Mafia III racket board, running live in the open world.
Recruit crew, post them to zones, collect an hourly take, and handle the problems the operation generates. The action isn't scripted missions — it's you responding to what your own business throws up. Everything stays at the abstraction level the base game uses: money, timers, heat, fade-to-black.
Single player only. Loading script mods into GTA Online will get the account banned. Launch story mode, and on Enhanced make sure BattlEye is not running.
Adult themes, handled the way the base game handles them — abstracted, no explicit content. All characters are adults. The systems are management and turf mechanics, not depictions.
Five layers, each feeding the next.
An hourly street take that generates heat and risk, and a safe weekly subscription deposit. They compete for the same worker-hours.
Bad clients, vice stings and walk-offs. One at a time, then a cooldown — two emergencies at once isn't a choice.
Six zones, four rival crews. Work a neutral corner to claim it; take a held one by force.
Roster upgrades, a legal retainer, laundering, stash houses with fast travel, and hired muscle on wages.
Street take resolves every in-game hour. It scales on tier, zone demand, loyalty, heat and stamina, with a night bonus and a bonus on turf you hold. It also generates heat and invites incidents.
Subscription deposits land every seven game days, unlocked by the Ring light and a laptop upgrade. Each worker carries a follower count that builds only while they are off the street and decays while they are on it. The deposit cannot fail, generates no heat and never triggers an incident.
So the two streams compete for the same worker-hours. The roster stops being a throughput problem and becomes an allocation one: who earns now and hot, who earns later and safe.
Stamina drains on shift and recovers off duty. Exhausted crew bleed loyalty, and loyalty scales payout — so working the roster into the ground is mathematically self-defeating. Subscriptions reinforce that rather than bypassing it: a worker parked off duty to build an audience is also resting, and a rested worker builds faster.
Tuned by simulating 12 game weeks for a tier-2 worker at 70 loyalty:
| Strategy | Street / wk | Subs / wk | Total / wk |
|---|---|---|---|
| Street whenever rested | $16,937 | $1,784 | $18,721 |
| Never on the street | $0 | $7,970 | $7,970 |
| Night shift, rest by day | $14,737 | $5,611 | $20,348 |
The mixed strategy wins. Street pays more per hour; subscriptions pay less but carry no risk at all.
Eligibility is a curated list of ped models, matched by hash. Keeping the pool
deliberate is what makes hotspots matter — eligible peds are uncommon enough
that where you look is a real decision. The list is
RecruitModels in config.json, so it can be widened
without a rebuild. Two kinds of area make searching easier:
| Area | Search radius | Tier 1 | Tier 2 | Tier 3 |
|---|---|---|---|---|
| Gang turf | 70m | 70% | 25% | 5% |
| Vinewood | 70m | 25% | 45% | 30% |
| Anywhere else | 35m | 60% | 30% | 10% |
Gang turf turns up volume at the lower tiers; Vinewood turns up fewer people but a better class of them. Standing in either also blips nearby prospects — the mod cannot make the game spawn more people, so instead it points at the ones already there. Ordinary areas get no blips, which is what keeps a hotspot feeling like one.
Some prospects already work for somebody — 45% on gang turf, 30% around Vinewood, 12% anywhere else. Signing one is the cheapest way to get an experienced earner and the fastest way to start a war.
| Consequence | Why |
|---|---|
| She comes in a tier higher | She already knows the job |
| Loyalty −15 | She has been through something and doesn't trust you yet |
| Her crew: aggression +0.15, strength +5 | They pull people in |
| Every other crew: aggression +0.04 | Word travels — a pimp who poaches is everyone's problem |
| 55% chance they arrive within the minute | Anchored where the deal was struck, not at her post |
Clear them and her crew backs off, and she saw you show up. Fail and they take her back permanently. Rival aggression feeds the turf-contest roll, so poaching is the lever that turns the map hostile: with none, a contest lands roughly every 9 real minutes; after ten, about every 5.6. It cannot spiral, because aggression clamps at 1.
Once every rival is broken there is nobody left to poach from, so late-game recruiting quietly becomes safe. That falls out of the design rather than being special-cased.
Hotspots are matched on the game's zone codes rather than coordinates, and the code lists are unverified. The recruit menu prints the code you are standing in so you can check and correct them. An unrecognised code falls through to "anywhere else" rather than breaking anything.
| Zone state | Post crew? | Payout | Rival pressure |
|---|---|---|---|
| Neutral | Yes — doing so claims it | base | None |
| Yours | Yes | ×1.15 | Contested while staffed |
| Rival-held | No — take it first | — | — |
Rivals only attack turf you hold and have staffed. Being attacked over an empty corner you happen to own reads as noise rather than pressure.
Same steps for Legacy and Enhanced — one build covers both.
SHVDNE is a drop-in replacement for ScriptHookVDotNet that runs the same binaries on both editions. Stock SHVDN will not load this on Enhanced. Install SHVDNE even if you are on Legacy.
Get the build for your edition and copy its files into the game root — the folder with GTA5.exe or GTA5_Enhanced.exe.
Download the release zip and copy ScriptHookVDotNet.asi, ScriptHookVDotNet2.dll and ScriptHookVDotNet3.dll into the same game root.
If a scripts folder doesn't exist yet, create one there now.
Copy all three DLLs into scripts/:
<game root>/scripts/
OnTheBlade.dll
LemonUI.SHVDN3.dll
iFruitAddon2.dll
All three are required. iFruitAddon2.dll only powers the phone contact — if it's missing the mod still loads and logs why, but you lose the in-game phone entry.
On Enhanced, start the game without BattlEye. Load a single-player save and wait for the world to finish streaming.
You should see an "On The Blade loaded" notification on startup and the operations menu on F5. If not, check Troubleshooting.
On first run the mod creates a folder next to the scripts:
<game root>/scripts/OnTheBlade/
config.json balance and keybinds
save.json roster, territory, upgrades
OnTheBlade.log startup and error log
Paths resolve off the game root, so Legacy and Enhanced installs keep
completely independent saves and configs with no extra setup. Copy
save.json between them if you'd rather share progress.
Delete OnTheBlade.dll from scripts/. Leave the
other two DLLs if other mods use them. The OnTheBlade/ data
folder can go too, or stay if you might come back to the save.
| Key | Action |
|---|---|
F5 | Operations menu — roster, territory, upgrades, property, muscle |
F1 | Phone menu — status report, recall everyone, fast travel |
| Phone contact | "On The Blade" in the in-game phone opens the same phone menu |
Insert | SHVDN script reload. Safe — releases every owned ped and saves first |
Both keys are rebindable in config.json via MenuKeyName and PhoneKeyName.
Everything is tunable without a rebuild. Edit config.json and press Insert to reload.
| Setting | Default | Effect |
|---|---|---|
MenuKeyName | F5 | Operations menu key |
PhoneKeyName | F1 | Phone menu key |
EnablePhoneContact | true | Registers the in-game phone contact. Off skips loading iFruitAddon2 entirely |
AutoSaveIntervalMs | 120000 | Autosave period |
| Setting | Default | Effect |
|---|---|---|
SpawnRadius | 150 | Distance at which a crew ped is created |
DespawnRadius | 220 | Distance at which it is deleted. Keep the gap wide or walking the boundary thrashes |
StreamScanIntervalMs | 750 | How often streaming is evaluated |
| Setting | Default | Effect |
|---|---|---|
TierBaseRate1/2/3 | 120 / 260 / 550 | Base hourly payout by crew tier |
NightDemandBonus | 1.6 | Multiplier between 20:00 and 05:00 |
OwnedZoneBonus | 1.15 | Multiplier on turf you hold |
StaminaDrainPerHour | 9 | Drain while on shift |
StaminaRecoverPerHour | 14 | Recovery while off duty |
LoyaltyDrainWhenExhausted | 4 | Loyalty lost per hour below 10 stamina |
HeatDecayPerHour | 0.03 | Base heat bleed-off, all zones |
| Setting | Default | Effect |
|---|---|---|
RecruitModels | 31 models | The eligibility list. Widen it here rather than in code |
RecruitRadius | 35 | Search radius in an ordinary area |
RecruitRadiusHotspot | 70 | Search radius on gang turf and around Vinewood |
ShowProspectBlips | true | Blip nearby prospects while standing in a hotspot |
MaxProspectBlips | 8 | Cap on simultaneous prospect blips |
ProspectBlipRefreshMs | 1500 | How often the blip set is rebuilt |
WorkerBlipColourName | Pink | Map colour for crew on post. Any GTA.BlipColor name |
ProspectBlipColourName | Pink | Map colour for prospects. Unrecognised names fall back to Pink |
ClaimChanceGang | 0.45 | Odds a prospect on gang turf already works for somebody |
ClaimChanceVinewood | 0.30 | Same, around Vinewood |
ClaimChanceOrdinary | 0.12 | Same, anywhere else |
RetaliationChance | 0.55 | Odds a claim brings her crew straight to you |
PoachAggressionHit | 0.15 | Aggression added to the crew you took her from |
PoachAggressionSpread | 0.04 | Aggression added to every other crew |
PoachLoyaltyPenalty | 15 | Loyalty she arrives short of |
| Setting | Default | Effect |
|---|---|---|
SubscriptionBrand | JustFans | In-fiction platform name, shown in menus and the deposit notification |
SubscriptionPayoutDays | 7 | Game days between deposits. Seven is about 5.5 real hours at default timescale — lower it if you want a faster loop |
FollowerGainPerHourOffDuty | 60 | Before stamina, loyalty and tier scaling |
FollowerDecayPerHourWorking | 8 | Lost per hour on the street — nobody is posting |
RevenuePerFollowerWeekly | 0.5 | Deposit = followers × this × (loyalty/100) |
MaxFollowers | 25000 | Ceiling per worker |
| Setting | Default | Effect |
|---|---|---|
BadClientChance | 0.08 | Per worker per hour |
WalkOffChance | 0.35 | Per worker per hour, below 25 loyalty |
ViceStingHeatFactor | 0.25 | Sting chance = zone heat × this |
RivalContestChance | 0.12 | × crew aggression, per hour |
IncidentCooldownMs | 90000 | Quiet period after one resolves |
| Setting | Default | Effect |
|---|---|---|
ZoneSaturationFalloff | 0.35 | Per-worker yield divided by 1 + others × this. Stops stacking one corner being optimal |
RaidHeatThreshold | 0.95 | Heat at which a staffed zone gets turned over |
RaidLockoutDays | 3 | Game days the corner stays shut |
RaidHeatAfter | 0.5 | Heat left behind after a raid |
RaidFine | 5000 | Charged on a raid — becomes debt if unaffordable |
BribeCostPerHeat | 9000 | Cost to clear one full point of heat |
BribeHeatCleared | 0.5 | Heat removed per bribe |
DebtInterestPerDay | 0.08 | Compounded at midnight |
DebtCollapseThreshold | 150000 | Debt at which the operation folds |
VehicleCost | 28000 | Per region |
VehicleDemandBonus | 1.10 | Payout multiplier in that region |
VehicleStaminaRelief | 0.75 | Stamina drain multiplier in that region |
| Setting | Default | Effect |
|---|---|---|
BaseRosterCap | 4 | Starting roster size, +2 per roster upgrade |
EnforcerHireCost | 12000 | Up-front cost per enforcer |
EnforcerDailyWage | 350 | Charged at 00:00. Miss it and they all walk |
StashHeatDecayBonus | 2.0 | Heat decay multiplier in a stash's region |
StashStaminaBonus | 1.5 | Off-duty recovery multiplier, any stash owned |
LaunderedHeatDecayBonus | 1.5 | Heat decay multiplier from the laundering upgrade |
Start with scripts/OnTheBlade/OnTheBlade.log — it records the game file version at startup, which is the first thing worth knowing.
ScriptHookVDotNet.log in the game root. If OnTheBlade.dll isn't listed, it isn't being loaded at all.scripts/, not the game root.ScriptHookVDotNet3.dll into scripts/ — a second copy there breaks loading.SHVDNE pins memory offsets per game build and ships point releases to chase patches. Check for a newer SHVDNE before assuming the mod is at fault — that is the usual cause, especially on Enhanced.
The log will say why. A missing or incompatible iFruitAddon2.dll
disables just that feature rather than the whole mod. You need 3.0.2 or
newer — that's the release where one file covers both editions. The
F1 menu works regardless.
Zone anchors and stash positions are approximate in this build and still need
verifying in-game. They live in Zones.cs and Regions.cs.
Press Insert to reload. That aborts any active incident, releases
its peds and clears the stuck state before saving.
Windows and the .NET SDK. Visual Studio is not required.
The project pulls Microsoft.NETFramework.ReferenceAssemblies, so
the SDK alone can target net48. Put three reference DLLs in
lib/ first — the build fails with a pointer to
lib/README.md if any is missing.
| File | Source | Verified with |
|---|---|---|
ScriptHookVDotNet3.dll | SHVDNE release zip | v1.1.0.6 |
LemonUI.SHVDN3.dll | LemonUI.zip → SHVDN3/ | v2.2 |
iFruitAddon2.dll | iFruitAddon2 release or NuGet | 3.1.1 |
dotnet build OnTheBlade.csproj -c Release
Builds clean with 0 errors and 0 warnings on .NET SDK 8.0.423.
bin/Release should contain exactly OnTheBlade.dll,
LemonUI.SHVDN3.dll and iFruitAddon2.dll —
ScriptHookVDotNet3.dll is reference-only and must not be copied.
SHVDNE supports Legacy and Enhanced from the same binaries, and a script written for Legacy runs as-is on Enhanced. The documented exception is scripts using their own memory patterns. This mod uses none — everything goes through the SHVDN API and game natives, so there are no edition-specific code paths to maintain.