diff --git a/src/AcDream.Core.Net/Messages/GameEvents.cs b/src/AcDream.Core.Net/Messages/GameEvents.cs
index 5f7dcc3..b0bc1c0 100644
--- a/src/AcDream.Core.Net/Messages/GameEvents.cs
+++ b/src/AcDream.Core.Net/Messages/GameEvents.cs
@@ -375,6 +375,94 @@ public static class GameEvents
BinaryPrimitives.ReadUInt32LittleEndian(payload.Slice(8)));
}
+ // ── Other small-payload events ──────────────────────────────────────────
+
+ /// 0x01C7 UseDone: the Use/UseWithTarget completion signal (WeenieError code).
+ public static uint? ParseUseDone(ReadOnlySpan payload)
+ {
+ if (payload.Length < 4) return null;
+ return BinaryPrimitives.ReadUInt32LittleEndian(payload);
+ }
+
+ /// 0x019A InventoryPutObjectIn3D: server dropped item to ground.
+ public static uint? ParsePutObjectIn3D(ReadOnlySpan payload)
+ {
+ if (payload.Length < 4) return null;
+ return BinaryPrimitives.ReadUInt32LittleEndian(payload);
+ }
+
+ /// 0x00A0 InventoryServerSaveFailed: revert a speculative local inventory op.
+ public static uint? ParseInventoryServerSaveFailed(ReadOnlySpan payload)
+ {
+ if (payload.Length < 4) return null;
+ return BinaryPrimitives.ReadUInt32LittleEndian(payload);
+ }
+
+ /// 0x0052 CloseGroundContainer: server closed a ground container view.
+ public static uint? ParseCloseGroundContainer(ReadOnlySpan payload)
+ {
+ if (payload.Length < 4) return null;
+ return BinaryPrimitives.ReadUInt32LittleEndian(payload);
+ }
+
+ /// 0x0207 TradeFailure: server trade error code.
+ public static uint? ParseTradeFailure(ReadOnlySpan payload)
+ {
+ if (payload.Length < 4) return null;
+ return BinaryPrimitives.ReadUInt32LittleEndian(payload);
+ }
+
+ /// 0x0200 AddToTrade: (itemGuid, slotIndex).
+ public readonly record struct AddToTrade(uint ItemGuid, uint SlotIndex);
+
+ public static AddToTrade? ParseAddToTrade(ReadOnlySpan payload)
+ {
+ if (payload.Length < 8) return null;
+ return new AddToTrade(
+ BinaryPrimitives.ReadUInt32LittleEndian(payload),
+ BinaryPrimitives.ReadUInt32LittleEndian(payload.Slice(4)));
+ }
+
+ /// 0x0202 AcceptTrade: initiator guid.
+ public static uint? ParseAcceptTrade(ReadOnlySpan payload)
+ {
+ if (payload.Length < 4) return null;
+ return BinaryPrimitives.ReadUInt32LittleEndian(payload);
+ }
+
+ /// 0x0264 QueryItemManaResponse: (itemGuid, manaPercent).
+ public readonly record struct QueryItemManaResponse(uint ItemGuid, float ManaPercent);
+
+ public static QueryItemManaResponse? ParseQueryItemManaResponse(ReadOnlySpan payload)
+ {
+ if (payload.Length < 8) return null;
+ return new QueryItemManaResponse(
+ BinaryPrimitives.ReadUInt32LittleEndian(payload),
+ BinaryPrimitives.ReadSingleLittleEndian(payload.Slice(4)));
+ }
+
+ /// 0x0274 CharacterConfirmationRequest — server-driven modal confirm.
+ public readonly record struct CharacterConfirmationRequest(
+ uint Type,
+ uint ContextId,
+ uint OtherGuid,
+ string Message);
+
+ public static CharacterConfirmationRequest? ParseCharacterConfirmationRequest(ReadOnlySpan payload)
+ {
+ if (payload.Length < 12) 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);
+ }
+ catch { return null; }
+ }
+
// ── Shared string reader (matches LoginRequest.ReadString16L) ───────────
private static string ReadString16L(ReadOnlySpan source, ref int pos)