using System; using System.Buffers.Binary; namespace AcDream.Core.Net.Messages; /// /// Inbound 0x01E0 EmoteText top-level GameMessage. /// Server-driven third-person emote announcement (e.g. /// "The Olthoi growls at you."). /// /// /// This is a standalone GameMessage — NOT wrapped in the 0xF7B0 /// GameEvent envelope. Dispatched directly from the opcode switch in /// . /// /// /// /// Wire layout (port from holtburger /// references/holtburger/.../messages/chat/types.rs::EmoteTextData, /// see also opcodes.rs:155): /// /// u32 opcode // 0x01E0 /// u32 senderGuid /// string16L senderName /// string16L text /// /// /// public static class EmoteText { public const uint Opcode = 0x01E0u; public readonly record struct Parsed( uint SenderGuid, string SenderName, string Text); public static Parsed? TryParse(byte[] body) { if (body is null || body.Length < 8) return null; uint opcode = BinaryPrimitives.ReadUInt32LittleEndian(body); if (opcode != Opcode) return null; try { int pos = 4; uint senderGuid = BinaryPrimitives.ReadUInt32LittleEndian(body.AsSpan(pos)); pos += 4; string senderName = StringReader.ReadString16L(body, ref pos); string text = StringReader.ReadString16L(body, ref pos); return new Parsed(senderGuid, senderName, text); } catch { return null; } } }