diff options
author | Shauren <shauren.trinity@gmail.com> | 2016-01-12 19:08:37 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2016-03-22 22:00:06 +0100 |
commit | f7624e720668a56c3fd385915c16d49d74bf5cef (patch) | |
tree | 7e8b71b8de0b8ab3a2df88cff51bce592fe796c1 /src/server | |
parent | a09468ea5207ecc0ac1d57d3b23680f2db985e4c (diff) |
Core/Quests: Fixed quest sharing
Closes #12304
Closes #16183
(cherry picked from commit 3c3cde028cbcab64d463707e192fc333d8cadda0)
Diffstat (limited to 'src/server')
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 8 | ||||
-rw-r--r-- | src/server/game/Handlers/QuestHandler.cpp | 30 |
2 files changed, 22 insertions, 16 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 247de0befe6..a01bba9aef3 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -15045,13 +15045,7 @@ QuestStatus Player::GetQuestStatus(uint32 quest_id) const bool Player::CanShareQuest(uint32 quest_id) const { Quest const* qInfo = sObjectMgr->GetQuestTemplate(quest_id); - if (qInfo && qInfo->HasFlag(QUEST_FLAGS_SHARABLE)) - { - QuestStatusMap::const_iterator itr = m_QuestStatus.find(quest_id); - if (itr != m_QuestStatus.end()) - return itr->second.Status == QUEST_STATUS_INCOMPLETE; - } - return false; + return qInfo && qInfo->HasFlag(QUEST_FLAGS_SHARABLE) && IsActiveQuest(quest_id); } void Player::SetQuestStatus(uint32 questId, QuestStatus status, bool update /*= true*/) diff --git a/src/server/game/Handlers/QuestHandler.cpp b/src/server/game/Handlers/QuestHandler.cpp index 0b496100346..a0a7bdde84b 100644 --- a/src/server/game/Handlers/QuestHandler.cpp +++ b/src/server/game/Handlers/QuestHandler.cpp @@ -98,7 +98,11 @@ void WorldSession::HandleQuestgiverAcceptQuestOpcode(WorldPackets::Quest::QuestG { TC_LOG_DEBUG("network", "WORLD: Received CMSG_QUESTGIVER_ACCEPT_QUEST %s, quest = %u, startcheat = %u", packet.QuestGiverGUID.ToString().c_str(), packet.QuestID, packet.StartCheat); - Object* object = ObjectAccessor::GetObjectByTypeMask(*_player, packet.QuestGiverGUID, TYPEMASK_UNIT | TYPEMASK_GAMEOBJECT | TYPEMASK_ITEM | TYPEMASK_PLAYER); + Object* object; + if (!packet.QuestGiverGUID.IsPlayer()) + object = ObjectAccessor::GetObjectByTypeMask(*_player, packet.QuestGiverGUID, TYPEMASK_UNIT | TYPEMASK_GAMEOBJECT | TYPEMASK_ITEM); + else + object = ObjectAccessor::FindPlayer(packet.QuestGiverGUID); #define CLOSE_GOSSIP_CLEAR_DIVIDER() \ do { \ @@ -120,6 +124,11 @@ void WorldSession::HandleQuestgiverAcceptQuestOpcode(WorldPackets::Quest::QuestG CLOSE_GOSSIP_CLEAR_DIVIDER(); return; } + if (_player->GetGroup() != playerQuestObject->GetGroup() || (_player != playerQuestObject && !playerQuestObject->GetGroup())) + { + CLOSE_GOSSIP_CLEAR_DIVIDER(); + return; + } } else { @@ -132,7 +141,10 @@ void WorldSession::HandleQuestgiverAcceptQuestOpcode(WorldPackets::Quest::QuestG // some kind of WPE protection if (!_player->CanInteractWithQuestGiver(object)) + { + CLOSE_GOSSIP_CLEAR_DIVIDER(); return; + } if (Quest const* quest = sObjectMgr->GetQuestTemplate(packet.QuestID)) { @@ -190,7 +202,7 @@ void WorldSession::HandleQuestgiverAcceptQuestOpcode(WorldPackets::Quest::QuestG } } - _player->PlayerTalkClass->SendCloseGossip(); + CLOSE_GOSSIP_CLEAR_DIVIDER(); #undef CLOSE_GOSSIP_CLEAR_DIVIDER } @@ -605,20 +617,20 @@ void WorldSession::HandlePushQuestToParty(WorldPackets::Quest::PushQuestToParty& else { receiver->SetDivider(sender->GetGUID()); - receiver->PlayerTalkClass->SendQuestGiverQuestDetails(quest, sender->GetGUID(), true); + receiver->PlayerTalkClass->SendQuestGiverQuestDetails(quest, receiver->GetGUID(), true); } } } void WorldSession::HandleQuestPushResult(WorldPackets::Quest::QuestPushResult& packet) { - if (!_player->GetDivider().IsEmpty() && _player->GetDivider() == packet.SenderGUID) + if (!_player->GetDivider().IsEmpty()) { - if (Player* player = ObjectAccessor::FindPlayer(_player->GetDivider())) - { - player->SendPushToPartyResponse(_player, static_cast<QuestPushReason>(packet.Result)); - _player->SetDivider(ObjectGuid::Empty); - } + if (_player->GetDivider() == packet.SenderGUID) + if (Player* player = ObjectAccessor::FindPlayer(_player->GetDivider())) + player->SendPushToPartyResponse(_player, static_cast<QuestPushReason>(packet.Result)); + + _player->SetDivider(ObjectGuid::Empty); } } |