From f8ca5fd40e91a7a50e9f2877dd0a8b4ab0e921f4 Mon Sep 17 00:00:00 2001 From: Snapper Date: Thu, 2 Jun 2016 17:13:55 +0200 Subject: Core/Quest: send SMSG_QUESTGIVER_STATUS_MULTIPLE after a quest is rewarded. This updates the status of nearby questgivers and prevents them from being stuck in a state that's no longer valid (for example, stuck with yellow question mark until area update). (cherry picked from commit 114f4c9715dd703f37440ef59fcf864fb8e6612f) --- src/server/game/Entities/Player/Player.cpp | 32 ++++++++++++++++++++++++++++++ src/server/game/Entities/Player/Player.h | 1 + src/server/game/Handlers/QuestHandler.cpp | 27 +------------------------ 3 files changed, 34 insertions(+), 26 deletions(-) (limited to 'src') diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 0b6e19f90b0..c4419c0aaf0 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -15161,6 +15161,8 @@ void Player::RewardQuest(Quest const* quest, uint32 reward, Object* questGiver, SendQuestUpdate(quest_id); + SendQuestGiverStatusMultiple(); + //lets remove flag for delayed teleports SetCanDelayTeleport(false); } @@ -16819,6 +16821,36 @@ void Player::SendQuestUpdateAddPlayer(Quest const* quest, uint16 newCount) const GetSession()->SendPacket(questUpdateAddPvpCredit.Write()); } +void Player::SendQuestGiverStatusMultiple() +{ + WorldPackets::Quest::QuestGiverStatusMultiple response; + + for (auto itr = m_clientGUIDs.begin(); itr != m_clientGUIDs.end(); ++itr) + { + if (itr->IsAnyTypeCreature()) + { + // need also pet quests case support + Creature* questgiver = ObjectAccessor::GetCreatureOrPetOrVehicle(*this, *itr); + if (!questgiver || questgiver->IsHostileTo(this)) + continue; + if (!questgiver->HasFlag64(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER)) + continue; + + response.QuestGiver.emplace_back(questgiver->GetGUID(), GetQuestDialogStatus(questgiver)); + } + else if (itr->IsGameObject()) + { + GameObject* questgiver = GetMap()->GetGameObject(*itr); + if (!questgiver || questgiver->GetGoType() != GAMEOBJECT_TYPE_QUESTGIVER) + continue; + + response.QuestGiver.emplace_back(questgiver->GetGUID(), GetQuestDialogStatus(questgiver)); + } + } + + GetSession()->SendPacket(response.Write()); +} + bool Player::HasPvPForcingQuest() const { for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i) diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 0209dc46385..cd7167b2d26 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1613,6 +1613,7 @@ class TC_GAME_API Player : public Unit, public GridObject void SendPushToPartyResponse(Player* player, QuestPushReason reason) const; void SendQuestUpdateAddCredit(Quest const* quest, ObjectGuid guid, QuestObjective const& obj, uint16 count) const; void SendQuestUpdateAddPlayer(Quest const* quest, uint16 newCount) const; + void SendQuestGiverStatusMultiple(); ObjectGuid GetDivider() const { return m_divider; } void SetDivider(ObjectGuid guid) { m_divider = guid; } diff --git a/src/server/game/Handlers/QuestHandler.cpp b/src/server/game/Handlers/QuestHandler.cpp index 44214139bc1..cd6b3eb135a 100644 --- a/src/server/game/Handlers/QuestHandler.cpp +++ b/src/server/game/Handlers/QuestHandler.cpp @@ -653,32 +653,7 @@ void WorldSession::HandleQuestPushResult(WorldPackets::Quest::QuestPushResult& p void WorldSession::HandleQuestgiverStatusMultipleQuery(WorldPackets::Quest::QuestGiverStatusMultipleQuery& /*packet*/) { - WorldPackets::Quest::QuestGiverStatusMultiple response; - - for (auto itr = _player->m_clientGUIDs.begin(); itr != _player->m_clientGUIDs.end(); ++itr) - { - if (itr->IsAnyTypeCreature()) - { - // need also pet quests case support - Creature* questgiver = ObjectAccessor::GetCreatureOrPetOrVehicle(*GetPlayer(), *itr); - if (!questgiver || questgiver->IsHostileTo(_player)) - continue; - if (!questgiver->HasFlag64(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER)) - continue; - - response.QuestGiver.emplace_back(questgiver->GetGUID(), _player->GetQuestDialogStatus(questgiver)); - } - else if (itr->IsGameObject()) - { - GameObject* questgiver = GetPlayer()->GetMap()->GetGameObject(*itr); - if (!questgiver || questgiver->GetGoType() != GAMEOBJECT_TYPE_QUESTGIVER) - continue; - - response.QuestGiver.emplace_back(questgiver->GetGUID(), _player->GetQuestDialogStatus(questgiver)); - } - } - - SendPacket(response.Write()); + _player->SendQuestGiverStatusMultiple(); } void WorldSession::HandleRequestWorldQuestUpdate(WorldPackets::Quest::RequestWorldQuestUpdate& /*packet*/) -- cgit v1.2.3