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

GungeonTogether LAN

Experimental two-player LAN/IP co-op for Enter the Gungeon. Host-authoritative combat, client-controlled Cultist and separate LAN saves. Early alpha; use a dedicated profile.

Date uploaded 2 weeks ago
Version 0.2.3
Download link mamonts-GungeonTogether_LAN-0.2.3.zip
Downloads 21
Dependency string mamonts-GungeonTogether_LAN-0.2.3

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 two-player co-op for Enter the Gungeon over a local network or Radmin VPN. Connect through Host / Join by IPv4. The host runs the game's native co-op simulation; the client controls the Cultist and renders replicated objects with local game resources. Both players share the host's camera view.

The gameplay runtime is an early alpha. Full campaigns, every boss/item and additional modpacks have not been validated. Client visuals, sound and some interactions remain incomplete.

Package 0.2.3 updates documentation and package metadata. The gameplay DLL and network protocol are unchanged from 0.2.2.

Requirements

  • Two Windows PCs with matching game files and the same mod version. The tested game version is Steam 2.1.9.
  • BepInExPack EtG 5.4.2101 / BepInEx 5.
  • A shared LAN or connected Radmin VPN network. Radmin VPN is installed separately.
  • Start with this mod and its loader only. Other mod combinations are unverified.

Installation

Packaged builds are listed under Releases. GitHub's Code → Download ZIP contains source code, not an installer.

Mod-manager ZIP

  1. Create a clean Enter the Gungeon profile in Thunderstore Mod Manager or r2modman.
  2. Install BepInExPack EtG 5.4.2101 in that profile.
  3. Import the GungeonTogether_LAN-0.2.3-Thunderstore.zip release through Settings → Import local mod, or install the package from the manager's catalogue when available.
  4. Remove older LAN DLLs and other GungeonTogether plugins from the same profile before updating. Keep backups outside BepInEx/plugins.
  5. Launch with Start Modded. LAN mode is selected automatically when loaded from a separate manager profile.

Local imports may require dependencies to be installed separately. Both players must install the same build.

Windows launcher ZIP

For a release that includes GungeonTogether-LAN.exe:

  1. Extract the Windows archive into a separate folder.
  2. Close the game, start Steam and open GungeonTogether-LAN.exe from that folder.
  3. Select the game folder containing EtG.exe, then use the install/launch button.
  4. The launcher can back up recognized older LAN DLLs and install its embedded version. If BepInEx is missing, it downloads the official loader package and verifies its checksum; the first installation needs internet access.
  5. Use the launcher for subsequent manual LAN launches. Update the launcher when updating the mod: its embedded version is fixed.

The launcher installs into the game folder and does not update manager profiles.

Connecting

  1. Both players launch the mod, enter the foyer and choose a character.
  2. Press Ctrl+P to open the LAN menu.
  3. The host selects HOST.
  4. The client enters the host's LAN/Radmin IPv4, uses the same TCP port and Session code, then selects JOIN BY IP.
  5. Once connected, the host selects START SYNCHRONIZED DUNGEON. The client loads automatically and controls the Cultist after the dungeon layout check succeeds.

The default TCP port is 27631. Allow the game through the firewall on the intended network. Use a trusted LAN or VPN: the mod does not add encryption to its TCP connection.

Controls

The client uses the usual movement, aim, fire, roll, reload, interact, blank and weapon-switch controls. The host controls pause, map and shared menus. Ctrl+P reopens the connection menu.

Saves

LAN progress is stored separately from normal progress in:

<game folder>/BepInEx/GungeonTogetherLAN/dungeon-profile

Normal unlocks and currency are not imported automatically. Manager profiles using the same game folder share this LAN save directory; separate mod profiles do not automatically create separate game saves.

With the default configuration, direct Steam launches use normal saves and disable LAN connections. The manual launcher selects LAN saves explicitly. Back up normal saves and the LAN directory before changing installations.

The client temporarily uses the host's generation state to create matching rooms. Normal disconnect restores the client's previous in-memory context; crash recovery is not guaranteed.

Advanced setting: Profile / SaveProfileMode in com.gungeontogether.lan.cfg. Auto selects the profile from the launch method, Normal disables LAN, and LAN explicitly selects LAN saves. Restart after changing it. The --gt-lan-profile argument remains available for manual launches.

Compatibility and known limitations

  • Other Steam GungeonTogether variants and older LAN plugins are incompatible in the same installation/profile. Use separate profiles for other networking mods.
  • Client combat audio, some effects/materials, beam geometry, shop/dialogue interfaces and secret-wall tile changes are incomplete.
  • TCP retransmission can delay state updates on poor connections.
  • A disconnected dungeon run is paused. Return to the foyer and start a new session; active-run reconnection and host migration are not implemented.
  • Native player/foyer initialization errors have occurred during diagnostic runs.
  • Two physical PCs over Radmin, full campaigns, all bosses/items, normal boss-to-floor transitions and third-party modpacks remain unverified.

Validation

The 0.2.2 runtime passed 69 automated transport, protocol and profile checks and two local two-process dungeon smoke runs. These checked matching first/second-floor layouts, client snapshots, native Cultist movement, firing and damage. Normal/LAN save-path selection was checked with copied save fixtures.

The smoke enemy had AI disabled and the next floor was loaded with a native level command. These results do not establish a complete multiplayer playthrough. See VALIDATION.md for detailed evidence.

Reporting problems

Open an issue with the game/mod versions, installation method, last action before the problem and logs from both players. Remove private identifiers before publishing logs.

Source and license

Source: vladnow/GungeonTogether-LAN.

Based on GungeonTogether by lam and contributors, commit 52be4b636a07f28483ae4e17b16ad471065e89ce. Copyright (c) 2025 lam. The original MIT license notice is preserved; LAN changes are distributed under the same MIT license. This is an unofficial fork.

Building requires a .NET SDK and local game/BepInEx reference assemblies. Run Build-LAN.ps1 with GamePath and BepInExCorePath pointing to those installations. Build-Launcher.ps1 builds the optional Windows launcher after the DLL has been built. Game assemblies, assets and BepInEx binaries are not redistributed in this package.

Developed with AI assistance.

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.