Core/Achievements: Implemented all criteria tree operators

This commit is contained in:
Shauren
2016-07-04 22:52:07 +02:00
parent 9645f868ed
commit d0d76abc9d
4 changed files with 87 additions and 29 deletions
@@ -85,7 +85,7 @@ bool AchievementMgr::CanUpdateCriteriaTree(Criteria const* criteria, CriteriaTre
return false;
}
return true;
return CriteriaHandler::CanUpdateCriteriaTree(criteria, tree, referencePlayer);
}
bool AchievementMgr::CanCompleteCriteriaTree(CriteriaTree const* tree)
@@ -936,37 +936,80 @@ bool CriteriaHandler::IsCompletedCriteriaTree(CriteriaTree const* tree)
return false;
uint64 requiredCount = tree->Entry->Amount;
uint64 completedCount = 0;
uint32 op = tree->Entry->Operator;
bool hasAll = true;
// Check criteria we depend on first
for (CriteriaTree const* node : tree->Children)
switch (tree->Entry->Operator)
{
if (IsCompletedCriteriaTree(node))
++completedCount;
else
hasAll = false;
if (op & CRITERIA_TREE_OPERATOR_ANY && completedCount >= requiredCount)
case CRITERIA_TREE_OPERATOR_SINGLE:
return tree->Criteria && IsCompletedCriteria(tree->Criteria, requiredCount);
case CRITERIA_TREE_OPERATOR_SINGLE_NOT_COMPLETED:
return !tree->Criteria || !IsCompletedCriteria(tree->Criteria, requiredCount);
case CRITERIA_TREE_OPERATOR_ALL:
for (CriteriaTree const* node : tree->Children)
if (!IsCompletedCriteriaTree(node))
return false;
return true;
case CRITERIA_TREE_OPERAROR_SUM_CHILDREN:
{
if (!tree->Criteria)
return true;
break;
uint64 progress = 0;
CriteriaMgr::WalkCriteriaTree(tree, [this, &progress](CriteriaTree const* criteriaTree)
{
if (criteriaTree->Criteria)
if (CriteriaProgress const* criteriaProgress = GetCriteriaProgress(criteriaTree->Criteria))
progress += criteriaProgress->Counter;
});
return progress >= requiredCount;
}
case CRITERIA_TREE_OPERATOR_MAX_CHILD:
{
uint64 progress = 0;
CriteriaMgr::WalkCriteriaTree(tree, [this, &progress](CriteriaTree const* criteriaTree)
{
if (criteriaTree->Criteria)
if (CriteriaProgress const* criteriaProgress = GetCriteriaProgress(criteriaTree->Criteria))
if (criteriaProgress->Counter > progress)
progress = criteriaProgress->Counter;
});
return progress >= requiredCount;
}
case CRITERIA_TREE_OPERATOR_COUNT_DIRECT_CHILDREN:
{
uint64 progress = 0;
for (CriteriaTree const* node : tree->Children)
if (node->Criteria)
if (CriteriaProgress const* criteriaProgress = GetCriteriaProgress(node->Criteria))
if (criteriaProgress->Counter >= 1)
if (++progress >= requiredCount)
return true;
return false;
}
case CRITERIA_TREE_OPERATOR_ANY:
{
uint64 progress = 0;
for (CriteriaTree const* node : tree->Children)
if (IsCompletedCriteriaTree(node))
if (++progress >= requiredCount)
return true;
return false;
}
default:
break;
}
if (op & CRITERIA_TREE_OPERATOR_ANY && completedCount < requiredCount)
return false;
}
bool CriteriaHandler::CanUpdateCriteriaTree(Criteria const* criteria, CriteriaTree const* tree, Player* referencePlayer) const
{
if ((tree->Entry->Flags & CRITERIA_TREE_FLAG_HORDE_ONLY && referencePlayer->GetTeam() != HORDE) ||
(tree->Entry->Flags & CRITERIA_TREE_FLAG_ALLIANCE_ONLY && referencePlayer->GetTeam() != ALLIANCE))
{
TC_LOG_TRACE("criteria", "CriteriaHandler::CanUpdateCriteriaTree: (Id: %u Type %s CriteriaTree %u) Wrong faction",
criteria->ID, CriteriaMgr::GetCriteriaTypeString(criteria->Entry->Type), tree->Entry->ID);
return false;
}
if (op & CRITERIA_TREE_OPERATOR_ALL && !hasAll)
return false;
if (!tree->Criteria)
return true;
return IsCompletedCriteria(tree->Criteria, requiredCount);
return true;
}
bool CriteriaHandler::CanCompleteCriteriaTree(CriteriaTree const* /*tree*/)
@@ -273,7 +273,7 @@ protected:
virtual void SendCriteriaProgressRemoved(uint32 criteriaId) = 0;
bool IsCompletedCriteriaTree(CriteriaTree const* tree);
virtual bool CanUpdateCriteriaTree(Criteria const* criteria, CriteriaTree const* tree, Player* referencePlayer) const = 0;
virtual bool CanUpdateCriteriaTree(Criteria const* criteria, CriteriaTree const* tree, Player* referencePlayer) const;
virtual bool CanCompleteCriteriaTree(CriteriaTree const* tree);
virtual void CompletedCriteriaTree(CriteriaTree const* tree, Player* referencePlayer) = 0;
virtual void AfterCriteriaTreeUpdate(CriteriaTree const* /*tree*/, Player* /*referencePlayer*/) { }
+18 -3
View File
@@ -407,10 +407,25 @@ enum CriteriaTypes
#define CRITERIA_TYPE_TOTAL 190
enum CriteriaTreeOperator
enum CriteriaTreeFlags : uint16
{
CRITERIA_TREE_OPERATOR_ALL = 4,
CRITERIA_TREE_OPERATOR_ANY = 8
CRITERIA_TREE_FLAG_PROGRESS_BAR = 0x0001,
CRITERIA_TREE_FLAG_PROGRESS_IS_DATE = 0x0004,
CRITERIA_TREE_FLAG_SHOW_CURRENCY_ICON = 0x0008,
CRITERIA_TREE_FLAG_ALLIANCE_ONLY = 0x0200,
CRITERIA_TREE_FLAG_HORDE_ONLY = 0x0400,
CRITERIA_TREE_FLAG_SHOW_REQUIRED_COUNT = 0x0800
};
enum CriteriaTreeOperator : uint8
{
CRITERIA_TREE_OPERATOR_SINGLE = 0,
CRITERIA_TREE_OPERATOR_SINGLE_NOT_COMPLETED = 1,
CRITERIA_TREE_OPERATOR_ALL = 4,
CRITERIA_TREE_OPERAROR_SUM_CHILDREN = 5,
CRITERIA_TREE_OPERATOR_MAX_CHILD = 6,
CRITERIA_TREE_OPERATOR_COUNT_DIRECT_CHILDREN = 7,
CRITERIA_TREE_OPERATOR_ANY = 8
};
enum Difficulty : uint8