From e7fe6dcb00ee32a78301d3344f65725c59aceb20 Mon Sep 17 00:00:00 2001 From: UltraNix <80540499+UltraNix@users.noreply.github.com> Date: Fri, 10 Sep 2021 01:04:28 +0200 Subject: [PATCH] fix(Core/Quests): properly handle quests with QuestType=0. (#7718) - Closes #6732 --- .../pending_db_world/rev_1630757583266839900.sql | 3 +++ src/server/game/Entities/Player/PlayerQuest.cpp | 6 +++--- src/server/game/Handlers/QuestHandler.cpp | 12 +++++++++--- src/server/game/Quests/QuestDef.cpp | 2 +- 4 files changed, 16 insertions(+), 7 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1630757583266839900.sql diff --git a/data/sql/updates/pending_db_world/rev_1630757583266839900.sql b/data/sql/updates/pending_db_world/rev_1630757583266839900.sql new file mode 100644 index 000000000..e251a1b63 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1630757583266839900.sql @@ -0,0 +1,3 @@ +INSERT INTO `version_db_world` (`sql_rev`) VALUES ('1630757583266839900'); + +UPDATE `quest_template` SET `QuestType`=0 WHERE `ID` IN (7946,1559,7881,7882,7883,7884,7885,7939,7941); diff --git a/src/server/game/Entities/Player/PlayerQuest.cpp b/src/server/game/Entities/Player/PlayerQuest.cpp index f267bdc28..fcd7de207 100644 --- a/src/server/game/Entities/Player/PlayerQuest.cpp +++ b/src/server/game/Entities/Player/PlayerQuest.cpp @@ -115,7 +115,7 @@ void Player::SendPreparedQuest(ObjectGuid guid) if (quest->IsAutoAccept() && CanAddQuest(quest, true) && CanTakeQuest(quest, true)) AddQuestAndCheckCompletion(quest, object); - if ((quest->IsAutoComplete() && quest->IsRepeatable() && !quest->IsDailyOrWeekly()) || quest->HasFlag(QUEST_FLAGS_AUTOCOMPLETE)) + if (quest->IsAutoComplete() || !quest->GetQuestMethod()) PlayerTalkClass->SendQuestGiverRequestItems(quest, guid, CanCompleteRepeatableQuest(quest), true); else PlayerTalkClass->SendQuestGiverQuestDetails(quest, guid, true); @@ -269,7 +269,7 @@ bool Player::CanCompleteQuest(uint32 quest_id, const QuestStatusData* q_savedSta return false; // not allow re-complete quest // auto complete quest - if ((qInfo->IsAutoComplete() || qInfo->GetFlags() & QUEST_FLAGS_AUTOCOMPLETE) && CanTakeQuest(qInfo, false)) + if ((qInfo->IsAutoComplete() || !qInfo->GetQuestMethod()) && CanTakeQuest(qInfo, false)) return true; QuestStatusData q_status; @@ -355,7 +355,7 @@ bool Player::CanCompleteRepeatableQuest(Quest const* quest) bool Player::CanRewardQuest(Quest const* quest, bool msg) { // not auto complete quest and not completed quest (only cheating case, then ignore without message) - if (!quest->IsDFQuest() && !quest->IsAutoComplete() && !(quest->GetFlags() & QUEST_FLAGS_AUTOCOMPLETE) && GetQuestStatus(quest->GetQuestId()) != QUEST_STATUS_COMPLETE) + if (!quest->IsDFQuest() && !quest->IsAutoComplete() && quest->GetQuestMethod() && GetQuestStatus(quest->GetQuestId()) != QUEST_STATUS_COMPLETE) return false; // daily quest can't be rewarded (25 daily quest already completed) diff --git a/src/server/game/Handlers/QuestHandler.cpp b/src/server/game/Handlers/QuestHandler.cpp index 61f1b8882..6b4558dee 100644 --- a/src/server/game/Handlers/QuestHandler.cpp +++ b/src/server/game/Handlers/QuestHandler.cpp @@ -213,7 +213,7 @@ void WorldSession::HandleQuestgiverQueryQuestOpcode(WorldPacket& recvData) if (quest->IsAutoAccept() && _player->CanAddQuest(quest, true)) _player->AddQuestAndCheckCompletion(quest, object); - if (quest->HasFlag(QUEST_FLAGS_AUTOCOMPLETE)) + if (quest->IsAutoComplete() || !quest->GetQuestMethod()) _player->PlayerTalkClass->SendQuestGiverRequestItems(quest, object->GetGUID(), _player->CanCompleteQuest(quest->GetQuestId()), true); else _player->PlayerTalkClass->SendQuestGiverQuestDetails(quest, object->GetGUID(), true); @@ -259,7 +259,7 @@ void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPacket& recvData) if (Quest const* quest = sObjectMgr->GetQuestTemplate(questId)) { if ((!_player->CanSeeStartQuest(quest) && _player->GetQuestStatus(questId) == QUEST_STATUS_NONE) || - (_player->GetQuestStatus(questId) != QUEST_STATUS_COMPLETE && !quest->IsAutoComplete())) + (_player->GetQuestStatus(questId) != QUEST_STATUS_COMPLETE && !quest->IsAutoComplete() && quest->GetQuestMethod())) { LOG_ERROR("network.opcode", "HACK ALERT: Player %s (%s) is trying to complete quest (id: %u) but he has no right to do it!", _player->GetName().c_str(), _player->GetGUID().ToString().c_str(), questId); @@ -269,6 +269,12 @@ void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPacket& recvData) { _player->RewardQuest(quest, reward, object); + // Special dialog status update (client does not query this) + if (!quest->GetQuestMethod()) + { + _player->PlayerTalkClass->SendQuestGiverStatus(uint8(_player->GetQuestDialogStatus(object)), guid); + } + switch (object->GetTypeId()) { case TYPEID_UNIT: @@ -585,7 +591,7 @@ void WorldSession::HandlePushQuestToParty(WorldPacket& recvPacket) if (quest->IsAutoAccept() && player->CanAddQuest(quest, true) && player->CanTakeQuest(quest, true)) player->AddQuestAndCheckCompletion(quest, _player); - if ((quest->IsAutoComplete() && quest->IsRepeatable() && !quest->IsDailyOrWeekly()) || quest->HasFlag(QUEST_FLAGS_AUTOCOMPLETE)) + if (quest->IsAutoComplete() || !quest->GetQuestMethod()) player->PlayerTalkClass->SendQuestGiverRequestItems(quest, _player->GetGUID(), player->CanCompleteRepeatableQuest(quest), true); else { diff --git a/src/server/game/Quests/QuestDef.cpp b/src/server/game/Quests/QuestDef.cpp index a4c7fd9b0..ffb391939 100644 --- a/src/server/game/Quests/QuestDef.cpp +++ b/src/server/game/Quests/QuestDef.cpp @@ -226,7 +226,7 @@ bool Quest::IsAutoAccept() const bool Quest::IsAutoComplete() const { - return sWorld->getBoolConfig(CONFIG_QUEST_IGNORE_AUTO_COMPLETE) ? false : (Method == 0 || HasFlag(QUEST_FLAGS_AUTOCOMPLETE)); + return sWorld->getBoolConfig(CONFIG_QUEST_IGNORE_AUTO_COMPLETE) ? false : HasFlag(QUEST_FLAGS_AUTOCOMPLETE); } bool Quest::IsRaidQuest(Difficulty difficulty) const