From 551249ae3150c6550f520a5724cb8204cd2d1196 Mon Sep 17 00:00:00 2001 From: Shauren Date: Tue, 10 Oct 2023 21:35:55 +0200 Subject: [PATCH] Core/Achievements: Define and implement new ModifierTree types --- .../game/Achievements/AchievementMgr.cpp | 29 +++++++++++++++++++ src/server/game/DataStores/DBCEnums.h | 9 ++++-- 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index 5adc61bb82..115b34693f 100644 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -2824,6 +2824,13 @@ bool AchievementMgr::AdditionalRequirementsSatisfied(AchievementCriteriaEntry switch (AchievementCriteriaAdditionalCondition(reqType)) { + case ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_SOURCE_PLAYER_CONDITION: // 2 + { + PlayerConditionEntry const* playerCondition = sPlayerConditionStore.LookupEntry(reqValue); + if (!playerCondition || !ConditionMgr::IsPlayerMeetingCondition(referencePlayer, playerCondition)) + return false; + break; + } case ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_ITEM_LEVEL: // 3 { uint64 itemId = (criteria->Type == ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM ? miscValue2 : miscValue1); @@ -2852,6 +2859,10 @@ bool AchievementMgr::AdditionalRequirementsSatisfied(AchievementCriteriaEntry if (!referencePlayer->HasAura(reqValue)) return false; break; + case CRITERIA_ADDITIONAL_CONDITION_SOURCE_HAS_AURA_TYPE: // 9 + if (!referencePlayer->HasAuraType(AuraType(reqValue))) + return false; + break; case ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_TARGET_HAS_AURA: // 10 if (!ref || !ref->IsUnit() || !ref->ToUnit()->HasAura(reqValue)) return false; @@ -2860,6 +2871,14 @@ bool AchievementMgr::AdditionalRequirementsSatisfied(AchievementCriteriaEntry if (!ref || !ref->IsUnit() || !ref->ToUnit()->HasAuraType(AuraType(reqValue))) return false; break; + case ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_SOURCE_AURA_STATE: // 12 + if (!referencePlayer->HasAuraState(AuraStateType(reqValue))) + return false; + break; + case ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_TARGET_AURA_STATE: // 13 + if (!ref || !ref->IsUnit() || !ref->ToUnit()->HasAuraState(AuraStateType(reqValue))) + return false; + break; case ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_ITEM_QUALITY_MIN: // 14 { uint64 itemId = (criteria->Type == ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM ? miscValue2 : miscValue1); @@ -2967,6 +2986,16 @@ bool AchievementMgr::AdditionalRequirementsSatisfied(AchievementCriteriaEntry if (!ref || !ref->IsUnit() || ref->ToUnit()->GetHealthPct() >= reqValue) return false; break; + case ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_TARGET_PLAYER_CONDITION: // 55 + { + if (!ref || !ref->IsPlayer()) + return false; + + PlayerConditionEntry const* playerCondition = sPlayerConditionStore.LookupEntry(reqValue); + if (!playerCondition || !ConditionMgr::IsPlayerMeetingCondition(ref->ToPlayer(), playerCondition)) + return false; + break; + } case ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_REQUIRES_GUILD_GROUP: // 61 { Guild* guild = referencePlayer->GetGuild(); diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h index b98b5566a2..a481971dd6 100644 --- a/src/server/game/DataStores/DBCEnums.h +++ b/src/server/game/DataStores/DBCEnums.h @@ -123,18 +123,21 @@ enum AchievementCriteriaCondition enum AchievementCriteriaAdditionalCondition { ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_SOURCE_DRUNK_VALUE = 1, // NYI - ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_UNK2 = 2, + ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_SOURCE_PLAYER_CONDITION = 2, ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_ITEM_LEVEL = 3, ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_TARGET_CREATURE_ENTRY = 4, ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_TARGET_MUST_BE_PLAYER = 5, ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_TARGET_MUST_BE_DEAD = 6, ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_TARGET_MUST_BE_ENEMY = 7, ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_SOURCE_HAS_AURA = 8, + ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_SOURCE_HAS_AURA_TYPE = 9, ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_TARGET_HAS_AURA = 10, ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_TARGET_HAS_AURA_TYPE = 11, + ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_SOURCE_AURA_STATE = 12, + ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_TARGET_AURA_STATE = 13, ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_ITEM_QUALITY_MIN = 14, ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_ITEM_QUALITY_EQUALS = 15, - ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_UNK16 = 16, + ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_SOURCE_IS_ALIVE = 16, ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_SOURCE_AREA_OR_ZONE = 17, ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_TARGET_AREA_OR_ZONE = 18, ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_MAP_DIFFICULTY = 20, @@ -156,7 +159,7 @@ enum AchievementCriteriaAdditionalCondition ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_TARGET_LEVEL = 40, ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_TARGET_ZONE = 41, ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_TARGET_HEALTH_PERCENT_BELOW = 46, - ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_UNK55 = 55, + ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_TARGET_PLAYER_CONDITION = 55, ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_MIN_ACHIEVEMENT_POINTS = 56, // NYI ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_REQUIRES_LFG_GROUP = 58, // NYI ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_UNK60 = 60,