Core/Quests: Fixed quest sharing

Closes #12304
Closes #16183
This commit is contained in:
Shauren committed 2016-01-12 19:08:37 +01:00
1 parent e203d78d2a
commit 3c3cde028c
3 files changed
+32 -23

No files matched your search

@@ -408,10 +408,10 @@ void PlayerMenu::SendQuestGiverQuestDetails(Quest const* quest, ObjectGuid npcGU
data << questTitle;
data << questDetails;
data << questObjectives;
data << uint8(activateAccept ? 1 : 0); // auto finish
data << uint8(activateAccept ? 1 : 0); // CGQuestInfo::m_autoLaunched
data << uint32(quest->GetFlags()); // 3.3.3 questFlags
data << uint32(quest->GetSuggestedPlayers());
data << uint8(0); // IsFinished? value is sent back to server in quest accept packet
data << uint8(0); // CGQuestInfo::m_startQuestCheat
if (quest->HasFlag(QUEST_FLAGS_HIDDEN_REWARDS))
{
+1 -7
View File
@@ -15638,13 +15638,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*/)
+29 -14
View File
@@ -102,12 +102,16 @@ void WorldSession::HandleQuestgiverAcceptQuestOpcode(WorldPacket& recvData)
{
ObjectGuid guid;
uint32 questId;
uint32 unk1;
recvData >> guid >> questId >> unk1;
uint32 startCheat;
recvData >> guid >> questId >> startCheat;
TC_LOG_DEBUG("network", "WORLD: Received CMSG_QUESTGIVER_ACCEPT_QUEST %s, quest = %u, unk1 = %u", guid.ToString().c_str(), questId, unk1);
TC_LOG_DEBUG("network", "WORLD: Received CMSG_QUESTGIVER_ACCEPT_QUEST %s, quest = %u, startCheat = %u", guid.ToString().c_str(), questId, startCheat);
Object* object = ObjectAccessor::GetObjectByTypeMask(*_player, guid, TYPEMASK_UNIT|TYPEMASK_GAMEOBJECT|TYPEMASK_ITEM|TYPEMASK_PLAYER);
Object* object;
if (!guid.IsPlayer())
object = ObjectAccessor::GetObjectByTypeMask(*_player, guid, TYPEMASK_UNIT | TYPEMASK_GAMEOBJECT | TYPEMASK_ITEM);
else
object = ObjectAccessor::FindPlayer(guid);
#define CLOSE_GOSSIP_CLEAR_DIVIDER() \
do { \
@@ -129,6 +133,11 @@ void WorldSession::HandleQuestgiverAcceptQuestOpcode(WorldPacket& recvData)
CLOSE_GOSSIP_CLEAR_DIVIDER();
return;
}
if (_player->GetGroup() != playerQuestObject->GetGroup() || (_player != playerQuestObject && !playerQuestObject->GetGroup()))
{
CLOSE_GOSSIP_CLEAR_DIVIDER();
return;
}
}
else
{
@@ -141,7 +150,10 @@ void WorldSession::HandleQuestgiverAcceptQuestOpcode(WorldPacket& recvData)
// some kind of WPE protection
if (!_player->CanInteractWithQuestGiver(object))
{
CLOSE_GOSSIP_CLEAR_DIVIDER();
return;
}
if (Quest const* quest = sObjectMgr->GetQuestTemplate(questId))
{
@@ -199,7 +211,7 @@ void WorldSession::HandleQuestgiverAcceptQuestOpcode(WorldPacket& recvData)
}
}
_player->PlayerTalkClass->SendCloseGossip();
CLOSE_GOSSIP_CLEAR_DIVIDER();
#undef CLOSE_GOSSIP_CLEAR_DIVIDER
}
@@ -588,7 +600,7 @@ void WorldSession::HandlePushQuestToParty(WorldPacket& recvPacket)
else
{
receiver->SetDivider(sender->GetGUID());
receiver->PlayerTalkClass->SendQuestGiverQuestDetails(quest, sender->GetGUID(), true);
receiver->PlayerTalkClass->SendQuestGiverQuestDetails(quest, receiver->GetGUID(), true);
}
}
}
@@ -602,17 +614,20 @@ void WorldSession::HandleQuestPushResult(WorldPacket& recvPacket)
TC_LOG_DEBUG("network", "WORLD: Received MSG_QUEST_PUSH_RESULT");
if (_player->GetDivider() && _player->GetDivider() == guid)
if (_player->GetDivider())
{
Player* player = ObjectAccessor::FindPlayer(_player->GetDivider());
if (player)
if (_player->GetDivider() == guid)
{
WorldPacket data(MSG_QUEST_PUSH_RESULT, 8 + 4 + 1);
data << uint64(_player->GetGUID());
data << uint8(msg); // valid values: 0-8
player->SendDirectMessage(&data);
_player->SetDivider(ObjectGuid::Empty);
Player* player = ObjectAccessor::FindPlayer(_player->GetDivider());
if (player)
{
WorldPacket data(MSG_QUEST_PUSH_RESULT, 8 + 4 + 1);
data << uint64(_player->GetGUID());
data << uint8(msg); // valid values: 0-8
player->SendDirectMessage(&data);
}
}
_player->SetDivider(ObjectGuid::Empty);
}
}