English | 简体中文
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.
- Raises the Fusion (Photon) session capacity (vanilla relies on the NetworkProjectConfig default of 3)
- Raises the Steam lobby member limit (vanilla clamps
CreateLobbyto 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
| 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.
- 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 toShiftAtMidnight.exe). - Launch the game once through Steam so BepInEx can generate its interop assemblies, then quit.
- Copy
ShiftMorePlayers.dllintoBepInEx\plugins\. - Launch the game via Steam. In CREATE LOBBY, the max players dropdown now goes up to 10 (or your configured value).
- In the Xbox app, open the game's files and locate its
Contentfolder (the folder containingShiftAtMidnight.exe). - Extract the complete BepInEx 6 IL2CPP x64 archive into
Content. The rootdotnetfolder is required; copying onlyBepInEx,winhttp.dll, and the config file is incomplete. - Launch once through the Xbox app, then quit after BepInEx finishes generating
BepInEx\interop. - Copy
ShiftMorePlayers.dllintoContent\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.
Edit BepInEx\config\com.tntcrafthim.shiftmoreplayers.cfg:
[General]
MaxPlayers = 10Range 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.
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).
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.
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\.
- Lobbies above 10 players: every interactable object (doors, barricades, items...) tracks "who has interacted" in a fixed-size Fusion
NetworkArrayof 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
GameSessionCrossGentemplate'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 FAILEDinLogOutput.log.
