fix(client): restore retail interaction parity
Harden keyboard and camera routing, inventory and vendor interactions, chat/emotes, relog portal flow, and paperdoll rendering. Add retail research, connected gate coverage, and release-gate validation.
This commit is contained in:
parent
0c699240e0
commit
f6fe0f2a4f
151 changed files with 10162 additions and 1211 deletions
|
|
@ -1400,6 +1400,7 @@ public sealed class LocalPlayerTeleportControllerTests
|
|||
public bool IsRecenterPending => RecenterPending;
|
||||
public bool RecenterPending;
|
||||
public bool ResetResult = true;
|
||||
public int ResetCalls;
|
||||
public bool LastResetWasSessionEnding;
|
||||
public readonly List<(int X, int Y, bool Sealed)> Recenters = new();
|
||||
public readonly List<(long Generation, uint Cell, int Radius)>
|
||||
|
|
@ -1414,6 +1415,7 @@ public sealed class LocalPlayerTeleportControllerTests
|
|||
|
||||
public bool ResetRecenter(bool sessionEnding)
|
||||
{
|
||||
ResetCalls++;
|
||||
LastResetWasSessionEnding = sessionEnding;
|
||||
return ResetResult;
|
||||
}
|
||||
|
|
@ -1954,6 +1956,7 @@ public sealed class LocalPlayerTeleportControllerTests
|
|||
harness.Controller.ResetGenerationPresentation();
|
||||
harness.Controller.Tick(0.016f);
|
||||
Assert.Equal(1, harness.Logout.CompleteCalls);
|
||||
Assert.Equal(1, harness.Streaming.ResetCalls);
|
||||
Assert.Equal(RuntimeLogoutStage.None, harness.Transit.LogoutStage);
|
||||
// The transaction's world reset retired the presentation.
|
||||
Assert.Contains("presentation-reset", order);
|
||||
|
|
@ -1966,6 +1969,34 @@ public sealed class LocalPlayerTeleportControllerTests
|
|||
Assert.Equal(1, harness.Logout.CompleteCalls);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void LogoutConfirmation_WaitsForOldStreamingWindowBeforeFreshGeneration()
|
||||
{
|
||||
var harness = new Harness(worldReady: true);
|
||||
Assert.True(harness.Controller.TryRequestLogout());
|
||||
harness.Logout.IsCharacterLogOffConfirmed = true;
|
||||
harness.Streaming.ResetResult = false;
|
||||
harness.Logout.OnComplete = () =>
|
||||
harness.Controller.ResetGenerationPresentation();
|
||||
|
||||
harness.Controller.Tick(0.016f);
|
||||
|
||||
Assert.Equal(RuntimeLogoutStage.Confirmed, harness.Transit.LogoutStage);
|
||||
Assert.Equal(0, harness.Logout.CompleteCalls);
|
||||
Assert.Equal(1, harness.Streaming.ResetCalls);
|
||||
|
||||
// StreamingController.Tick advances the retained retirement between
|
||||
// these controller ticks. Once converged, the logout transaction may
|
||||
// expose the next generation. Its reset callback consumes the same
|
||||
// retirement instead of beginning a second one.
|
||||
harness.Streaming.ResetResult = true;
|
||||
harness.Controller.Tick(0.016f);
|
||||
|
||||
Assert.Equal(RuntimeLogoutStage.None, harness.Transit.LogoutStage);
|
||||
Assert.Equal(1, harness.Logout.CompleteCalls);
|
||||
Assert.Equal(2, harness.Streaming.ResetCalls);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void LogoutConfirmationBeforeHoldEnd_SkipsTheWormholeEntirely()
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue