From 4e7181c1716da4292456f158f0fee39a1c2b02ad Mon Sep 17 00:00:00 2001 From: Shauren Date: Tue, 7 Jan 2025 16:46:44 +0100 Subject: Core/Commands: Extract bonus lists and item context from provided item link for .additem commands Closes #30209 (cherry picked from commit f647ff68659ed6d8d414d20520507dd451c2cb8d) --- src/server/scripts/Commands/cs_misc.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'src/server/scripts/Commands') diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index 96bad647a0a..c9ea07ee4e1 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -1158,8 +1158,14 @@ public: Optional const& bonusListIdString, Optional itemContextArg) { uint32 itemId = 0; + std::vector bonusListIDs; + ItemContext itemContext = ItemContext::NONE; if (Hyperlink<::item> const* itemLinkData = std::get_if>(&itemArg)) + { itemId = (*itemLinkData)->Item->GetId(); + bonusListIDs = (*itemLinkData)->ItemBonusListIDs; + itemContext = static_cast((*itemLinkData)->Context); + } else if (uint32 const* itemIdPtr = std::get_if(&itemArg)) itemId = *itemIdPtr; else if (std::string_view const* itemNameText = std::get_if(&itemArg)) @@ -1192,15 +1198,12 @@ public: if (count == 0) count = 1; - std::vector bonusListIDs; - // semicolon separated bonuslist ids (parse them after all arguments are extracted by strtok!) if (bonusListIdString) for (std::string_view token : Trinity::Tokenize(*bonusListIdString, ';', false)) if (Optional bonusListId = Trinity::StringTo(token); bonusListId && *bonusListId) bonusListIDs.push_back(*bonusListId); - ItemContext itemContext = ItemContext::NONE; if (itemContextArg) { itemContext = ItemContext(*itemContextArg); @@ -1208,6 +1211,9 @@ public: { std::vector contextBonuses = ItemBonusMgr::GetBonusListsForItem(itemId, itemContext); bonusListIDs.insert(bonusListIDs.begin(), contextBonuses.begin(), contextBonuses.end()); + std::ranges::sort(bonusListIDs); + std::ranges::borrowed_subrange_t&> removed = std::ranges::unique(bonusListIDs); + bonusListIDs.erase(removed.begin(), removed.end()); } } -- cgit v1.2.3