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
|
|
@ -67,6 +67,7 @@ public sealed class ClientCommandRequestsTests
|
|||
{
|
||||
{ ClientCommandRequests.BuildSetAfkMessage, ClientCommandRequests.SetAfkMessageOpcode },
|
||||
{ ClientCommandRequests.BuildEmote, ClientCommandRequests.EmoteOpcode },
|
||||
{ ClientCommandRequests.BuildSoulEmote, ClientCommandRequests.SoulEmoteOpcode },
|
||||
{ ClientCommandRequests.BuildAddFriend, ClientCommandRequests.AddFriendOpcode },
|
||||
{ ClientCommandRequests.BuildRemoveConsent, ClientCommandRequests.RemoveConsentOpcode },
|
||||
};
|
||||
|
|
|
|||
|
|
@ -27,6 +27,22 @@ public sealed class ServerMessageTests
|
|||
Assert.Equal(5u, parsed.Value.ChatType);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TryParse_PreservesEmbeddedCommandResponseNewlines()
|
||||
{
|
||||
const string text = "@acecommands\n@help\n@teleport";
|
||||
byte[] msg = PackString16L(text);
|
||||
byte[] body = new byte[4 + msg.Length + 4];
|
||||
BinaryPrimitives.WriteUInt32LittleEndian(body, ServerMessage.Opcode);
|
||||
Array.Copy(msg, 0, body, 4, msg.Length);
|
||||
BinaryPrimitives.WriteUInt32LittleEndian(body.AsSpan(4 + msg.Length), 0u);
|
||||
|
||||
ServerMessage.Parsed parsed = Assert.IsType<ServerMessage.Parsed>(
|
||||
ServerMessage.TryParse(body));
|
||||
|
||||
Assert.Equal(text, parsed.Message);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TryParse_WrongOpcode_ReturnsNull()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -77,6 +77,18 @@ public sealed class WorldSessionChatTests
|
|||
Assert.Throws<ArgumentNullException>(() => session.SendTalk(null!));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void SendSoulEmote_EmitsRetailGameAction()
|
||||
{
|
||||
using var session = NewSession();
|
||||
byte[]? captured = null;
|
||||
session.GameActionCapture = body => captured = body;
|
||||
|
||||
session.SendSoulEmote("waves.");
|
||||
|
||||
Assert.Equal(ClientCommandRequests.BuildSoulEmote(1u, "waves."), captured);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void SendTeleportToLifestone_EmitsRetailGameAction()
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue