Sparroh-LiveSplitHooks icon

LiveSplitHooks

Automatic LiveSplit start/split/reset for Mycopunk. IL reset-before-start, objective splits, per-mission split profiles.

Last updated 17 hours ago
Total downloads 1
Total rating 0 
Categories Client-Side
Dependency string Sparroh-LiveSplitHooks-1.2.4
Dependants 0 other packages depend on this package

This mod requires the following mods to function

BepInEx-BepInExPack_Mycopunk-5.4.2403 icon
BepInEx-BepInExPack_Mycopunk

BepInEx pack for Mycopunk. Preconfigured and ready to use.

Preferred version: 5.4.2403

README

LiveSplitHooks

A BepInEx mod for Mycopunk that drives LiveSplit automatically over its named pipe command server. No ASL script required.

Features

  • Auto start when a mission begins
  • Auto reset + start on each new mission (IL-style; configurable)
  • Auto split on successful mission completion
  • Auto reset on mission fail / abort
  • Optional splits on each main objective
  • Incursion floor-clear splits (default target floor 30; ends the run at max floor)
  • Sub-mission transitions (e.g. Cranius after setup): split, swap profile, start
  • Per-mission split profiles — auto switchsplits by mission name/id
  • Load removal via LiveSplit game time (pausegametime / unpausegametime)
  • Auto-reconnect if LiveSplit is opened after the game
  • Fully configurable triggers

Requirements

  • Mycopunk
  • BepInEx (BepInExPack for Mycopunk)
  • LiveSplit running on the same PC
  • For split profile switching: a recent LiveSplit build that supports the switchsplits pipe command

LiveSplit setup

  1. Open LiveSplit and load your splits layout as usual.
  2. Keep LiveSplit running while you play. The named pipe server (\\.\pipe\LiveSplit) is available by default — no extra component is required for pipe control.
  3. Optional: Right-click LiveSplit → Control → compare against Game Time if you use load removal.
  4. Launch Mycopunk with the mod installed.

When a mission starts you should see the timer reset (if a previous run exists) and start. Completing the mission splits; failing resets (defaults).

IL vs full-game

  • Individual missions (default): leave ResetBeforeStartOnMissionBegin = true. Each mission is its own LiveSplit attempt (reset + start on begin, split on complete).
  • Full-game / multi-mission route: set ResetBeforeStartOnMissionBegin = false so the timer keeps running across missions. Use one split segment per mission with SplitOnMissionComplete = true. Prefer leaving split profiles **off ** for full-game runs.

Objective splits

Set SplitOnObjectiveComplete = true to split on each main (non-side) objective. Keep SplitOnExtractObjective = false if SplitOnMissionComplete already ends the run, or you will double-split at extract.

Incursion (floor 30)

Incursion never ends in-game. The speedrun category ends at floor 30.

When the active mission id is listed in FloorChangeSplitMissionIds (default incursion):

  • Timer starts on mission begin as usual
  • Each floor clear (floor number increases) sends split
  • Door code skips that jump multiple floors emit one split per floor crossed (keeps a 30-segment layout aligned)
  • Clearing floor 30 (entering floor 31, or skipping past 30) sends the final split and ends the LiveSplit run ( IncursionEndRunAtMaxFloor, default true)
  • Final time stays on screen; further floors / mission fail later do not reset or split this attempt

Suggested incursion.lss: 30 segments (cleared floor 1 … cleared floor 30). No extract segment.

Cranius (sub-mission)

Cranius loads after a setup mission on Moldy Tundra (often planet_def). With SplitOnSubMissionTransition = true ( default):

  1. Setup mission starts → normal start (and optional profile)
  2. Cranius mission starts → split (ends setup attempt) → resetswitchsplits to Cranius profile → start

The game’s mission id is literally ???; C# type is FlatTundraMission. The mod sets primary key **cranius **. Put these in your live profiles.txt (not only the example file):

cranius => Mycopunk - cranius.lss
??? => Mycopunk - cranius.lss
FlatTundra Mission => Mycopunk - cranius.lss
FlatTundraMission => Mycopunk - cranius.lss
# planet_def => Mycopunk - planet_def.lss

Cranius is separate from Amalgamation — only Flat Tundra / cranius aliases apply.

Per-mission split profiles

Use this when different missions need different .lss files (e.g. different objective counts).

  1. Put your .lss files in one folder (any path). Filenames can include the game prefix, e.g. Mycopunk - cleanup_detail.lss.
  2. In config (BepInEx/config/sparroh.livesplithooks.cfg):
[SplitProfiles]
Enabled = true
Directory = C:\Path\To\LiveSplit\Splits
MapFile = C:\Path\To\LiveSplit\Splits\profiles.txt
Mappings =
AllowSubstringMatch = true
  • MapFile = path to the mapping text file (not Mappings — that is for inline lines only).
  • Directory = folder used to resolve relative .lss names on the right-hand side of the map.
  • Ensure the map file is named profiles.txt (not profiles.txt.txt from Windows hidden extensions).
  1. Create profiles.txt next to your splits (see profiles.example.txt):
ouroblitz => Mycopunk - ouroboros_blitz.lss
incursion => Mycopunk - incursion.lss
cleanup_detail => Mycopunk - cleanup_detail.lss
prized_pos => Mycopunk - prized_pos.lss
sat_salvage => Mycopunk - sat_salvage.lss
cranius => Mycopunk - cranius.lss
??? => Mycopunk - cranius.lss
FlatTundra Mission => Mycopunk - cranius.lss
FlatTundraMission => Mycopunk - cranius.lss

Confirmed ids: ouroblitz, incursion, cleanup_detail, prized_pos, sat_salvage, Cranius (cranius / ??? / FlatTundraMission).

  1. Start a mission with DebugLogging = true and read the BepInEx log line:
Mission identity key='ouroblitz' name='Ouroboros: Blitz' detail=[OuroborosBlitz | Roguelike Operation]

Prefer the stable key= id for exact mappings; ~Name substring lines work until you log each mission once.

  1. On the next matching mission the mod sends resetswitchsplits <path>start.

Inline mappings also work via SplitProfiles.Mappings (same line format, \n-separated in the cfg value). MapFile is easier to edit.

Note: Profile switching resets the timer before loading the new file so LiveSplit can swap cleanly. That pairs naturally with IL mode.

Installing

Thunderstore / r2modman (recommended)
Install LiveSplitHooks into your Mycopunk profile.

Manual
Place LiveSplitHooks.dll in BepInEx/plugins/.

Configuration

Edit BepInEx/config/sparroh.livesplithooks.cfg (created on first launch):

Section Key Default Description
General Enabled true Master switch
General DebugLogging true Log commands and mission identity
Connection AutoReconnect true Retry if LiveSplit is not open
Connection ReconnectIntervalSeconds 3 Delay between reconnect attempts
Triggers StartOnMissionBegin true start when mission starts
Triggers ResetBeforeStartOnMissionBegin true reset then start on mission begin (IL). Set false for full-game
Triggers UseStartOrSplit false Use startorsplit instead of start
Triggers SplitOnMissionComplete true split on successful extract/complete
Triggers SplitOnObjectiveComplete false split on each main objective
Triggers SplitOnExtractObjective false Also split extract objective (usually redundant)
Triggers ResetOnMissionFail true reset on fail/abort
Triggers PauseGameTimeDuringLoads true Pause game time while loading
Triggers SplitOnSubMissionTransition true Mid-run mission change: split, swap profile, start (Cranius)
Triggers FloorChangeSplitMissionIds incursion Mission ids that split on floor clear
Triggers IncursionFloorSplitMax 30 Last floor number that emits a floor split
Triggers IncursionStopSplitsAtMaxFloor true Stop floor splits after max floor
Triggers IncursionEndRunAtMaxFloor true End LiveSplit run when max floor is cleared (endless Incursion)
SplitProfiles Enabled false Auto-switch .lss by mission
SplitProfiles Directory (empty) Folder for relative .lss paths
SplitProfiles DefaultSplits (empty) Fallback .lss if no mapping matches
SplitProfiles Mappings (empty) Inline key => file lines
SplitProfiles MapFile (empty) External mapping file path
SplitProfiles AllowSubstringMatch true Allow key⊂mission-name matches

Building

dotnet build --configuration Release

Output: bin/Release/netstandard2.1/LiveSplitHooks.dll

How it works

The mod connects to LiveSplit’s command server and sends newline-terminated commands (start, split, reset, switchsplits, pausegametime, …).

Game hooks (Harmony):

  • MissionManager.OnMissionStarted_Client → capture mission identity, optional profile switch, optional reset, then start
  • MissionManager.OnMissionCompleted_ClientRpc → split
  • MissionManager.OnFailMission_Client → reset
  • ObjectiveBase.Complete / client RPC → optional objective splits
  • IncursionObjective.SpawnRooms_ClientRpc / IncursionHUD.SetFloor → floor-clear splits
  • Scene / player-load state → game time pause

Mission identity is resolved via MissionManager reflection (name/id and related fields) and logged when debug is on so you can build profile maps without reverse-engineering.

Troubleshooting

  • Nothing happens — Confirm LiveSplit is open before or while the game runs; enable DebugLogging and watch the BepInEx log for LiveSplit <= start etc.
  • Double splits — Turn off SplitOnObjectiveComplete if you only want one split per mission, or disable SplitOnMissionComplete if you split on objectives only.
  • Timer doesn’t use load removal — Set LiveSplit to compare Game Time, and keep PauseGameTimeDuringLoads enabled.
  • Pipe connect failed — Another program may be holding the pipe; restart LiveSplit.
  • Profile did not switch — Check the mission identity log line, your map keys, and that the .lss path exists. Confirm your LiveSplit version supports switchsplits (update LiveSplit if the command is ignored).
  • Wrong splits loaded — Prefer exact keys from the log; disable AllowSubstringMatch if substring rules are too greedy.
  • Incursion keeps running after floor 30 — Ensure IncursionEndRunAtMaxFloor = true and that the mission id matches FloorChangeSplitMissionIds (default incursion).

License

MIT — see LICENSE.

Authors

  • Sparroh