fix(inventory): inventory group names are cut to 64 characters, as the client

LWOInventoryComponent_Common::msgUpdateInventoryGroup (0x00c955b0) resizes
the group name to 64 characters on ADD and MODIFY. The server kept names
of any length in the charxml.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Aaron Kimbrell
2026-10-02 10:30:24 -05:00
parent 0bc1a88e75
commit 9afe8ccedb
3 changed files with 12 additions and 1 deletions

View File

@@ -2399,7 +2399,8 @@ void InventoryComponent::OnUpdateInventoryGroup(const GameMessages::UpdateInvent
GroupUpdate groupUpdate;
groupUpdate.groupId = msg.groupID;
groupUpdate.inventory = msg.inventoryType;
groupUpdate.groupName = GeneralUtils::UTF16ToWTF8(msg.groupName);
// msgUpdateInventoryGroup (0x00c955b0) cuts names to 64 characters
groupUpdate.groupName = GeneralUtils::UTF16ToWTF8(msg.groupName.substr(0, MaximumGroupNameLength));
if (msg.action == "ADD") groupUpdate.command = GroupUpdateCommand::ADD;
else if (msg.action == "MODIFY") groupUpdate.command = GroupUpdateCommand::MODIFY;

View File

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

View File

@@ -60,3 +60,12 @@ TEST_F(InventoryGroupTests, AddingAGroupThatExistsDoesNothing) {
EXPECT_EQ(Groups()[0].groupName, "first");
EXPECT_EQ(Groups()[0].lots.size(), 1u);
}
TEST_F(InventoryGroupTests, NamesAreCutTo64Characters) {
const std::u16string longName(70, u'a');
Group("ADD", "user_group1", longName);
EXPECT_EQ(Groups()[0].groupName, std::string(64, 'a'));
Group("MODIFY", "user_group1", std::u16string(65, u'b'));
EXPECT_EQ(Groups()[0].groupName, std::string(64, 'b'));
}