aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Handlers/QuestHandler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Handlers/QuestHandler.cpp')
-rw-r--r--src/server/game/Handlers/QuestHandler.cpp113
1 files changed, 95 insertions, 18 deletions
diff --git a/src/server/game/Handlers/QuestHandler.cpp b/src/server/game/Handlers/QuestHandler.cpp
index 7e0d4832523..9018c4dd0ab 100644
--- a/src/server/game/Handlers/QuestHandler.cpp
+++ b/src/server/game/Handlers/QuestHandler.cpp
@@ -30,6 +30,7 @@
#include "ObjectAccessor.h"
#include "ObjectMgr.h"
#include "Player.h"
+#include "PoolMgr.h"
#include "QuestDef.h"
#include "QuestPackets.h"
#include "ReputationMgr.h"
@@ -165,7 +166,7 @@ void WorldSession::HandleQuestgiverAcceptQuestOpcode(WorldPackets::Quest::QuestG
Player* player = ObjectAccessor::FindPlayer(_player->GetPlayerSharingQuest());
if (player)
{
- player->SendPushToPartyResponse(_player, QUEST_PUSH_ACCEPTED);
+ player->SendPushToPartyResponse(_player, QuestPushReason::Accepted);
_player->ClearQuestSharingInfo();
}
}
@@ -624,19 +625,29 @@ void WorldSession::HandleQuestgiverCloseQuest(WorldPackets::Quest::QuestGiverClo
void WorldSession::HandlePushQuestToParty(WorldPackets::Quest::PushQuestToParty& packet)
{
- if (!_player->CanShareQuest(packet.QuestID))
- return;
-
Quest const* quest = sObjectMgr->GetQuestTemplate(packet.QuestID);
if (!quest)
return;
- Player * const sender = GetPlayer();
+ Player* const sender = GetPlayer();
+
+ if (!_player->CanShareQuest(packet.QuestID))
+ {
+ sender->SendPushToPartyResponse(sender, QuestPushReason::NotAllowed);
+ return;
+ }
+
+ // in pool and not currently available (wintergrasp weekly, dalaran weekly) - can't share
+ if (sPoolMgr->IsPartOfAPool<Quest>(packet.QuestID) && !sPoolMgr->IsSpawnedObject<Quest>(packet.QuestID))
+ {
+ sender->SendPushToPartyResponse(sender, QuestPushReason::NotDaily);
+ return;
+ }
Group* group = sender->GetGroup();
if (!group)
{
- sender->SendPushToPartyResponse(sender, QUEST_PUSH_NOT_IN_PARTY);
+ sender->SendPushToPartyResponse(sender, QuestPushReason::NotInParty);
return;
}
@@ -647,43 +658,109 @@ void WorldSession::HandlePushQuestToParty(WorldPackets::Quest::PushQuestToParty&
if (!receiver || receiver == sender)
continue;
- if (!receiver->SatisfyQuestStatus(quest, false))
+ if (!receiver->GetPlayerSharingQuest().IsEmpty())
{
- sender->SendPushToPartyResponse(receiver, QUEST_PUSH_ONQUEST);
+ sender->SendPushToPartyResponse(receiver, QuestPushReason::Busy);
continue;
}
- if (receiver->GetQuestStatus(packet.QuestID) == QUEST_STATUS_COMPLETE)
+ if (!receiver->IsAlive())
{
- sender->SendPushToPartyResponse(receiver, QUEST_PUSH_ALREADY_DONE);
+ sender->SendPushToPartyResponse(receiver, QuestPushReason::Dead);
+ receiver->SendPushToPartyResponse(sender, QuestPushReason::DeadToRecipient, quest);
+ continue;
+ }
+
+ switch (receiver->GetQuestStatus(packet.QuestID))
+ {
+ case QUEST_STATUS_REWARDED:
+ {
+ sender->SendPushToPartyResponse(receiver, QuestPushReason::AlreadyDone);
+ receiver->SendPushToPartyResponse(sender, QuestPushReason::AlreadyDoneToRecipient, quest);
+ continue;
+ }
+ case QUEST_STATUS_INCOMPLETE:
+ case QUEST_STATUS_COMPLETE:
+ {
+ sender->SendPushToPartyResponse(receiver, QuestPushReason::OnQuest);
+ receiver->SendPushToPartyResponse(sender, QuestPushReason::OnQuestToRecipient, quest);
+ continue;
+ }
+ default:
+ break;
+ }
+
+ if (!receiver->SatisfyQuestLog(false))
+ {
+ sender->SendPushToPartyResponse(receiver, QuestPushReason::LogFull);
+ receiver->SendPushToPartyResponse(sender, QuestPushReason::LogFullToRecipient, quest);
continue;
}
if (!receiver->SatisfyQuestDay(quest, false))
{
- sender->SendPushToPartyResponse(receiver, QUEST_PUSH_DIFFERENT_SERVER_DAILY);
+ sender->SendPushToPartyResponse(receiver, QuestPushReason::AlreadyDone);
+ receiver->SendPushToPartyResponse(sender, QuestPushReason::AlreadyDoneToRecipient, quest);
continue;
}
- if (!receiver->CanTakeQuest(quest, false))
+ if (!receiver->SatisfyQuestMinLevel(quest, false))
{
- sender->SendPushToPartyResponse(receiver, QUEST_PUSH_INVALID);
+ sender->SendPushToPartyResponse(receiver, QuestPushReason::LowLevel);
+ receiver->SendPushToPartyResponse(sender, QuestPushReason::LowLevelToRecipient, quest);
continue;
}
- if (!receiver->SatisfyQuestLog(false))
+ if (!receiver->SatisfyQuestMaxLevel(quest, false))
{
- sender->SendPushToPartyResponse(receiver, QUEST_PUSH_LOG_FULL);
+ sender->SendPushToPartyResponse(receiver, QuestPushReason::HighLevel);
+ receiver->SendPushToPartyResponse(sender, QuestPushReason::HighLevelToRecipient, quest);
continue;
}
- if (!receiver->GetPlayerSharingQuest().IsEmpty())
+ if (!receiver->SatisfyQuestClass(quest, false))
+ {
+ sender->SendPushToPartyResponse(receiver, QuestPushReason::Class);
+ receiver->SendPushToPartyResponse(sender, QuestPushReason::ClassToRecipient, quest);
+ continue;
+ }
+
+ if (!receiver->SatisfyQuestRace(quest, false))
+ {
+ sender->SendPushToPartyResponse(receiver, QuestPushReason::Race);
+ receiver->SendPushToPartyResponse(sender, QuestPushReason::RaceToRecipient, quest);
+ continue;
+ }
+
+ if (!receiver->SatisfyQuestReputation(quest, false))
+ {
+ sender->SendPushToPartyResponse(receiver, QuestPushReason::LowFaction);
+ receiver->SendPushToPartyResponse(sender, QuestPushReason::LowFactionToRecipient, quest);
+ continue;
+ }
+
+ if (!receiver->SatisfyQuestDependentQuests(quest, false))
+ {
+ sender->SendPushToPartyResponse(receiver, QuestPushReason::Prerequisite);
+ receiver->SendPushToPartyResponse(sender, QuestPushReason::PrerequisiteToRecipient, quest);
+ continue;
+ }
+
+ if (!receiver->SatisfyQuestExpansion(quest, false))
+ {
+ sender->SendPushToPartyResponse(receiver, QuestPushReason::Expansion);
+ receiver->SendPushToPartyResponse(sender, QuestPushReason::ExpansionToRecipient, quest);
+ continue;
+ }
+
+ if (!receiver->CanTakeQuest(quest, false))
{
- sender->SendPushToPartyResponse(receiver, QUEST_PUSH_BUSY);
+ sender->SendPushToPartyResponse(receiver, QuestPushReason::Invalid);
+ receiver->SendPushToPartyResponse(sender, QuestPushReason::InvalidToRecipient, quest);
continue;
}
- sender->SendPushToPartyResponse(receiver, QUEST_PUSH_SUCCESS);
+ sender->SendPushToPartyResponse(receiver, QuestPushReason::Success);
if (quest->IsAutoAccept() && receiver->CanAddQuest(quest, true) && receiver->CanTakeQuest(quest, true))
receiver->AddQuestAndCheckCompletion(quest, sender);