diff options
Diffstat (limited to 'src/server/game/Handlers/QuestHandler.cpp')
| -rw-r--r-- | src/server/game/Handlers/QuestHandler.cpp | 113 |
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); |
