Vibinwood
June 3, 2026 · View on GitHub
A BepInEx 6 plugin that drives haptic devices from in-game events in Robin Morningwood Adventure — The Whellcum's Secret (TWS). Fight, jerk off, win a hot scene, climax — and feel it.
Two outputs fire in parallel for every event:
- Intiface / Buttplug — local USB/Bluetooth toys via Intiface Central.
- XToys — cloud toys via an xtoys.app Private Webhook.
⚠️ Adult content. 18+. Integrates with adult haptic hardware.
Engine facts (for modders)
| Game | Robin Morningwood Adventure — TWS, by GrizzlyGamerStudio |
| Unity | 2022.3.20f1, IL2CPP (GameAssembly.dll + il2cpp_data/) |
| Loader | BepInEx 6 (Unity.IL2CPP, win-x64) — not BepInEx 5 (that's Mono only) |
| Plugin runtime | .NET 6 CoreCLR (BepInEx's bundled dotnet/) |
| Anti-cheat | none |
This is the IL2CPP sibling of the 7 Days to Die (Mono/BepInEx 5) plugin. The output
layer (ButtplugManager, XToysManager, HapticsLogger) is shared almost verbatim;
only the bootstrap + Harmony patch layer differ.
Mapped events (EVENT_MAP.md)
All targets are in Assembly-CSharp, global namespace. 11 hooks bind live:
- Combat (
BattleScreenController):Attack,ExecuteEnemyAttack,DisplayRobinsLife(int damage)(intensity scales with the hit),JerkOff,ForceGameOverRobinCums,GameOver(EndType)→ RobinCums / EnemyCums / DoubleCumshot. - Hot scenes:
HotSceneController.StartDisplay/DisplayNextScene,PlayerSetItemController.WinHotScene/LoseHotScene. - Brawl:
BrawlCumshotAttackPanel.Play.
BattleScreenController.EnemyStartsCumming()is intentionally not hooked — the title-screen attract loop calls it every frame (~1200/min), which would machine-gun the toy. The enemy-climax moment is already covered byGameOver(EnemyCums)+ the brawl panel. A per-event debounce (max(150ms, DurationMs)) guards against any other rapid re-fires.
Install (players)
- Install BepInEx 6 IL2CPP (win-x64): download
BepInEx-Unity.IL2CPP-win-x64-6.0.0-pre.2.zipfrom the BepInEx releases and extract it into the game folder (next toRobin Morningwood Adventure.exe). Launch once and quit — this generatesBepInEx/interop,plugins,config. - Runtime dependency fix (one-time): Buttplug's websocket connector references
System.Threading.Channels 7.0.0.0, but BepInEx's bundled .NET 6 runtime pins 6.0.0.0 in its TPA list, so CoreCLR hard-fails the load. Copy theSystem.Threading.Channels.dllthat ships with this plugin over…\dotnet\System.Threading.Channels.dll(a.net6bakbackup is kept). The 7.0 file is the net6-targeted build (bindsSystem.Runtime 6.0.0.0), so it's safe. Intiface won't work without this step. - Copy this plugin's
Vibinwood/folder intoBepInEx/plugins/. - Start Intiface Central ("Start Server") and/or set up XToys (below).
- Launch the game. Settings live in
BepInEx/config/com.vibinwood.haptics.cfg.
XToys setup (optional — cloud devices)
You need a running XToys script with a Private Webhook + Generic Output block and a
setIntensity Global Trigger. The published 7dtvibe
script is a ready-made one that works as-is:
- Open xtoys.app/scripts/7dtvibe, connect your toy under Generic Output, press ▶, keep the tab open.
- In
com.vibinwood.haptics.cfg([XToys]):Enabled = true,WebhookId = <your-id>.
The plugin POSTs https://webhook.xtoys.app/<id> with {"action":"setIntensity","intensity":0-100}.
Modes & configuration
Everything is tuned in BepInEx/config/com.vibinwood.haptics.cfg (the running game reads it on launch). There is no in-game panel — see the note below.
🎛️ Config editor (desktop app):
configapp/is a small .NET WinForms tool that readscom.vibinwood.haptics.cfgdirectly and writes it back in place on Save — sliders, dropdowns, per-event tuning, toy routing, no download-and-move. Build withcd configapp && dotnet build -c Release, runbin/Release/net9.0-windows/VibinwoodConfig.exe. (A zero-install browser version,ConfigEditor.html, is also included as a fallback.) Either way: edit, save, relaunch the game.
[General] Mode — the master behaviour:
Discrete— event pulses only (hits, climaxes, hot scenes, brawl)Continuous— a steady buzz during battles that tracks the live arousal meterBoth— continuous buzz with discrete pulses layered on top (default)Off
Continuous (battle-meter) mode. The battle life bar in this game is an arousal/edging meter — it drains toward climax. While a battle is active the plugin reads both meters every frame and drives your toys:
[Continuous] Invert = true— vibration swells as the meter drains toward climax (arousal = 1 − life).falsetracks remaining life directly.Multiplier,MinIntensity,MaxIntensity— shape the curve.[Continuous] ToyRouting— per-toy meter routing, e.g.Lovense Gush 2=Robin;Some Other Toy=Enemy. Unlisted toys default to slot 0 → Robin, others → Enemy. So with two toys, one reacts to your character and one to the enemy.[Continuous] XToysSource— which meter the XToys output follows (Robin/Enemy/Both/Off).
No in-game GUI. A custom IMGUI overlay would need an injected
OnGUIMonoBehaviour, butIl2CppInterop's ClassInjector hits an uncatchable nativeRewriteTypeAccessViolation on this game's runtime (confirmed acrossLoad(), deferred injection, a field-free type, and the latest BepInEx with a fresh cache). So config is file-driven. An external config editor is the planned GUI.
Build (developers)
Requires the .NET SDK and a BepInEx-6-initialised copy of the game (for the interop
reference assemblies). Edit <GameDir> in Vibinwood.csproj, then:
dotnet build -c Release
The plugin + its managed deps are copied to <GameDir>\BepInEx\plugins\Vibinwood\.
| File | What |
|---|---|
Plugin.cs | BepInEx 6 BasePlugin entry; AssemblyResolve shim; per-hook resilient patching. |
HapticsConfig.cs | Master/XToys config + the per-event table + dispatch (with debounce). |
Patches/Hooks.cs | Harmony postfix bodies, wired one-by-one in Plugin.ApplyPatches. |
ButtplugManager.cs / XToysManager.cs / HapticsLogger.cs | Shared output layer (ported from the 7DTD plugin). |
Reversing workflow
tools/Il2CppDumper was run against GameAssembly.dll + global-metadata.dat to produce
dump/dump.cs (the source of EVENT_MAP.md). Re-run it after a game update to re-map
renamed methods; the per-hook patcher logs a ✗ for any target that no longer resolves.