diff options
author | Shauren <shauren.trinity@gmail.com> | 2025-06-30 15:34:37 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2025-06-30 15:34:37 +0200 |
commit | 79347f72db13600a0cc326d9a61c4cf0396777d0 (patch) | |
tree | dafc573c51e740379bbdbfc341f4e408811e8536 | |
parent | ca5928b8de12422d1cee671bc401a2820c11ff23 (diff) |
Core/Quests: Allow quest objective items with effect type other than "On Looted" to be put in inventory even when QUEST_OBJECTIVE_FLAG_2_QUEST_BOUND_ITEM is set
Closes #29579
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 65e24aa3639..f33d76ee8d4 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -16590,10 +16590,25 @@ void Player::ItemAddedQuestCheck(uint32 entry, uint32 count, Optional<bool> boun { std::vector<QuestObjective const*> updatedObjectives; std::function<bool(QuestObjective const*)> const* objectiveFilter = nullptr; + ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(entry); if (boundItemFlagRequirement) - objectiveFilter = *boundItemFlagRequirement ? &ItemQuestObjectiveFilters.QuestBoundItem : &ItemQuestObjectiveFilters.NotQuestBoundItem; + { + bool ignoresQuestBoundItemFlag = std::ranges::any_of(itemTemplate->Effects, [](int8 triggerType) + { + return triggerType != ITEM_SPELLTRIGGER_ON_LOOTED && triggerType != ITEM_SPELLTRIGGER_ON_LOOTED_FORCED; + }, &ItemEffectEntry::TriggerType); + + if (*boundItemFlagRequirement) + { + if (ignoresQuestBoundItemFlag) + return; + + objectiveFilter = &ItemQuestObjectiveFilters.QuestBoundItem; + } + else if (!ignoresQuestBoundItemFlag) + objectiveFilter = &ItemQuestObjectiveFilters.NotQuestBoundItem; + } - ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(entry); UpdateQuestObjectiveProgress(QUEST_OBJECTIVE_ITEM, itemTemplate->GetId(), count, ObjectGuid::Empty, &updatedObjectives, objectiveFilter); if (itemTemplate->QuestLogItemId && (updatedObjectives.size() != 1 || !(updatedObjectives[0]->Flags2 & QUEST_OBJECTIVE_FLAG_2_QUEST_BOUND_ITEM))) UpdateQuestObjectiveProgress(QUEST_OBJECTIVE_ITEM, itemTemplate->QuestLogItemId, count, ObjectGuid::Empty, &updatedObjectives, objectiveFilter); @@ -16606,7 +16621,7 @@ void Player::ItemAddedQuestCheck(uint32 entry, uint32 count, Optional<bool> boun return; if (hadBoundItemObjective) - *hadBoundItemObjective = updatedObjectives.size() == 1 && updatedObjectives[0]->Flags2 & QUEST_OBJECTIVE_FLAG_2_QUEST_BOUND_ITEM; + *hadBoundItemObjective = true; SendQuestUpdateAddItem(itemTemplate, *updatedObjectives[0], count); } |