diff options
-rw-r--r-- | src/server/game/Handlers/QuestHandler.cpp | 12 | ||||
-rw-r--r-- | src/server/game/Scripting/ScriptMgr.cpp | 9 | ||||
-rw-r--r-- | src/server/game/Scripting/ScriptMgr.h | 4 | ||||
-rw-r--r-- | src/server/game/Server/Packets/QuestPackets.cpp | 5 | ||||
-rw-r--r-- | src/server/game/Server/Packets/QuestPackets.h | 10 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.h | 2 |
7 files changed, 43 insertions, 1 deletions
diff --git a/src/server/game/Handlers/QuestHandler.cpp b/src/server/game/Handlers/QuestHandler.cpp index 49fe2ac0345..a02fa586775 100644 --- a/src/server/game/Handlers/QuestHandler.cpp +++ b/src/server/game/Handlers/QuestHandler.cpp @@ -612,6 +612,18 @@ void WorldSession::HandleQuestgiverCompleteQuest(WorldPackets::Quest::QuestGiver } } +void WorldSession::HandleQuestgiverCloseQuest(WorldPackets::Quest::QuestGiverCloseQuest& questGiverCloseQuest) +{ + if (_player->FindQuestSlot(questGiverCloseQuest.QuestID) >= MAX_QUEST_LOG_SIZE) + return; + + Quest const* quest = sObjectMgr->GetQuestTemplate(questGiverCloseQuest.QuestID); + if (!quest) + return; + + sScriptMgr->OnQuestAcknowledgeAutoAccept(_player, quest); +} + void WorldSession::HandlePushQuestToParty(WorldPackets::Quest::PushQuestToParty& packet) { if (!_player->CanShareQuest(packet.QuestID)) diff --git a/src/server/game/Scripting/ScriptMgr.cpp b/src/server/game/Scripting/ScriptMgr.cpp index 6ca57b18391..d6ada60914e 100644 --- a/src/server/game/Scripting/ScriptMgr.cpp +++ b/src/server/game/Scripting/ScriptMgr.cpp @@ -2254,6 +2254,15 @@ void ScriptMgr::OnQuestStatusChange(Player* player, Quest const* quest, QuestSta tmpscript->OnQuestStatusChange(player, quest, oldStatus, newStatus); } +void ScriptMgr::OnQuestAcknowledgeAutoAccept(Player* player, Quest const* quest) +{ + ASSERT(player); + ASSERT(quest); + + GET_SCRIPT(QuestScript, quest->GetScriptId(), tmpscript); + tmpscript->OnAcknowledgeAutoAccept(player, quest); +} + void ScriptMgr::OnQuestObjectiveChange(Player* player, Quest const* quest, QuestObjective const& objective, int32 oldAmount, int32 newAmount) { ASSERT(player); diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h index e4765c44bec..f781d74a8fb 100644 --- a/src/server/game/Scripting/ScriptMgr.h +++ b/src/server/game/Scripting/ScriptMgr.h @@ -863,6 +863,9 @@ class TC_GAME_API QuestScript : public ScriptObject // Called when a quest status change virtual void OnQuestStatusChange(Player* /*player*/, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus /*newStatus*/) { } + // Called for auto accept quests when player closes quest UI after seeing initial quest details + virtual void OnAcknowledgeAutoAccept(Player* /*player*/, Quest const* /*quest*/) { } + // Called when a quest objective data change virtual void OnQuestObjectiveChange(Player* /*player*/, Quest const* /*quest*/, QuestObjective const& /*objective*/, int32 /*oldAmount*/, int32 /*newAmount*/) { } }; @@ -1144,6 +1147,7 @@ class TC_GAME_API ScriptMgr public: /* QuestScript */ void OnQuestStatusChange(Player* player, Quest const* quest, QuestStatus oldStatus, QuestStatus newStatus); + void OnQuestAcknowledgeAutoAccept(Player* player, Quest const* quest); void OnQuestObjectiveChange(Player* player, Quest const* quest, QuestObjective const& objective, int32 oldAmount, int32 newAmount); private: diff --git a/src/server/game/Server/Packets/QuestPackets.cpp b/src/server/game/Server/Packets/QuestPackets.cpp index 3fcd20bb1fe..9f0f7536023 100644 --- a/src/server/game/Server/Packets/QuestPackets.cpp +++ b/src/server/game/Server/Packets/QuestPackets.cpp @@ -388,6 +388,11 @@ void QuestGiverCompleteQuest::Read() FromScript = _worldPacket.ReadBit(); } +void QuestGiverCloseQuest::Read() +{ + _worldPacket >> QuestID; +} + WorldPacket const* QuestGiverQuestDetails::Write() { _worldPacket << QuestGiverGUID; diff --git a/src/server/game/Server/Packets/QuestPackets.h b/src/server/game/Server/Packets/QuestPackets.h index 84a4f7f3b79..a581a0af74f 100644 --- a/src/server/game/Server/Packets/QuestPackets.h +++ b/src/server/game/Server/Packets/QuestPackets.h @@ -353,6 +353,16 @@ namespace WorldPackets bool FromScript = false; // 0 - standart complete quest mode with npc, 1 - auto-complete mode }; + class QuestGiverCloseQuest final : public ClientPacket + { + public: + QuestGiverCloseQuest(WorldPacket&& packet) : ClientPacket(CMSG_QUEST_GIVER_CLOSE_QUEST, std::move(packet)) { } + + void Read() override; + + int32 QuestID = 0; + }; + struct QuestObjectiveSimple { int32 ID = 0; diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 0dfabcdaa75..94aa90fbc11 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -690,7 +690,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_QUEST_CONFIRM_ACCEPT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestConfirmAccept); DEFINE_HANDLER(CMSG_QUEST_GIVER_ACCEPT_QUEST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestgiverAcceptQuestOpcode); DEFINE_HANDLER(CMSG_QUEST_GIVER_CHOOSE_REWARD, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestgiverChooseRewardOpcode); - DEFINE_HANDLER(CMSG_QUEST_GIVER_CLOSE_QUEST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_QUEST_GIVER_CLOSE_QUEST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestgiverCloseQuest); DEFINE_HANDLER(CMSG_QUEST_GIVER_COMPLETE_QUEST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestgiverCompleteQuest); DEFINE_HANDLER(CMSG_QUEST_GIVER_HELLO, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestgiverHelloOpcode); DEFINE_HANDLER(CMSG_QUEST_GIVER_QUERY_QUEST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestgiverQueryQuestOpcode); diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index c8fcd89ac75..139a2afa9a0 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -615,6 +615,7 @@ namespace WorldPackets class QuestGiverHello; class QueryQuestInfo; class QuestGiverChooseReward; + class QuestGiverCloseQuest; class QuestGiverCompleteQuest; class QuestGiverRequestReward; class QuestGiverQueryQuest; @@ -1472,6 +1473,7 @@ class TC_GAME_API WorldSession void HandleQuestLogRemoveQuest(WorldPackets::Quest::QuestLogRemoveQuest& packet); void HandleQuestConfirmAccept(WorldPackets::Quest::QuestConfirmAccept& packet); void HandleQuestgiverCompleteQuest(WorldPackets::Quest::QuestGiverCompleteQuest& packet); + void HandleQuestgiverCloseQuest(WorldPackets::Quest::QuestGiverCloseQuest& questGiverCloseQuest); void HandlePushQuestToParty(WorldPackets::Quest::PushQuestToParty& packet); void HandleQuestPushResult(WorldPackets::Quest::QuestPushResult& packet); void HandleRequestWorldQuestUpdate(WorldPackets::Quest::RequestWorldQuestUpdate& packet); |