GTA V · Single player

On The Blade

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.

Legacy + Enhanced v0.2.0 ScriptHookVDotNet Enhanced .NET Framework 4.8

What it is

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.

Read this first

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.

Content

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.

Systems

Five layers, each feeding the next.

Two revenue streams

An hourly street take that generates heat and risk, and a safe weekly subscription deposit. They compete for the same worker-hours.

Incidents

Bad clients, vice stings and walk-offs. One at a time, then a cooldown — two emergencies at once isn't a choice.

Territory

Six zones, four rival crews. Work a neutral corner to claim it; take a held one by force.

Business

Roster upgrades, a legal retainer, laundering, stash houses with fast travel, and hired muscle on wages.

The two streams

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.

The tension

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:

StrategyStreet / wkSubs / wkTotal / 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.

Recruiting

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:

AreaSearch radiusTier 1Tier 2Tier 3
Gang turf70m70%25%5%
Vinewood70m25%45%30%
Anywhere else35m60%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.

Taking someone else's earner

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.

ConsequenceWhy
She comes in a tier higherShe already knows the job
Loyalty −15She has been through something and doesn't trust you yet
Her crew: aggression +0.15, strength +5They pull people in
Every other crew: aggression +0.04Word travels — a pimp who poaches is everyone's problem
55% chance they arrive within the minuteAnchored 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.

Needs verifying in-game

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.

Territory rules

Zone statePost crew?PayoutRival pressure
NeutralYes — doing so claims itbaseNone
YoursYes×1.15Contested while staffed
Rival-heldNo — 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.

Install

Same steps for Legacy and Enhanced — one build covers both.

Requirements

Why SHVDNE, not stock SHVDN

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.

  1. Install Script Hook V

    Get the build for your edition and copy its files into the game root — the folder with GTA5.exe or GTA5_Enhanced.exe.

  2. Install ScriptHookVDotNet Enhanced

    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.

  3. Drop in the mod

    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.

  4. Launch story mode

    On Enhanced, start the game without BattlEye. Load a single-player save and wait for the world to finish streaming.

  5. Press F5

    You should see an "On The Blade loaded" notification on startup and the operations menu on F5. If not, check Troubleshooting.

Where it keeps its files

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.

Uninstalling

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.

Controls

KeyAction
F5Operations menu — roster, territory, upgrades, property, muscle
F1Phone menu — status report, recall everyone, fast travel
Phone contact"On The Blade" in the in-game phone opens the same phone menu
InsertSHVDN script reload. Safe — releases every owned ped and saves first

Both keys are rebindable in config.json via MenuKeyName and PhoneKeyName.

Config

Everything is tunable without a rebuild. Edit config.json and press Insert to reload.

Keys and interface

SettingDefaultEffect
MenuKeyNameF5Operations menu key
PhoneKeyNameF1Phone menu key
EnablePhoneContacttrueRegisters the in-game phone contact. Off skips loading iFruitAddon2 entirely
AutoSaveIntervalMs120000Autosave period

Streaming

SettingDefaultEffect
SpawnRadius150Distance at which a crew ped is created
DespawnRadius220Distance at which it is deleted. Keep the gap wide or walking the boundary thrashes
StreamScanIntervalMs750How often streaming is evaluated

Economy

SettingDefaultEffect
TierBaseRate1/2/3120 / 260 / 550Base hourly payout by crew tier
NightDemandBonus1.6Multiplier between 20:00 and 05:00
OwnedZoneBonus1.15Multiplier on turf you hold
StaminaDrainPerHour9Drain while on shift
StaminaRecoverPerHour14Recovery while off duty
LoyaltyDrainWhenExhausted4Loyalty lost per hour below 10 stamina
HeatDecayPerHour0.03Base heat bleed-off, all zones

Recruiting

SettingDefaultEffect
RecruitModels31 modelsThe eligibility list. Widen it here rather than in code
RecruitRadius35Search radius in an ordinary area
RecruitRadiusHotspot70Search radius on gang turf and around Vinewood
ShowProspectBlipstrueBlip nearby prospects while standing in a hotspot
MaxProspectBlips8Cap on simultaneous prospect blips
ProspectBlipRefreshMs1500How often the blip set is rebuilt
WorkerBlipColourNamePinkMap colour for crew on post. Any GTA.BlipColor name
ProspectBlipColourNamePinkMap colour for prospects. Unrecognised names fall back to Pink
ClaimChanceGang0.45Odds a prospect on gang turf already works for somebody
ClaimChanceVinewood0.30Same, around Vinewood
ClaimChanceOrdinary0.12Same, anywhere else
RetaliationChance0.55Odds a claim brings her crew straight to you
PoachAggressionHit0.15Aggression added to the crew you took her from
PoachAggressionSpread0.04Aggression added to every other crew
PoachLoyaltyPenalty15Loyalty she arrives short of

Subscriptions

SettingDefaultEffect
SubscriptionBrandJustFansIn-fiction platform name, shown in menus and the deposit notification
SubscriptionPayoutDays7Game days between deposits. Seven is about 5.5 real hours at default timescale — lower it if you want a faster loop
FollowerGainPerHourOffDuty60Before stamina, loyalty and tier scaling
FollowerDecayPerHourWorking8Lost per hour on the street — nobody is posting
RevenuePerFollowerWeekly0.5Deposit = followers × this × (loyalty/100)
MaxFollowers25000Ceiling per worker

Incidents and rivals

SettingDefaultEffect
BadClientChance0.08Per worker per hour
WalkOffChance0.35Per worker per hour, below 25 loyalty
ViceStingHeatFactor0.25Sting chance = zone heat × this
RivalContestChance0.12× crew aggression, per hour
IncidentCooldownMs90000Quiet period after one resolves

Saturation, raids, debt

SettingDefaultEffect
ZoneSaturationFalloff0.35Per-worker yield divided by 1 + others × this. Stops stacking one corner being optimal
RaidHeatThreshold0.95Heat at which a staffed zone gets turned over
RaidLockoutDays3Game days the corner stays shut
RaidHeatAfter0.5Heat left behind after a raid
RaidFine5000Charged on a raid — becomes debt if unaffordable
BribeCostPerHeat9000Cost to clear one full point of heat
BribeHeatCleared0.5Heat removed per bribe
DebtInterestPerDay0.08Compounded at midnight
DebtCollapseThreshold150000Debt at which the operation folds
VehicleCost28000Per region
VehicleDemandBonus1.10Payout multiplier in that region
VehicleStaminaRelief0.75Stamina drain multiplier in that region

Business

SettingDefaultEffect
BaseRosterCap4Starting roster size, +2 per roster upgrade
EnforcerHireCost12000Up-front cost per enforcer
EnforcerDailyWage350Charged at 00:00. Miss it and they all walk
StashHeatDecayBonus2.0Heat decay multiplier in a stash's region
StashStaminaBonus1.5Off-duty recovery multiplier, any stash owned
LaunderedHeatDecayBonus1.5Heat decay multiplier from the laundering upgrade

Troubleshooting

Start with scripts/OnTheBlade/OnTheBlade.log — it records the game file version at startup, which is the first thing worth knowing.

Nothing happens when I press F5

It stopped working after a game update

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 phone contact is missing

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.

Crew are standing in odd places

Zone anchors and stash positions are approximate in this build and still need verifying in-game. They live in Zones.cs and Regions.cs.

Someone is stuck "in trouble"

Press Insert to reload. That aborts any active incident, releases its peds and clears the stuck state before saving.

Build from source

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.

FileSourceVerified with
ScriptHookVDotNet3.dllSHVDNE release zipv1.1.0.6
LemonUI.SHVDN3.dllLemonUI.zipSHVDN3/v2.2
iFruitAddon2.dlliFruitAddon2 release or NuGet3.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.dllScriptHookVDotNet3.dll is reference-only and must not be copied.

Why one build covers both editions

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.