Skip to content

Commit

Permalink
Core/Quests: Fixes destroying of items, which start quest and which q…
Browse files Browse the repository at this point in the history
…uest is abbandoned. This however needs more research if the items stay in inventory or the items are destroyed and added again.
  • Loading branch information
Lopin authored and Lopin committed May 9, 2011
1 parent 8dee6e7 commit 69ecf31
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 11 deletions.
20 changes: 20 additions & 0 deletions src/server/game/Quests/QuestDef.cpp
Expand Up @@ -213,6 +213,26 @@ bool Quest::IsAllowedInRaid() const
return sWorld->getBoolConfig(CONFIG_QUEST_IGNORE_RAID);
}

bool Quest::IsQuestReturnItem(uint32 questId) const
{
if (!questId)
return false;

Quest const* quest = sObjectMgr->GetQuestTemplate(questId);
if (!quest || !quest->SrcItemId)
return false;

ItemTemplate const* item = sObjectMgr->GetItemTemplate(quest->SrcItemId);
if (!item || item->StartQuest != questId)
return false;

for (uint8 n = 0; n < 6; n++)
if (quest->SrcItemId == quest->ReqItemId[n])
return true;

return false;
}

uint32 Quest::CalculateHonorGain(uint8 level) const
{
if (level > GT_MAX_LEVEL)
Expand Down
1 change: 1 addition & 0 deletions src/server/game/Quests/QuestDef.h
Expand Up @@ -185,6 +185,7 @@ class Quest

bool HasFlag(uint32 flag) const { return (QuestFlags & flag) != 0; }
void SetFlag(uint32 flag) { QuestFlags |= flag; }
bool IsQuestReturnItem(uint32 quest) const;

// table data accessors:
uint32 GetQuestId() const { return QuestId; }
Expand Down
21 changes: 10 additions & 11 deletions src/server/game/Server/Protocol/Handlers/QuestHandler.cpp
Expand Up @@ -397,22 +397,21 @@ void WorldSession::HandleQuestLogRemoveQuest(WorldPacket& recv_data)

if (slot < MAX_QUEST_LOG_SIZE)
{
if (uint32 quest = _player->GetQuestSlotQuestId(slot))
if (uint32 questId = _player->GetQuestSlotQuestId(slot))
{
if (!_player->TakeQuestSourceItem(quest, true))
return; // can't un-equip some items, reject quest cancel

if (const Quest *pQuest = sObjectMgr->GetQuestTemplate(quest))
if (Quest const* quest = sObjectMgr->GetQuestTemplate(questId))
{
if (pQuest->HasFlag(QUEST_TRINITY_FLAGS_TIMED))
_player->RemoveTimedQuest(quest);
if (quest->HasFlag(QUEST_TRINITY_FLAGS_TIMED))
_player->RemoveTimedQuest(questId);

if (!quest->IsQuestReturnItem(questId))
_player->TakeQuestSourceItem(questId, true); // Remove quest src item from player
}

_player->TakeQuestSourceItem(quest, true); // remove quest src item from player
_player->RemoveActiveQuest(quest);
_player->GetAchievementMgr().RemoveTimedAchievement(ACHIEVEMENT_TIMED_TYPE_QUEST, quest);
_player->RemoveActiveQuest(questId);
_player->GetAchievementMgr().RemoveTimedAchievement(ACHIEVEMENT_TIMED_TYPE_QUEST, questId);

sLog->outDetail("Player %u abandoned quest %u", _player->GetGUIDLow(), quest);
sLog->outDetail("Player %u abandoned quest %u", _player->GetGUIDLow(), questId);
}

_player->SetQuestSlot(slot, 0);
Expand Down

0 comments on commit 69ecf31

Please sign in to comment.