#Netcode
🥊 USF4 ROLLBACK 🥊

Este sábado a las 18:00 (UTC-3) toca tener una edición especial de Ultra Street Fighter 4 con el mod de rollback netcode en una nueva edición del LFC Extra.

En el Discord tengo el paso a paso para instalar el mod, los invito a que se sumen para probar ✌️
September 26, 2026 at 12:15 AM
How I Fixed Relative Docking & Physics Drift in UE5 (Aether Framework Deep Dive)
Hey DEV! 👋 Last week I shared an update on my open-world space sim _Sirius_ (on reddit KadmiumTech), built on my custom **Aether Framework** in Unreal Engine 5. Aether leverages UE5's Network Prediction Plugin (NPP) and Large World Coordinates (LWC) to handle deterministic 6DOF space physics. One of the trickiest mechanics in space games is **Relative Docking** —landing a small, agile fighter onto a massive, fast-moving capital carrier without physics jitter or netcode desync. Here is a deep dive into four specific physics bugs I encountered and how I solved them in C++! This is still work in progress and needs some adjustmends but the core works. ## ### 1. Jittery Rotation on Moving Carriers **The Problem:** Whenever a ship entered a relative movement zone, rotational smoothing was completely bypassed. Every micro-rotation of the carrier hit the player's ship as a harsh, frame-by-frame stutter. Additionally, the camera aim director was running post-physics, creating a phase shift between camera, mesh, and physics state. **The Solution:** I synchronized the Aim Director updates directly with netcode prediction ticks and re-enabled rotational smoothing for relative zones in `AetherMovementComponent.cpp`. Rotation offsets are now smoothly interpolated toward `Identity` using `FQuat::Slerp`. // AetherMovementComponent.cpp - FinalizeSmoothingFrame() if (Sync->bIsRelative && Sync->ZoneID > 0) { if (UAetherGravitySubsystem* Subsystem = GetGravitySubsystem()) { FTransform ParentTransform; if (Subsystem->GetZoneTransform(Sync->ZoneID, ParentTransform)) { TargetLocation = ParentTransform.TransformPosition(TargetLocation); TargetRotation = ParentTransform.TransformRotation(TargetRotation); } } // Smoothly interpolate translation and rotation offsets back to identity SmoothingTranslationOffset = FMath::VInterpTo(SmoothingTranslationOffset, FVector::ZeroVector, DeltaTime, 15.0f); SmoothingRotationOffset = FQuat::Slerp(SmoothingRotationOffset, FQuat::Identity, FMath::Clamp(DeltaTime * 15.0f, 0.0f, 1.0f)); VisualComponent->SetWorldLocationAndRotation( TargetLocation + SmoothingTranslationOffset, (SmoothingRotationOffset * TargetRotation).GetNormalized() ); return; } ### 2. Violently Oscillating / "Sticky" Landing Gear **The Problem:** Landing gear suspension forces were calculated using raw spring velocity multiplied by friction and mass—missing delta-time scaling and impulse limits. Pressing into the ground created an unscaled force that catapulted the ship into space in an violent feedback loop. **The Solution:** In `AetherLandingGearSim.cpp`, damping forces are now properly scaled by mass, frequency, and time step, with impulses clamped against maximum allowed Gs. I also isolated the "Sticky" (magnetic) landing gear behavior to apply a controlled, downward force vector. // AetherLandingGearSim.cpp - Step() const float ActiveStiffness = ScaledStiffness * ProgressiveMultiplier; const float ActiveDamping = (AxisVelocity < 0.0f) ? (ScaledDamping * 0.2f) : ScaledDamping; // Calculate spring force and clamp max impulses to prevent violent bounce-backs float SpringForce = (Compression * ActiveStiffness) - (AxisVelocity * ActiveDamping); SpringForce = FMath::Clamp(SpringForce, 0.0f, (MassPerGear * 980.0f) * Gear.MaxSuspensionGs); FVector CurrentGearForce = GearUpDir * SpringForce; // Separate magnetic ground attraction force if (Gear.GearMode == EAetherLandingGearMode::Sticky && Compression > 0.001f) { const float AdhesionForce = MassPerGear * 980.0f * 1.5f; CurrentGearForce -= GearUpDir * AdhesionForce; } ### 3. Rolling 90° Caused Unwanted Sideways Drift **The Problem:** The aerodynamic lift vector calculation contained a matrix transformation flaw that simplified to applying lift straight up against world gravity, regardless of ship orientation. Rolling 90° put the wings vertical, but lift kept pushing world-up, producing unintended lateral drift. **The Solution:** Lift must always evaluate relative to the ship’s **local Up axis** (`Sync->Rotation.GetAxisZ()`). In `AetherAeroSim.cpp`, the lift force vector is now computed directly along the local roof vector and scaled by atmospheric density. // AetherAeroSim.cpp - Step() if (EnvDensity > 0.001f) { const FQuat InvShipRot = Sync->Rotation.Inverse(); const FVector BodyVel = InvShipRot.RotateVector(Sync->LinearVelocity); const float ForwardSpeed = FMath::Max(0.0f, BodyVel.X); const float InvMaxLiftSpeed = 1.0f / FMath::Max(1.0f, Aux->MaxSpeed * Aux->OptimalLiftSpeedRatio); const float LiftAlpha = FMath::Clamp(ForwardSpeed * InvMaxLiftSpeed, 0.0f, 1.0f); // FIX: Get local ship up direction instead of world up! const FVector ShipUpDir = Sync->Rotation.GetAxisZ(); const float GravityMag = LocalGravity.IsNearlyZero() ? 980.0f : LocalGravity.Size(); // Apply aerodynamic lift aligned with local ship orientation Sync->LinearVelocity += ShipUpDir * (LiftAlpha * GravityMag * EnvDensity * DeltaSeconds); } ### 4. Loss of Inherited Speed When Exiting Moving Carriers **The Problem:** When exiting a carrier, zone transition logic calculated inherited world velocity correctly (e.g., combining 2,000 cm/s ship speed + 55,000 cm/s carrier speed). However, on the exact same frame, the velocity was clamped against the ship's standalone engine `MaxSpeed` (e.g., 5,000 cm/s), causing the ship to instantly lose over 90% of its momentum. **The Solution:** I removed the hard top-speed clamp during world-zone handshakes in `FAetherSpaceUtils::ProcessZoneHandshake`. Instead, excess momentum bleeds off dynamically over time (`Dynamic Bleed`) inside `AetherAeroSim.cpp`. // AetherAeroSim.cpp - Step() const float SpeedSq = Sync->LinearVelocity.SizeSquared(); const float MaxSpeedSq = FMath::Square(EffectiveMaxSpeed); // Exponentially bleed off excess inherited velocity instead of hard-clamping if (SpeedSq > MaxSpeedSq) { const float CurrentSpeed = FMath::Sqrt(SpeedSq); const float ExcessSpeed = CurrentSpeed - EffectiveMaxSpeed; const float DynamicBleed = Aux->DynamicBleedBase + (ExcessSpeed * Aux->DynamicBleedFactor); const float NewSpeed = EffectiveMaxSpeed + (ExcessSpeed * FMath::Exp(-DynamicBleed * DeltaSeconds)); Sync->LinearVelocity *= (NewSpeed / CurrentSpeed); } ### Key Takeaway Developing networked physics for space games requires strict separation of local and world reference frames. By dividing the simulation tick into modular sub-simulations (Kinematics -> Aerodynamics -> Landing Gear -> Collision) within UE5's Network Prediction Plugin, we can guarantee deterministic simulation across server and client views. Have you worked with relative physics frames or NPP in Unreal Engine 5? I’d love to hear your thoughts or questions in the comments below!
dev.to
September 25, 2026 at 11:47 PM
Good luck making rollback netcode work with the sheer chaos of Smash's formula. Just because most online players are tryhards and sweats, doesn't mean you can afford to NOT account for the folks who want to play on unorthodox stages with hazards and maximum items on. :L
September 25, 2026 at 10:49 PM
it seems like that might get messy license-wise on the photon end, but as long as the netcode is done and you're not looking to re-engineer it to make native callouts to any of the nintendo online or matchmaking services, etc., i'm willing to give it a look
September 25, 2026 at 8:14 PM
On this day 4 years ago, it was announced during the CEOtaku 2022 event that Guilty Gear Xrd Rev 2 was receiving rollback netcode for the game's Steam version, with the 1st public test set to begin in late October 2022. The announcement trailer can be watched below.
www.youtube.com/watch?v=mTnA...
Steam版 『GUILTY GEAR Xrd REV 2』Rollback Netcode Announcement Trailer
YouTube video by arcsystemworks
www.youtube.com
September 25, 2026 at 8:09 PM
stable netcode for close racing is the hard part, most desync shows up in contact. are you rollback or snapshot interpolation? curious how it handles bumps.
September 25, 2026 at 8:02 PM
nice, netcode is brutal
September 25, 2026 at 7:05 PM
(After going insane) I finally figured out the netcode 😅 It's now stable in real world scenarios for close racing and I can start adding more game modes (Races, CTF...) #gamedev #indiegame #indiedev #Steam
September 25, 2026 at 6:03 PM
Fatal Fury: City of the Wolves review: vale a pena o retorno da SNK?
Fatal Fury: City of the Wolves review: vale a pena o retorno da SNK?
Fatal Fury: City of the Wolves traz a SNK de volta com visual de HQ, netcode ótimo e roster inusitado. Veja se vale a pena.
olhardigital.com.br
September 25, 2026 at 5:51 PM
Btw there no virus you can even go to the official discord server

discord.gg/Mhz93B7VW5
Join the Project Hayven Discord Server!
Community, playtesting, and matchmaking for Project Hayven: Rollback Netcode for SSF2. | 474 members
discord.gg
September 25, 2026 at 5:02 PM
Ssf2 rollback netcode is the best mod of ssf2 i ever played
September 25, 2026 at 5:00 PM
☁️ (Frjádagr) We are currently putting together 2 plans for builds today.

- First: We are looking to have an All-Backer Tech-Preview playtest this afternoon with all backers for about 4-6 hours. This will go over some physics netcode updates from Bault and team so definitely don't want to miss it!
September 25, 2026 at 3:18 PM
Kinda poetic, really, considering the original GBVS fizzled out due, in large part, to having delay-based netcode.
September 25, 2026 at 12:00 PM
Yeah i usually just stick with matching up with players from my region and even then sometimes i find players that have quite a difference in ping. I wish i had an answer for you about GBs netcode but i don’t. Sorry to hear that the session wasn’t as fun as hoped 😔
September 25, 2026 at 10:44 AM
36 players on one island. On a Pixel 6a it runs at ~30fps. The netcode judges every touch as your phone saw it — I tested it UAE to France, 100-550ms round trip. https://survivalzomb.com/get
September 25, 2026 at 9:02 AM
"The bare minimum for Smash 6 to grab the attention of players burnt out of Ultimate are: 1). Rollback netcode online 2). An up to date training mode, 3). Little to no buffer and 4). Substantial single-player content Regardless if the roster is big or small"
September 25, 2026 at 7:14 AM
So isn't this like a huge security risk if the netcode was generated?
September 25, 2026 at 6:09 AM
tried playing gbvsr online yesterday with my wife and for some reason the matches were kinda unstable? we have no issues when playing ggst so you'd think rising coming out after ggst would mean the netcode should be about the same but it was spotty as hell 😵‍💫
September 25, 2026 at 5:46 AM
no netcode whatsoever, apparently...
September 24, 2026 at 9:46 PM
Arcana Hearts 3 got good netcode before Marvel 3. I need to load this back up.
September 24, 2026 at 4:33 PM
Wtf do you mean Arcana hearts 3 love maxxxxx has good netcode now?!
September 24, 2026 at 4:06 PM
I would love to play as many different players as possible, but it's a two-way street. There's not alot in my control unless I want to sit and suffer playing against some cunt that's just going to criticize the way that I play over delay-based netcode. There's better things I can spend my time on.
September 24, 2026 at 2:13 PM
Rollback netcode for Zoom calls
September 23, 2026 at 7:05 PM