aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities/Player
diff options
context:
space:
mode:
authorSnapper <snapperryen@gmail.com>2016-06-02 17:13:55 +0200
committerSnapper <snapperryen@gmail.com>2016-06-07 10:22:23 +0200
commit114f4c9715dd703f37440ef59fcf864fb8e6612f (patch)
tree0dca60fa632738fb69c24bba7bcc9fc0c36205dc /src/server/game/Entities/Player
parent24ac2bb9be5099b67edfd3239ab2ec8c12362a7a (diff)
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).
Diffstat (limited to 'src/server/game/Entities/Player')
-rw-r--r--src/server/game/Entities/Player/Player.cpp46
-rw-r--r--src/server/game/Entities/Player/Player.h1
2 files changed, 47 insertions, 0 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index ec86e8fe4c3..e133e550e9b 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -15049,6 +15049,8 @@ void Player::RewardQuest(Quest const* quest, uint32 reward, Object* questGiver,
SendQuestUpdate(quest_id);
+ SendQuestGiverStatusMultiple();
+
//lets remove flag for delayed teleports
SetCanDelayTeleport(false);
}
@@ -16592,6 +16594,50 @@ void Player::SendQuestUpdateAddPlayer(Quest const* quest, uint16 old_count, uint
SetQuestSlotCounter(log_slot, QUEST_PVP_KILL_SLOT, GetQuestSlotCounter(log_slot, QUEST_PVP_KILL_SLOT) + add_count);
}
+void Player::SendQuestGiverStatusMultiple()
+{
+ uint32 count = 0;
+
+ WorldPacket data(SMSG_QUESTGIVER_STATUS_MULTIPLE, 4);
+ data << uint32(count); // placeholder
+
+ for (auto itr = m_clientGUIDs.begin(); itr != m_clientGUIDs.end(); ++itr)
+ {
+ uint32 questStatus = DIALOG_STATUS_NONE;
+
+ if (itr->IsAnyTypeCreature())
+ {
+ // need also pet quests case support
+ Creature* questgiver = ObjectAccessor::GetCreatureOrPetOrVehicle(*this, *itr);
+ if (!questgiver || questgiver->IsHostileTo(this))
+ continue;
+ if (!questgiver->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER))
+ continue;
+
+ questStatus = GetQuestDialogStatus(questgiver);
+
+ data << uint64(questgiver->GetGUID());
+ data << uint8(questStatus);
+ ++count;
+ }
+ else if (itr->IsGameObject())
+ {
+ GameObject* questgiver = GetMap()->GetGameObject(*itr);
+ if (!questgiver || questgiver->GetGoType() != GAMEOBJECT_TYPE_QUESTGIVER)
+ continue;
+
+ questStatus = GetQuestDialogStatus(questgiver);
+
+ data << uint64(questgiver->GetGUID());
+ data << uint8(questStatus);
+ ++count;
+ }
+ }
+
+ data.put<uint32>(0, count); // write real count
+ GetSession()->SendPacket(&data);
+}
+
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 6a38cd3b9fe..45f94eb5b17 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -1413,6 +1413,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
void SendQuestUpdateAddItem(Quest const* quest, uint32 itemIdx, uint16 count) const;
void SendQuestUpdateAddCreatureOrGo(Quest const* quest, ObjectGuid guid, uint32 creatureOrGOIdx, uint16 oldCount, uint16 addCount);
void SendQuestUpdateAddPlayer(Quest const* quest, uint16 oldCount, uint16 addCount);
+ void SendQuestGiverStatusMultiple();
ObjectGuid GetDivider() const { return m_divider; }
void SetDivider(ObjectGuid guid) { m_divider = guid; }