From 05250fe4adafa6a22ffdc8c97700489cab9fa0e9 Mon Sep 17 00:00:00 2001 From: Ovalord <1Don7H4v3@m41L.com> Date: Tue, 28 Nov 2017 08:30:58 +0100 Subject: [PATCH] Core/Quests: Implemented quest popups --- src/server/game/AI/SmartScripts/SmartScript.cpp | 15 +++++++-------- src/server/game/Entities/Creature/GossipDef.cpp | 14 +++++++------- src/server/game/Entities/Creature/GossipDef.h | 6 +++--- src/server/game/Entities/Player/Player.cpp | 2 +- src/server/game/Handlers/QuestHandler.cpp | 8 ++++---- src/server/game/Spells/SpellEffects.cpp | 5 ++++- 6 files changed, 26 insertions(+), 24 deletions(-) diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index 77eaa865e7..a567e56e0e 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -332,17 +332,16 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u { if (me && e.action.questOffer.directAdd == 0) { - if (pTarget->CanTakeQuest(q, true)) - if (WorldSession* session = pTarget->GetSession()) - { - PlayerMenu menu(session); - menu.SendQuestGiverQuestDetails(q, me->GetGUID(), true); - TC_LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction:: SMART_ACTION_OFFER_QUEST: Player guidLow %u - offering quest %u", pTarget->GetGUID().GetCounter(), e.action.questOffer.questID); - } + if (pTarget->CanTakeQuest(q, true) && q->IsAutoAccept()) + { + pTarget->AddQuestAndCheckCompletion(q, nullptr); + pTarget->PlayerTalkClass->SendQuestGiverQuestDetails(q, pTarget->GetGUID(), true, true); + TC_LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction:: SMART_ACTION_OFFER_QUEST: Player guidLow %u - discovering quest %u", pTarget->GetGUID().GetCounter(), e.action.questOffer.questID); + } } else { - (*itr)->ToPlayer()->AddQuestAndCheckCompletion(q, nullptr); + pTarget->AddQuestAndCheckCompletion(q, nullptr); TC_LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction:: SMART_ACTION_OFFER_QUEST: Player guidLow %u - quest %u added", pTarget->GetGUID().GetCounter(), e.action.questOffer.questID); } diff --git a/src/server/game/Entities/Creature/GossipDef.cpp b/src/server/game/Entities/Creature/GossipDef.cpp index cf170cbf43..d257978ba7 100644 --- a/src/server/game/Entities/Creature/GossipDef.cpp +++ b/src/server/game/Entities/Creature/GossipDef.cpp @@ -396,7 +396,7 @@ void PlayerMenu::SendQuestGiverStatus(uint32 questStatus, ObjectGuid npcGUID) co TC_LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTGIVER_STATUS NPC=%s, status=%u", npcGUID.ToString().c_str(), questStatus); } -void PlayerMenu::SendQuestGiverQuestDetails(Quest const* quest, ObjectGuid npcGUID, bool activateAccept) const +void PlayerMenu::SendQuestGiverQuestDetails(Quest const* quest, ObjectGuid npcGUID, bool autoLaunched, bool displayPopup) const { std::string questTitle = quest->GetTitle(); std::string questDetails = quest->GetDetails(); @@ -439,11 +439,11 @@ void PlayerMenu::SendQuestGiverQuestDetails(Quest const* quest, ObjectGuid npcGU data << questTurnTargetName; // 4.x data << uint32(quest->GetQuestGiverPortrait()); // 4.x data << uint32(quest->GetQuestTurnInPortrait()); // 4.x - data << uint8(activateAccept ? 1 : 0); // auto finish + data << uint8(autoLaunched); // auto finish data << uint32(quest->GetFlags() & (sWorld->getBoolConfig(CONFIG_QUEST_IGNORE_AUTO_ACCEPT) ? ~QUEST_FLAGS_AUTO_ACCEPT : ~0)); // 3.3.3 questFlags data << uint32(quest->GetSuggestedPlayers()); data << uint8(0); // IsFinished? value is sent back to server in quest accept packet - data << uint8(quest->IsStartAtAreaTrigger() ? 1 : 0); // 4.x Starts at AreaTrigger? + data << uint8(displayPopup); // 4.x Starts at AreaTrigger? data << uint32(quest->GetRequiredSpell()); // 4.x quest->BuildExtraQuestInfo(data, _session->GetPlayer()); @@ -630,7 +630,7 @@ void PlayerMenu::SendQuestQueryResponse(Quest const* quest) const TC_LOG_DEBUG("network", "WORLD: Sent SMSG_QUEST_QUERY_RESPONSE questid=%u", quest->GetQuestId()); } -void PlayerMenu::SendQuestGiverOfferReward(Quest const* quest, ObjectGuid npcGUID, bool enableNext) const +void PlayerMenu::SendQuestGiverOfferReward(Quest const* quest, ObjectGuid npcGUID, bool autoLaunched) const { std::string questTitle = quest->GetTitle(); std::string questOfferRewardText = quest->GetOfferRewardText(); @@ -669,7 +669,7 @@ void PlayerMenu::SendQuestGiverOfferReward(Quest const* quest, ObjectGuid npcGUI data << uint32(quest->GetQuestGiverPortrait()); data << uint32(quest->GetQuestTurnInPortrait()); - data << uint8(enableNext ? 1 : 0); // Auto Finish + data << uint8(autoLaunched); // Auto Finish data << uint32(quest->GetFlags()); // 3.3.3 questFlags data << uint32(quest->GetSuggestedPlayers()); // SuggestedGroupNum @@ -694,7 +694,7 @@ void PlayerMenu::SendQuestGiverOfferReward(Quest const* quest, ObjectGuid npcGUI TC_LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTGIVER_OFFER_REWARD NPC=%s, questid=%u", npcGUID.ToString().c_str(), quest->GetQuestId()); } -void PlayerMenu::SendQuestGiverRequestItems(Quest const* quest, ObjectGuid npcGUID, bool canComplete, bool closeOnCancel) const +void PlayerMenu::SendQuestGiverRequestItems(Quest const* quest, ObjectGuid npcGUID, bool canComplete, bool autoLaunched) const { // We can always call to RequestItems, but this packet only goes out if there are actually // items. Otherwise, we'll skip straight to the OfferReward @@ -735,7 +735,7 @@ void PlayerMenu::SendQuestGiverRequestItems(Quest const* quest, ObjectGuid npcGU data << quest->GetIncompleteEmote(); // Close Window after cancel - data << uint32(closeOnCancel); + data << uint32(autoLaunched); data << uint32(quest->GetFlags()); // 3.3.3 questFlags data << uint32(quest->GetSuggestedPlayers()); // SuggestedGroupNum diff --git a/src/server/game/Entities/Creature/GossipDef.h b/src/server/game/Entities/Creature/GossipDef.h index 68011cec7f..da94463f65 100644 --- a/src/server/game/Entities/Creature/GossipDef.h +++ b/src/server/game/Entities/Creature/GossipDef.h @@ -282,10 +282,10 @@ class TC_GAME_API PlayerMenu void SendQuestGiverQuestList(QEmote const& eEmote, const std::string& Title, ObjectGuid npcGUID); void SendQuestQueryResponse(Quest const* quest) const; - void SendQuestGiverQuestDetails(Quest const* quest, ObjectGuid npcGUID, bool activateAccept) const; + void SendQuestGiverQuestDetails(Quest const* quest, ObjectGuid npcGUID, bool autoLaunched, bool displayPopup) const; - void SendQuestGiverOfferReward(Quest const* quest, ObjectGuid npcGUID, bool enableNext) const; - void SendQuestGiverRequestItems(Quest const* quest, ObjectGuid npcGUID, bool canComplete, bool closeOnCancel) const; + void SendQuestGiverOfferReward(Quest const* quest, ObjectGuid npcGUID, bool autoLaunched) const; + void SendQuestGiverRequestItems(Quest const* quest, ObjectGuid npcGUID, bool canComplete, bool autoLaunched) const; static void AddQuestLevelToTitle(std::string &title, int32 level); diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index a27203ca70..14c32c957c 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -14579,7 +14579,7 @@ void Player::SendPreparedQuest(ObjectGuid guid) if (quest->IsAutoComplete() && quest->IsRepeatable() && !quest->IsDailyOrWeekly()) PlayerTalkClass->SendQuestGiverRequestItems(quest, guid, CanCompleteRepeatableQuest(quest), true); else - PlayerTalkClass->SendQuestGiverQuestDetails(quest, guid, true); + PlayerTalkClass->SendQuestGiverQuestDetails(quest, guid, true, false); } } } diff --git a/src/server/game/Handlers/QuestHandler.cpp b/src/server/game/Handlers/QuestHandler.cpp index 55853d59b1..2acaa287a7 100644 --- a/src/server/game/Handlers/QuestHandler.cpp +++ b/src/server/game/Handlers/QuestHandler.cpp @@ -243,7 +243,7 @@ void WorldSession::HandleQuestgiverQueryQuestOpcode(WorldPacket& recvData) if (quest->IsAutoComplete()) _player->PlayerTalkClass->SendQuestGiverRequestItems(quest, object->GetGUID(), _player->CanCompleteQuest(quest->GetQuestId()), true); else - _player->PlayerTalkClass->SendQuestGiverQuestDetails(quest, object->GetGUID(), true); + _player->PlayerTalkClass->SendQuestGiverQuestDetails(quest, object->GetGUID(), true, false); } } @@ -321,7 +321,7 @@ void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPacket& recvData) if (nextQuest->IsAutoAccept() && _player->CanAddQuest(nextQuest, true)) _player->AddQuestAndCheckCompletion(nextQuest, object); - _player->PlayerTalkClass->SendQuestGiverQuestDetails(nextQuest, guid, true); + _player->PlayerTalkClass->SendQuestGiverQuestDetails(nextQuest, guid, true, false); } } @@ -344,7 +344,7 @@ void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPacket& recvData) if (nextQuest->IsAutoAccept() && _player->CanAddQuest(nextQuest, true)) _player->AddQuestAndCheckCompletion(nextQuest, object); - _player->PlayerTalkClass->SendQuestGiverQuestDetails(nextQuest, guid, true); + _player->PlayerTalkClass->SendQuestGiverQuestDetails(nextQuest, guid, true, false); } } @@ -637,7 +637,7 @@ void WorldSession::HandlePushQuestToParty(WorldPacket& recvPacket) else { receiver->SetQuestSharingInfo(sender->GetGUID(), questId); - receiver->PlayerTalkClass->SendQuestGiverQuestDetails(quest, receiver->GetGUID(), true); + receiver->PlayerTalkClass->SendQuestGiverQuestDetails(quest, receiver->GetGUID(), true, false); } } } diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 38a204f354..76f6c8b49f 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -5179,9 +5179,12 @@ void Spell::EffectQuestStart(SpellEffIndex effIndex) return; if (quest->IsAutoAccept() && player->CanAddQuest(quest, false)) + { player->AddQuestAndCheckCompletion(quest, player); + player->PlayerTalkClass->SendQuestGiverQuestDetails(quest, player->GetGUID(), true, true); + } - player->PlayerTalkClass->SendQuestGiverQuestDetails(quest, player->GetGUID(), true); + player->PlayerTalkClass->SendQuestGiverQuestDetails(quest, player->GetGUID(), true, false); } }