Core/Quests: Correct criteria tree quest objective update conditions

* Apply same raid group restriction as normal objectives
* Check that player is on quest before updating criteria
* Remove non-GM requirement
This commit is contained in:
Shauren
2021-02-06 20:03:37 +01:00
parent 7c58a13cc9
commit b37163b5e2

View File

@@ -19,6 +19,7 @@
#include "AchievementPackets.h"
#include "DatabaseEnv.h"
#include "DB2Structure.h"
#include "Group.h"
#include "Log.h"
#include "ObjectMgr.h"
#include "Player.h"
@@ -225,14 +226,10 @@ void QuestObjectiveCriteriaMgr::SendAllData(Player const* /*receiver*/) const
void QuestObjectiveCriteriaMgr::CompletedObjective(QuestObjective const* questObjective, Player* referencePlayer)
{
// disable for gamemasters with GM-mode enabled
if (_owner->IsGameMaster())
return;
if (HasCompletedObjective(questObjective))
return;
referencePlayer->KillCreditCriteriaTreeObjective(*questObjective);
_owner->KillCreditCriteriaTreeObjective(*questObjective);
TC_LOG_INFO("criteria.quest", "QuestObjectiveCriteriaMgr::CompletedObjective(%u). %s", questObjective->ID, GetOwnerInfo().c_str());
@@ -282,6 +279,21 @@ bool QuestObjectiveCriteriaMgr::CanUpdateCriteriaTree(Criteria const* criteria,
return false;
}
if (_owner->GetQuestStatus(objective->QuestID) != QUEST_STATUS_INCOMPLETE)
{
TC_LOG_TRACE("criteria.quest", "QuestObjectiveCriteriaMgr::CanUpdateCriteriaTree: (Id: %u Type %s Quest Objective %u) Not on quest",
criteria->ID, CriteriaMgr::GetCriteriaTypeString(criteria->Entry->Type), objective->ID);
return false;
}
Quest const* quest = ASSERT_NOTNULL(sObjectMgr->GetQuestTemplate(objective->QuestID));
if (_owner->GetGroup() && _owner->GetGroup()->isRaidGroup() && !quest->IsAllowedInRaid(referencePlayer->GetMap()->GetDifficultyID()))
{
TC_LOG_TRACE("criteria.quest", "QuestObjectiveCriteriaMgr::CanUpdateCriteriaTree: (Id: %u Type %s Quest Objective %u) Quest cannot be completed in raid group",
criteria->ID, CriteriaMgr::GetCriteriaTypeString(criteria->Entry->Type), objective->ID);
return false;
}
return CriteriaHandler::CanUpdateCriteriaTree(criteria, tree, referencePlayer);
}