aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Achievements/CriteriaHandler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Achievements/CriteriaHandler.cpp')
-rw-r--r--src/server/game/Achievements/CriteriaHandler.cpp105
1 files changed, 104 insertions, 1 deletions
diff --git a/src/server/game/Achievements/CriteriaHandler.cpp b/src/server/game/Achievements/CriteriaHandler.cpp
index 5cbdcefd648..4cba6ab5b55 100644
--- a/src/server/game/Achievements/CriteriaHandler.cpp
+++ b/src/server/game/Achievements/CriteriaHandler.cpp
@@ -3095,7 +3095,7 @@ bool CriteriaHandler::ModifierSatisfied(ModifierTreeEntry const* modifier, uint6
bool bagScanReachedEnd = referencePlayer->ForEachItem(ItemSearchLocation::Everywhere, [&bonusListIDs](Item const* item)
{
- bool hasBonus = std::any_of(item->m_itemData->BonusListIDs->begin(), item->m_itemData->BonusListIDs->end(), [&bonusListIDs](int32 bonusListID)
+ bool hasBonus = std::any_of(item->GetBonusListIDs().begin(), item->GetBonusListIDs().end(), [&bonusListIDs](int32 bonusListID)
{
return bonusListIDs.find(bonusListID) != bonusListIDs.end();
});
@@ -3762,6 +3762,109 @@ bool CriteriaHandler::ModifierSatisfied(ModifierTreeEntry const* modifier, uint6
return false;
break;
}
+ case ModifierTreeType::PlayerAuraWithLabelStackCountEqualOrGreaterThan: // 335
+ {
+ uint32 count = 0;
+ referencePlayer->HasAura([secondaryAsset, &count](Aura const* aura)
+ {
+ if (aura->GetSpellInfo()->HasLabel(secondaryAsset))
+ count += aura->GetStackAmount();
+ return false;
+ });
+ if (count < reqValue)
+ return false;
+ break;
+ }
+ case ModifierTreeType::PlayerAuraWithLabelStackCountEqual: // 336
+ {
+ uint32 count = 0;
+ referencePlayer->HasAura([secondaryAsset, &count](Aura const* aura)
+ {
+ if (aura->GetSpellInfo()->HasLabel(secondaryAsset))
+ count += aura->GetStackAmount();
+ return false;
+ });
+ if (count != reqValue)
+ return false;
+ break;
+ }
+ case ModifierTreeType::PlayerAuraWithLabelStackCountEqualOrLessThan: // 337
+ {
+ uint32 count = 0;
+ referencePlayer->HasAura([secondaryAsset, &count](Aura const* aura)
+ {
+ if (aura->GetSpellInfo()->HasLabel(secondaryAsset))
+ count += aura->GetStackAmount();
+ return false;
+ });
+ if (count > reqValue)
+ return false;
+ break;
+ }
+ case ModifierTreeType::PlayerIsInCrossFactionGroup: // 338
+ {
+ Group const* group = referencePlayer->GetGroup();
+ if (!(group->GetGroupFlags() & GROUP_FLAG_CROSS_FACTION))
+ return false;
+ break;
+ }
+ case ModifierTreeType::PlayerHasTraitNodeEntryInActiveConfig: // 340
+ {
+ auto hasTraitNodeEntry = [referencePlayer, reqValue]()
+ {
+ for (UF::TraitConfig const& traitConfig : referencePlayer->m_activePlayerData->TraitConfigs)
+ {
+ if (TraitConfigType(*traitConfig.Type) == TraitConfigType::Combat)
+ {
+ if (int32(*referencePlayer->m_activePlayerData->ActiveCombatTraitConfigID) != traitConfig.ID
+ || !EnumFlag(TraitCombatConfigFlags(*traitConfig.CombatConfigFlags)).HasFlag(TraitCombatConfigFlags::ActiveForSpec))
+ continue;
+ }
+
+ for (UF::TraitEntry const& traitEntry : traitConfig.Entries)
+ if (traitEntry.TraitNodeEntryID == int32(reqValue))
+ return true;
+ }
+ return false;
+ }();
+ if (!hasTraitNodeEntry)
+ return false;
+ break;
+ }
+ case ModifierTreeType::PlayerHasTraitNodeEntryInActiveConfigRankGreaterOrEqualThan: // 341
+ {
+ auto traitNodeEntryRank = [referencePlayer, secondaryAsset]() -> Optional<uint16>
+ {
+ for (UF::TraitConfig const& traitConfig : referencePlayer->m_activePlayerData->TraitConfigs)
+ {
+ if (TraitConfigType(*traitConfig.Type) == TraitConfigType::Combat)
+ {
+ if (int32(*referencePlayer->m_activePlayerData->ActiveCombatTraitConfigID) != traitConfig.ID
+ || !EnumFlag(TraitCombatConfigFlags(*traitConfig.CombatConfigFlags)).HasFlag(TraitCombatConfigFlags::ActiveForSpec))
+ continue;
+ }
+
+ for (UF::TraitEntry const& traitEntry : traitConfig.Entries)
+ if (traitEntry.TraitNodeEntryID == int32(secondaryAsset))
+ return traitEntry.Rank;
+ }
+ return {};
+ }();
+ if (!traitNodeEntryRank || traitNodeEntryRank < int32(reqValue))
+ return false;
+ break;
+ }
+ case ModifierTreeType::PlayerDaysSinceLogout: // 344
+ if (GameTime::GetGameTime() - referencePlayer->m_playerData->LogoutTime < int64(reqValue) * DAY)
+ return false;
+ break;
+ case ModifierTreeType::PlayerCanUseItem: // 351
+ {
+ ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(reqValue);
+ if (!itemTemplate || !referencePlayer->CanUseItem(itemTemplate))
+ return false;
+ break;
+ }
default:
return false;
}