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

GungeonTogether LAN

Experimental two-player LAN/Radmin co-op. Host/Join by IPv4, five guest characters. Fixes missing native enemy sprites stopping early rooms. Full campaign remains unverified.

Date uploaded a week ago
Version 0.3.2
Download link mamonts-GungeonTogether_LAN-0.3.2.zip
Downloads 9
Dependency string mamonts-GungeonTogether_LAN-0.3.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 two-player co-op for Enter the Gungeon over LAN or Radmin VPN. Connect using Host / Join by IPv4. The host runs native co-op; the client controls a selected second character and renders replicated objects using its own game resources. Both players share the host's camera.

0.3.2 is an early-floor testing alpha. The known fourth-floor Sell Creep layout mismatch remains unresolved and can stop a run. Full campaign completion is not established. Client audio, effects and some interactions remain incomplete.

Install or update

  • Both Windows PCs need matching game files and the same 0.3.2 build. Built against Steam Enter the Gungeon 2.1.9.
  • Use BepInExPack EtG 5.4.2101 / BepInEx 5 and a clean manager profile with one networking mod.
  • Install Radmin VPN separately when using a virtual LAN.

When this version is published on Thunderstore, update the mod on both PCs and use Start Modded. For a prepared local package, install the loader in the profile, then import GungeonTogether_LAN-0.3.2-Thunderstore.zip through Settings → Import local mod. The local import may require installing the loader dependency separately.

Remove older LAN DLLs and other GungeonTogether variants from that profile first. Keep backups outside BepInEx/plugins. Use separate profiles for LAN and other networking mods. This release contains a Thunderstore package and source; no updated launcher is provided.

0.3.2 cannot connect to 0.3.1 or earlier peers. Update both PCs. Creating a package does not publish it. Source is available from GitHub; Code → Download ZIP downloads source, not an installable mod.

Connect and play

  1. Enter the foyer and choose a local character. Esc closes the LAN menu; Ctrl+P reopens it.
  2. Host: HOST → CREATE ROOM. Listen address 0.0.0.0 accepts connections on all adapters; a specific local LAN/Radmin address also works.
  3. Client: JOIN. Enter the host's IPv4, matching port and room code. Select Cultist, Pilot, Marine, Convict or Hunter under PLAYER TWO, then JOIN BY IP. The run character is separate from the client's foyer character.
  4. The host sees the choice and presses START RUN. The client loads automatically after the map check. Character selection remains available until the run starts.

Default port: TCP 27631. Allow the game through the firewall for the intended network. Use a trusted LAN/VPN; the mod does not add encryption.

The guest uses normal movement, aim, fire, roll, reload, interact, blank, item and weapon-switch controls. The host controls pause, map and shared menus. Opening the LAN menu mutes guest input. Losing window focus during an active LAN run does not automatically pause the game; manual host pause remains available.

Fix in 0.3.2

Some enemy sprite collections are embedded inside enemy prefabs and cannot be loaded independently by their tk2d GUID. In 0.3.1, encountering Blobulin/Blobuloid/Blobulon could stop the client and then pause the host with Missing or incompatible local sprite asset.

The host now includes the native owning enemy's database GUID with the sprite definition. If the collection is absent locally, the client loads that prefab's dependencies from its own game files and verifies the collection GUID and ordered sprite-table fingerprint. It does not create a second simulated enemy or receive textures over the network. This also supports other enemy collections with an identifiable native owner; it is not proof that every asset in the game is covered.

The missing-asset and layout checks remain active. A real mismatch still stops the session instead of leaving invisible hazards. The exact old failure was reproduced before the fix. See VALIDATION.md for the current runtime hash and bounded native tests.

Latency

The queue/compression improvements from 0.3.1 remain: stale unsent world states are replaced by newer ones, while reliable control messages retain their order. The display buffer is 60 ms, with dungeon snapshots up to 20 Hz. There is no client prediction.

The menu's RTT measures the mod's round trip. Its response figure measures guest input to a confirming host snapshot and excludes display interpolation. Neither is a pure Radmin ping or a guarantee. Low FPS, resource loading, congestion and retransmissions can still add delay. 0.3.2 targets the missing-enemy-asset stop; it does not claim a further latency reduction.

Historical constrained-network measurements belong to 0.3.1 and are retained in publication/VALIDATION-0.3.1.md and the transport evidence.

Saves

LAN progress is separate from normal progress:

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

Normal unlocks and currency are not imported. Initial options/display preferences may be inherited once, with a backup for migrated LAN display fields. Later LAN display choices are preserved.

Manager profiles sharing a game folder also share this LAN save directory. With default settings, direct Steam launches use normal saves and disable LAN. Back up both save directories before changing installations.

The client temporarily imports the host's generation state. Normal disconnect restores its previous in-memory context; crash recovery is not guaranteed. Advanced setting: Profile / SaveProfileMode in com.gungeontogether.lan.cfg: Auto, Normal (LAN disabled), or LAN. Restart after changing it. Manual launches can use --gt-lan-profile.

Limits

  • Fourth-floor Sell Creep map mismatch remains unresolved. Geometry checks stop mismatched runs.
  • A complete natural campaign, all bosses/items/abilities, normal boss/elevator progression, endings, long runs and modpacks remain unverified.
  • Client combat audio, some materials/effects, beams, secret-wall changes and shop/dialogue UI remain incomplete. Client price text is absent. The shop stock/highlight checks recorded for 0.3.1 do not establish complete shopping support.
  • A disconnected run pauses. Return to the foyer and create a new session; active-run reconnection and host migration are not implemented.
  • Native player/foyer startup warnings have been observed. This release does not claim that all freezes or startup errors are resolved.

Native checks use two local game processes, not two physical PCs over Radmin. Read VALIDATION.md for the actual scenarios and their limits.

If the game stops

Before returning to the foyer, capture the full status text below the main button and open DETAILS. An automatically opened LAN menu can indicate a stopped session, not a normal pause. Closing the menu alone does not recover a faulted run.

Keep both players' BepInEx/LogOutput.log files before launching again. For Thunderstore Mod Manager, open the profile folder from the manager; the log is in its BepInEx directory. Include versions, host PC, selected heroes, last action and RTT/response figures in a GitHub issue. Remove personal identifiers before publishing logs.

Source and license

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

Build with a .NET SDK and your local game/BepInEx libraries using Build-LAN.ps1 with GamePath and BepInExCorePath. Game resources, game assemblies and BepInEx binaries are excluded from distribution. 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.