diff options
-rw-r--r-- | src/server/game/Entities/Creature/GossipDef.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 8 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 9 | ||||
-rw-r--r-- | src/server/game/Handlers/QuestHandler.cpp | 46 |
4 files changed, 38 insertions, 27 deletions
diff --git a/src/server/game/Entities/Creature/GossipDef.cpp b/src/server/game/Entities/Creature/GossipDef.cpp index 8dc0ea6e352..1a7fa91e4f5 100644 --- a/src/server/game/Entities/Creature/GossipDef.cpp +++ b/src/server/game/Entities/Creature/GossipDef.cpp @@ -437,7 +437,7 @@ void PlayerMenu::SendQuestGiverQuestDetails(Quest const* quest, ObjectGuid npcGU Quest::AddQuestLevelToTitle(packet.QuestTitle, quest->GetQuestLevel()); packet.QuestGiverGUID = npcGUID; - packet.InformUnit = _session->GetPlayer()->GetDivider(); + packet.InformUnit = _session->GetPlayer()->GetPlayerSharingQuest(); packet.QuestID = quest->GetQuestId(); packet.PortraitGiver = quest->GetQuestGiverPortrait(); packet.PortraitGiverMount = quest->GetQuestGiverPortraitMount(); diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 21e37b2b624..0ef75e6c17c 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -24182,6 +24182,14 @@ void Player::SendInitialPacketsAfterAddToMap() _garrison->SendRemoteInfo(); UpdateItemLevelAreaBasedScaling(); + + if (!GetPlayerSharingQuest().IsEmpty()) + { + if (Quest const* quest = sObjectMgr->GetQuestTemplate(GetSharedQuestID())) + PlayerTalkClass->SendQuestGiverQuestDetails(quest, GetGUID(), true, false); + else + ClearQuestSharingInfo(); + } } void Player::SendUpdateToOutOfRangeGroupMembers() diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 8516fb71611..773cae4e538 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1430,8 +1430,10 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> void SendQuestUpdateAddPlayer(Quest const* quest, uint16 newCount) const; void SendQuestGiverStatusMultiple(); - ObjectGuid GetDivider() const { return m_divider; } - void SetDivider(ObjectGuid guid) { m_divider = guid; } + uint32 GetSharedQuestID() const { return m_sharedQuestId; } + ObjectGuid GetPlayerSharingQuest() const { return m_playerSharingQuest; } + void SetQuestSharingInfo(ObjectGuid guid, uint32 id) { m_playerSharingQuest = guid; m_sharedQuestId = id; } + void ClearQuestSharingInfo() { m_playerSharingQuest = ObjectGuid::Empty; m_sharedQuestId = 0; } uint32 GetInGameTime() const { return m_ingametime; } void SetInGameTime(uint32 time) { m_ingametime = time; } @@ -2532,7 +2534,8 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> QuestSet m_monthlyquests; SeasonalEventQuestMap m_seasonalquests; - ObjectGuid m_divider; + ObjectGuid m_playerSharingQuest; + uint32 m_sharedQuestId; uint32 m_ingametime; /*********************************************************/ diff --git a/src/server/game/Handlers/QuestHandler.cpp b/src/server/game/Handlers/QuestHandler.cpp index 1819e5bea1d..dc6b482e9d8 100644 --- a/src/server/game/Handlers/QuestHandler.cpp +++ b/src/server/game/Handlers/QuestHandler.cpp @@ -108,29 +108,29 @@ void WorldSession::HandleQuestgiverAcceptQuestOpcode(WorldPackets::Quest::QuestG else object = ObjectAccessor::FindPlayer(packet.QuestGiverGUID); -#define CLOSE_GOSSIP_CLEAR_DIVIDER() \ +#define CLOSE_GOSSIP_CLEAR_SHARING_INFO() \ do { \ _player->PlayerTalkClass->SendCloseGossip(); \ - _player->SetDivider(ObjectGuid::Empty); \ + _player->ClearQuestSharingInfo(); \ } while (0) // no or incorrect quest giver if (!object) { - CLOSE_GOSSIP_CLEAR_DIVIDER(); + CLOSE_GOSSIP_CLEAR_SHARING_INFO(); return; } if (Player* playerQuestObject = object->ToPlayer()) { - if ((_player->GetDivider().IsEmpty() && _player->GetDivider() != packet.QuestGiverGUID) || !playerQuestObject->CanShareQuest(packet.QuestID)) + if ((_player->GetPlayerSharingQuest().IsEmpty() && _player->GetPlayerSharingQuest() != packet.QuestGiverGUID) || !playerQuestObject->CanShareQuest(packet.QuestID)) { - CLOSE_GOSSIP_CLEAR_DIVIDER(); + CLOSE_GOSSIP_CLEAR_SHARING_INFO(); return; } if (!_player->IsInSameRaidWith(playerQuestObject)) { - CLOSE_GOSSIP_CLEAR_DIVIDER(); + CLOSE_GOSSIP_CLEAR_SHARING_INFO(); return; } } @@ -138,7 +138,7 @@ void WorldSession::HandleQuestgiverAcceptQuestOpcode(WorldPackets::Quest::QuestG { if (!object->hasQuest(packet.QuestID)) { - CLOSE_GOSSIP_CLEAR_DIVIDER(); + CLOSE_GOSSIP_CLEAR_SHARING_INFO(); return; } } @@ -146,7 +146,7 @@ void WorldSession::HandleQuestgiverAcceptQuestOpcode(WorldPackets::Quest::QuestG // some kind of WPE protection if (!_player->CanInteractWithQuestGiver(object)) { - CLOSE_GOSSIP_CLEAR_DIVIDER(); + CLOSE_GOSSIP_CLEAR_SHARING_INFO(); return; } @@ -155,17 +155,17 @@ void WorldSession::HandleQuestgiverAcceptQuestOpcode(WorldPackets::Quest::QuestG // prevent cheating if (!GetPlayer()->CanTakeQuest(quest, true)) { - CLOSE_GOSSIP_CLEAR_DIVIDER(); + CLOSE_GOSSIP_CLEAR_SHARING_INFO(); return; } - if (!_player->GetDivider().IsEmpty()) + if (!_player->GetPlayerSharingQuest().IsEmpty()) { - Player* player = ObjectAccessor::FindPlayer(_player->GetDivider()); + Player* player = ObjectAccessor::FindPlayer(_player->GetPlayerSharingQuest()); if (player) { player->SendPushToPartyResponse(_player, QUEST_PUSH_ACCEPTED); - _player->SetDivider(ObjectGuid::Empty); + _player->ClearQuestSharingInfo(); } } @@ -186,7 +186,7 @@ void WorldSession::HandleQuestgiverAcceptQuestOpcode(WorldPackets::Quest::QuestG if (player->CanTakeQuest(quest, true)) { - player->SetDivider(_player->GetGUID()); + player->SetQuestSharingInfo(_player->GetGUID(), quest->GetQuestId()); // need confirmation that any gossip window will close player->PlayerTalkClass->SendCloseGossip(); @@ -203,9 +203,9 @@ void WorldSession::HandleQuestgiverAcceptQuestOpcode(WorldPackets::Quest::QuestG } } - CLOSE_GOSSIP_CLEAR_DIVIDER(); + CLOSE_GOSSIP_CLEAR_SHARING_INFO(); -#undef CLOSE_GOSSIP_CLEAR_DIVIDER +#undef CLOSE_GOSSIP_CLEAR_SHARING_INFO } void WorldSession::HandleQuestgiverQueryQuestOpcode(WorldPackets::Quest::QuestGiverQueryQuest& packet) @@ -482,7 +482,7 @@ void WorldSession::HandleQuestConfirmAccept(WorldPackets::Quest::QuestConfirmAcc if (!quest->HasFlag(QUEST_FLAGS_PARTY_ACCEPT)) return; - Player* originalPlayer = ObjectAccessor::FindPlayer(_player->GetDivider()); + Player* originalPlayer = ObjectAccessor::FindPlayer(_player->GetPlayerSharingQuest()); if (!originalPlayer) return; @@ -504,7 +504,7 @@ void WorldSession::HandleQuestConfirmAccept(WorldPackets::Quest::QuestConfirmAcc } } - _player->SetDivider(ObjectGuid::Empty); + _player->ClearQuestSharingInfo(); } void WorldSession::HandleQuestgiverCompleteQuest(WorldPackets::Quest::QuestGiverCompleteQuest& packet) @@ -626,7 +626,7 @@ void WorldSession::HandlePushQuestToParty(WorldPackets::Quest::PushQuestToParty& continue; } - if (!receiver->GetDivider().IsEmpty()) + if (!receiver->GetPlayerSharingQuest().IsEmpty()) { sender->SendPushToPartyResponse(receiver, QUEST_PUSH_BUSY); continue; @@ -641,7 +641,7 @@ void WorldSession::HandlePushQuestToParty(WorldPackets::Quest::PushQuestToParty& receiver->PlayerTalkClass->SendQuestGiverRequestItems(quest, sender->GetGUID(), receiver->CanCompleteRepeatableQuest(quest), true); else { - receiver->SetDivider(sender->GetGUID()); + receiver->SetQuestSharingInfo(sender->GetGUID(), quest->GetQuestId()); receiver->PlayerTalkClass->SendQuestGiverQuestDetails(quest, receiver->GetGUID(), true, false); } } @@ -649,13 +649,13 @@ void WorldSession::HandlePushQuestToParty(WorldPackets::Quest::PushQuestToParty& void WorldSession::HandleQuestPushResult(WorldPackets::Quest::QuestPushResult& packet) { - if (!_player->GetDivider().IsEmpty()) + if (!_player->GetPlayerSharingQuest().IsEmpty()) { - if (_player->GetDivider() == packet.SenderGUID) - if (Player* player = ObjectAccessor::FindPlayer(_player->GetDivider())) + if (_player->GetPlayerSharingQuest() == packet.SenderGUID) + if (Player* player = ObjectAccessor::FindPlayer(_player->GetPlayerSharingQuest())) player->SendPushToPartyResponse(_player, static_cast<QuestPushReason>(packet.Result)); - _player->SetDivider(ObjectGuid::Empty); + _player->ClearQuestSharingInfo(); } } |