diff options
author | Brian <runningnak3d@gmail.com> | 2016-07-15 13:49:12 -0400 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2016-07-15 20:06:37 +0200 |
commit | 7b5373adb3dcb6a58e95ef3a70ceb6af7095a16b (patch) | |
tree | 657a3e6da402b931a6df2d4025c5e37bf642773c | |
parent | 8b9dc06ffc6a3d30b78fc4d0035ff7e4afcf01e4 (diff) |
Core/Quests: Remove quest items that were looted if they are unique, bound, quest items, when abandoning a quest. (#17556)
(cherry picked from commit 3c0d7fd744d618d01e96851ab27473198328d0b6)
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 16 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 1 | ||||
-rw-r--r-- | src/server/game/Handlers/QuestHandler.cpp | 1 |
3 files changed, 18 insertions, 0 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 0c71134359e..62054fdfaaf 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -14517,6 +14517,22 @@ void Player::FailQuest(uint32 questId) } } +void Player::AbandonQuest(uint32 questId) +{ + if (Quest const* quest = sObjectMgr->GetQuestTemplate(questId)) + { + // Destroy quest items on quest abandon. + for (QuestObjective const& obj : quest->GetObjectives()) + if (obj.Type == QUEST_OBJECTIVE_ITEM) + DestroyItemCount(obj.ObjectID, obj.Amount, true, true); + + // Destroy items received during the quest. + for (uint8 i = 0; i < QUEST_ITEM_DROP_COUNT; ++i) + if (quest->ItemDrop[i] && quest->ItemDropQuantity[i] && sObjectMgr->GetItemTemplate(quest->ItemDrop[i])->GetBonding() == BIND_QUEST_ITEM) + DestroyItemCount(quest->ItemDrop[i], quest->ItemDropQuantity[i], true, true); + } +} + bool Player::SatisfyQuestSkill(Quest const* qInfo, bool msg) const { uint32 skill = qInfo->GetRequiredSkill(); diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index d891ec94105..6810bdb0c72 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1503,6 +1503,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> bool CanRewardQuest(Quest const* quest, uint32 reward, bool msg); void AddQuestAndCheckCompletion(Quest const* quest, Object* questGiver); void AddQuest(Quest const* quest, Object* questGiver); + void AbandonQuest(uint32 quest_id); void CompleteQuest(uint32 quest_id); void IncompleteQuest(uint32 quest_id); uint32 GetQuestMoneyReward(Quest const* quest) const; diff --git a/src/server/game/Handlers/QuestHandler.cpp b/src/server/game/Handlers/QuestHandler.cpp index 6ef966a2340..8430a30e86e 100644 --- a/src/server/game/Handlers/QuestHandler.cpp +++ b/src/server/game/Handlers/QuestHandler.cpp @@ -435,6 +435,7 @@ void WorldSession::HandleQuestLogRemoveQuest(WorldPackets::Quest::QuestLogRemove } _player->TakeQuestSourceItem(questId, true); // remove quest src item from player + _player->AbandonQuest(questId); // remove all quest items player received before abandoning quest. Note, this does not remove normal drop items that happen to be quest requirements. _player->RemoveActiveQuest(questId); _player->RemoveCriteriaTimer(CRITERIA_TIMED_TYPE_QUEST, questId); |