fix(client): restore retail interaction parity
All checks were successful
CI / linux-portable (push) Successful in 3m27s
CI / windows-gate (push) Successful in 6m42s
CI / release (push) Successful in 2m12s

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:
Erik 2026-08-26 20:45:11 +02:00
parent 0c699240e0
commit f6fe0f2a4f
151 changed files with 10162 additions and 1211 deletions

View file

@ -2269,8 +2269,9 @@ public sealed class MotionInterpreter : IMotionDoneSink
if (PhysicsObj is null)
return false;
bool grounded = PhysicsObj.TransientState.HasFlag(TransientStateFlags.Contact)
&& PhysicsObj.TransientState.HasFlag(TransientStateFlags.OnWalkable);
const TransientStateFlags groundedMask =
TransientStateFlags.Contact | TransientStateFlags.OnWalkable;
bool grounded = (PhysicsObj.TransientState & groundedMask) == groundedMask;
if (!grounded)
return false;

View file

@ -74,6 +74,32 @@ public readonly record struct RawMotionAction(
/// </summary>
public sealed class RawMotionState
{
public RawMotionState()
{
}
/// <summary>
/// Deep snapshot used at retail's synchronous SendMovementEvent boundary.
/// The action FIFO is copied so animation completion cannot mutate a
/// packet that has already been requested.
/// </summary>
public RawMotionState(RawMotionState other)
{
ArgumentNullException.ThrowIfNull(other);
CurrentHoldKey = other.CurrentHoldKey;
CurrentStyle = other.CurrentStyle;
ForwardCommand = other.ForwardCommand;
ForwardHoldKey = other.ForwardHoldKey;
ForwardSpeed = other.ForwardSpeed;
SidestepCommand = other.SidestepCommand;
SidestepHoldKey = other.SidestepHoldKey;
SidestepSpeed = other.SidestepSpeed;
TurnCommand = other.TurnCommand;
TurnHoldKey = other.TurnHoldKey;
TurnSpeed = other.TurnSpeed;
_actions.AddRange(other._actions);
}
/// <summary>Retail <c>current_holdkey</c> (ctor default HoldKey_None).</summary>
public HoldKey CurrentHoldKey { get; set; } = HoldKey.None;
/// <summary>Retail <c>current_style</c> (ctor default 0x8000003D, NonCombat).</summary>