Core/AI: Fix an issue where the OnQuestAccept hooks were not called for auto-completed quests.
Fixes #11304
This commit is contained in:
1 parent
ca6b9df261
commit
ec8e94c6ac
4 files changed
+56
-26
No files matched your search
@@ -77,6 +77,7 @@
|
||||
#include "World.h"
|
||||
#include "WorldPacket.h"
|
||||
#include "WorldSession.h"
|
||||
#include "GameObjectAI.h"
|
||||
|
||||
#define ZONE_UPDATE_INTERVAL (1*IN_MILLISECONDS)
|
||||
|
||||
@@ -14770,11 +14771,7 @@ void Player::SendPreparedQuest(uint64 guid)
|
||||
}
|
||||
|
||||
if (quest->IsAutoAccept() && CanAddQuest(quest, true) && CanTakeQuest(quest, true))
|
||||
{
|
||||
AddQuest(quest, object);
|
||||
if (CanCompleteQuest(questId))
|
||||
CompleteQuest(questId);
|
||||
}
|
||||
AddQuestAndCheckCompletion(quest, object);
|
||||
|
||||
if ((quest->IsAutoComplete() && quest->IsRepeatable() && !quest->IsDailyOrWeekly()) || quest->HasFlag(QUEST_FLAGS_AUTOCOMPLETE))
|
||||
PlayerTalkClass->SendQuestGiverRequestItems(quest, guid, CanCompleteRepeatableQuest(quest), true);
|
||||
@@ -15042,6 +15039,53 @@ bool Player::CanRewardQuest(Quest const* quest, bool msg)
|
||||
return true;
|
||||
}
|
||||
|
||||
void Player::AddQuestAndCheckCompletion(Quest const* quest, Object* questGiver)
|
||||
{
|
||||
AddQuest(quest, questGiver);
|
||||
|
||||
if (CanCompleteQuest(quest->GetQuestId()))
|
||||
CompleteQuest(quest->GetQuestId());
|
||||
|
||||
if (!questGiver)
|
||||
return;
|
||||
|
||||
switch (questGiver->GetTypeId())
|
||||
{
|
||||
case TYPEID_UNIT:
|
||||
sScriptMgr->OnQuestAccept(this, (questGiver->ToCreature()), quest);
|
||||
questGiver->ToCreature()->AI()->sQuestAccept(this, quest);
|
||||
break;
|
||||
case TYPEID_ITEM:
|
||||
case TYPEID_CONTAINER:
|
||||
{
|
||||
Item* item = (Item*)questGiver;
|
||||
sScriptMgr->OnQuestAccept(this, item, quest);
|
||||
|
||||
// destroy not required for quest finish quest starting item
|
||||
bool destroyItem = true;
|
||||
for (int i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i)
|
||||
{
|
||||
if (quest->RequiredItemId[i] == item->GetEntry() && item->GetTemplate()->MaxCount > 0)
|
||||
{
|
||||
destroyItem = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (destroyItem)
|
||||
DestroyItem(item->GetBagSlot(), item->GetSlot(), true);
|
||||
|
||||
break;
|
||||
}
|
||||
case TYPEID_GAMEOBJECT:
|
||||
sScriptMgr->OnQuestAccept(this, questGiver->ToGameObject(), quest);
|
||||
questGiver->ToGameObject()->AI()->QuestAccept(this, quest);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
bool Player::CanRewardQuest(Quest const* quest, uint32 reward, bool msg)
|
||||
{
|
||||
// prevent receive reward with quest items in bank or for not completed quest
|
||||
|
||||
@@ -1357,6 +1357,7 @@ class Player : public Unit, public GridObject<Player>
|
||||
bool CanCompleteRepeatableQuest(Quest const* quest);
|
||||
bool CanRewardQuest(Quest const* quest, bool msg);
|
||||
bool CanRewardQuest(Quest const* quest, uint32 reward, bool msg);
|
||||
void AddQuestAndCheckCompletion(Quest const* quest, Object* questGiver);
|
||||
void AddQuest(Quest const* quest, Object* questGiver);
|
||||
void CompleteQuest(uint32 quest_id);
|
||||
void IncompleteQuest(uint32 quest_id);
|
||||
|
||||
@@ -239,6 +239,7 @@ void WorldSession::HandleQuestgiverAcceptQuestOpcode(WorldPacket& recvData)
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
_player->PlayerTalkClass->SendCloseGossip();
|
||||
|
||||
if (quest->GetSrcSpell() > 0)
|
||||
@@ -278,11 +279,7 @@ void WorldSession::HandleQuestgiverQueryQuestOpcode(WorldPacket& recvData)
|
||||
return;
|
||||
|
||||
if (quest->IsAutoAccept() && _player->CanAddQuest(quest, true))
|
||||
{
|
||||
_player->AddQuest(quest, object);
|
||||
if (_player->CanCompleteQuest(questId))
|
||||
_player->CompleteQuest(questId);
|
||||
}
|
||||
_player->AddQuestAndCheckCompletion(quest, object);
|
||||
|
||||
if (quest->HasFlag(QUEST_FLAGS_AUTOCOMPLETE))
|
||||
_player->PlayerTalkClass->SendQuestGiverRequestItems(quest, object->GetGUID(), _player->CanCompleteQuest(quest->GetQuestId()), true);
|
||||
@@ -348,11 +345,7 @@ void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPacket& recvData)
|
||||
if (Quest const* nextQuest = _player->GetNextQuest(guid, quest))
|
||||
{
|
||||
if (nextQuest->IsAutoAccept() && _player->CanAddQuest(nextQuest, true) && _player->CanTakeQuest(nextQuest, true))
|
||||
{
|
||||
_player->AddQuest(nextQuest, object);
|
||||
if (_player->CanCompleteQuest(nextQuest->GetQuestId()))
|
||||
_player->CompleteQuest(nextQuest->GetQuestId());
|
||||
}
|
||||
_player->AddQuestAndCheckCompletion(nextQuest, object);
|
||||
|
||||
_player->PlayerTalkClass->SendQuestGiverQuestDetails(nextQuest, guid, true);
|
||||
}
|
||||
@@ -367,11 +360,7 @@ void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPacket& recvData)
|
||||
if (Quest const* nextQuest = _player->GetNextQuest(guid, quest))
|
||||
{
|
||||
if (nextQuest->IsAutoAccept() && _player->CanAddQuest(nextQuest, true) && _player->CanTakeQuest(nextQuest, true))
|
||||
{
|
||||
_player->AddQuest(nextQuest, object);
|
||||
if (_player->CanCompleteQuest(nextQuest->GetQuestId()))
|
||||
_player->CompleteQuest(nextQuest->GetQuestId());
|
||||
}
|
||||
_player->AddQuestAndCheckCompletion(nextQuest, object);
|
||||
|
||||
_player->PlayerTalkClass->SendQuestGiverQuestDetails(nextQuest, guid, true);
|
||||
}
|
||||
@@ -615,11 +604,7 @@ void WorldSession::HandlePushQuestToParty(WorldPacket& recvPacket)
|
||||
sender->SendPushToPartyResponse(receiver, QUEST_PARTY_MSG_SHARING_QUEST);
|
||||
|
||||
if (quest->IsAutoAccept() && receiver->CanAddQuest(quest, true) && receiver->CanTakeQuest(quest, true))
|
||||
{
|
||||
receiver->AddQuest(quest, sender);
|
||||
if (receiver->CanCompleteQuest(questId))
|
||||
receiver->CompleteQuest(questId);
|
||||
}
|
||||
receiver->AddQuestAndCheckCompletion(quest, sender);
|
||||
|
||||
if ((quest->IsAutoComplete() && quest->IsRepeatable() && !quest->IsDailyOrWeekly()) || quest->HasFlag(QUEST_FLAGS_AUTOCOMPLETE))
|
||||
receiver->PlayerTalkClass->SendQuestGiverRequestItems(quest, sender->GetGUID(), receiver->CanCompleteRepeatableQuest(quest), true);
|
||||
|
||||
@@ -92,7 +92,7 @@ public:
|
||||
// ok, normal (creature/GO starting) quest
|
||||
if (player->CanAddQuest(quest, true))
|
||||
{
|
||||
player->AddQuest(quest, NULL);
|
||||
player->AddQuestAndCheckCompletion(quest, NULL);
|
||||
|
||||
if (player->CanCompleteQuest(entry))
|
||||
player->CompleteQuest(entry);
|
||||
|
||||
Reference in new issue
Block a user