
Behold Pirates
Behold: Pirates adds hostile, fully crewed fleets that pursue and battle players who venture into the open ocean.Behold: Pirates
Created by Behold.
Behold: Pirates adds hostile, fully crewed pirate fleets to the open ocean in How to Fish. Enemy boats pursue players beyond the island shoreline, circle at weapon range, exchange fire, react to crew losses, sink, retreat, and leave collectible pirate corpses behind.
Installation
Mod manager (recommended)
Install Behold: Pirates with Thunderstore Mod Manager, r2modman, or Gale. The required BepInEx pack is installed automatically.
Manual installation
- Install BepInEx 5.4.23.5 x64.
- Extract the package into the inner game folder containing
How to Fish.exe. - Confirm that
BepInEx/plugins/Behold.Pirates/Behold.Pirates.dllexists. - Launch the game normally through Steam.
Verified game build
- Game directory:
C:\Program Files (x86)\Steam\steamapps\common\How to Fish\How to Fish - Unity:
6000.4.4f1 - Scripting backend: Mono (
How to Fish_Data\Managed\Assembly-CSharp.dllexists) - Inspected
Assembly-CSharp.dllSHA-256:0491C7B5286CA37B42D506113A9C7E32E0AD8D9D121C5FE3BE8E67CE9E9D036B - BepInEx:
5.4.23.5, Windows x64
The game assembly already retains readable type and member names. The analysis workflow decompiles a separate copy into analysis/decompiled; it never rewrites the shipped DLL.
Build and install the plugin
From PowerShell in this repository:
.\scripts\Build-And-Install.ps1
Launch the game normally through Steam. On first launch, BepInEx creates its configuration and log files. Confirm these lines in:
C:\Program Files (x86)\Steam\steamapps\common\How to Fish\How to Fish\BepInEx\LogOutput.log
Behold: Pirates 0.10.0 loaded; Harmony patches applied.
Harmony observed Player.Awake
Open-ocean encounters
Travelling 60 metres beyond the current island's sampled shoreline triggers the experimental open-ocean encounters. The shoreline is traced from 120 directions when each island loads, follows irregular island shapes, and falls back to the island's configured radius if too little level geometry can be detected:
-
shaded orange-red low-poly debug points follow the water surface around the exact open-ocean boundary, spaced no more than 10 metres apart;
-
entering the open ocean makes the server check every second whether the players can afford a pirate fleet; eligible pirate ships spawn near the seaward horizon, while sinking and retreating ships retain their full value until they have completely drowned, escaped, and despawned, preventing premature replacements;
-
the server totals the live
TotalWorthof every unique item slotted or separately held by living players beyond the open-ocean boundary and adds the player boat's current motor purchase value; only 10% of that worth counts in the first 60-metre open-ocean band, rising by another 10% for each complete border-distance travelled from shore (20% after 120 metres, 30% after 180 metres, and so on), based on the farthest living player; it then rerolls random reinforcements until their combined 100-value hulls, current motor purchase values, and equipped weapon values fit within 75%-100% of the missing pirate-worth requirement; no reinforcement spawns while that shortfall is below the weakest boat's hull-and-weapon value, and after 256 unsuccessful affordable rolls it uses the closest fitting fleet; -
a fleet begins with one boat; the first additional boat has a 50% chance to appear, with the chance halved for every further boat (25%, 12.5%, and so on) up to eight boats, and the boats remain network-visible regardless of distance;
-
the pirate boat always uses the default boat skin and keeps its crew anchored inside its visual hull;
-
each pirate boat independently receives one of the boat's native motors, with each successive upgrade tier weighted at 35% of the preceding tier so stock motors remain common and high-tier motors are rare;
-
each pirate boat has one helmsman and one or more shooters positioned inside the hull; additional shooter tiers use the same 35%-per-tier weighting as motor upgrades, and every living shooter receives a different randomly selected weapon and fires independently unless they have taken over the helm;
-
pirate and player boats collide through the default boat prefab's authored 17-collider physics hull;
-
all crew members use the game's third-person player meshes, original arm IK settings, and live authored hand anchors for the helm and equipped firearm, so wheel and weapon animations move their grips exactly as they do for players;
-
shooters carry a pistol, shotgun, SMG, assault rifle, or sniper rifle; the helmsman steers with both hands and cannot shoot while the other pirates fire from the open hull;
-
if the pirate at the helm dies, the first surviving shooter moves behind the wheel only while the boat is outside its circling range, puts their weapon away, and continues driving while the remaining shooters keep firing; inside that range the shooters stay armed and the boat coasts, and a boat retreats once nobody remains free to shoot;
-
the pirate at the helm targets a moving tangent point on the closest living player's orbit instead of the player boat itself, approaching and circling bow-first through the default boat's authored forward axis, full native motor throttle, buoyancy, and damping pipeline at 25% of the longest-range shooter's attack range; each motor tier therefore keeps its own force-derived acceleration and speed;
-
the pirate free to shoot carries the weapon in a lowered shoulder-ready pose, raises it to aim while firing, grips it with the player's authored hand pose, animates its hands during firing and reloading, and uses its native attack range, projectile type, damage, weapon spread, sound, fire interval, magazine size, and reload timing;
-
pirate fire originates at the visible weapon muzzle and leads the moving player; a per-shot shooter spread shifts the whole shot or pellet pattern without changing the weapon's own spread;
-
all pirates are backed by real creature instances that share their boat's network lifetime and cannot be detached by high-speed movement, while preserving the player's health and incoming-damage scaling, so native fish damage, headshots, trickshot bonuses, kill score, and other kill mechanics apply; killed pirates put away their weapon visuals, restore their skinned hands, use the native player-corpse ragdoll rig, and become named collectible creature items through the normal pickup and inventory systems; corpses continuously left in water lose buoyancy over 30 seconds and despawn, while removing one from the water resets that timer; killing the entire crew gradually removes the boat's buoyancy over the same period, disables its water-masking hull so the sea floods the interior, and removes it beneath the waves;
-
pirate behavior continuously follows player presence and combat readiness: a boat pursues the closest living player beyond the open-ocean boundary, retreats while no living player remains there or nobody aboard remains free to shoot, and immediately resumes pursuit if both conditions recover before the boat escapes; retreating boats despawn once clear.
The trigger distance and encounter toggle are configurable in BepInEx/config/behold.howtofish.pirates.cfg after the first launch. See the configuration reference for every option.
The first line verifies plugin loading. The second verifies Harmony once a player object is created; it is debug-level and may require Logging.Console/Logging.Disk debug sources in BepInEx.cfg.
Refresh decompiled sources after a game update
.\scripts\Analyze-Game.ps1
Compare the new hash and source tree before adjusting patches. Decompiled output and tool binaries are intentionally git-ignored.
Layout
src/Pirates.Mod: plugin sourcescripts/Build-And-Install.ps1: build and deploy toBepInEx/pluginsscripts/Build-ThunderstorePackage.ps1: build a validated upload-ready Thunderstore archivethunderstore: Thunderstore manifest, store description, and iconscripts/Install-BepInEx.ps1: repeatable BepInEx installerscripts/Analyze-Game.ps1: ILSpy decompile and class inventoryanalysis/decompiled/Assembly-CSharp: local readable game sources
Rollback
Remove BepInEx, .doorstop_version, doorstop_config.ini, winhttp.dll, and changelog.txt from the game directory, or use Steam's Verify integrity of game files. Save data is not modified by this plugin.