acdream/tests/AcDream.Core.Net.Tests/Messages
Erik db0cac03c4 fix(D.2b): PickupEvent removes the 3D render, not the weenie — unwield lands in the pack
PickupEvent (0xF74A) and DeleteObject (0xF747) are semantically distinct:
- 0xF747 = weenie DESTROYED → evict from ClientObjectTable (weenie_object_table)
- 0xF74A = object LEFT THE 3D WORLD VIEW (moved into a container) → remove
  the 3D WorldEntity, but the weenie persists in ClientObjectTable

Before this fix, both paths fired EntityDeleted identically, causing
ObjectTableWiring to evict the weenie from ClientObjectTable. The follow-up
InventoryPutObjInContainer (0x0022) then tried MoveItem on an unknown guid
and no-op'd, so the unwielded item simply vanished.

Fix: add `bool FromPickup` (default false) to DeleteObject.Parsed. WorldSession
sets it true on the PickupEvent path and false on the DeleteObject path.
ObjectTableWiring.Wire's EntityDeleted handler skips table.Remove when
FromPickup is true, preserving the weenie for the container-move echo.

GameWindow.OnLiveEntityDeleted (3D entity removal) is untouched — it fires
for both pickups and destroys, as intended.

Divergence register: AP-65 added (data ghosts for other-player pickups until
teleport/relog clear; harmless — no UI queries ContainerId 0).

Tests: +5 (DeleteObject FromPickup parser regression; wiring retain/evict
semantics; Parsed default/explicit FromPickup). 343/343 pass.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 23:39:27 +02:00
..
AllegianceRequestsTests.cs feat(allegiance): Phase H.2 AllegianceRequests + AllegianceTree model 2026-04-18 17:17:45 +02:00
AppraiseInfoParserTests.cs feat(net): AppraiseInfoParser — ArmorProfile/CreatureProfile/WeaponProfile + enchantment bitfields 2026-04-19 10:24:35 +02:00
AppraiseTests.cs fix(test): update AppraiseTests.ParsePutObjInContainer_RoundTrip for 4-field parser 2026-06-21 19:06:05 +02:00
AutonomousPositionTests.cs fix(physics): #30 #34 L.2a movement truth diagnostics 2026-04-29 21:52:53 +02:00
CastSpellTests.cs feat(spells): Phase E.5 CastSpellRequest + Spellbook/enchantment state 2026-04-18 17:00:32 +02:00
CharacterActionsTests.cs fix(net): Phase L.1c conform combat wire events 2026-04-28 10:54:50 +02:00
CharacterEnterWorldTests.cs feat(net): acdream enters the world — CharacterList parsed + CharacterEnterWorld sent + 68 CreateObject received (Phase 4.7) 2026-04-11 15:14:31 +02:00
CharacterListTests.cs feat(net): acdream enters the world — CharacterList parsed + CharacterEnterWorld sent + 68 CreateObject received (Phase 4.7) 2026-04-11 15:14:31 +02:00
ChatTests.cs fix(chat): BuildTell wire field order + retail-style FormatEntry + suppress duplicate Channel echo 2026-04-25 20:49:02 +02:00
CombatEventTests.cs fix(net): Phase L.1c conform combat wire events 2026-04-28 10:54:50 +02:00
CreateObjectTests.cs feat(D.5.4): capture full item field set in CreateObject parser 2026-06-18 15:50:27 +02:00
DeleteObjectTests.cs fix(D.2b): PickupEvent removes the 3D render, not the weenie — unwield lands in the pack 2026-06-22 23:39:27 +02:00
EmoteTextTests.cs feat(net): #18 holtburger inbound chat parity - EmoteText, SoulEmote, ServerMessage, PlayerKilled, WeenieError + Windows-1252 codec 2026-04-25 19:06:01 +02:00
GameActionLoginCompleteTests.cs feat(net): Phase 4.8 — send GameAction.LoginComplete after EnterWorld 2026-04-11 23:36:19 +02:00
GameEventDispatcherTests.cs feat(net): Phase F.1 GameEvent (0xF7B0) envelope dispatcher 2026-04-18 16:52:46 +02:00
GameEventsInventoryTests.cs fix(net): D.2b-B B-Wire — ParseInventoryServerSaveFailed reads weenieError 2026-06-21 18:55:56 +02:00
InteractRequestsTests.cs test(B.5): exercise i32 sign-correctness for BuildPickUp.placement 2026-05-14 15:05:07 +02:00
InventoryActionsTests.cs feat(net): D.2b-B B-Wire — DropItem/GetAndWieldItem/NoLongerViewingContents builders + Send wrappers 2026-06-21 18:58:30 +02:00
InventoryRemoveObjectTests.cs feat(net): D.2b-B B-Wire — InventoryRemoveObject (0x0024) parser 2026-06-21 18:52:21 +02:00
MoveToStateTests.cs fix(physics): #30 #34 L.2a movement truth diagnostics 2026-04-29 21:52:53 +02:00
ObjDescEventTests.cs feat(net): wire 0xF625 ObjDescEvent for live appearance updates 2026-05-06 10:46:14 +02:00
PickupEventTests.cs fix(B.5): handle PickupEvent 0xF74A so picked-up items despawn locally 2026-05-14 16:13:16 +02:00
PlayerKilledTests.cs feat(net): #18 holtburger inbound chat parity - EmoteText, SoulEmote, ServerMessage, PlayerKilled, WeenieError + Windows-1252 codec 2026-04-25 19:06:01 +02:00
PrivateUpdatePropertyIntTests.cs feat(net): D.2b-B B-Wire — PrivateUpdatePropertyInt (0x02CD) parser 2026-06-21 18:50:56 +02:00
PublicUpdatePropertyIntTests.cs feat(D.5.2): PublicUpdatePropertyInt (0x02CE) parser 2026-06-17 18:29:23 +02:00
ServerMessageTests.cs feat(net): #18 holtburger inbound chat parity - EmoteText, SoulEmote, ServerMessage, PlayerKilled, WeenieError + Windows-1252 codec 2026-04-25 19:06:01 +02:00
SetStackSizeTests.cs feat(net): D.2b-B B-Wire — SetStackSize (0x0197) parser 2026-06-21 18:51:42 +02:00
SetStateTests.cs feat(phys L.2g slice 1): inbound SetState (0xF74B) parser 2026-05-12 22:15:31 +02:00
SetTurbineChatChannelsTests.cs feat(net+chat): #19 TurbineChat (0xF7DE) codec + ChatChannelInfo + SetTurbineChatChannels parser 2026-04-25 19:44:56 +02:00
SocialActionsTests.cs feat(net): SocialActions — query / fellowship / channel / options outbound 2026-04-19 10:26:58 +02:00
SoulEmoteTests.cs feat(net): #18 holtburger inbound chat parity - EmoteText, SoulEmote, ServerMessage, PlayerKilled, WeenieError + Windows-1252 codec 2026-04-25 19:06:01 +02:00
TurbineChatTests.cs feat(net+chat): #19 TurbineChat (0xF7DE) codec + ChatChannelInfo + SetTurbineChatChannels parser 2026-04-25 19:44:56 +02:00
UpdateMotionTests.cs fix(anim): Phase L.1c clear MoveTo state + bulk-copy ForwardCommand on overlay UMs 2026-04-29 10:02:53 +02:00
UpdatePositionTests.cs feat(net): Phase 6.7 — parse UpdatePosition (0xF748) into PositionUpdated event 2026-04-11 20:37:32 +02:00