feat(chat): port retail client command families
Expand the typed client-command boundary across travel, character queries, local UI and layout controls, AFK and consent, emotes, friends, squelch and filters, and fill-components. Preserve retail packet layouts and queue ownership, import the confirmation dialog, and keep authoritative social state in Core. Co-Authored-By: Codex <codex@openai.com>
This commit is contained in:
parent
5a45a7ac7f
commit
9ea579bdd0
47 changed files with 6659 additions and 99 deletions
|
|
@ -89,6 +89,25 @@ public static class GameEvents
|
|||
try { return ReadString16L(payload, ref pos); } catch { return null; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 0x01C3 QueryAgeResponse: target name (empty for self), then the
|
||||
/// server-formatted played duration. Retail source:
|
||||
/// <c>CM_Character::DispatchUI_QueryAgeResponse @ 0x006A2E40</c>.
|
||||
/// </summary>
|
||||
public readonly record struct QueryAgeResponse(string Name, string Age);
|
||||
|
||||
public static QueryAgeResponse? ParseQueryAgeResponse(ReadOnlySpan<byte> payload)
|
||||
{
|
||||
int pos = 0;
|
||||
try
|
||||
{
|
||||
string name = ReadString16L(payload, ref pos);
|
||||
string age = ReadString16L(payload, ref pos);
|
||||
return new QueryAgeResponse(name, age);
|
||||
}
|
||||
catch { return null; }
|
||||
}
|
||||
|
||||
// ── Errors ──────────────────────────────────────────────────────────────
|
||||
|
||||
/// <summary>0x028A WeenieError: generic game-logic failure code.</summary>
|
||||
|
|
@ -470,20 +489,18 @@ public static class GameEvents
|
|||
public readonly record struct CharacterConfirmationRequest(
|
||||
uint Type,
|
||||
uint ContextId,
|
||||
uint OtherGuid,
|
||||
string Message);
|
||||
|
||||
public static CharacterConfirmationRequest? ParseCharacterConfirmationRequest(ReadOnlySpan<byte> payload)
|
||||
{
|
||||
if (payload.Length < 12) return null;
|
||||
if (payload.Length < 8) return null;
|
||||
int pos = 0;
|
||||
uint type = BinaryPrimitives.ReadUInt32LittleEndian(payload); pos += 4;
|
||||
uint contextId = BinaryPrimitives.ReadUInt32LittleEndian(payload.Slice(pos)); pos += 4;
|
||||
uint otherGuid = BinaryPrimitives.ReadUInt32LittleEndian(payload.Slice(pos)); pos += 4;
|
||||
try
|
||||
{
|
||||
string msg = ReadString16L(payload, ref pos);
|
||||
return new CharacterConfirmationRequest(type, contextId, otherGuid, msg);
|
||||
return new CharacterConfirmationRequest(type, contextId, msg);
|
||||
}
|
||||
catch { return null; }
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue