From 98364454ca0dc313c98ef6c17028c78ae3cfe00b Mon Sep 17 00:00:00 2001 From: Aokromes Date: Sat, 12 May 2018 13:23:19 +0200 Subject: [PATCH] Core/Quest: Fix crash caused by disabled quests Fix crash happening when a disabled quest was added and rewarded (through a GM command). Disabled quests are not validated on startup and they can reference invalid spells. --- src/server/game/Conditions/DisableMgr.cpp | 5 ----- src/server/game/Entities/Player/Player.cpp | 2 +- src/server/scripts/Commands/cs_quest.cpp | 9 ++++++--- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/server/game/Conditions/DisableMgr.cpp b/src/server/game/Conditions/DisableMgr.cpp index 6c56566ed44..9cbf062a63b 100644 --- a/src/server/game/Conditions/DisableMgr.cpp +++ b/src/server/game/Conditions/DisableMgr.cpp @@ -374,11 +374,6 @@ bool IsDisabledFor(DisableType type, uint32 entry, Unit const* unit, uint8 flags } return false; case DISABLE_TYPE_QUEST: - if (!unit) - return true; - if (Player const* player = unit->ToPlayer()) - if (player->IsGameMaster()) - return false; return true; case DISABLE_TYPE_BATTLEGROUND: case DISABLE_TYPE_OUTDOORPVP: diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 56c9eaa3a1f..807ccbbbfa1 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -15205,7 +15205,7 @@ void Player::RewardQuest(Quest const* quest, uint32 reward, Object* questGiver, // cast spells after mark quest complete (some spells have quest completed state requirements in spell_area data) if (quest->GetRewSpellCast() > 0) { - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(quest->GetRewSpellCast()); + SpellInfo const* spellInfo = ASSERT_NOTNULL(sSpellMgr->GetSpellInfo(quest->GetRewSpellCast())); if (questGiver->isType(TYPEMASK_UNIT) && !spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL) && !spellInfo->HasEffect(SPELL_EFFECT_CREATE_ITEM) && !quest->HasFlag(QUEST_FLAGS_PLAYER_CAST_ON_COMPLETE)) { if (Creature* creature = GetMap()->GetCreature(questGiver->GetGUID())) diff --git a/src/server/scripts/Commands/cs_quest.cpp b/src/server/scripts/Commands/cs_quest.cpp index d4bd1d2129d..5f896b1a5c1 100644 --- a/src/server/scripts/Commands/cs_quest.cpp +++ b/src/server/scripts/Commands/cs_quest.cpp @@ -26,6 +26,7 @@ EndScriptData */ #include "Chat.h" #include "DatabaseEnv.h" #include "DBCStores.h" +#include "DisableMgr.h" #include "ObjectMgr.h" #include "Player.h" #include "ReputationMgr.h" @@ -73,7 +74,7 @@ public: Quest const* quest = sObjectMgr->GetQuestTemplate(entry); - if (!quest) + if (!quest || DisableMgr::IsDisabledFor(DISABLE_TYPE_QUEST, entry, nullptr)) { handler->PSendSysMessage(LANG_COMMAND_QUEST_NOTFOUND, entry); handler->SetSentErrorMessage(true); @@ -185,7 +186,8 @@ public: Quest const* quest = sObjectMgr->GetQuestTemplate(entry); // If player doesn't have the quest - if (!quest || player->GetQuestStatus(entry) == QUEST_STATUS_NONE) + if (!quest || player->GetQuestStatus(entry) == QUEST_STATUS_NONE + || DisableMgr::IsDisabledFor(DISABLE_TYPE_QUEST, entry, nullptr)) { handler->PSendSysMessage(LANG_COMMAND_QUEST_NOTFOUND, entry); handler->SetSentErrorMessage(true); @@ -289,7 +291,8 @@ public: Quest const* quest = sObjectMgr->GetQuestTemplate(entry); // If player doesn't have the quest - if (!quest || player->GetQuestStatus(entry) != QUEST_STATUS_COMPLETE) + if (!quest || player->GetQuestStatus(entry) != QUEST_STATUS_COMPLETE + || DisableMgr::IsDisabledFor(DISABLE_TYPE_QUEST, entry, nullptr)) { handler->PSendSysMessage(LANG_COMMAND_QUEST_NOTFOUND, entry); handler->SetSentErrorMessage(true);