BepInEx plugin for Facepunch.Steamworks split-screen multiplayer
Find a file
gabrielgad 73bfe8c0cd
All checks were successful
Build and Release / build (push) Successful in 11s
ci: publish release via Forgejo API instead of softprops action
softprops/action-gh-release@v2 fails on this repo's ephemeral Forgejo runner
image (the tag build ran but the release step never published). Replace it
with a curl-based create-release + asset-upload against Forgejo's native
release API, authorized by the auto-injected GITHUB_TOKEN. Idempotent on
re-runs (reuses the tag's release, replaces the asset).
2026-07-06 13:16:17 -04:00
.github/workflows ci: publish release via Forgejo API instead of softprops action 2026-07-06 13:16:17 -04:00
src v2.3.1: reflection-only cross-variant patcher; coerce SteamId struct writes 2026-07-06 12:59:47 -04:00
.gitignore Initial commit: SplituxFacepunch v2.0.0 2025-12-13 09:19:58 -05:00
nuget.config Initial commit: SplituxFacepunch v2.0.0 2025-12-13 09:19:58 -05:00
README.md Initial commit: SplituxFacepunch v2.0.0 2025-12-13 09:19:58 -05:00

SplituxFacepunch

BepInEx plugin for splitux that enables local split-screen multiplayer in games using Facepunch.Steamworks.

Features

  • Identity Spoofing: Each instance gets a unique Steam ID and display name
  • Facepunch Library Patches: Patches SteamClient.SteamId, SteamClient.Name, IsValid, IsLoggedOn
  • Photon Auth Bypass: Sets AuthType=255 (None) for games using Photon networking
  • Runtime Patches: Apply game-specific patches via config (no recompilation needed)

How It Works

Splitux generates a BepInEx/config/splitux.cfg for each game instance. The plugin reads this config and applies:

  1. Facepunch Settings - Toggle switches for known library patches
  2. Runtime Patches - Game-specific class/method patches using Harmony

Configuration Format

[Identity]
player_index=0
account_name=Player 1
steam_id=76561198000000001

[Facepunch]
spoof_identity=true
force_valid=true
photon_bypass=true

[RuntimePatches]
patch.0.class=SteamManager
patch.0.method=DoSteam
patch.0.action=force_steam_loaded

patch.1.class=GameManager
patch.1.property=DisableSteamAuthorizationForPhoton
patch.1.action=force_true

Available Actions

Action Description
force_true Force bool return to true
force_false Force bool return to false
skip Skip original method entirely
force_steam_loaded Set steamLoaded=true, steamId/steamName to spoofed values
fake_auth_ticket Return fake Steam auth ticket string
photon_auth_none Set Photon AuthType=255, random UserId
log_call Log method calls (debug)

Splitux Handler Example

name: "Across The Obelisk"
steam_appid: 1385380
exec: "AcrossTheObelisk.exe"

facepunch_settings:
  spoof_identity: true
  force_valid: true
  photon_bypass: true

runtime_patches:
  - class: "SteamManager"
    method: "DoSteam"
    action: "force_steam_loaded"
  - class: "GameManager"
    property: "DisableSteamAuthorizationForPhoton"
    action: "force_true"
  - class: "NetworkManager"
    method: "GetSteamAuthTicket"
    action: "fake_auth_ticket"
  - class: "GameManager"
    method: "SteamNotConnected"
    action: "skip"

Supported Games

Games using Facepunch.Steamworks:

  • Across The Obelisk
  • (more as tested)

Building

dotnet build src/SplituxFacepunch.csproj -c Release

Output: src/bin/Release/net472/SplituxFacepunch.dll

License

MIT