Skip to content

Repository files navigation

ShiftMorePlayers (SAM-mod)

English | 简体中文

ShiftMorePlayers cover

A BepInEx mod for Shift At Midnight that raises the co-op player limit beyond the vanilla cap of 3 players. It is configurable up to the theoretical Steam lobby maximum of 250, with a default of 10.

Verified: Steam lobby creation, joining, spawning, and gameplay work with the raised limit. Xbox app / Game Pass build 1.0.1.0 successfully hosts an expanded Fusion room. The Xbox over-capacity client fallback still needs a real multi-account test.

Features

  • Raises the Fusion (Photon) session capacity (vanilla relies on the NetworkProjectConfig default of 3)
  • Raises the Steam lobby member limit (vanilla clamps CreateLobby to 3)
  • Fixes the MaxPlayers value shown in the Steam server browser and its "lobby full" checks
  • Extends the Steam create-lobby dropdown up to the configured cap
  • Supports Steam and Xbox app / Game Pass through one adaptive DLL
  • On Xbox, modded clients automatically bypass the title's fixed 3-member MPSD template and join the host's Fusion room directly
  • Limit is configurable (2-250, default 10)
  • Built-in diagnostics log the effective Fusion room capacity and every player spawn

How it works (7 adaptive Harmony patch classes)

Patch Purpose
Fusion.NetworkRunner.StartGame (Prefix) The game never sets StartGameArgs.PlayerCount; force it to N — the authoritative session capacity for the host and the Photon room
Steamworks.SteamMatchmaking.CreateLobby (Prefix) Force cMaxMembers = N — both join paths (server browser + Steam invite) check GetLobbyMemberLimit()
PlatformManager.HostLobby plus the available platform override (Prefix/Postfix) Restore s_MAXPLAYERS around host creation without assuming the Steam-only class exists
PlatformManager_Xbox.OnJoinSessionCompleted (Prefix, Xbox only) When MPSD rejects a fourth member as full, reuse the fetched host XUID and FusionRegion and continue through the game's normal direct Fusion client path
CreateLobbySettings.StartLobby (Prefix, Steam only) Capture the host's actual dropdown selection before the vanilla clamp
CreateLobbySettings.UpdateDropdownLanguage (Postfix, Steam only) Append options to the max-players dropdown every time the menu opens (option i = i+1 players, idempotent)
FusionNetworkManager.SpawnPlayerInGameScene (Postfix) Diagnostics: log every in-game player spawn with its index

The mod discovers platform-specific methods at runtime. Steam-only patches are skipped on Xbox, and the Xbox direct-join fallback is skipped on Steam. No game files are modified.

Installation (players)

Steam

  1. Download BepInEx 6 IL2CPP bleeding edge (BepInEx-Unity.IL2CPP-win-x64-6.0.0-be.xxx.zip) and extract it into the game root folder (next to ShiftAtMidnight.exe).
  2. Launch the game once through Steam so BepInEx can generate its interop assemblies, then quit.
  3. Copy ShiftMorePlayers.dll into BepInEx\plugins\.
  4. Launch the game via Steam. In CREATE LOBBY, the max players dropdown now goes up to 10 (or your configured value).

Xbox app / Game Pass

  1. In the Xbox app, open the game's files and locate its Content folder (the folder containing ShiftAtMidnight.exe).
  2. Extract the complete BepInEx 6 IL2CPP x64 archive into Content. The root dotnet folder is required; copying only BepInEx, winhttp.dll, and the config file is incomplete.
  3. Launch once through the Xbox app, then quit after BepInEx finishes generating BepInEx\interop.
  4. Copy ShiftMorePlayers.dll into Content\BepInEx\plugins\, then launch through the Xbox app.

Install the same DLL on every Xbox player. The host creates the expanded Fusion room; players joining after Xbox's three MPSD slots are occupied need the client-side direct-join fallback in this DLL.

Tested with BepInEx 6.0.0-be.785 and the Xbox build 1.0.1.0 on July 26, 2026.

Configuration

Edit BepInEx\config\com.tntcrafthim.shiftmoreplayers.cfg:

[General]
MaxPlayers = 10

Range 2-250, default 10. The upper bound matches Steam's theoretical lobby-member limit; it is not a claim that 250-player gameplay is stable. On Steam, only the host needs the mod. On Xbox app / Game Pass, install the same version on every player because clients joining beyond the platform template's 3 members must use the direct Fusion fallback.

On Steam, the in-game dropdown offers every size up to the configured value. The Xbox build has no player-count dropdown, so it always uses MaxPlayers directly.

When upgrading from v1.3.0 or older, the mod automatically copies com.tntcraft.shiftmoreplayers.cfg to the new filename on first launch and keeps the old file as a backup.

How high can you go?

Static audit of the current Steam and Xbox game builds (July 2026):

Ceiling Value Why
Recommended / default 10 Player #11+ exceeds Interactable.AmountOfHits' fixed 10 per-player slots and is expected to fail interactions
Xbox MPSD membership 3 The title's GameSessionCrossGen template is server-side fixed at 3; v1.4.0 lets modded extra clients bypass MPSD membership and join Fusion directly
Configurable / Steam limit 250 Highest value exposed by the mod; Steam lobby-member ceiling
Photon protocol limit ~255 PlayerRef uses a byte-sized representation

In practice: use the default 10. Beyond 10 is chaos mode — the session itself holds (engine limits are far away), but extra players may be unable to interact with objects and monsters may not detect them (see Known notes).

Verifying it works

After hosting a lobby, check BepInEx\LogOutput.log:

[Info   :ShiftMorePlayers] Patch OK: FusionStartGamePatch
[Info   :ShiftMorePlayers] Patch OK: SteamCreateLobbyPatch
[Info   :ShiftMorePlayers] Patch OK: PlatformHostLobbyPatch
[Info   :ShiftMorePlayers] Patch OK: XboxFullLobbyDirectJoinPatch
[Info   :ShiftMorePlayers] Patch OK: StartLobbyPatch
[Info   :ShiftMorePlayers] Patch OK: SpawnPlayerLogPatch
[Info   :ShiftMorePlayers] Patch OK: ExtendMaxPlayersDropdownPatch

On Xbox, Steam and dropdown patches are deliberately skipped. Expected lines include:

[ShiftMorePlayers] Steam matchmaking is absent; skipping the Steam lobby limit patch.
[ShiftMorePlayers] Patching PlatformManager_Xbox.HostLobby
[ShiftMorePlayers] Xbox full-lobby direct join fallback armed.
[ShiftMorePlayers] This platform has no lobby-size dropdown; skipping dropdown extension.
[ShiftMorePlayers] StartGameArgs.PlayerCount = 10

An Xbox client joining after the MPSD session reaches three members should also log:

[ShiftMorePlayers] Xbox MPSD lobby is full; bypassing its 3-member template and joining the Fusion room directly.

When players spawn you will see:

[ShiftMorePlayers] Spawned player [Player:4] at index 3

An index of 3 or higher means more than three players reached the game session.

Building (developers)

Requires .NET 6+ SDK. $(GameDir) in the csproj points at the game install folder, then:

dotnet build -c Release

Output: bin\Release\net6.0\ShiftMorePlayers.dll.

Run scripts\build-release.ps1 to build and create both the Nexus Mods and Thunderstore packages in Releases\.

Known notes

  • Lobbies above 10 players: every interactable object (doors, barricades, items...) tracks "who has interacted" in a fixed-size Fusion NetworkArray of 10 slots, indexed by player. The 11th player's interactions are expected to throw index errors and do nothing. The first 10 players are unaffected.
  • Can the 10-slot limit be fixed? Not directly — the array size is compiled into the game binary and is part of the network protocol (host and clients must agree). A mod-side workaround is feasible (extra patches that track interactions of players 11+ outside the array), but it is untestable without 11 real players. If you genuinely want >10-player sessions, open a GitHub issue and it can be built.
  • Event spawn points: the doppelganger event (EventManager.playerDoppelgangerSpawnpoints) and the final sequence (FinalSequenceManager.finalSequenceSpawnPoints) use scene-defined point arrays that may be sized for the vanilla player count — unverified at high player counts.
  • Monster detection: each monster type (BabyDoll / Spider / WeepingAngel) keeps a per-player detection array whose size comes from the scene data — built for the vanilla 3 players. Extra players may be invisible to monsters or cause AI errors.
  • When someone joins, the game may log UpdatePlayerLobbyUI: only N handlers for M members - retrying... — a vanilla lobby-UI retry while it waits for the player object to replicate (more visible on slow networks). It resolves itself within seconds; everyone gets in.
  • Monster difficulty budget scales only with night number and solo/multiplayer flag, not player count — more players makes the game easier. Balance quirk, not a bug.
  • Spawn positions are computed as base + spacing * player index, so any player count gets valid spawn points.
  • Voice anchors are spawned per player dynamically; the Photon Voice room has no player limit.
  • Xbox app / Game Pass version: supported through the same DLL and locally smoke-tested on build 1.0.1.0. v1.3.3 fixed the platform-specific crashes; v1.4.0 adds a client fallback for the server-side GameSessionCrossGen template's fixed 3-member limit. Install the mod on every Xbox player. Expanded hosting is verified; the over-capacity direct-join path still needs a real multi-account test. Extra clients are not MPSD members, so Xbox presence, platform voice-permission lists, and leave cleanup may be incomplete even when Fusion gameplay works.
  • If a game update breaks the patches, look for Patch FAILED in LogOutput.log.

About

Uncap the default 3-player max limit (increase the player lobby limit up to 250 players, ONLY HOST NEEDED)

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages