aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2016-01-12 19:08:37 +0100
committerShauren <shauren.trinity@gmail.com>2016-03-22 22:00:06 +0100
commitf7624e720668a56c3fd385915c16d49d74bf5cef (patch)
tree7e8b71b8de0b8ab3a2df88cff51bce592fe796c1 /src
parenta09468ea5207ecc0ac1d57d3b23680f2db985e4c (diff)
Core/Quests: Fixed quest sharing
Closes #12304 Closes #16183 (cherry picked from commit 3c3cde028cbcab64d463707e192fc333d8cadda0)
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Player/Player.cpp8
-rw-r--r--src/server/game/Handlers/QuestHandler.cpp30
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);
}
}