You are viewing a potentially older version of this package. View all versions.
mamonts-GungeonTogether_LAN-0.2.2 icon

GungeonTogether LAN

Experimental two-player LAN/IP co-op. Host runs native combat; client controls Cultist. Local rendering, separate LAN saves. Use a dedicated profile and Radmin VPN or LAN.

By mamonts
Date uploaded a week ago
Version 0.2.2
Download link mamonts-GungeonTogether_LAN-0.2.2.zip
Downloads 10
Dependency string mamonts-GungeonTogether_LAN-0.2.2

This mod requires the following mods to function

BepInEx-BepInExPack_EtG-5.4.2101 icon
BepInEx-BepInExPack_EtG

BepInEx pack for Enter the Gungeon. Preconfigured and includes unstripped Unity DLLs.

Preferred version: 5.4.2101

README

Gungeon Together LAN — experimental alpha

Two-player cooperation over a trusted LAN or Radmin VPN, with Host / Join by IPv4. The host runs Enter the Gungeon's native two-player simulation. The client controls the native Cultist and renders replicated sprites using its own game resources. The camera is shared. No video streaming or separate server is used.

Early alpha. Full campaigns, every boss/item, additional modpacks and poor network conditions have not been validated. Client combat audio, some effects/materials/beam geometry, shop/dialogue interfaces and secret-wall tile changes remain incomplete. This is a test build with partial visual replication, not a promise of complete multiplayer compatibility.

Install in a dedicated profile

  1. Create a fresh Enter the Gungeon profile named LAN in Thunderstore Mod Manager or r2modman.
  2. Install this package and its BepInExPack EtG dependency.
  3. Both players use version 0.2.2, matching game files, and initially only this mod.
  4. Use the manager's Start Modded button. LAN mode is enabled automatically when the selected BepInEx root belongs to a separate manager profile. No custom launch argument or external EXE is needed for that installation.
  5. Choose a character in the foyer. Press Ctrl+P. The host chooses HOST; the client enters the host's Radmin IPv4 and the same port/session code, then chooses JOIN BY IP.
  6. The host presses START SYNCHRONIZED DUNGEON. The client loads automatically. Control starts after matching dungeon geometry has been verified.

The default TCP port is 27631. Radmin VPN must be installed and connected separately when used. Use an appropriate firewall exception for the game/port. The mod does not encrypt its TCP protocol separately from the VPN.

Keep Steam three-player mods separate

Create a different profile for Rec's GungeonTogether_3Player. Do not install the Steam GungeonTogether plugin or legacy LAN DLLs in this LAN profile. The LAN plugin declares them incompatible to prevent two networking implementations from loading together.

Switch profiles and use Start Modded to switch modes; reinstalling the game is unnecessary. A profile export from a published installation can share package versions. Manually imported local builds still need to be sent separately until publication.

Saves

LAN mode uses <game folder>/BepInEx/GungeonTogetherLAN/dungeon-profile, separate from the normal Windows game profile. Normal progress is not imported into LAN, so existing normal unlocks/currency may be absent there. This LAN directory is shared by installations using the same game folder; manager profiles separate mods/configs, not automatically all game saves.

Direct Steam launches from the game's ordinary BepInEx folder keep normal saves by default and disable LAN connections. Version 0.2.0 incorrectly selected the LAN profile for every launch; that behavior was fixed in 0.2.1 and remains fixed here.

The client temporarily receives the host's LAN generation history/flags to generate the same rooms. System hash and mid-game GUID are scrubbed from that context. Normal disconnect restores the client's previous in-memory LAN context; crash recovery is not guaranteed. Back up normal saves and this LAN directory before manually removing whole game folders.

Advanced setting: Profile / SaveProfileMode in com.gungeontogether.lan.cfg. Auto is the default; Normal disables LAN and retains normal saves; LAN explicitly selects LAN saves. The legacy --gt-lan-profile argument remains supported for direct manual installations. The configuration is read at startup.

Controls and limitations

The client uses its usual movement, aim, fire, roll, reload, interact, blank and weapon-switch controls. Pause/map/common menus are controlled by the host. Input is sent up to 60 Hz; full sprite states up to 10 Hz. TCP loss/retransmission can delay fresh states. A disconnected dungeon run is paused; return to the foyer and start again. Active-run reconnect and host migration are not implemented.

Validation

Tested on Windows against Steam Enter the Gungeon 2.1.9 and BepInExPack EtG 5.4.2101. The final DLL passed 69 automated transport/protocol/profile checks, native normal/LAN save-path and fixture-load checks, and two two-process loopback smoke runs with different room layouts. Both runs checked first-floor layout agreement, client sprite snapshots, native Cultist movement/fire/damage and a forced transition to a matching second floor.

The test enemy had AI disabled and the floor change used a native level-loading command. Boss completion, elevators, active enemy fights and a whole campaign were not established. Some native player/UI initialization exceptions also appear in the test logs; this is not a clean full-gameplay certification. Local two-process tests are not equivalent to two physical PCs over Radmin. Report issues with both participants' BepInEx logs and the last action before the problem; remove private identifiers before sharing logs publicly.

Credits and source

Independent LAN fork based on lam and contributors' GungeonTogether, commit 52be4b636a07f28483ae4e17b16ad471065e89ce. Original MIT copyright notice is preserved. LAN changes are released under the same MIT license. This package is not the Steam three-player fork and is not an official game update.

The corresponding source/build scripts are supplied separately as GungeonTogether_LAN-source.zip with this prerelease handoff. To build from source, run Build-LAN.ps1 with your own game and BepInEx reference paths and an installed .NET SDK; the resulting runtime goes into bin. Game assemblies and BepInEx binaries are not redistributed. The code was developed with AI assistance; use the AI Generated category when listing this package.

CHANGELOG

0.4.1

  • Fix the reproduced Gunfig 1.2.0 floor-load conflict by using native LAN-aware player generation during active sessions; no saved Gunfig options are rewritten.
  • The host's native coin/key counters now read the host wallet. Changing the guest wallet previously overwrote the one shared-screen counter, creating apparent money loss and displaying an affordable purchase that the actual host wallet could not cover. The fix does not grant or redistribute money.
  • Native synergy rebuilding and stat activation evaluate the inventory owner. Splitting components across both characters no longer completes a synergy. Complete sets retain native activation, gun-equipped rules and modifiers for their owner. This applies independently of the three economy switches.
  • Protect the native dungeon's forced character-regeneration fallback, which explicitly loads the Cultist and bypasses the ordinary selected-prefab getter. The ordinary getter/slot lookup were already protected in 0.4.0. Keep strict character validation and include expected/actual identities in future mismatch diagnostics.
  • Restore the native camera's mouse/stick look calculation on each normal LAN view. This is scoped to camera calculation and does not change the global co-op mode. The guest computes look locally, respects the native setting and sends a bounded offset for authority-side visibility culling. Native manual/cinematic framing remains in use.
  • Stop interpolating weapon angles across a flip or a change in the sign of a parent scale. Those poses have different reflected angular representations; blending them produced a spurious intermediate swing.
  • Use a shorter Russian DETAILS label so it fits the footer button.

0.4.0

  • Poll host packets before native input evaluation and send guest controls immediately after native actions update. Button edges bypass the regular send cadence.
  • Present a bounded current-frame walking step locally while retaining host authority and wall/pit guards. Pauses, rolls, teleports and blocked input still stop/reset prediction.
  • Increase full world updates from 30 Hz to an adaptive 60 Hz, backing off to 30 Hz when capture/encoding/compression or the outgoing queue exceed the budget. Stable 60 Hz streams can use a shorter interpolation buffer; jitter still raises buffering.
  • Fix the guest map input reading Pause instead of the configured Map action. Holding/releasing the map action now opens/closes it locally; host-revealed rooms also add the native exits/unknown-room markers without exposing secret rooms.
  • Protect remote action bindings when native controllers initialize, reload saved bindings or are reassigned. Reload remains separate from gun cycling and active-item use.
  • Deduplicate equivalent sprite/material descriptions rather than allocating network IDs for each temporary outline material. This addresses the recorded 0.3.9 "Too many sprite collections" stop. Native stress coverage recreates 5,000 material instances without adding definitions.
  • Replicate the native outline shader's atlas parameters per sprite/frame, including rotated packing and scale, and build outline geometry with the correct flags. This addresses missing outline data; every reported black-halo scene and boss shader is not established by the local probes.
  • Add LAN CO-OP to the game's native title and pause menus, including keyboard/controller navigation. Ctrl+P still opens the overlay. Host/join from the title continues through normal character selection; the overlay yields so the player can choose a character, then reconnects automatically.
  • Follow the game's English, Spanish, Simplified Chinese or Russian language setting. Unsupported game languages use English. No language selector or separate language setting is added. Technical diagnostics remain English.
  • Add three independent host options under RULES: Separate money, Separate keys, and Personal chests and shops. Defaults preserve shared resources and ordinary native loot. Rules are sent to the guest before generation and cannot change during a run.
  • Separate money credits native enemy coin drops to the last attacker. Boss-tagged run coins are split equally, alternating odd remainders; other/unattributed coins go to the collector. Permanent Hegemony Credits are unaffected.
  • Separate keys retains independent key budgets. Disabling one resource option keeps that resource shared even when the other is separate. Balances persist through native floor changes.
  • Personal ordinary chests have independent openings, key payments and random rewards. One player can leave a chest unopened and receive nothing. Rolls may coincide. Ground loot rejects the other player; legitimately held equipment remains visible to the partner and later normal drops can be traded.
  • Finite ordinary run shop stock is purchased independently by each player, at the native price. Native purchase/steal callbacks remain in use. Buying one player's stock does not remove the partner's item or price label.

0.3.9

  • Synchronize the authoritative primary player mastery-token count used by native room-injection prerequisites. Prevent the reproduced client-only fourth-floor Sell Creep injection when client placeholder controllers are temporarily absent. Eligible host conditions remain supported.
  • Preserve native non-mastery prerequisites, host generation and the layout-hash barrier. The generation override applies only to an active LAN client during generation.
  • Show actual native input-override reasons in DETAILS, preserving cinematic/dialogue input restrictions.
  • Require matching 0.3.9 builds on both PCs; retain 0.3.8 interface, rendering, movement and audio changes.
  • Local controlled tests reached the fifth main floor. Full natural combat/campaign and physical two-PC/Radmin validation remain separate.

0.3.8

  • Keep original local sprite shaders, keywords, texture identity/UV transforms and supported color/emission/cutout parameters. Apply dynamic authoritative tint separately. This covers native shadow, gun and procedural projectile material variants without shipping game assets.
  • Wait for both living players at ordinary doors, open immediately once both are close, and avoid the native forced-movement sequence. Defer a room seal until both living players enter so a trailing player is not pulled into a prematurely sealed room.
  • Preserve unacknowledged walking input across ordinary adjacent-room changes, use host door state while clipping client prediction, and filter only small camera-anchor changes caused by animation/pixel rounding. Wall/pit checks and authoritative teleports remain.
  • Mirror native default labels such as shop prices; drive native boss bar artwork with host health/name data. Controllers that contain several boss segments use a combined health fraction on the guest.
  • Exclude local map artwork from world-sprite suppression, update native markers/exploration, and allow the guest to hold the normal map binding. Guest map teleport selection is not enabled.
  • Use authoritative maximum ammo and keep native ammo widgets within the viewport.
  • Normalize native goop clock sentinels (including permanent lifetimes), accept finite signed sprite geometry, and discard unrenderable non-finite host visual transforms with diagnostics. Received packet validation remains strict. Numeric failure messages identify the offending value/field and sprite context where available.
  • Register network sound emitters with Wwise. Keep native hurt cues/switches and add a damage-counter fallback, with separate hurt dispatch/failure diagnostics. Preserve the first session failure when the transport disconnects.
  • Add the support Discord link to the public README: https://discord.gg/wuZQBhbrHk . This becomes visible on Thunderstore when this package description is published.

Update both PCs to 0.3.8. Early-floor alpha; fourth-floor Sell Creep mismatch and full-campaign validation remain open. See RELEASE-NOTES-0.3.8.md and VALIDATION-0.3.8.md.

0.3.7

  • Replace the IMGUI imitation of the guest HUD with the game's actual heart, blank, consumable, gun, active-item and status-bar controllers. Keep the original single-player layout on the guest. Detached inactive UI equipment copies never enter player inventories or run Pickup callbacks.
  • Reserve the native controller confirm/interact button for Interact. Network shooting uses RightTrigger, avoiding direct native menu/controller checks that could mistake a shot for interaction.
  • Open ordinary unlocked doors when either network player enters. Remove the shared-screen proximity gate and its forced movement of both players. Locked/sealed doors and battle-room regrouping keep native checks.
  • Relay nearby native goop cells, definitions and burning/electric/frozen flags. Build local native goop meshes and fire particles without local cell-gameplay callbacks or independent damage/spread simulation. Unsupported assets stop the run with a visible error instead of concealing a hazard.
  • Recreate native textboxes and conversation response buttons using the host's actual text. The host still runs dialogue logic; the guest sends their normal interaction/menu actions.
  • Relay guest damage to the native damage vignette and hurt sound event. Replicate native sprite override tints for hit/status flashes. No local damage is applied for feedback.
  • Update both native placeholder positions/collider caches and room lighting. This addresses stale light/occlusion positions; the exact dark halo reported on a remote PC still needs a remote comparison.
  • Smooth small authoritative walking corrections over 60 ms while retaining immediate bounded visual input replay, collision clipping and resets on teleports/room changes. This is not a reduction of physical network ping.
  • Forward menu-navigation bindings only while a host dialogue is present. WASD's additional menu-navigation actions, reload and weapon cycling no longer disable walking replay. The earlier synthetic direction-only test did not cover these real keyboard binding combinations.
  • Show the native player-two input state in LAN menu DETAILS to help identify any remaining movement locks.

Update both PCs to 0.3.7. Earlier peers are incompatible. Built against Steam Enter the Gungeon 2.1.9 and BepInExPack EtG 5.4.2101. Install through matching clean Thunderstore profiles. No launcher is included.

This is an early-floor alpha. The fourth-floor Sell Creep layout mismatch remains unresolved; full natural campaign completion is not established. The native HUD's current weapon/item display is covered; full inventory foldouts, dual-wield layouts, every item-specific meter, arbitrary dynamic/modded goops, general particle/gas-cloud replication and every NPC/puzzle are not established. A direct ordinary-door restriction was removed; this does not prove that every reported room-transition freeze has the same cause.

See the separate VALIDATION-0.3.7.md for exact checks. Native processes are local, silent, windowed, no-activate and cursor-unconstrained. Sound dispatch is checked without listening. No physical two-PC/Radmin run, fresh manager import or remote publication is claimed. All earlier release directories remain intact.

0.3.6

  • Synchronize opened native secret-room ceilings, door meshes/blockers, visibility and minimap reveal. Keep closed secrets concealed and apply presentation without client room-entry gameplay or duplicate discovery statistics.
  • Send the guest's complete gun, active-item, passive-item and active-synergy inventory when it changes. Use read-only native equipment-page readers and show the selected guest character.
  • Keep Ammonomicon item sprites visible instead of hiding them with simulated world actors. Mute guest movement/prediction while its book is open. Do not grant items or mutate the mirror's placeholder inventories to populate the book.
  • Preserve and enforce the native shared coin/key budget. Either player collects/spends from the same consumables object; blanks and equipment remain per-player.
  • Retain native ghost persistence and resurrection rules. No automatic revival on every floor change is added.
  • Require 0.3.6 on both peers. Retain 0.3.5 movement response changes and earlier guest HUD/audio/camera fixes. Full campaign and fourth-floor Sell Creep mismatch limits remain.

0.3.5

  • Send compact player motion separately at up to 60 Hz and full world snapshots at up to 30 Hz. Capture after native physics and acknowledge input consumed by the native player controller.
  • Preserve the guest input/send cadence through frame jitter. Coalesce unsent movement states while retaining reliable action edges.
  • Add optional bounded visual prediction for ordinary guest walking, including the attached gun/hands/outlines and guest camera. Keep native damage and interactions authoritative on the host.
  • Check terrain and blocking bodies before presenting predicted lead. Disable/reset replay for pause, rolls, input overrides, stale motion, room changes and teleports. Provide Network / ClientMovementPrediction to disable it.
  • Use adaptive world interpolation, initially 40 ms and bounded to 35-90 ms. Report actual smoothing in the menu.
  • Retain the graphical guest HUD, combat sound relay, independent cameras and resource/layout checks. Require 0.3.5 on both peers.
  • Make public packages English only. Exclude local agent instructions, localized documents and obsolete launcher files. Browser repository uploads still require explicit deletion of old tracked files.
  • Keep the unresolved fourth-floor Sell Creep layout mismatch and incomplete campaign coverage explicit. Local response measurements do not establish two-PC/Radmin latency.

0.3.4

  • Replace the guest text box with a graphical, host-authoritative HUD using local heart/armor/blank/cash/key and equipped gun/item icons; include max health, magazine capacity/count, reload and item-charge state.
  • Add bounded combat sound-event batches with spatial emitters and per-source Wwise switches. Keep local volume settings and suppress duplicate local combat cues while mirroring.
  • Reject duplicate, old-floor and stale sound batches; clear sources during transitions and session teardown. Add sound counters to network diagnostics.
  • Require 0.3.4 on both peers. Preserve separate cameras and existing synchronization checks; full campaign and audible two-PC coverage remain unverified.
  • Keep silent, windowed diagnostics and separate release/0.3.4/ artifacts with standalone release notes. No launcher update.

0.3.3

  • Added per-player camera focus during ordinary LAN gameplay: host/player one and client/player two. Native manual camera framing is retained for scripted sequences.
  • Select network sprites using the guest's virtual camera and bounded viewport aspect, including objects outside the host's screen.
  • Read native deferred off-screen sprite-animation updates before capturing geometry.
  • Bypass the native shared-screen movement boundary while retaining other movement restrictions and collision results.
  • Require 0.3.3 on both peers; older input payloads do not include the guest viewport aspect.
  • Retain the 0.3.2 enemy asset loader and 0.3.1 transport/interpolation changes. Full campaigns and complete death/cinematic coverage remain unverified.

0.3.2

  • Fixed resolution of native enemy sprite collections embedded in enemy prefabs, including Blobulin/Blobuloid/Blobulon. Missing collections can now load their owning prefab dependencies by native enemy GUID.
  • Preserved collection GUID/table checks and the stop on genuinely incompatible resources; no invisible-enemy fallback.
  • Added bounded prefab-owner discovery and per-session dependency caching. The network handshake now requires 0.3.2 on both peers.
  • Reproduced the 0.3.1 missing-Blobulin stop before testing the fix. Current bounded native evidence is in VALIDATION.md; full-run readiness is not claimed.
  • Updated the Thunderstore/source package and public troubleshooting instructions. No launcher update is provided. Existing latency improvements remain; further latency reduction is not claimed.

0.3.1 — state freshness and client stability alpha

  • Replace pending world/foyer state with newer state while preserving reliable control-message order. Compress large replaceable packets when useful and bound pending stale data.
  • Reduce timestamped display interpolation from 120 ms to 60 ms; retain up to 20 dungeon snapshots per second. Add mod RTT and client input-to-host-snapshot acknowledgement readings.
  • In a controlled real-socket test with an incompressible 16 KiB / 30 Hz workload and a 128 KiB/s bottleneck, p95 delivered-state age changed from 2063 ms under FIFO to 341 ms under latest-state delivery. This is not a Radmin or running-dungeon result.
  • Add guest cash, keys, blanks, weapon/item names, active-item state, ghost/death and run-end HUD information.
  • Update mirrored client rooms without native gameplay room-entry events; suppress client collision simulation and independent boss intros while mirroring. Reduce repeated scene scans.
  • Prevent native focus-loss automatic pause during an active LAN run; preserve manual host pause.
  • Draw the menu cursor above controls. Inherit initial display preferences once and refresh the normal startup viewport/UI with bounded work.
  • Add display-profile, acknowledgement, latency and sprite-visibility checks. The exact runtime passed two bounded local two-process early-floor scenarios; see VALIDATION.md for measurements and remaining visual coverage. Complete item-outline/material fidelity is not claimed.
  • Require both peers to update: 0.3.0 and older peers are incompatible.
  • Keep the unresolved fourth-floor Sell Creep layout mismatch and geometry barrier explicit. No full-campaign or physical-PC/Radmin validation is claimed.

0.3.0 — movement and character alpha

  • Interpolate timestamped foyer avatars and client dungeon sprites/camera with a 120 ms buffer. Increase dungeon snapshots to up to 20 Hz.
  • Resolve different foyer heroes using their own sprite collections.
  • Let the client choose Cultist, Pilot, Marine, Convict or Hunter before the run. Transfer the selected heroes in floor commands and scope native co-op prefab/controller lookup fixes to the LAN run.
  • Replace the prototype window with a restrained dark/gold menu, role tabs, hero selector, scalable layout and separate diagnostics. Typing mutes local movement; Esc closes the menu.
  • Use English throughout the in-game menu, hero names, hints and client status HUD.
  • Require both PCs to update: 0.2.x peers are incompatible.
  • Isolate native per-room generation random state on every floor. This fixes a reproduced case where procedural corridor pit/floor cells differed despite matching room names and prerequisites. Keep layout hash checks enabled.
  • Known blocker: a separate fourth-floor layout mismatch remains reproducible. The geometry barrier stops the run; the fifth floor was not reached. Attempts to isolate deferred layout RNG did not resolve this and are excluded from the release.
  • Add silent windowed diagnostics with background execution and cursor release. See VALIDATION.md for the exact current test scope.

0.2.3 — documentation package

  • Correct public instructions and repository metadata; the runtime remained 0.2.2.

0.2.2 — profile installation alpha

  • Automatically enable LAN mode when loaded from a separate mod-manager BepInEx profile.
  • Keep ordinary direct Steam launches on normal saves; retain explicit Normal/LAN configuration choices.
  • Use a distinct LAN plugin identifier and declare Steam GungeonTogether/legacy LAN plugins incompatible in the same profile.
  • Package the runtime for Thunderstore dependency installation without an external installer EXE.
  • Transfer the host's current-session generation statistics and retained early-chest flag; preserve native player availability during client seed initialization. This addresses later-floor geometry mismatches reproduced during local preflight tests.

0.2.1

  • Fixed unconditional save-profile redirection during ordinary Steam launches.

0.2.0

  • Added host-native Cultist control, local sprite replication, generation-context/layout checks and floor-transition synchronization.

0.1.0

  • Added direct IPv4/TCP connection and foyer avatar preview.