fix(inventory): an inventory group holds at most 1000 LOTs, as the client

LWOInventoryComponent_Common::msgUpdateInventoryGroupContents (0x00ce1f50)
ignores an ADD to an unlocked group that already holds 1000 LOTs. The
server had no cap, so a modified client could grow the charxml without
limit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Aaron Kimbrell
2026-10-02 10:31:02 -05:00
parent 042594e3dd
commit 841004e6a4
3 changed files with 11 additions and 0 deletions

View File

@@ -2021,6 +2021,8 @@ void InventoryComponent::UpdateGroup(const GroupUpdate& groupUpdate) {
break;
}
case GroupUpdateCommand::ADD_LOT: {
// msgUpdateInventoryGroupContents (0x00ce1f50): a group holds at most 1000 LOTs
if (groupItr->lots.size() >= MaximumGroupLotCount) break;
groupItr->lots.insert(groupUpdate.lot);
break;
}

View File

@@ -101,6 +101,7 @@ public:
static constexpr uint32_t MaximumGroupCount = 50;
static constexpr size_t MaximumGroupNameLength = 64; // UTF-16 characters
static constexpr size_t MaximumGroupLotCount = 1000;
static constexpr eReplicaComponentType ComponentType = eReplicaComponentType::INVENTORY;

View File

@@ -88,3 +88,11 @@ TEST_F(InventoryGroupTests, ClearEmptiesAGroup) {
ASSERT_EQ(Groups().size(), 1u);
EXPECT_TRUE(Groups()[0].lots.empty());
}
TEST_F(InventoryGroupTests, AGroupHoldsAtMost1000Lots) {
Group("ADD", "user_group1", u"bricks");
for (LOT lot = 1; lot <= 1001; lot++) Contents("ADD", "user_group1", lot);
EXPECT_EQ(Groups()[0].lots.size(), 1000u);
EXPECT_FALSE(Groups()[0].lots.contains(1001));
}