Skip to content

Added Server Browser and Lobby Server (#10, #45, #35), in-game chat (#8) and minor bug fixes (#36) - #46

Open
AMacro wants to merge 691 commits into
Insprill:masterfrom
AMacro:beta
Open

AMacro wants to merge 691 commits into
Insprill:masterfrom
AMacro:beta

Conversation

@AMacro

@AMacro AMacro commented Jul 14, 2024

Copy link
Copy Markdown

@Insprill

This is a consolidation PR that covers multiple issues.

Work is ongoing for #6 and #11.

Jarnster pushed a commit to Jarnster/dv-multiplayer that referenced this pull request Nov 27, 2024
Fix project board link in the README
@AMacro
AMacro force-pushed the beta branch 3 times, most recently from 1e8fee4 to 48e900a Compare March 2, 2025 10:27
AMacro added 7 commits July 19, 2025 09:57
Replaces sbyte-based paint theme indices with uint-based theme IDs using FNV-1a hashing for unique identification. Updates all relevant serialisation, deserialisation, packet structures, and method signatures to use the new theme ID system. This change improves extensibility and avoids index collisions, allowing for more robust theme registration and lookup.
AMacro and others added 30 commits July 26, 2026 19:42
When SkinManager is installed and the player is a client, call SkinManger's BaseSpawn patch after spawning a TrainCar
Translated more terms to French
Block keyboard inputs from affecting character while chat is open
Move Persistent Jobs compatibility into a dedicated helper and replace reflection-based access with typed events and properties.
Tightens shutdown and unload handling across networking components by clearing client players explicitly, avoiding disposal work during world unload, and updating networked map/item teardown behaviour.

Reduces teardown error logs.
Prevent attempts to add the same component more than once (decrease nuisance logging
Introduces WindPhysicsController to manage spring bone physics for networked player models with wind-based hair/cloth simulation.

- Adds WindPhysicsController component that applies inertia and wind forces to SpringBone components based on car velocity and player position (inside/outside car)
- Disables ambient random wind when player is on a car, replacing it with speed-based wind force
- Detects broken windows to allow wind through when inside a car
- Updates SpringManager to optionally compensate for root motion, preventing false swing from rig translation
- Adds CompensateForRootMovement() to SpringBone for root-relative tip position tracking
Hide remote player models and name tags when they are far from the local player, then reactivate them when they come back within range. The client player manager now runs a periodic culling coroutine with hysteresis to avoid rapid toggling.

Culled players still keep their transforms updated so they remain in sync when shown again.
Adds unload/teardown safety checks in player tracking, world map marker sync, train car cleanup, and server culling/spawner loops. The changes guard event unsubscriptions and component access with null checks, stop periodic coroutines when unloading starts, and clear train-car lookup caches during unload to avoid stale state and shutdown-time exceptions.
Fix issues with summoning the Hand Car with a player onboard.

Extend train availability checks to return explicit in-use reasons and timeout values, including movement, occupancy, brakes, engine, recent use, and job assignment. Propagate this data through SpawnResponse so the server can return richer InUse failures and update the comms radio summon UI to show reason-specific feedback and countdown formatting for timeout-based blocks.

Add a cooldown of 2 seconds for a failed summon to stop spam.
Introduce a trainset-level hard correction path when incoming car positions exceed a max delta, instead of always applying normal interpolation updates. The client now detects threshold breaches per car, temporarily makes rigidbodies kinematic, snaps to authoritative state, clears stale movement queues/stress, then resumes normal physics update processing on the next fixed step.
Raises `MAX_COUPLER_ITERATIONS` from 10 to 50 to give loose coupler attachment more time to converge. Adds a warning when tighten interactions arrive in an unexpected coupling state, plus extra debug logs around `LooseAttachCoupler()` (IDs, distance, iterations, and final coupled target) to improve diagnosis of coupling sync/timing issues.
Propagates an `isDerailed` flag through `InUse`, `LocoInUse`, and `OtherCarInUse` so player-spawned derailed cars are not blocked by normal in-use checks. This bypasses brake, engine-running, carriage, and coupled-car in-use gating for derailed demo scenarios while preserving existing behavior for non-derailed cars.
Make lobby request handling wait for refreshed Steam lobby data before processing, with explicit logging and early exits on refresh failures. Add a shared DVMP lobby check (`IsDVMP`) and use it to block non-DVMP joins. Also fix main-menu cancellation paths so direct IP connection state/buttons are correctly reset when popups are aborted.
Closer alignment with existing code styling for readability.
Revert public fields back to private as they are not accessed outside of the class
Resolve the 'loadAfter' loop created by the current load order:
- PersistentJobs loads after Multiplayer.
- RemoteDispatch loads after PersistentJobs.
- Multiplayer loads after RemoteDispatch.

Check if RemoteDispatch is present and enabled, and if so, wait for it to be loaded prior to patching. Remove the hard 'loadAfter' dependency from `Info.json`
Persistent Jobs mod compatibility
Client player culling now adapts to the active camera context. The culling coroutine uses a shorter check interval when an external camera is active, and computes distance from the active camera transform.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants