An all-in-one quality-of-life and character mod for Waterpark Simulator, built on BepInEx 6 (IL2CPP).
Eleven features in one plugin, each with its own on/off switch and its own settings. Nothing is forced on you: turn off what you do not want and it is never patched in. If a feature breaks against a newer game build it is logged and skipped, and the game still boots.
Adult content. Some features change guest and staff bodies, including removing swimwear and shipping a replacement nude body mesh. All of it is client-side and cosmetic, and all of it can be switched off.
| Feature | Default | What it changes |
|---|---|---|
| StaffCapacity | on | Multiplies the staff slots the research tree grants — 3 to start and +3 per upgrade, against vanilla's 0–1 and +1. |
| StaffExperience | on | Rescales the research-XP penalty on actions your staff complete rather than you. Defaults to removing it. |
| GuestSwimwear | on | Removes swimwear from guest NPCs. Optionally strips staff and player avatars too, by slot. Client-side visual only. |
| WardrobeNone | on | Puts the game's own hidden "None" buttons back into the character editor's body slots, so your avatar can wear nothing by choice. Only the loaded copy is changed; game files are untouched. |
| StaffMarker | on, inert | Marks employees so they can still be told from guests once StripStaff has taken their uniform: the job on their nameplate, a hat, or sunglasses. Mode ships Off, so it does nothing until you pick one. |
| Wetness | on | Scales down the wet-skin shader, which otherwise reads as shiny plastic, and retunes skin specular. |
| BodyMesh | on | Replaces character meshes with .vmesh files shipped next to the plugin, matched by name. |
| Jiggle | on | Spring motion on the breast and (optionally) glute bones, so they lag and settle as a character moves. |
| DayLength | on | Stretches the in-game day so it does not run out while you are doing something else. |
| VisitorVariety | on | Widens the visitor body generator. Vanilla randomises one visitor in four, and only over the bottom half of its own range. |
| VisitorSexRatio | on | Sets how often a visitor — and optionally a newly offered hireable staff member — is female. Vanilla is a coin flip with no setting. |
| VisitorSkinTones | on | Reweights how often each skin tone is drawn. Ships with vanilla's even spread, so it does nothing until you change the weights. |
| Probe | on | A loopback-only HTTP endpoint for inspecting live game objects. A debugging tool; see below. |
Every knob is documented in docs/features.md — what it does, what the vanilla behaviour was, and how it was measured.
Probe listens on 127.0.0.1:9099 and can read and modify live game state. It is bound to
loopback, so nothing off your machine can reach it, but any local process can. That is the
right trade for a single-player debugging tool and the wrong one for anything else — turn it
off in the config when you are not debugging.
- Waterpark Simulator (CayPlay), Windows build. Runs natively on Windows and under Proton/Wine on Linux.
- BepInEx 6 bleeding-edge, IL2CPP, win-x64. Not BepInEx 5, and not the IL2CPP build from the 5.x line — this game is Unity 6 IL2CPP and only BepInEx 6 loads against it.
- Download the latest
BepInEx-Unity.IL2CPP-win-x64-*.zipfrom the bleeding-edge builds page: https://builds.bepinex.dev/projects/bepinex_be (Developed against6.0.0-be.785. Anything close to it should work.) - Extract the zip into the game folder — the one containing
WaterparkSimulator.exe. You should end up withBepInEx/,doorstop_config.iniandwinhttp.dllsitting next to the exe. - Launch the game once and let it reach the main menu, then quit. The first run generates
the IL2CPP interop assemblies into
BepInEx/interop/and can take several minutes with no visible progress. This is normal. - Confirm
BepInEx/LogOutput.lognow exists. If it does not, BepInEx is not loading — stop here and fix that first, because no plugin will run.
On Linux (Steam / Proton): the injector is a winhttp.dll override, which Proton does not
enable by itself. Set your launch options to:
WINEDLLOVERRIDES="winhttp=n,b" %command%
Non-Steam launchers (Lutris, Heroic, Faugus, bare wine) need the same WINEDLLOVERRIDES
value in their per-game environment.
- Grab
VicMod-<version>.zipfrom the Releases page. - Extract it into the game folder — the same one holding
WaterparkSimulator.exe. The zip already contains theBepInEx/plugins/VicMod/path, so it lands in the right place. - Launch the game.
You should end up with:
<game folder>/
WaterparkSimulator.exe
BepInEx/
plugins/
VicMod/
VicMod.dll
meshes/
CC_Body_Female_LOD0.vmesh
CC_Body_Female_LOD1.vmesh
Uninstall by deleting BepInEx/plugins/VicMod/.
BepInEx/LogOutput.log will contain:
[Message: VicMod] VicMod 0.2.1 loading
[Info : VicMod] [x] StaffCapacity
[Info : VicMod] [x] StaffExperience
...
[Message: VicMod] VicMod ready (11 feature(s) active)
A [ ] means the feature is switched off in the config. A [!] means it failed to apply and
was skipped — the line says which feature and why.
Launch the game once after installing; BepInEx writes BepInEx/config/VicMod.cfg with
every setting, its default and a comment explaining it. Edit it with a text editor and
restart the game.
Turning a feature off entirely:
[Features]
Jiggle = falseEverything else lives in a section named after its feature:
[Jiggle]
Breasts = true
Glutes = false
Stiffness = 300
Damping = 20
[GuestSwimwear]
NamePatterns = Bikini, Swim, Crop_Top
StripStaff = Off
[VisitorSexRatio]
FemaleShare = 0.5Two things worth knowing before you tune:
Logging.Leveldefaults toWarning. Raising it toInfoorDebugis how features report what they measured. BepInEx also has its own filter —Debuglines will not reach the log file unlessDebugis in[Logging.Disk] LogLevelsinBepInEx/config/BepInEx.cfg.- Settings that take a list (
NamePatterns,KeepStaffSlots,Weights) are comma-separated, and BepInEx rewrites the file on every launch — your values are preserved, but formatting is not.
The full reference, including what each number actually does and the range worth trying, is in docs/features.md.
You need the .NET SDK (6.0 or newer — the project
targets net6.0, and a newer SDK builds it fine). Nothing else.
git clone https://github.com/JIRPOS/VicMod.git
cd VicMod
./scripts/build.sh # or: dotnet build src/VicMod/VicMod.csproj -c ReleaseThe output is src/VicMod/bin/Release/net6.0/VicMod.dll. Copy it and src/VicMod/meshes/
into BepInEx/plugins/VicMod/.
VicMod compiles against NuGet packages only — it references no game assembly and resolves every game type by name at runtime — so the build works on a machine with no copy of the game installed.
If the game is installed, the build deploys straight into it. The install is auto-detected from Steam's library folders and the usual manual-install spots; if that misses, point it at yours:
export GAME_DIR="/path/to/Waterpark Simulator" # also used by every script in scripts/
./scripts/build.shor, for MSBuild only, create a gitignored Local.props beside Directory.Build.props:
<Project>
<PropertyGroup>
<GameDir>/path/to/Waterpark Simulator</GameDir>
</PropertyGroup>
</Project>A build that cannot find the game still succeeds; it just tells you it did not deploy.
The Release workflow under the Actions tab builds the plugin and packages it. Run it from
the Actions tab (Run workflow); it uploads VicMod-<version>.zip as a run artifact and,
optionally, opens a draft GitHub Release with the zip attached.
Locally:
./scripts/package.sh # -> release/VicMod-<version>.zipOther scripts, all of which locate the game themselves:
./scripts/log.sh # tail the BepInEx log, filtered to VicMod (-a for everything)
./scripts/dump.sh # Cpp2IL + ilspycmd -> dump/ ; run after every game update
./scripts/commands.sh # regenerate docs/commands.md from that dump
./scripts/meshexport.sh # game asset -> .vmesh
./scripts/meshedit.sh # a .vmesh -> an editable .blend (--shipped reopens VicMod's own)
./scripts/meshinstall.sh # an edited .blend -> .vmesh -> src/VicMod/meshes/The mesh scripts additionally need Blender and
uv on PATH; dump.sh needs tools/cpp2il and
dotnet tool install -g ilspycmd.
Further reading:
- docs/features.md — every feature and every setting, in detail
- docs/meshes.md — the body mesh pipeline, and how to sculpt one
- docs/internals.md — architecture, why types resolve by name, what to do after a game update
- docs/commands.md — every console command in the build
- CLAUDE.md — the working notebook: hazards, what is measured, what is not
Developed against game build 24862398 (Unity 6000.0.65f1, IL2CPP) with BepInEx
6.0.0-be.785.
VicMod resolves every game type, method and field by name at runtime rather than compiling against generated IL2CPP proxies, which is what usually breaks a mod on a game update. A build that only shifts metadata tokens will not break it. A build that renames or removes something a feature looks for will disable that feature, log which one and why, and leave the rest running.
Multiplayer: anything on a NetworkSystem is server-authoritative. The cosmetic features are
client-side and safe; test the rest in singleplayer first.
MIT — see LICENSE.