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
This commit is contained in:
Shauren
2025-06-30 15:34:37 +02:00
parent ca5928b8de
commit 79347f72db

View File

@@ -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;
if (boundItemFlagRequirement)
objectiveFilter = *boundItemFlagRequirement ? &ItemQuestObjectiveFilters.QuestBoundItem : &ItemQuestObjectiveFilters.NotQuestBoundItem;
ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(entry);
if (boundItemFlagRequirement)
{
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;
}
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);
}