feat(net): #13 register PD trailer inventory+equipped in ItemRepository
After PlayerDescription is dispatched, the Inventory and Equipped lists produced by the parser are now fed into ItemRepository via AddOrUpdate + MoveItem so inventory/paperdoll panels see items after login. Acceptance test PlayerDescription_RegistersInventoryEntries_InItemRepository confirms ItemCount goes 0→2 for a synthetic PD with two inventory entries. 282 Net.Tests pass. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
58095d8d4b
commit
078919cc18
2 changed files with 82 additions and 0 deletions
|
|
@ -1,5 +1,6 @@
|
|||
using System;
|
||||
using System.Buffers.Binary;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using AcDream.Core.Chat;
|
||||
using AcDream.Core.Combat;
|
||||
|
|
@ -328,4 +329,50 @@ public sealed class GameEventWiringTests
|
|||
Assert.Contains("Mana Stone", e.Text);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void PlayerDescription_RegistersInventoryEntries_InItemRepository()
|
||||
{
|
||||
// Issue #13 acceptance test: after a PlayerDescription with non-empty
|
||||
// Inventory is dispatched through WireAll, ItemRepository.ItemCount > 0.
|
||||
// Wire format: strict path (no GAMEPLAY_OPTIONS bit) so inventory +
|
||||
// equipped follow directly after spellbook_filters.
|
||||
var dispatcher = new GameEventDispatcher();
|
||||
var items = new ItemRepository();
|
||||
var combat = new CombatState();
|
||||
var spellbook = new Spellbook();
|
||||
var chat = new ChatLog();
|
||||
GameEventWiring.WireAll(dispatcher, items, combat, spellbook, chat);
|
||||
|
||||
Assert.Equal(0, items.ItemCount); // pre-condition
|
||||
|
||||
var sb = new MemoryStream();
|
||||
using var w = new BinaryWriter(sb);
|
||||
w.Write(0u); // propertyFlags = 0
|
||||
w.Write(0x52u); // weenieType
|
||||
w.Write(0x201u); // vectorFlags = ATTRIBUTE | ENCHANTMENT
|
||||
w.Write(1u); // has_health
|
||||
w.Write(0u); // attribute_flags = 0 (no attrs)
|
||||
w.Write(0u); // enchantment_mask = 0
|
||||
|
||||
w.Write(0u); // option_flags = None (no GAMEPLAY_OPTIONS → strict inv path)
|
||||
w.Write(0u); // options1
|
||||
w.Write(0u); // legacy hotbar list count = 0
|
||||
w.Write(0u); // spellbook_filters
|
||||
|
||||
// Inventory: 2 entries
|
||||
w.Write(2u);
|
||||
w.Write(0x50000A01u); w.Write(0u); // guid, ContainerType=NonContainer
|
||||
w.Write(0x50000A02u); w.Write(1u); // guid, ContainerType=Container
|
||||
|
||||
// Equipped: 0 entries
|
||||
w.Write(0u);
|
||||
|
||||
var env = GameEventEnvelope.TryParse(WrapEnvelope(GameEventType.PlayerDescription, sb.ToArray()));
|
||||
dispatcher.Dispatch(env!.Value);
|
||||
|
||||
Assert.Equal(2, items.ItemCount);
|
||||
Assert.NotNull(items.GetItem(0x50000A01u));
|
||||
Assert.NotNull(items.GetItem(0x50000A02u));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue