Top-level GameMessage (UIQueue), not a GameEvent. Server sends when an object leaves the client's inventory view (sold / dropped / destroyed). Layout: opcode(4) + guid(4) = 8 bytes — the smallest inventory wire. 3 tests: happy path, wrong opcode, truncated. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
31 lines
1.1 KiB
C#
31 lines
1.1 KiB
C#
using System;
|
|
using System.Buffers.Binary;
|
|
|
|
namespace AcDream.Core.Net.Messages;
|
|
|
|
/// <summary>
|
|
/// Inbound <c>InventoryRemoveObject (0x0024)</c> — a top-level GameMessage (UIQueue),
|
|
/// NOT a GameEvent. The server tells the client an object left its inventory view
|
|
/// (given away / sold / destroyed). The client drops it from object maintenance.
|
|
///
|
|
/// <para>Wire layout (ACE <c>GameMessageInventoryRemoveObject.cs</c>, size hint 8):</para>
|
|
/// <code>
|
|
/// u32 opcode = 0x0024
|
|
/// u32 guid
|
|
/// </code>
|
|
/// </summary>
|
|
public static class InventoryRemoveObject
|
|
{
|
|
public const uint Opcode = 0x0024u;
|
|
|
|
public readonly record struct Parsed(uint Guid);
|
|
|
|
/// <summary>Parse a raw 0x0024 body. Returns null on opcode mismatch / truncation.</summary>
|
|
public static Parsed? TryParse(ReadOnlySpan<byte> body)
|
|
{
|
|
if (body.Length < 8) return null; // 4 + 4
|
|
if (BinaryPrimitives.ReadUInt32LittleEndian(body) != Opcode) return null;
|
|
uint guid = BinaryPrimitives.ReadUInt32LittleEndian(body[4..]);
|
|
return new Parsed(guid);
|
|
}
|
|
}
|