using System; using System.Buffers.Binary; namespace AcDream.Core.Net.Messages; /// /// Inbound SetStackSize (0x0197) — a top-level GameMessage (UIQueue group), /// NOT a GameEvent. The server updates a stack's count + value after a merge / split. /// Client consumer: ACCWeenieObject::ServerSaysSetStackSize. /// /// Wire layout (ACE GameMessageSetStackSize.cs, size hint 17): /// /// u32 opcode = 0x0197 /// u8 sequence // ByteSequence (UpdatePropertyInt) — not honored /// u32 guid /// i32 stackSize /// i32 value /// /// public static class SetStackSize { public const uint Opcode = 0x0197u; public readonly record struct Parsed(uint Guid, int StackSize, int Value); /// Parse a raw 0x0197 body. Returns null on opcode mismatch / truncation. public static Parsed? TryParse(ReadOnlySpan body) { if (body.Length < 17) return null; // 4 + 1 + 4 + 4 + 4 if (BinaryPrimitives.ReadUInt32LittleEndian(body) != Opcode) return null; int pos = 4; pos += 1; // sequence byte (not honored) uint guid = BinaryPrimitives.ReadUInt32LittleEndian(body[pos..]); pos += 4; int stack = BinaryPrimitives.ReadInt32LittleEndian(body[pos..]); pos += 4; int value = BinaryPrimitives.ReadInt32LittleEndian(body[pos..]); return new Parsed(guid, stack, value); } }