FixtureProvider.Populate for 0x21000023 was binding only
InventoryController and omitting PaperdollController, so the
~21 equip slots rendered empty even though sample equipped items
existed in the table. Also, the three per-list empty-slot
sprites were not being resolved from the dat (contentsEmpty /
sideBagEmpty / mainPackEmpty all defaulted to 0), so the slot cells
had no background art.
Fixes:
- FixtureProvider.Populate gains a DatCollection dats param
(mirrors the GameWindow.OnLoad lookup at line 2233-2235).
The 0x21000023 case now resolves all three empty sprites via
ItemListCellTemplate.ResolveEmptySprite and passes them to
InventoryController.Bind.
- PaperdollController.Bind is now called after InventoryController
in the same 0x21000023 case, matching GameWindow:2257-2265
(same layout subtree, contentsEmpty as the equip-slot placeholder,
sendWield: null since there is no live session in the studio).
- StudioWindow.OnLoad passes _dats! to the updated Populate signature.
SampleData.AddEquipped was already correct: MoveItem(guid, PlayerGuid,
-1, equipMask) at ClientObjectTable.cs:134 sets
CurrentlyEquippedLocation = newEquipLocation and calls Reindex which
places the item in _containerIndex[PlayerGuid]. No SampleData change
needed.
Tests: 2 new assertions in FixtureProviderTests —
sideBags_matchInventoryControllerFilter (Type.HasFlag(Container)
|| ItemsCapacity > 0 filter must match both bags) and
equippedItems_retainLocationAndAreInContents (equipped items have
CurrentlyEquippedLocation != None AND appear in GetContents so the
paperdoll controller can find them). 604 pass / 2 skip / 0 fail.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>