Core/Achievements: Defined all modifier tree types and implemented many of them

This commit is contained in:
Shauren
2021-06-07 15:37:34 +02:00
parent 626c8f5de1
commit d0be92ec0a
18 changed files with 1609 additions and 647 deletions

View File

@@ -71,6 +71,16 @@ uint32 AchievementMgr::GetAchievementPoints() const
return _achievementPoints;
}
std::vector<uint32> AchievementMgr::GetCompletedAchievementIds() const
{
std::vector<uint32> achievementIds;
std::transform(_completedAchievements.begin(), _completedAchievements.end(), std::back_inserter(achievementIds), [](std::pair<uint32 const, CompletedAchievementData> const& achievement)
{
return achievement.first;
});
return achievementIds;
}
bool AchievementMgr::CanUpdateCriteriaTree(Criteria const* criteria, CriteriaTree const* tree, Player* referencePlayer) const
{
AchievementEntry const* achievement = tree->Achievement;

View File

@@ -56,6 +56,7 @@ public:
virtual void CompletedAchievement(AchievementEntry const* entry, Player* referencePlayer) = 0;
bool HasAchieved(uint32 achievementId) const;
uint32 GetAchievementPoints() const;
std::vector<uint32> GetCompletedAchievementIds() const;
protected:
bool CanUpdateCriteriaTree(Criteria const* criteria, CriteriaTree const* tree, Player* referencePlayer) const override;

File diff suppressed because it is too large Load Diff

View File

@@ -359,6 +359,16 @@ uint8 BattlePetMgr::GetPetCount(uint32 species) const
}));
}
uint32 BattlePetMgr::GetPetUniqueSpeciesCount() const
{
std::set<uint32> speciesIds;
std::transform(_pets.begin(), _pets.end(), std::inserter(speciesIds, speciesIds.end()), [](std::pair<uint64 const, BattlePet> const& pet)
{
return pet.second.PacketInfo.Species;
});
return speciesIds.size();
}
void BattlePetMgr::UnlockSlot(uint8 slot)
{
if (!_slots[slot].Locked)

View File

@@ -96,7 +96,7 @@ public:
void CalculateStats();
WorldPackets::BattlePet::BattlePet PacketInfo;
BattlePetSaveInfo SaveInfo;
BattlePetSaveInfo SaveInfo = BATTLE_PET_UNCHANGED;
};
explicit BattlePetMgr(WorldSession* owner);
@@ -114,6 +114,7 @@ public:
void RemovePet(ObjectGuid guid);
uint8 GetPetCount(uint32 species) const;
uint32 GetPetUniqueSpeciesCount() const;
WorldPackets::BattlePet::BattlePetSlot* GetSlot(uint8 slot) { return slot < _slots.size() ? &_slots[slot] : nullptr; }
void UnlockSlot(uint8 slot);
@@ -134,6 +135,8 @@ public:
void SendUpdates(std::vector<std::reference_wrapper<BattlePet>> pets, bool petAdded);
void SendError(BattlePetError error, uint32 creatureId);
bool HasJournalLock() const { return true; }
private:
WorldSession* _owner;
uint16 _trapLevel = 0;

View File

@@ -2393,6 +2393,17 @@ std::set<uint32> DB2Manager::GetDefaultItemBonusTree(uint32 itemId, ItemContext
return bonusListIDs;
}
std::set<uint32> DB2Manager::GetAllItemBonusTreeBonuses(uint32 itemBonusTreeId) const
{
std::set<uint32> bonusListIDs;
VisitItemBonusTree(itemBonusTreeId, true, [&bonusListIDs](ItemBonusTreeNodeEntry const* bonusTreeNode)
{
if (bonusTreeNode->ChildItemBonusListID)
bonusListIDs.insert(bonusTreeNode->ChildItemBonusListID);
});
return bonusListIDs;
}
void LoadAzeriteEmpoweredItemUnlockMappings(std::unordered_map<int32, std::vector<AzeriteUnlockMappingEntry const*>> const& azeriteUnlockMappingsBySet, uint32 itemId)
{
auto itemIdRange = _itemToBonusTree.equal_range(itemId);

View File

@@ -373,6 +373,7 @@ public:
ItemBonusList const* GetItemBonusList(uint32 bonusListId) const;
uint32 GetItemBonusListForItemLevelDelta(int16 delta) const;
std::set<uint32> GetDefaultItemBonusTree(uint32 itemId, ItemContext itemContext) const;
std::set<uint32> GetAllItemBonusTreeBonuses(uint32 itemBonusTreeId) const;
ItemChildEquipmentEntry const* GetItemChildEquipment(uint32 itemId) const;
ItemClassEntry const* GetItemClassByOldEnum(uint32 itemClass) const;
bool HasItemCurrencyCost(uint32 itemId) const;

View File

@@ -104,6 +104,8 @@ enum AchievementFlags
ACHIEVEMENT_FLAG_TRACKING_FLAG = 0x00100000, // hidden tracking flag, sent to client in all cases except completion announcements
};
uint32 constexpr ACHIVEMENT_CATEGORY_PET_BATTLES = 15117;
enum AreaFlags
{
AREA_FLAG_SNOW = 0x00000001, // snow (only Dun Morogh, Naxxramas, Razorfen Downs and Winterspring)
@@ -244,321 +246,6 @@ enum class CorruptionEffectsFlag
DEFINE_ENUM_FLAG(CorruptionEffectsFlag);
enum CriteriaAdditionalCondition
{
CRITERIA_ADDITIONAL_CONDITION_SOURCE_DRUNK_VALUE = 1,
CRITERIA_ADDITIONAL_CONDITION_SOURCE_PLAYER_CONDITION = 2,
CRITERIA_ADDITIONAL_CONDITION_ITEM_LEVEL = 3,
CRITERIA_ADDITIONAL_CONDITION_TARGET_CREATURE_ENTRY = 4,
CRITERIA_ADDITIONAL_CONDITION_TARGET_MUST_BE_PLAYER = 5,
CRITERIA_ADDITIONAL_CONDITION_TARGET_MUST_BE_DEAD = 6,
CRITERIA_ADDITIONAL_CONDITION_TARGET_MUST_BE_ENEMY = 7,
CRITERIA_ADDITIONAL_CONDITION_SOURCE_HAS_AURA = 8,
CRITERIA_ADDITIONAL_CONDITION_SOURCE_HAS_AURA_TYPE = 9,
CRITERIA_ADDITIONAL_CONDITION_TARGET_HAS_AURA = 10,
CRITERIA_ADDITIONAL_CONDITION_TARGET_HAS_AURA_TYPE = 11,
CRITERIA_ADDITIONAL_CONDITION_SOURCE_AURA_STATE = 12,
CRITERIA_ADDITIONAL_CONDITION_TARGET_AURA_STATE = 13,
CRITERIA_ADDITIONAL_CONDITION_ITEM_QUALITY_MIN = 14,
CRITERIA_ADDITIONAL_CONDITION_ITEM_QUALITY_EQUALS = 15,
CRITERIA_ADDITIONAL_CONDITION_SOURCE_IS_ALIVE = 16,
CRITERIA_ADDITIONAL_CONDITION_SOURCE_AREA_OR_ZONE = 17,
CRITERIA_ADDITIONAL_CONDITION_TARGET_AREA_OR_ZONE = 18,
//CRITERIA_ADDITIONAL_CONDITION_UNK_19 = 19,
CRITERIA_ADDITIONAL_CONDITION_MAP_DIFFICULTY_OLD = 20,
CRITERIA_ADDITIONAL_CONDITION_TARGET_CREATURE_YIELDS_XP = 21, // NYI
CRITERIA_ADDITIONAL_CONDITION_SOURCE_LEVEL_ABOVE_TARGET = 22,
CRITERIA_ADDITIONAL_CONDITION_SOURCE_LEVEL_EQUAL_TARGET = 23,
CRITERIA_ADDITIONAL_CONDITION_ARENA_TYPE = 24,
CRITERIA_ADDITIONAL_CONDITION_SOURCE_RACE = 25,
CRITERIA_ADDITIONAL_CONDITION_SOURCE_CLASS = 26,
CRITERIA_ADDITIONAL_CONDITION_TARGET_RACE = 27,
CRITERIA_ADDITIONAL_CONDITION_TARGET_CLASS = 28,
CRITERIA_ADDITIONAL_CONDITION_MAX_GROUP_MEMBERS = 29,
CRITERIA_ADDITIONAL_CONDITION_TARGET_CREATURE_TYPE = 30,
CRITERIA_ADDITIONAL_CONDITION_TARGET_CREATURE_FAMILY = 31,
CRITERIA_ADDITIONAL_CONDITION_SOURCE_MAP = 32,
CRITERIA_ADDITIONAL_CONDITION_CLIENT_VERSION = 33,
CRITERIA_ADDITIONAL_CONDITION_BATTLE_PET_TEAM_LEVEL = 34,
CRITERIA_ADDITIONAL_CONDITION_NOT_IN_GROUP = 35,
CRITERIA_ADDITIONAL_CONDITION_IN_GROUP = 36,
CRITERIA_ADDITIONAL_CONDITION_MIN_PERSONAL_RATING = 37, // NYI
CRITERIA_ADDITIONAL_CONDITION_TITLE_BIT_INDEX = 38,
CRITERIA_ADDITIONAL_CONDITION_SOURCE_LEVEL = 39,
CRITERIA_ADDITIONAL_CONDITION_TARGET_LEVEL = 40,
CRITERIA_ADDITIONAL_CONDITION_SOURCE_ZONE = 41,
CRITERIA_ADDITIONAL_CONDITION_TARGET_ZONE = 42,
CRITERIA_ADDITIONAL_CONDITION_SOURCE_HEALTH_PCT_LOWER = 43,
CRITERIA_ADDITIONAL_CONDITION_SOURCE_HEALTH_PCT_GREATER = 44,
CRITERIA_ADDITIONAL_CONDITION_SOURCE_HEALTH_PCT_EQUAL = 45,
CRITERIA_ADDITIONAL_CONDITION_TARGET_HEALTH_PCT_LOWER = 46,
CRITERIA_ADDITIONAL_CONDITION_TARGET_HEALTH_PCT_GREATER = 47,
CRITERIA_ADDITIONAL_CONDITION_TARGET_HEALTH_PCT_EQUAL = 48,
CRITERIA_ADDITIONAL_CONDITION_SOURCE_HEALTH_LOWER = 49,
CRITERIA_ADDITIONAL_CONDITION_SOURCE_HEALTH_GREATER = 50,
CRITERIA_ADDITIONAL_CONDITION_SOURCE_HEALTH_EQUAL = 51,
CRITERIA_ADDITIONAL_CONDITION_TARGET_HEALTH_LOWER = 52,
CRITERIA_ADDITIONAL_CONDITION_TARGET_HEALTH_GREATER = 53,
CRITERIA_ADDITIONAL_CONDITION_TARGET_HEALTH_EQUAL = 54,
CRITERIA_ADDITIONAL_CONDITION_TARGET_PLAYER_CONDITION = 55,
CRITERIA_ADDITIONAL_CONDITION_MIN_ACHIEVEMENT_POINTS = 56,
CRITERIA_ADDITIONAL_CONDITION_IN_LFG_DUNGEON = 57,
CRITERIA_ADDITIONAL_CONDITION_IN_LFG_RANDOM_DUNGEON = 58,
CRITERIA_ADDITIONAL_CONDITION_IN_LFG_FIRST_RANDOM_DUNGEON = 59,
//CRITERIA_ADDITIONAL_CONDITION_UNK_60 = 60, // NYI
CRITERIA_ADDITIONAL_CONDITION_REQUIRES_GUILD_GROUP = 61, // NYI
CRITERIA_ADDITIONAL_CONDITION_GUILD_REPUTATION = 62,
CRITERIA_ADDITIONAL_CONDITION_RATED_BATTLEGROUND = 63, // NYI
CRITERIA_ADDITIONAL_CONDITION_RATED_BATTLEGROUND_RATING = 64,
CRITERIA_ADDITIONAL_CONDITION_PROJECT_RARITY = 65,
CRITERIA_ADDITIONAL_CONDITION_PROJECT_RACE = 66,
CRITERIA_ADDITIONAL_CONDITION_WORLD_STATE_EXPRESSION = 67,
CRITERIA_ADDITIONAL_CONDITION_MAP_DIFFICULTY = 68,
CRITERIA_ADDITIONAL_CONDITION_SOURCE_LEVEL_GREATER = 69,
CRITERIA_ADDITIONAL_CONDITION_TARGET_LEVEL_GREATER = 70,
CRITERIA_ADDITIONAL_CONDITION_SOURCE_LEVEL_LOWER = 71,
CRITERIA_ADDITIONAL_CONDITION_TARGET_LEVEL_LOWER = 72,
CRITERIA_ADDITIONAL_CONDITION_MODIFIER_TREE = 73,
CRITERIA_ADDITIONAL_CONDITION_SCENARIO_ID = 74,
CRITERIA_ADDITIONAL_CONDITION_THE_TILLERS_REPUTATION = 75,
CRITERIA_ADDITIONAL_CONDITION_PET_BATTLE_ACHIEVEMENT_POINTS = 76, // NYI
//CRITERIA_ADDITIONAL_CONDITION_UNK_77 = 77, // NYI
CRITERIA_ADDITIONAL_CONDITION_BATTLE_PET_FAMILY = 78, // NYI
CRITERIA_ADDITIONAL_CONDITION_BATTLE_PET_HEALTH_PCT = 79, // NYI
CRITERIA_ADDITIONAL_CONDITION_GUILD_GROUP_MEMBERS = 80, // NYI
CRITERIA_ADDITIONAL_CONDITION_BATTLE_PET_ENTRY = 81, // NYI
CRITERIA_ADDITIONAL_CONDITION_SCENARIO_STEP_INDEX = 82,
CRITERIA_ADDITIONAL_CONDITION_CHALLENGE_MODE_MEDAL = 83, // NYI
CRITERIA_ADDITIONAL_CONDITION_IS_ON_QUEST = 84,
CRITERIA_ADDITIONAL_CONDITION_EXALTED_WITH_FACTION = 85, // NYI
CRITERIA_ADDITIONAL_CONDITION_HAS_ACHIEVEMENT = 86,
CRITERIA_ADDITIONAL_CONDITION_HAS_ACHIEVEMENT_ON_CHARACTER = 87, // NYI
CRITERIA_ADDITIONAL_CONDITION_CLOUD_SERPENT_REPUTATION = 88,
CRITERIA_ADDITIONAL_CONDITION_BATTLE_PET_BREED_QUALITY_ID = 89, // NYI
CRITERIA_ADDITIONAL_CONDITION_PET_BATTLE_IS_PVP = 90, // NYI
CRITERIA_ADDITIONAL_CONDITION_BATTLE_PET_SPECIES = 91,
CRITERIA_ADDITIONAL_CONDITION_ACTIVE_EXPANSION = 92,
//CRITERIA_ADDITIONAL_CONDITION_UNK_93 = 93, // NYI
CRITERIA_ADDITIONAL_CONDITION_FRIENDSHIP_REP_REACTION = 94, // NYI
CRITERIA_ADDITIONAL_CONDITION_FACTION_STANDING = 95,
CRITERIA_ADDITIONAL_CONDITION_ITEM_CLASS_AND_SUBCLASS = 96, // NYI
CRITERIA_ADDITIONAL_CONDITION_SOURCE_SEX = 97,
CRITERIA_ADDITIONAL_CONDITION_SOURCE_NATIVE_SEX = 98,
CRITERIA_ADDITIONAL_CONDITION_SKILL = 99,
//CRITERIA_ADDITIONAL_CONDITION_UNK_100 = 100, // NYI
CRITERIA_ADDITIONAL_CONDITION_NORMAL_PHASE_SHIFT = 101,
CRITERIA_ADDITIONAL_CONDITION_IN_PHASE = 102,
CRITERIA_ADDITIONAL_CONDITION_NOT_IN_PHASE = 103,
CRITERIA_ADDITIONAL_CONDITION_HAS_SPELL = 104,
CRITERIA_ADDITIONAL_CONDITION_ITEM_COUNT = 105,
CRITERIA_ADDITIONAL_CONDITION_ACCOUNT_EXPANSION = 106,
CRITERIA_ADDITIONAL_CONDITION_SOURCE_HAS_AURA_LABEL = 107, // NYI, SpellLabel
//CRITERIA_ADDITIONAL_CONDITION_UNK_108 = 108, // NYI
CRITERIA_ADDITIONAL_CONDITION_TIME_IN_RANGE = 109, // NYI, packed time between asset and secondaryAsset
CRITERIA_ADDITIONAL_CONDITION_REWARDED_QUEST = 110,
CRITERIA_ADDITIONAL_CONDITION_COMPLETED_QUEST = 111,
CRITERIA_ADDITIONAL_CONDITION_COMPLETED_QUEST_OBJECTIVE = 112, // QuestObjectiveID
CRITERIA_ADDITIONAL_CONDITION_EXPLORED_AREA = 113,
CRITERIA_ADDITIONAL_CONDITION_ITEM_COUNT_INCLUDING_BANK = 114,
//CRITERIA_ADDITIONAL_CONDITION_UNK_115 = 115, // NYI
CRITERIA_ADDITIONAL_CONDITION_SOURCE_PVP_FACTION_INDEX = 116,
CRITERIA_ADDITIONAL_CONDITION_LFG_VALUE_EQUAL = 117,
CRITERIA_ADDITIONAL_CONDITION_LFG_VALUE_GREATER = 118,
CRITERIA_ADDITIONAL_CONDITION_CURRENCY_AMOUNT = 119,
//CRITERIA_ADDITIONAL_CONDITION_UNK_120 = 120, // NYI
CRITERIA_ADDITIONAL_CONDITION_CURRENCY_TRACKED_AMOUNT = 121,
CRITERIA_ADDITIONAL_CONDITION_MAP_INSTANCE_TYPE = 122,
CRITERIA_ADDITIONAL_CONDITION_MENTOR = 123,
//CRITERIA_ADDITIONAL_CONDITION_UNK_124 = 124, // NYI
//CRITERIA_ADDITIONAL_CONDITION_UNK_125 = 125, // NYI
CRITERIA_ADDITIONAL_CONDITION_GARRISON_LEVEL_ABOVE = 126, // asset: garrLevel, secondaryAsset: garrType
CRITERIA_ADDITIONAL_CONDITION_GARRISON_FOLLOWERS_ABOVE_LEVEL = 127, // asset: count, secondaryAsset: followerLevel, tertiaryAsset: garrType
CRITERIA_ADDITIONAL_CONDITION_GARRISON_FOLLOWERS_ABOVE_QUALITY = 128, // asset: count, secondaryAsset: followerQuality, tertiaryAsset: garrType
CRITERIA_ADDITIONAL_CONDITION_GARRISON_FOLLOWER_ABOVE_LEVEL_WITH_ABILITY = 129, // asset: followerLevel, secondaryAsset: ability, tertiaryAsset: garrType
CRITERIA_ADDITIONAL_CONDITION_GARRISON_FOLLOWER_ABOVE_LEVEL_WITH_TRAIT = 130, // asset: followerLevel, secondaryAsset: ability, tertiaryAsset: garrType (same as above but ability must have GARRISON_ABILITY_FLAG_TRAIT)
CRITERIA_ADDITIONAL_CONDITION_GARRISON_FOLLOWER_WITH_ABILITY_IN_BUILDING = 131, // asset: ability, secondaryAsset: buildingType, tertiaryAsset: garrType
CRITERIA_ADDITIONAL_CONDITION_GARRISON_FOLLOWER_WITH_TRAIT_IN_BUILDING = 132, // asset: ability, secondaryAsset: buildingType, tertiaryAsset: garrType
CRITERIA_ADDITIONAL_CONDITION_GARRISON_FOLLOWER_ABOVE_LEVEL_IN_BUILDING = 133, // asset: followerLevel, secondaryAsset: buildingType, tertiaryAsset: garrType
CRITERIA_ADDITIONAL_CONDITION_GARRISON_BUILDING_ABOVE_LEVEL = 134, // asset: buildingType, secondaryAsset: buildingLevel, tertiaryAsset: garrType
CRITERIA_ADDITIONAL_CONDITION_GARRISON_BLUEPRINT = 135, // NYI
//CRITERIA_ADDITIONAL_CONDITION_UNK_136 = 136, // NYI
//CRITERIA_ADDITIONAL_CONDITION_UNK_137 = 137, // NYI
//CRITERIA_ADDITIONAL_CONDITION_UNK_138 = 138, // NYI
//CRITERIA_ADDITIONAL_CONDITION_UNK_139 = 139, // NYI
CRITERIA_ADDITIONAL_CONDITION_GARRISON_BUILDING_INACTIVE = 140,
//CRITERIA_ADDITIONAL_CONDITION_UNK_141 = 141, // NYI
CRITERIA_ADDITIONAL_CONDITION_GARRISON_BUILDING_EQUAL_LEVEL = 142, // asset: buildingType, secondaryAsset: buildingLevel, tertiaryAsset: garrType
CRITERIA_ADDITIONAL_CONDITION_GARRISON_FOLLOWER_WITH_ABILITY= 143, // asset: ability, secondaryAsset: garrType
CRITERIA_ADDITIONAL_CONDITION_GARRISON_FOLLOWER_WITH_TRAIT = 144, // asset: ability, secondaryAsset: garrType
CRITERIA_ADDITIONAL_CONDITION_GARRISON_FOLLOWER_ABOVE_QUALITY_WOD = 145, // asset: followerQuality
CRITERIA_ADDITIONAL_CONDITION_GARRISON_FOLLOWER_EQUAL_LEVEL = 146, // asset: followerLevel, secondaryAsset: garrType
CRITERIA_ADDITIONAL_CONDITION_GARRISON_RARE_MISSION = 147, // NYI
//CRITERIA_ADDITIONAL_CONDITION_UNK_148 = 148, // NYI
CRITERIA_ADDITIONAL_CONDITION_GARRISON_BUILDING_LEVEL = 149, // NYI
//CRITERIA_ADDITIONAL_CONDITION_UNK_150 = 150, // NYI
CRITERIA_ADDITIONAL_CONDITION_BATTLE_PET_SPECIES_IN_TEAM = 151, // asset: count, secondaryAsset: battlePetSpeciesId
CRITERIA_ADDITIONAL_CONDITION_BATTLE_PET_FAMILY_IN_TEAM = 152, // asset: count, secondaryAsset: battlePetFamily
//CRITERIA_ADDITIONAL_CONDITION_UNK_153 = 153, // NYI
//CRITERIA_ADDITIONAL_CONDITION_UNK_154 = 154, // NYI
//CRITERIA_ADDITIONAL_CONDITION_UNK_155 = 155, // NYI
//CRITERIA_ADDITIONAL_CONDITION_UNK_156 = 156, // NYI
CRITERIA_ADDITIONAL_CONDITION_GARRISON_FOLLOWER_ID = 157, // follower with id, in any garrison
CRITERIA_ADDITIONAL_CONDITION_QUEST_OBJECTIVE_PROGRESS_EQUAL= 158, // NYI asset: questObjectiveId, secondaryAsset: progress
CRITERIA_ADDITIONAL_CONDITION_QUEST_OBJECTIVE_PROGRESS_ABOVE= 159, // NYI asset: questObjectiveId, secondaryAsset: progress
//CRITERIA_ADDITIONAL_CONDITION_UNK_160 = 160, // NYI
//CRITERIA_ADDITIONAL_CONDITION_UNK_161 = 161, // NYI
//CRITERIA_ADDITIONAL_CONDITION_UNK_162 = 162, // NYI
//CRITERIA_ADDITIONAL_CONDITION_UNK_163 = 163, // NYI
//CRITERIA_ADDITIONAL_CONDITION_UNK_164 = 164, // NYI
//CRITERIA_ADDITIONAL_CONDITION_UNK_165 = 165, // NYI
//CRITERIA_ADDITIONAL_CONDITION_UNK_166 = 166, // NYI
CRITERIA_ADDITIONAL_CONDITION_GARRISON_MISSION_TYPE = 167, // NYI
CRITERIA_ADDITIONAL_CONDITION_GARRISON_FOLLOWER_ABOVE_ITEM_LEVEL = 168, // asset: followerItemLevel
CRITERIA_ADDITIONAL_CONDITION_GARRISON_FOLLOWERS_ABOVE_ITEM_LEVEL = 169, // asset: count, secondaryAsset: followerItemLevel, tertiaryAsset: garrType
CRITERIA_ADDITIONAL_CONDITION_GARRISON_LEVEL_EQUAL = 170, // asset: count
CRITERIA_ADDITIONAL_CONDITION_GARRISON_GROUP_SIZE = 171, // NYI
//CRITERIA_ADDITIONAL_CONDITION_UNK_172 = 172, // NYI something to do with currency but only used on criterias that require the same currency
CRITERIA_ADDITIONAL_CONDITION_TARGETING_CORPSE = 173,
//CRITERIA_ADDITIONAL_CONDITION_UNK_174 = 174, // NYI
CRITERIA_ADDITIONAL_CONDITION_GARRISON_FOLLOWERS_LEVEL_EQUAL= 175, // asset: count, secondaryAsset: followerLevel, tertiaryAsset: garrType
CRITERIA_ADDITIONAL_CONDITION_GARRISON_FOLLOWER_ID_IN_BUILDING = 176, // asset: followerId, secondaryAsset: buildingType
//CRITERIA_ADDITIONAL_CONDITION_UNK_177 = 177, // NYI
//CRITERIA_ADDITIONAL_CONDITION_UNK_178 = 178, // NYI
CRITERIA_ADDITIONAL_CONDITION_WORLD_PVP_AREA = 179, // NYI
CRITERIA_ADDITIONAL_CONDITION_NON_OWN_GARRISON = 180, // NYI
//CRITERIA_ADDITIONAL_CONDITION_UNK_181 = 181, // NYI
//CRITERIA_ADDITIONAL_CONDITION_UNK_182 = 183, // NYI
//CRITERIA_ADDITIONAL_CONDITION_UNK_183 = 183, // NYI
CRITERIA_ADDITIONAL_CONDITION_GARRISON_FOLLOWERS_ITEM_LEVEL_ABOVE = 184,
//CRITERIA_ADDITIONAL_CONDITION_UNK_185 = 185, // NYI
//CRITERIA_ADDITIONAL_CONDITION_UNK_186 = 186, // NYI
CRITERIA_ADDITIONAL_CONDITION_GARRISON_FOLLOWER_TYPE = 187, // NYI
CRITERIA_ADDITIONAL_CONDITION_USED_LEVEL_BOOST_LESS_THAN_HOURS_AGO = 188, // NYI
//CRITERIA_ADDITIONAL_CONDITION_UNK_189 = 189, // NYI
//CRITERIA_ADDITIONAL_CONDITION_UNK_190 = 190, // NYI
//CRITERIA_ADDITIONAL_CONDITION_UNK_191 = 191, // NYI
//CRITERIA_ADDITIONAL_CONDITION_UNK_192 = 192, // NYI
CRITERIA_ADDITIONAL_CONDITION_HONOR_LEVEL = 193,
CRITERIA_ADDITIONAL_CONDITION_PRESTIGE_LEVEL = 194,
//CRITERIA_ADDITIONAL_CONDITION_UNK_195 = 195, // NYI
//CRITERIA_ADDITIONAL_CONDITION_UNK_196 = 196, // NYI
//CRITERIA_ADDITIONAL_CONDITION_UNK_197 = 197, // NYI
//CRITERIA_ADDITIONAL_CONDITION_UNK_198 = 198, // NYI
//CRITERIA_ADDITIONAL_CONDITION_UNK_198 = 199, // NYI
CRITERIA_ADDITIONAL_CONDITION_ITEM_MODIFIED_APPEARANCE = 200,
CRITERIA_ADDITIONAL_CONDITION_GARRISON_SELECTED_TALENT = 201, // NYI asset: garrTalentId (talent selected, research timer doesn't matter)
CRITERIA_ADDITIONAL_CONDITION_GARRISON_RESEARCHED_TALENT = 202, // NYI asset: garrTalentId (talent selected, research must be finished)
CRITERIA_ADDITIONAL_CONDITION_HAS_CHARACTER_RESTRICTIONS = 203,
//CRITERIA_ADDITIONAL_CONDITION_UNK_204 = 204, // NYI
//CRITERIA_ADDITIONAL_CONDITION_UNK_205 = 205, // NYI
CRITERIA_ADDITIONAL_CONDITION_QUEST_INFO_ID = 206,
CRITERIA_ADDITIONAL_CONDITION_GARRISON_RESEARCHING_TALENT = 207, // NYI asset: garrTalentId (talent selected, research must be in progress)
CRITERIA_ADDITIONAL_CONDITION_ARTIFACT_APPEARANCE_SET_USED = 208,
CRITERIA_ADDITIONAL_CONDITION_CURRENCY_AMOUNT_EQUAL = 209,
//CRITERIA_ADDITIONAL_CONDITION_UNK_210 = 210, // NYI
CRITERIA_ADDITIONAL_CONDITION_SCENARIO_TYPE = 211,
CRITERIA_ADDITIONAL_CONDITION_ACCOUNT_EXPANSION_EQUAL = 212,
//CRITERIA_ADDITIONAL_CONDITION_UNK_213 = 213, // NYI
//CRITERIA_ADDITIONAL_CONDITION_UNK_214 = 214, // NYI
//CRITERIA_ADDITIONAL_CONDITION_UNK_215 = 215, // NYI
CRITERIA_ADDITIONAL_CONDITION_CHALLENGE_MODE_MEDAL_2 = 216, // NYI keystone master, asset = 3
//CRITERIA_ADDITIONAL_CONDITION_UNK_217 = 217, // NYI
//CRITERIA_ADDITIONAL_CONDITION_UNK_218 = 218, // NYI
//CRITERIA_ADDITIONAL_CONDITION_UNK_219 = 219, // NYI
//CRITERIA_ADDITIONAL_CONDITION_UNK_220 = 220, // NYI
//CRITERIA_ADDITIONAL_CONDITION_UNK_221 = 221, // NYI
//CRITERIA_ADDITIONAL_CONDITION_UNK_222 = 222, // NYI
//CRITERIA_ADDITIONAL_CONDITION_UNK_223 = 223, // NYI
//CRITERIA_ADDITIONAL_CONDITION_UNK_224 = 224, // NYI
//CRITERIA_ADDITIONAL_CONDITION_UNK_225 = 225, // NYI
CRITERIA_ADDITIONAL_CONDITION_USED_LEVEL_BOOST = 226, // NYI
CRITERIA_ADDITIONAL_CONDITION_USED_RACE_CHANGE = 227, // NYI
CRITERIA_ADDITIONAL_CONDITION_USED_FACTION_CHANGE = 228, // NYI
//CRITERIA_ADDITIONAL_CONDITION_UNK_229 = 229, // NYI
//CRITERIA_ADDITIONAL_CONDITION_UNK_230 = 230, // NYI
CRITERIA_ADDITIONAL_CONDITION_ACHIEVEMENT_GLOBALLY_INCOMPLETED = 231, // hall of fame stuff, asset: unk, secondaryAsset: achievementId
CRITERIA_ADDITIONAL_CONDITION_MAIN_HAND_VISIBLE_SUBCLASS = 232,
CRITERIA_ADDITIONAL_CONDITION_OFF_HAND_VISIBLE_SUBCLASS = 233,
CRITERIA_ADDITIONAL_CONDITION_PVP_TIER = 234, // NYI asset: pvpTierId
CRITERIA_ADDITIONAL_CONDITION_AZERITE_ITEM_LEVEL = 235,
//CRITERIA_ADDITIONAL_CONDITION_UNK_236 = 236, // NYI
//CRITERIA_ADDITIONAL_CONDITION_UNK_237 = 237, // NYI
//CRITERIA_ADDITIONAL_CONDITION_UNK_238 = 238, // NYI
CRITERIA_ADDITIONAL_CONDITION_PVP_TIER_GREATER = 239, // NYI asset: pvpTierEnum, secondaryAsset: pvpBracket
//CRITERIA_ADDITIONAL_CONDITION_UNK_240 = 240, // NYI
//CRITERIA_ADDITIONAL_CONDITION_UNK_241 = 241, // NYI
//CRITERIA_ADDITIONAL_CONDITION_UNK_242 = 242, // NYI
//CRITERIA_ADDITIONAL_CONDITION_UNK_243 = 243, // NYI
//CRITERIA_ADDITIONAL_CONDITION_UNK_244 = 244, // NYI
CRITERIA_ADDITIONAL_CONDITION_IN_WAR_MODE = 245,
//CRITERIA_ADDITIONAL_CONDITION_UNK_246 = 246, // NYI
CRITERIA_ADDITIONAL_CONDITION_KEYSTONE_LEVEL = 247, // NYI
//CRITERIA_ADDITIONAL_CONDITION_UNK_248 = 248, // NYI
CRITERIA_ADDITIONAL_CONDITION_KEYSTONE_DUNGEON = 249, // NYI asset: mapChallengeModeId
//CRITERIA_ADDITIONAL_CONDITION_UNK_250 = 250, // NYI
CRITERIA_ADDITIONAL_CONDITION_PVP_SEASON = 251, // NYI asset: that unknown column in PvpSeason.db2
CRITERIA_ADDITIONAL_CONDITION_SOURCE_DISPLAY_RACE = 252,
CRITERIA_ADDITIONAL_CONDITION_TARGET_DISPLAY_RACE = 253,
CRITERIA_ADDITIONAL_CONDITION_FRIENDSHIP_REP_REACTION_EXACT = 254, // NYI
CRITERIA_ADDITIONAL_CONDITION_SOURCE_AURA_COUNT_EQUAL = 255,
CRITERIA_ADDITIONAL_CONDITION_TARGET_AURA_COUNT_EQUAL = 256,
CRITERIA_ADDITIONAL_CONDITION_SOURCE_AURA_COUNT_GREATER = 257,
CRITERIA_ADDITIONAL_CONDITION_TARGET_AURA_COUNT_GREATER = 258,
CRITERIA_ADDITIONAL_CONDITION_UNLOCKED_AZERITE_ESSENCE_RANK_LOWER = 259,
CRITERIA_ADDITIONAL_CONDITION_UNLOCKED_AZERITE_ESSENCE_RANK_EQUAL = 260,
CRITERIA_ADDITIONAL_CONDITION_UNLOCKED_AZERITE_ESSENCE_RANK_GREATER = 261,
CRITERIA_ADDITIONAL_CONDITION_SOURCE_HAS_AURA_EFFECT_INDEX = 262, // asset: spellId, secondaryAsset: index
CRITERIA_ADDITIONAL_CONDITION_SOURCE_SPECIALIZATION_ROLE = 263,
CRITERIA_ADDITIONAL_CONDITION_SOURCE_LEVEL_120 = 264,
//CRITERIA_ADDITIONAL_CONDITION_UNK_265 = 265,
CRITERIA_ADDITIONAL_CONDITION_SELECTED_AZERITE_ESSENCE_RANK_LOWER = 266,
CRITERIA_ADDITIONAL_CONDITION_SELECTED_AZERITE_ESSENCE_RANK_GREATER = 267,
CRITERIA_ADDITIONAL_CONDITION_SOURCE_LEVEL_IN_RANGE_CT = 268,
CRITERIA_ADDITIONAL_CONDITION_TARGET_LEVEL_IN_RANGE_CT = 269,
//CRITERIA_ADDITIONAL_CONDITION_UNK_270 = 270,
//CRITERIA_ADDITIONAL_CONDITION_UNK_271 = 271,
CRITERIA_ADDITIONAL_CONDITION_SOURCE_LEVEL_GREATER_CT = 272, // compare levels using content tuning
CRITERIA_ADDITIONAL_CONDITION_TARGET_LEVEL_GREATER_CT = 273, // compare levels using content tuning
//CRITERIA_ADDITIONAL_CONDITION_UNK_274 = 274,
//CRITERIA_ADDITIONAL_CONDITION_UNK_275 = 275,
//CRITERIA_ADDITIONAL_CONDITION_UNK_276 = 276,
CRITERIA_ADDITIONAL_CONDITION_RAF_RECRUIT_IN_PARTY = 277, // NYI
//CRITERIA_ADDITIONAL_CONDITION_UNK_278 = 278,
//CRITERIA_ADDITIONAL_CONDITION_UNK_279 = 279,
CRITERIA_ADDITIONAL_CONDITION_MAP_OR_COSMETIC_MAP = 280,
//CRITERIA_ADDITIONAL_CONDITION_UNK_281 = 281,
CRITERIA_ADDITIONAL_CONDITION_HAS_ENTITLEMENT = 282, // NYI
CRITERIA_ADDITIONAL_CONDITION_HAS_QUEST_SESSION = 283, // NYI
//CRITERIA_ADDITIONAL_CONDITION_UNK_284 = 284,
//CRITERIA_ADDITIONAL_CONDITION_UNK_285 = 285,
//CRITERIA_ADDITIONAL_CONDITION_UNK_286 = 286,
//CRITERIA_ADDITIONAL_CONDITION_UNK_287 = 287,
CRITERIA_ADDITIONAL_CONDITION_COVENANT = 288,
//CRITERIA_ADDITIONAL_CONDITION_UNK_289 = 289, // related to pvp ranking
CRITERIA_ADDITIONAL_CONDITION_PERMANENT_ANIMA_DIVERSION_TALENT = 290, // NYI
CRITERIA_ADDITIONAL_CONDITION_SOULBIND = 291,
//CRITERIA_ADDITIONAL_CONDITION_UNK_292 = 292,
CRITERIA_ADDITIONAL_CONDITION_SOURCE_AREA_OR_ZONE_IN_GROUP = 293,
//CRITERIA_ADDITIONAL_CONDITION_UNK_294 = 294,
//CRITERIA_ADDITIONAL_CONDITION_UNK_295 = 295,
//CRITERIA_ADDITIONAL_CONDITION_UNK_296 = 296,
//CRITERIA_ADDITIONAL_CONDITION_UNK_297 = 297,
//CRITERIA_ADDITIONAL_CONDITION_UNK_298 = 298,
//CRITERIA_ADDITIONAL_CONDITION_UNK_299 = 299,
CRITERIA_ADDITIONAL_CONDITION_SOURCE_IN_SPECIFIC_CHROMIE_TIME = 300,
CRITERIA_ADDITIONAL_CONDITION_SOURCE_IN_ANY_CHROMIE_TIME = 301,
//CRITERIA_ADDITIONAL_CONDITION_UNK_302 = 302,
CRITERIA_ADDITIONAL_CONDITION_SOURCE_RUNEFORGE_LEGENDARY_KNOWN = 303,
//CRITERIA_ADDITIONAL_CONDITION_UNK_304 = 304,
//CRITERIA_ADDITIONAL_CONDITION_UNK_305 = 305,
//CRITERIA_ADDITIONAL_CONDITION_UNK_306 = 306,
CRITERIA_ADDITIONAL_CONDITION_SOULBIND_CONDUIT_RANK = 307, // NYI
CRITERIA_ADDITIONAL_CONDITION_SHAPESHIFT_FORM_CUSTOMIZATION_DISPLAY = 308,
CRITERIA_ADDITIONAL_CONDITION_SOULBIND_MIN_CONDUITS_AT_RANK = 309, // NYI
CRITERIA_ADDITIONAL_CONDITION_IS_RESTRICTED_ACCOUNT = 310, // NYI
CRITERIA_ADDITIONAL_CONDITION_SOURCE_FLYING = 311,
};
enum class CriteriaFailEvent : uint8
{
None = 0,
@@ -1287,6 +974,333 @@ enum MapDifficultyFlags : uint8
MAP_DIFFICULTY_FLAG_CANNOT_EXTEND = 0x10
};
enum class ModifierTreeType : int32
{
None = 0, // No modifier
PlayerInebriationLevelEqualOrGreaterThan = 1, // Player inebriation level is {#Drunkenness} or more
PlayerMeetsCondition = 2, // Player meets condition "{PlayerCondition}"
MinimumItemLevel = 3, // Minimum item level is {#Item Level}
TargetCreatureId = 4, // Target is NPC "{Creature}"
TargetIsPlayer = 5, // Target is player
TargetIsDead = 6, // Target is dead
TargetIsOppositeFaction = 7, // Target is opposite faction
PlayerHasAura = 8, // Player has aura "{Spell}"
PlayerHasAuraEffect = 9, // Player has aura effect "{SpellAuraNames.EnumID}"
TargetHasAura = 10, // Target has aura "{Spell}"
TargetHasAuraEffect = 11, // Target has aura effect "{SpellAuraNames.EnumID}"
TargetHasAuraState = 12, // Target has aura state "{$Aura State}"
PlayerHasAuraState = 13, // Player has aura state "{$Aura State}"
ItemQualityIsAtLeast = 14, // Item quality is at least {$Item Quality}
ItemQualityIsExactly = 15, // Item quality is exactly {$Item Quality}
PlayerIsAlive = 16, // Player is alive
PlayerIsInArea = 17, // Player is in area "{AreaTable}"
TargetIsInArea = 18, // Target is in area "{AreaTable}"
ItemId = 19, // Item is "{Item}"
LegacyDungeonDifficulty = 20, // Legacy dungeon difficulty is "{$Dungeon Difficulty}"
PlayerToTargetLevelDeltaGreaterThan = 21, // Exceeds the target's level by {#Level Delta} levels
TargetToPlayerLevelDeltaGreaterThan = 22, // Target exceeds your level by {#Level Delta} levels
PlayerLevelEqualTargetLevel = 23, // You and the target are equal level
PlayerInArenaWithTeamSize = 24, // Player is in an arena with team size {#Team Size}
PlayerRace = 25, // Player race is "{ChrRaces}"
PlayerClass = 26, // Player class is "{ChrClasses}"
TargetRace = 27, // Target race is "{ChrRaces}"
TargetClass = 28, // Target class is "{ChrClasses}"
LessThanTappers = 29, // Less than {#Tappers} tappers
CreatureType = 30, // Creature is type "{CreatureType}"
CreatureFamily = 31, // Creature is family "{CreatureFamily}"
PlayerMap = 32, // Player is on map "{Map}"
ClientVersionEqualOrLessThan = 33, // Milestone is at or before "{WowStaticSchemas}"
BattlePetTeamLevel = 34, // All three winning battle pets are at or above level {#Battle Pet Level}
PlayerIsNotInParty = 35, // Player is not in a party
PlayerIsInParty = 36, // Player is in a party
HasPersonalRatingEqualOrGreaterThan = 37, // Has a Personal Rating of at least {#Personal Rating}
HasTitle = 38, // Has title "{CharTitles.Mask_ID}"
PlayerLevelEqual = 39, // Player is exactly level {#Level}
TargetLevelEqual = 40, // Target is exactly level {#Level}
PlayerIsInZone = 41, // Player is in top-level area "{AreaTable}"
TargetIsInZone = 42, // Target is in top-level area "{AreaTable}"
PlayerHealthBelowPercent = 43, // Player health below {#Percent}%
PlayerHealthAbovePercent = 44, // Player health above {#Percent}%
PlayerHealthEqualsPercent = 45, // Player health equals {#Percent}%
TargetHealthBelowPercent = 46, // Target health below {#Percent}%
TargetHealthAbovePercent = 47, // Target health above {#Percent}%
TargetHealthEqualsPercent = 48, // Target health equals {#Percent}%
PlayerHealthBelowValue = 49, // Player health below {#Hit Points} HP
PlayerHealthAboveValue = 50, // Player health above {#Hit Points} HP
PlayerHealthEqualsValue = 51, // Player health equals {#Hit Points} HP
TargetHealthBelowValue = 52, // Target health below {#Hit Points} HP
TargetHealthAboveValue = 53, // Target health above {#Hit Points} HP
TargetHealthEqualsValue = 54, // Target health equals {#Hit Points} HP
TargetIsPlayerAndMeetsCondition = 55, // Target is a player with condition "{PlayerCondition}"
PlayerHasMoreThanAchievementPoints = 56, // Player has over {#Achievement Pts} achievement points
PlayerInLfgDungeon = 57, // Player is in a LFG dungeon
PlayerInRandomLfgDungeon = 58, // Player is in a random LFG dungeon
PlayerInFirstRandomLfgDungeon = 59, // Player is in a first random LFG dungeon
PlayerInRankedArenaMatch = 60, // Player is in a ranked arena match
PlayerInGuildParty = 61, /*NYI*/ // Player is in a guild party
PlayerGuildReputationEqualOrGreaterThan = 62, // Player has guild reputation of {#Guild Reputation} or more
PlayerInRatedBattleground = 63, // Player is in rated battleground
PlayerBattlegroundRatingEqualOrGreaterThan = 64, // Player has a battleground rating of {#Battleground Rating} or more
ResearchProjectRarity = 65, /*NYI*/ // Research project rarity is "{$Project Rarity}"
ResearchProjectBranch = 66, /*NYI*/ // Research project is in branch "{ResearchBranch}"
WorldStateExpression = 67, // World state expression "{WorldStateExpression}" is true
DungeonDifficulty = 68, // Dungeon difficulty is "{Difficulty}"
PlayerLevelEqualOrGreaterThan = 69, // Player level is {#Level} or more
TargetLevelEqualOrGreaterThan = 70, // Target level is {#Level} or more
PlayerLevelEqualOrLessThan = 71, // Player level is {#Level} or less
TargetLevelEqualOrLessThan = 72, // Target level is {#Level} or less
ModifierTree = 73, // Modifier tree "{ModifierTree}" is also true
PlayerScenario = 74, // Player is on scenario "{Scenario}"
TillersReputationGreaterThan = 75, // Reputation with Tillers is above {#Reputation}
BattlePetAchievementPointsEqualOrGreaterThan = 76, // Battle pet achievement points are at least {#Achievement Pts}
UniqueBattlePetsEqualOrGreaterThan = 77, // (Account) At least {#Pets Known} unique pets known
BattlePetType = 78, // Battlepet is of type "{$Battle Pet Types}"
BattlePetHealthPercentLessThan = 79, /*NYI*/ // (Account) Battlepet's health is below {#Health Percent} percent
GuildGroupMemberCountEqualOrGreaterThan = 80, // Be in a group with at least {#Members} guild members
BattlePetOpponentCreatureId = 81, /*NYI*/ // Battle pet opponent is "{Creature}"
PlayerScenarioStep = 82, // Player is on scenario step number {#Step Number}
ChallengeModeMedal = 83, // Challenge mode medal earned is "{#Challenge Mode Medal(OBSOLETE)}" (OBSOLETE)
PlayerOnQuest = 84, // Player is currently on the quest "{QuestV2}"
ExaltedWithFaction = 85, // Reach exalted with "{Faction}"
EarnedAchievementOnAccount = 86, // Earned achievement "{Achievement}" on this account
EarnedAchievementOnPlayer = 87, // Earned achievement "{Achievement}" on this player
OrderOfTheCloudSerpentReputationGreaterThan = 88, // Reputation with Order of the Cloud Serpent is above {#Reputation}
BattlePetQuality = 89, /*NYI*/ // Battle pet is of quality "{BattlePetBreedQuality}"
BattlePetFightWasPVP = 90, /*NYI*/ // Battle pet fight was PVP
BattlePetSpecies = 91, // Battle pet is species type "{BattlePetSpecies}"
ServerExpansionEqualOrGreaterThan = 92, // Server expansion level is "{$Expansion Level}" or higher
PlayerHasBattlePetJournalLock = 93, // Player has battle pet journal lock
FriendshipRepReactionIsMet = 94, // Friendship rep reaction "{FriendshipRepReaction}" is met
ReputationWithFactionIsEqualOrGreaterThan = 95, // Reputation with "{Faction}" is {#Reputation} or more
ItemClassAndSubclass = 96, // Item is class "{ItemClass.ClassID}", subclass "{^ItemSubclass.SubclassID:ItemSubclass.ClassID = ?}"
PlayerGender = 97, // Player's gender is "{$Gender}"
PlayerNativeGender = 98, // Player's native gender is "{$Gender}"
PlayerSkillEqualOrGreaterThan = 99, // Player skill "{SkillLine}" is level {#Skill Level} or higher
PlayerLanguageSkillEqualOrGreaterThan = 100, // Player language "{Languages}" is level {#Language Level} or higher
PlayerIsInNormalPhase = 101, // Player is in normal phase
PlayerIsInPhase = 102, // Player is in phase "{Phase}"
PlayerIsInPhaseGroup = 103, // Player is in phase group "{PhaseGroup}"
PlayerKnowsSpell = 104, // Player knows spell "{Spell}"
PlayerHasItemQuantity = 105, // Player is carrying item "{Item}", quantity {#Quantity}
PlayerExpansionLevelEqualOrGreaterThan = 106, // Player expansion level is "{$Expansion Level}" or higher
PlayerHasAuraWithLabel = 107, // Player has aura with label {Label}
PlayersRealmWorldState = 108, // Player's realm state "{WorldState}" equals {#Value}
TimeBetween = 109, // Time is between "{/Begin Date}" and "{/End Date}"
PlayerHasCompletedQuest = 110, // Player has previously completed quest "{QuestV2}"
PlayerIsReadyToTurnInQuest = 111, // Player is ready to turn in quest "{QuestV2}"
PlayerHasCompletedQuestObjective = 112, // Player has completed Quest Objective "{QuestObjective}"
PlayerHasExploredArea = 113, // Player has explored area "{AreaTable}"
PlayerHasItemQuantityIncludingBank = 114, // Player or bank has item "{Item}", quantity {#Quantity}
Weather = 115, // Weather is "{Weather}"
PlayerFaction = 116, // Player faction is {$Player Faction}
LfgStatusEqual = 117, // Looking-for-group status "{$LFG Status}" equals {#Value}
LFgStatusEqualOrGreaterThan = 118, // Looking-for-group status "{$LFG Status}" is {#Value} or more
PlayerHasCurrencyEqualOrGreaterThan = 119, // Player has currency "{CurrencyTypes}" in amount {#Amount} or more
TargetThreatListSizeLessThan = 120, // Player Killed creature with less than "{#Targets}" threat list targets
PlayerHasTrackedCurrencyEqualOrGreaterThan = 121, // Player has currency "{CurrencyTypes}" tracked (per season) in amount {#Amount} or more
PlayerMapInstanceType = 122, // Player is on a map of type "{@INSTANCE_TYPE}"
PlayerInTimeWalkerInstance = 123, // Player was in a Time Walker instance
PvpSeasonIsActive = 124, // PVP season is active
PvpSeason = 125, // Current PVP season is {#Season}
GarrisonTierEqualOrGreaterThan = 126, // Garrison is tier {#Tier} or higher for garrison type "{GarrType}"
GarrisonFollowersWithLevelEqualOrGreaterThan = 127, // At least {#Followers} followers of at least level {#Level} for follower type "{GarrFollowerType}"
GarrisonFollowersWithQualityEqualOrGreaterThan = 128, // At least {#Followers} followers at least quality "{@GARR_FOLLOWER_QUALITY}" for follower type "{GarrFollowerType}"
GarrisonFollowerWithAbilityAtLevelEqualOrGreaterThan = 129, // Follower of at least level {#Level} has ability {GarrAbility} for follower type "{GarrFollowerType}"
GarrisonFollowerWithTraitAtLevelEqualOrGreaterThan = 130, // Follower of at least level {#Level} has trait {GarrAbility} for follower type "{GarrFollowerType}"
GarrisonFollowerWithAbilityAssignedToBuilding = 131, // Follower with ability "{GarrAbility}" is assigned to building type "{@GARRISON_BUILDING_TYPE}" for garrison type "{GarrType}"
GarrisonFollowerWithTraitAssignedToBuilding = 132, // Follower with trait "{GarrAbility}" is assigned to building type "{@GARRISON_BUILDING_TYPE}" for garrison type "{GarrType}"
GarrisonFollowerWithLevelAssignedToBuilding = 133, // Follower at least level {#Level} is assigned to building type "{@GARRISON_BUILDING_TYPE}" for garrison type "GarrType}"
GarrisonBuildingWithLevelEqualOrGreaterThan = 134, // Building "{@GARRISON_BUILDING_TYPE}" is at least level {#Level} for garrison type "{GarrType}"
HasBlueprintForGarrisonBuilding = 135, // Has blueprint for garrison building "{GarrBuilding}" of type "{GarrType}"
HasGarrisonBuildingSpecialization = 136, // Has garrison building specialization "{GarrSpecialization}"
AllGarrisonPlotsAreFull = 137, // All garrison type "{GarrType}" plots are full
PlayerIsInOwnGarrison = 138, // Player is in their own garrison
GarrisonShipmentOfTypeIsPending = 139, /*NYI*/ // Shipment of type "{CharShipmentContainer}" is pending
GarrisonBuildingIsUnderConstruction = 140, // Garrison building "{GarrBuilding}" is under construction
GarrisonMissionHasBeenCompleted = 141, /*NYI*/ // Garrison mission "{GarrMission}" has been completed
GarrisonBuildingLevelEqual = 142, // Building {@GARRISON_BUILDING_TYPE} is exactly level {#Level} for garrison type "{GarrType}"
GarrisonFollowerHasAbility = 143, // This follower has ability "{GarrAbility}" for garrison type "{GarrType}"
GarrisonFollowerHasTrait = 144, // This follower has trait "{GarrAbility}" for garrison type "{GarrType}"
GarrisonFollowerQualityEqual = 145, // This Garrison Follower is {@GARR_FOLLOWER_QUALITY} quality
GarrisonFollowerLevelEqual = 146, // This Garrison Follower is level {#Level}
GarrisonMissionIsRare = 147, /*NYI*/ // This Garrison Mission is Rare
GarrisonMissionIsElite = 148, /*NYI*/ // This Garrison Mission is Elite
CurrentGarrisonBuildingLevelEqual = 149, // This Garrison Building is level {#Level} - building type passed as argument
GarrisonPlotInstanceHasBuildingThatIsReadyToActivate = 150, // Garrison plot instance "{GarrPlotInstance}" has building that is ready to activate
BattlePetTeamWithSpeciesEqualOrGreaterThan = 151, // Battlepet: with at least {#Amount} "{BattlePetSpecies}"
BattlePetTeamWithTypeEqualOrGreaterThan = 152, // Battlepet: with at least {#Amount} pets of type "{$Battle Pet Types}"
PetBattleLastAbility = 153, /*NYI*/ // Battlepet: last ability was "{BattlePetAbility}"
PetBattleLastAbilityType = 154, /*NYI*/ // Battlepet: last ability was of type "{$Battle Pet Types}"
BattlePetTeamWithAliveEqualOrGreaterThan = 155, // Battlepet: with at least {#Alive} alive
HasGarrisonBuildingActiveSpecialization = 156, // Has Garrison building active specialization "{GarrSpecialization}"
HasGarrisonFollower = 157, // Has Garrison follower "{GarrFollower}"
PlayerQuestObjectiveProgressEqual = 158, // Player's progress on Quest Objective "{QuestObjective}" is equal to {#Value}
PlayerQuestObjectiveProgressEqualOrGreaterThan = 159, // Player's progress on Quest Objective "{QuestObjective}" is at least {#Value}
IsPTRRealm = 160, // This is a PTR Realm
IsBetaRealm = 161, // This is a Beta Realm
IsQARealm = 162, // This is a QA Realm
GarrisonShipmentContainerIsFull = 163, /*NYI*/ // Shipment Container "{CharShipmentContainer}" is full
PlayerCountIsValidToStartGarrisonInvasion = 164, // Player count is valid to start garrison invasion
InstancePlayerCountEqualOrLessThan = 165, // Instance has at most {#Players} players
AllGarrisonPlotsFilledWithBuildingsWithLevelEqualOrGreater = 166, // All plots are full and at least level {#Level} for garrison type "{GarrType}"
GarrisonMissionType = 167, /*NYI*/ // This mission is type "{GarrMissionType}"
GarrisonFollowerItemLevelEqualOrGreaterThan = 168, // This follower is at least item level {#Level}
GarrisonFollowerCountWithItemLevelEqualOrGreaterThan = 169, // At least {#Followers} followers are at least item level {#Level} for follower type "{GarrFollowerType}"
GarrisonTierEqual = 170, // Garrison is exactly tier {#Tier} for garrison type "{GarrType}"
InstancePlayerCountEqual = 171, // Instance has exactly {#Players} players
CurrencyId = 172, // The currency is type "{CurrencyTypes}"
SelectionIsPlayerCorpse = 173, // Target is player corpse
PlayerCanAcceptQuest = 174, // Player is currently eligible for quest "{QuestV2}"
GarrisonFollowerCountWithLevelEqualOrGreaterThan = 175, // At least {#Followers} followers exactly level {#Level} for follower type "{GarrFollowerType}"
GarrisonFollowerIsInBuilding = 176, // Garrison follower "{GarrFollower}" is in building "{GarrBuilding}"
GarrisonMissionCountLessThan = 177, /*NYI*/ // Player has less than {#Available} available and {#In-Progress} in-progress missions of garrison type "{GarrType}"
GarrisonPlotInstanceCountEqualOrGreaterThan = 178, // Player has at least {#Amount} instances of plot "{GarrPlot}" available
CurrencySource = 179, /*NYI*/ // Currency source is {$Currency Source}
PlayerIsInNotOwnGarrison = 180, // Player is in another garrison (not their own)
HasActiveGarrisonFollower = 181, // Has active Garrison follower "{GarrFollower}"
PlayerDailyRandomValueMod_X_Equals = 182, /*NYI*/ // Player daily random value mod {#Mod Value} equals {#Equals Value}
PlayerHasMount = 183, // Player has Mount "{Mount}"
GarrisonFollowerCountWithInactiveWithItemLevelEqualOrGreaterThan = 184, // At least {#Followers} followers (including inactive) are at least item level {#Level} for follower type "{GarrFollowerType}"
GarrisonFollowerIsOnAMission = 185, // Garrison follower "{GarrFollower}" is on a mission
GarrisonMissionCountInSetLessThan = 186, /*NYI*/ // Player has less than {#Missions} available and in-progress missions of set "{GarrMissionSet}" in garrison type "{GarrType}"
GarrisonFollowerType = 187, // This Garrison Follower is of type "{GarrFollowerType}"
PlayerUsedBoostLessThanHoursAgoRealTime = 188, /*NYI*/ // Player has boosted and boost occurred < {#Hours} hours ago (real time)
PlayerUsedBoostLessThanHoursAgoGameTime = 189, /*NYI*/ // Player has boosted and boost occurred < {#Hours} hours ago (in-game time)
PlayerIsMercenary = 190, // Player is currently Mercenary
PlayerEffectiveRace = 191, /*NYI*/ // Player effective race is "{ChrRaces}"
TargetEffectiveRace = 192, /*NYI*/ // Target effective race is "{ChrRaces}"
HonorLevelEqualOrGreaterThan = 193, // Honor level >= {#Level}
PrestigeLevelEqualOrGreaterThan = 194, // Prestige level >= {#Level}
GarrisonMissionIsReadyToCollect = 195, /*NYI*/ // Garrison mission "{GarrMission}" is ready to collect
PlayerIsInstanceOwner = 196, /*NYI*/ // Player is the instance owner (requires 'Lock Instance Owner' LFGDungeon flag)
PlayerHasHeirloom = 197, // Player has heirloom "{Item}"
TeamPoints = 198, /*NYI*/ // Team has {#Points} Points
PlayerHasToy = 199, // Player has toy "{Item}"
PlayerHasTransmog = 200, // Player has transmog "{ItemModifiedAppearance}"
GarrisonTalentSelected = 201, /*NYI*/ // Garrison has talent "{GarrTalent}" selected
GarrisonTalentResearched = 202, /*NYI*/ // Garrison has talent "{GarrTalent}" researched
PlayerHasRestriction = 203, // Player has restriction of type "{@CHARACTER_RESTRICTION_TYPE}"
PlayerCreatedCharacterLessThanHoursAgoRealTime = 204, /*NYI*/ // Player has created their character < {#Hours} hours ago (real time)
PlayerCreatedCharacterLessThanHoursAgoGameTime = 205, // Player has created their character < {#Hours} hours ago (in-game time)
QuestHasQuestInfoId = 206, // Quest has Quest Info "{QuestInfo}"
GarrisonTalentResearchInProgress = 207, /*NYI*/ // Garrison is researching talent "{GarrTalent}"
PlayerEquippedArtifactAppearanceSet = 208, // Player has equipped Artifact Appearance Set "{ArtifactAppearanceSet}"
PlayerHasCurrencyEqual = 209, // Player has currency "{CurrencyTypes}" in amount {#Amount} exactly
MinimumAverageItemHighWaterMarkForSpec = 210, /*NYI*/ // Minimum average item high water mark is {#Item High Water Mark} for "{$Item History Spec Match}")
PlayerScenarioType = 211, // Player in scenario of type "{$Scenario Type}"
PlayersAuthExpansionLevelEqualOrGreaterThan = 212, // Player's auth expansion level is "{$Expansion Level}" or higher
PlayerLastWeek2v2Rating = 213, /*NYI*/ // Player achieved at least a rating of {#Rating} in 2v2 last week player played
PlayerLastWeek3v3Rating = 214, /*NYI*/ // Player achieved at least a rating of {#Rating} in 3v3 last week player played
PlayerLastWeekRBGRating = 215, /*NYI*/ // Player achieved at least a rating of {#Rating} in RBG last week player played
GroupMemberCountFromConnectedRealmEqualOrGreaterThan = 216, // At least {#Num Players} members of the group are from your connected realms
ArtifactTraitUnlockedCountEqualOrGreaterThan = 217, // At least {#Num Traits} traits have been unlocked in artifact "{Item}"
ParagonReputationLevelEqualOrGreaterThan = 218, // Paragon level >= "{#Level}"
GarrisonShipmentIsReady = 219, /*NYI*/ // Shipment in container type "{CharShipmentContainer}" ready
PlayerIsInPvpBrawl = 220, // Player is in PvP Brawl
ParagonReputationLevelWithFactionEqualOrGreaterThan = 221, // Paragon level >= "{#Level}" with faction "{Faction}"
PlayerHasItemWithBonusListFromTreeAndQuality = 222, // Player has an item with bonus list from tree "{ItemBonusTree}" and of quality "{$Item Quality}"
PlayerHasEmptyInventorySlotCountEqualOrGreaterThan = 223, // Player has at least "{#Number of empty slots}" empty inventory slots
PlayerHasItemInHistoryOfProgressiveEvent = 224, /*NYI*/ // Player has item "{Item}" in the item history of progressive event "{ProgressiveEvent}"
PlayerHasArtifactPowerRankCountPurchasedEqualOrGreaterThan = 225, // Player has at least {#Purchased Ranks} ranks of {ArtifactPower} on equipped artifact
PlayerHasBoosted = 226, // Player has boosted
PlayerHasRaceChanged = 227, // Player has race changed
PlayerHasBeenGrantedLevelsFromRaF = 228, // Player has been granted levels from Recruit a Friend
IsTournamentRealm = 229, // Is Tournament Realm
PlayerCanAccessAlliedRaces = 230, // Player can access allied races
GroupMemberCountWithAchievementEqualOrLessThan = 231, // No More Than {#Group Members} With Achievement {Achievement} In Group (true if no group)
PlayerMainhandWeaponType = 232, // Player has main hand weapon of type "{$Weapon Type}"
PlayerOffhandWeaponType = 233, // Player has off-hand weapon of type "{$Weapon Type}"
PlayerPvpTier = 234, // Player is in PvP tier {PvpTier}
PlayerAzeriteLevelEqualOrGreaterThan = 235, // Players' Azerite Item is at or above level "{#Azerite Level}"
PlayerIsOnQuestInQuestline = 236, // Player is on quest in questline "{QuestLine}"
PlayerIsQnQuestLinkedToScheduledWorldStateGroup = 237, // Player is on quest associated with current progressive unlock group "{ScheduledWorldStateGroup}"
PlayerIsInRaidGroup = 238, // Player is in raid group
PlayerPvpTierInBracketEqualOrGreaterThan = 239, // Player is at or above "{@PVP_TIER_ENUM}" for "{@PVP_BRACKET}"
PlayerCanAcceptQuestInQuestline = 240, // Player is eligible for quest in questline "{Questline}"
PlayerHasCompletedQuestline = 241, // Player has completed questline "{Questline}"
PlayerHasCompletedQuestlineQuestCount = 242, // Player has completed "{#Quests}" quests in questline "{Questline}"
PlayerHasCompletedPercentageOfQuestline = 243, // Player has completed "{#Percentage}" % of quests in questline "{Questline}"
PlayerHasWarModeEnabled = 244, // Player has WarMode Enabled (regardless of shard state)
PlayerIsOnWarModeShard = 245, // Player is on a WarMode Shard
PlayerIsAllowedToToggleWarModeInArea = 246, // Player is allowed to toggle WarMode in area
MythicPlusKeystoneLevelEqualOrGreaterThan = 247, /*NYI*/ // Mythic Plus Keystone Level Atleast {#Level}
MythicPlusCompletedInTime = 248, /*NYI*/ // Mythic Plus Completed In Time
MythicPlusMapChallengeMode = 249, /*NYI*/ // Mythic Plus Map Challenge Mode {MapChallengeMode}
MythicPlusDisplaySeason = 250, /*NYI*/ // Mythic Plus Display Season {#Season}
MythicPlusMilestoneSeason = 251, /*NYI*/ // Mythic Plus Milestone Season {#Season}
PlayerVisibleRace = 252, // Player visible race is "{ChrRaces}"
TargetVisibleRace = 253, // Target visible race is "{ChrRaces}"
FriendshipRepReactionEqual = 254, // Friendship rep reaction is exactly "{FriendshipRepReaction}"
PlayerAuraStackCountEqual = 255, // Player has exactly {#Stacks} stacks of aura "{Spell}"
TargetAuraStackCountEqual = 256, // Target has exactly {#Stacks} stacks of aura "{Spell}"
PlayerAuraStackCountEqualOrGreaterThan = 257, // Player has at least {#Stacks} stacks of aura "{Spell}"
TargetAuraStackCountEqualOrGreaterThan = 258, // Target has at least {#Stacks} stacks of aura "{Spell}"
PlayerHasAzeriteEssenceRankLessThan = 259, // Player has Azerite Essence {AzeriteEssence} at less than rank {#rank}
PlayerHasAzeriteEssenceRankEqual = 260, // Player has Azerite Essence {AzeriteEssence} at rank {#rank}
PlayerHasAzeriteEssenceRankGreaterThan = 261, // Player has Azerite Essence {AzeriteEssence} at greater than rank {#rank}
PlayerHasAuraWithEffectIndex = 262, // Player has Aura {Spell} with Effect Index {#index} active
PlayerLootSpecializationMatchesRole = 263, // Player loot specialization matches role {@LFG_ROLE}
PlayerIsAtMaxExpansionLevel = 264, // Player is at max expansion level
TransmogSource = 265, // Transmog Source is "{@TRANSMOG_SOURCE}"
PlayerHasAzeriteEssenceInSlotAtRankLessThan = 266, // Player has Azerite Essence in slot {@AZERITE_ESSENCE_SLOT} at less than rank {#rank}
PlayerHasAzeriteEssenceInSlotAtRankGreaterThan = 267, // Player has Azerite Essence in slot {@AZERITE_ESSENCE_SLOT} at greater than rank {#rank}
PlayerLevelWithinContentTuning = 268, // Player has level within Content Tuning {ContentTuning}
TargetLevelWithinContentTuning = 269, // Target has level within Content Tuning {ContentTuning}
PlayerIsScenarioInitiator = 270, /*NYI*/ // Player is Scenario Initiator
PlayerHasCompletedQuestOrIsOnQuest = 271, // Player is currently on or previously completed quest "{QuestV2}"
PlayerLevelWithinOrAboveContentTuning = 272, // Player has level within or above Content Tuning {ContentTuning}
TargetLevelWithinOrAboveContentTuning = 273, // Target has level within or above Content Tuning {ContentTuning}
PlayerLevelWithinOrAboveLevelRange = 274, /*NYI*/ // Player has level within or above Level Range {LevelRange}
TargetLevelWithinOrAboveLevelRange = 275, /*NYI*/ // Target has level within or above Level Range {LevelRange}
MaxJailersTowerLevelEqualOrGreaterThan = 276, // Max Jailers Tower Level Atleast {#Level}
GroupedWithRaFRecruit = 277, // Grouped With Recruit
GroupedWithRaFRecruiter = 278, // Grouped with Recruiter
PlayerSpecialization = 279, // Specialization is "{ChrSpecialization}"
PlayerMapOrCosmeticChildMap = 280, // Player is on map or cosmetic child map "{Map}"
PlayerCanAccessShadowlandsPrepurchaseContent = 281, // Player can access Shadowlands (9.0) prepurchase content
PlayerHasEntitlement = 282, /*NYI*/ // Player has entitlement "{BattlePayDeliverable}"
PlayerIsInPartySyncGroup = 283, /*NYI*/ // Player is in party sync group
QuestHasPartySyncRewards = 284, /*NYI*/ // Quest is eligible for party sync rewards
HonorGainSource = 285, /*NYI*/ // Player gained honor from source {@SPECIAL_MISC_HONOR_GAIN_SOURCE}
JailersTowerActiveFloorIndexEqualOrGreaterThan = 286, /*NYI*/ // Active Floor Index Atleast {#Level}
JailersTowerActiveFloorDifficultyEqualOrGreaterThan = 287, /*NYI*/ // Active Floor Difficulty Atleast {#Level}
PlayerCovenant = 288, // Player is member of covenant "{Covenant}"
HasTimeEventPassed = 289, // Has time event "{TimeEvent}" passed
GarrisonHasPermanentTalent = 290, /*NYI*/ // Garrison has permanent talent "{GarrTalent}"
HasActiveSoulbind = 291, // Has Active Soulbind "{Soulbind}"
HasMemorizedSpell = 292, /*NYI*/ // Has memorized spell "{Spell}"
PlayerHasAPACSubscriptionReward_2020 = 293, // Player has APAC Subscription Reward 2020
PlayerHasTBCCDEWarpStalker_Mount = 294, // Player has TBCC:DE Warp Stalker Mount
PlayerHasTBCCDEDarkPortal_Toy = 295, // Player has TBCC:DE Dark Portal Toy
PlayerHasTBCCDEPathOfIllidan_Toy = 296, // Player has TBCC:DE Path of Illidan Toy
PlayerHasImpInABallToySubscriptionReward = 297, // Player has Imp in a Ball Toy Subscription Reward
PlayerIsInAreaGroup = 298, // Player is in area group "{AreaGroup}"
TargetIsInAreaGroup = 299, // Target is in area group "{AreaGroup}"
PlayerIsInChromieTime = 300, // Player has selected Chromie Time ID "{UiChromieTimeExpansionInfo}"
PlayerIsInAnyChromieTime = 301, // Player has selected ANY Chromie Time ID
ItemIsAzeriteArmor = 302, // Item is Azerite Armor
PlayerHasRuneforgePower = 303, // Player Has Runeforge Power "{RuneforgeLegendaryAbility}"
PlayerInChromieTimeForScaling = 304, // Player is Chromie Time for Scaling
IsRaFRecruit = 305, // Is RAF recruit
AllPlayersInGroupHaveAchievement = 306, // All Players In Group Have Achievement "{Achievement}"
PlayerHasSoulbindConduitRankEqualOrGreaterThan = 307, /*NYI*/ // Player has Conduit "{SoulbindConduit}" at Rank {#Rank} or Higher
PlayerSpellShapeshiftFormCreatureDisplayInfoSelection = 308, // Player has chosen {CreatureDisplayInfo} for shapeshift form {SpellShapeshiftForm}
PlayerSoulbindConduitCountAtRankEqualOrGreaterThan = 309, /*NYI*/ // Player has at least {#Level} Conduits at Rank {#Rank} or higher.
PlayerIsRestrictedAccount = 310, // Player is a Restricted Account
PlayerIsFlying = 311, // Player is flying
PlayerScenarioIsLastStep = 312, // Player is on the last step of a Scenario
PlayerHasWeeklyRewardsAvailable = 313, // Player has weekly rewards available
TargetCovenant = 314, // Target is member of covenant "{Covenant}"
PlayerHasTBCCollectorsEdition = 315, // Player has TBC Collector's Edition
PlayerHasWrathCollectorsEdition = 316, // Player has Wrath Collector's Edition
GarrisonTalentResearchedAndAtRankEqualOrGreaterThan = 317, /*NYI*/ // Garrison has talent "{GarrTalent}" researched and active at or above {#Rank}
CurrencySpentOnGarrisonTalentResearchEqualOrGreaterThan = 318, /*NYI*/ // Currency {CurrencyTypes} Spent on Garrison Talent Research in Tree {GarrTalentTree} is greater than or equal to {#Quantity}
RenownCatchupActive = 319, /*NYI*/ // Renown Catchup Active
RapidRenownCatchupActive = 320, /*NYI*/ // Rapid Renown Catchup Active
PlayerMythicPlusRatingEqualOrGreaterThan = 321, /*NYI*/ // Player has Mythic+ Rating of at least "{#DungeonScore}"
PlayerMythicPlusRunCountInCurrentExpansionEqualOrGreaterThan = 322, /*NYI*/ // Player has completed at least "{#MythicKeystoneRuns}" Mythic+ runs in current expansion
};
enum class ModifierTreeOperator : int8
{
SingleTrue = 2,

View File

@@ -2468,6 +2468,29 @@ void Item::InitArtifactPowers(uint8 artifactId, uint8 artifactTier)
}
}
uint32 Item::GetTotalUnlockedArtifactPowers() const
{
uint32 purchased = GetTotalPurchasedArtifactPowers();
uint64 artifactXp = m_itemData->ArtifactXP;
uint32 currentArtifactTier = GetModifier(ITEM_MODIFIER_ARTIFACT_TIER);
uint32 extraUnlocked = 0;
do
{
uint64 xpCost = 0;
if (GtArtifactLevelXPEntry const* cost = sArtifactLevelXPGameTable.GetRow(purchased + extraUnlocked + 1))
xpCost = uint64(currentArtifactTier == MAX_ARTIFACT_TIER ? cost->XP2 : cost->XP);
if (artifactXp < xpCost)
break;
artifactXp -= xpCost;
++extraUnlocked;
} while (true);
return purchased + extraUnlocked;
}
uint32 Item::GetTotalPurchasedArtifactPowers() const
{
uint32 purchasedRanks = 0;

View File

@@ -411,6 +411,7 @@ class TC_GAME_API Item : public Object
void SetArtifactPower(uint16 artifactPowerId, uint8 purchasedRank, uint8 currentRankWithBonus);
void InitArtifactPowers(uint8 artifactId, uint8 artifactTier);
uint32 GetTotalUnlockedArtifactPowers() const;
uint32 GetTotalPurchasedArtifactPowers() const;
void ApplyArtifactPowerEnchantmentBonuses(EnchantmentSlot slot, uint32 enchantId, bool apply, Player* owner);
void CopyArtifactDataFromParent(Item* parent);

View File

@@ -799,7 +799,7 @@ void CollectionMgr::AddItemAppearance(ItemModifiedAppearanceEntry const* itemMod
{
int32 transmogSlot = ItemTransmogrificationSlots[item->InventoryType];
if (transmogSlot >= 0)
_owner->GetPlayer()->UpdateCriteria(CRITERIA_TYPE_APPEARANCE_UNLOCKED_BY_SLOT, transmogSlot, 1);
_owner->GetPlayer()->UpdateCriteria(CRITERIA_TYPE_APPEARANCE_UNLOCKED_BY_SLOT, transmogSlot, itemModifiedAppearance->ID);
}
if (std::vector<TransmogSetEntry const*> const* sets = sDB2Manager.GetTransmogSetsForItemModifiedAppearance(itemModifiedAppearance->ID))

View File

@@ -9969,6 +9969,50 @@ uint8 Player::FindEquipSlot(Item const* item, uint32 slot, bool swap) const
return NULL_SLOT;
}
uint32 Player::GetFreeInventorySlotCount(EnumFlag<ItemSearchLocation> location /*= ItemSearchLocation::Inventory*/) const
{
uint32 freeSlotCount = 0;
if (location.HasFlag(ItemSearchLocation::Equipment))
for (uint8 i = EQUIPMENT_SLOT_START; i < EQUIPMENT_SLOT_END; ++i)
if (!GetItemByPos(INVENTORY_SLOT_BAG_0, i))
++freeSlotCount;
if (location.HasFlag(ItemSearchLocation::Inventory))
{
uint8 inventoryEnd = INVENTORY_SLOT_ITEM_START + GetInventorySlotCount();
for (uint8 i = INVENTORY_SLOT_BAG_START; i < inventoryEnd; ++i)
if (!GetItemByPos(INVENTORY_SLOT_BAG_0, i))
++freeSlotCount;
for (uint8 i = INVENTORY_SLOT_BAG_START; i < INVENTORY_SLOT_BAG_END; ++i)
if (Bag* bag = GetBagByPos(i))
for (uint32 j = 0; j < GetBagSize(bag); ++j)
if (!GetItemInBag(bag, j))
++freeSlotCount;
}
if (location.HasFlag(ItemSearchLocation::Bank))
{
for (uint8 i = BANK_SLOT_ITEM_START; i < BANK_SLOT_BAG_END; ++i)
if (!GetItemByPos(INVENTORY_SLOT_BAG_0, i))
++freeSlotCount;
for (uint8 i = BANK_SLOT_BAG_START; i < BANK_SLOT_BAG_END; ++i)
if (Bag* bag = GetBagByPos(i))
for (uint32 j = 0; j < GetBagSize(bag); ++j)
if (!GetItemInBag(bag, j))
++freeSlotCount;
}
if (location.HasFlag(ItemSearchLocation::ReagentBank))
for (uint8 i = REAGENT_SLOT_START; i < REAGENT_SLOT_END; ++i)
if (!GetItemByPos(INVENTORY_SLOT_BAG_0, i))
++freeSlotCount;
return freeSlotCount;
}
InventoryResult Player::CanUnequipItems(uint32 item, uint32 count) const
{
InventoryResult res = EQUIP_ERR_OK;
@@ -23226,19 +23270,13 @@ bool Player::BuyItemFromVendorSlot(ObjectGuid vendorguid, uint32 vendorslot, uin
uint32 Player::GetMaxPersonalArenaRatingRequirement(uint32 minarenaslot) const
{
// returns the maximal personal arena rating that can be used to purchase items requiring this condition
// the personal rating of the arena team must match the required limit as well
// so return max[in arenateams](min(personalrating[teamtype], teamrating[teamtype]))
// so return max[in arenateams](personalrating[teamtype])
uint32 max_personal_rating = 0;
for (uint8 i = minarenaslot; i < MAX_ARENA_SLOT; ++i)
{
if (ArenaTeam* at = sArenaTeamMgr->GetArenaTeamById(GetArenaTeamId(i)))
{
uint32 p_rating = GetArenaPersonalRating(i);
uint32 t_rating = at->GetRating();
p_rating = p_rating < t_rating ? p_rating : t_rating;
if (max_personal_rating < p_rating)
max_personal_rating = p_rating;
}
uint32 p_rating = GetArenaPersonalRating(i);
if (max_personal_rating < p_rating)
max_personal_rating = p_rating;
}
return max_personal_rating;
}
@@ -26514,6 +26552,11 @@ uint32 Player::GetAchievementPoints() const
return m_achievementMgr->GetAchievementPoints();
}
std::vector<uint32> Player::GetCompletedAchievementIds() const
{
return m_achievementMgr->GetCompletedAchievementIds();
}
bool Player::HasAchieved(uint32 achievementId) const
{
return m_achievementMgr->HasAchieved(achievementId);

View File

@@ -1260,6 +1260,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
void UpdateAverageItemLevelEquipped();
uint8 FindEquipSlot(Item const* item, uint32 slot, bool swap) const;
uint32 GetFreeInventorySlotCount(EnumFlag<ItemSearchLocation> location = ItemSearchLocation::Inventory) const;
uint32 GetItemCount(uint32 item, bool inBankAlso = false, Item* skipItem = nullptr) const;
uint32 GetItemCountWithLimitCategory(uint32 limitCategory, Item* skipItem = nullptr) const;
Item* GetItemByGuid(ObjectGuid guid) const;
@@ -2490,6 +2491,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
void SendRespondInspectAchievements(Player* player) const;
uint32 GetAchievementPoints() const;
std::vector<uint32> GetCompletedAchievementIds() const;
bool HasAchieved(uint32 achievementId) const;
void ResetAchievements();
void ResetCriteria(CriteriaFailEvent condition, int32 failAsset, bool evenIfCriteriaComplete = false);

View File

@@ -431,7 +431,7 @@ void WorldSession::HandleCharEnum(CharacterDatabaseQueryHolder* holder)
while (result->NextRow());
}
charEnum.IsAlliedRacesCreationAllowed = GetAccountExpansion() >= EXPANSION_BATTLE_FOR_AZEROTH;
charEnum.IsAlliedRacesCreationAllowed = CanAccessAlliedRaces();
for (std::pair<uint8 const, RaceUnlockRequirement> const& requirement : sObjectMgr->GetRaceUnlockRequirements())
{

View File

@@ -28,8 +28,8 @@ Scenario::Scenario(ScenarioData const* scenarioData) : _data(scenarioData), _cur
{
ASSERT(_data);
for (auto step : _data->Steps)
SetStepState(step.second, SCENARIO_STEP_NOT_STARTED);
for (std::pair<uint8 const, ScenarioStepEntry const*> const& scenarioStep : _data->Steps)
SetStepState(scenarioStep.second, SCENARIO_STEP_NOT_STARTED);
if (ScenarioStepEntry const* step = GetFirstStep())
SetStep(step);
@@ -112,12 +112,12 @@ void Scenario::OnPlayerExit(Player* player)
bool Scenario::IsComplete()
{
for (auto step : _data->Steps)
for (std::pair<uint8 const, ScenarioStepEntry const*> const& scenarioStep : _data->Steps)
{
if (step.second->IsBonusObjective())
if (scenarioStep.second->IsBonusObjective())
continue;
if (GetStepState(step.second) != SCENARIO_STEP_DONE)
if (GetStepState(scenarioStep.second) != SCENARIO_STEP_DONE)
return false;
}
@@ -222,7 +222,7 @@ void Scenario::BuildScenarioState(WorldPackets::Scenario::ScenarioState* scenari
scenarioState->CriteriaProgress = GetCriteriasProgress();
scenarioState->BonusObjectives = GetBonusObjectivesData();
// Don't know exactly what this is for, but seems to contain list of scenario steps that we're either on or that are completed
for (auto state : _stepStates)
for (std::pair<ScenarioStepEntry const* const, ScenarioStepState> const& state : _stepStates)
{
if (state.first->IsBonusObjective())
continue;
@@ -246,7 +246,7 @@ ScenarioStepEntry const* Scenario::GetFirstStep() const
{
// Do it like this because we don't know what order they're in inside the container.
ScenarioStepEntry const* firstStep = nullptr;
for (auto scenarioStep : _data->Steps)
for (std::pair<uint8 const, ScenarioStepEntry const*> const& scenarioStep : _data->Steps)
{
if (scenarioStep.second->IsBonusObjective())
continue;
@@ -258,6 +258,22 @@ ScenarioStepEntry const* Scenario::GetFirstStep() const
return firstStep;
}
ScenarioStepEntry const* Scenario::GetLastStep() const
{
// Do it like this because we don't know what order they're in inside the container.
ScenarioStepEntry const* lastStep = nullptr;
for (std::pair<uint8 const, ScenarioStepEntry const*> const& scenarioStep : _data->Steps)
{
if (scenarioStep.second->IsBonusObjective())
continue;
if (!lastStep || scenarioStep.second->OrderIndex > lastStep->OrderIndex)
lastStep = scenarioStep.second;
}
return lastStep;
}
void Scenario::SendScenarioState(Player* player)
{
WorldPackets::Scenario::ScenarioState scenarioState;
@@ -268,16 +284,16 @@ void Scenario::SendScenarioState(Player* player)
std::vector<WorldPackets::Scenario::BonusObjectiveData> Scenario::GetBonusObjectivesData()
{
std::vector<WorldPackets::Scenario::BonusObjectiveData> bonusObjectivesData;
for (auto itr = _data->Steps.begin(); itr != _data->Steps.end(); ++itr)
for (std::pair<uint8 const, ScenarioStepEntry const*> const& scenarioStep : _data->Steps)
{
if (!itr->second->IsBonusObjective())
if (!scenarioStep.second->IsBonusObjective())
continue;
if (sCriteriaMgr->GetCriteriaTree(itr->second->Criteriatreeid))
if (sCriteriaMgr->GetCriteriaTree(scenarioStep.second->Criteriatreeid))
{
WorldPackets::Scenario::BonusObjectiveData bonusObjectiveData;
bonusObjectiveData.BonusObjectiveID = itr->second->ID;
bonusObjectiveData.ObjectiveComplete = GetStepState(itr->second) == SCENARIO_STEP_DONE;
bonusObjectiveData.BonusObjectiveID = scenarioStep.second->ID;
bonusObjectiveData.ObjectiveComplete = GetStepState(scenarioStep.second) == SCENARIO_STEP_DONE;
bonusObjectivesData.push_back(bonusObjectiveData);
}
}
@@ -291,13 +307,13 @@ std::vector<WorldPackets::Achievement::CriteriaProgress> Scenario::GetCriteriasP
if (!_criteriaProgress.empty())
{
for (auto critItr = _criteriaProgress.begin(); critItr != _criteriaProgress.end(); ++critItr)
for (std::pair<uint32 const, CriteriaProgress> const& progressPair : _criteriaProgress)
{
WorldPackets::Achievement::CriteriaProgress criteriaProgress;
criteriaProgress.Id = critItr->first;
criteriaProgress.Quantity = critItr->second.Counter;
criteriaProgress.Date = critItr->second.Date;
criteriaProgress.Player = critItr->second.PlayerGUID;
criteriaProgress.Id = progressPair.first;
criteriaProgress.Quantity = progressPair.second.Counter;
criteriaProgress.Date = progressPair.second.Date;
criteriaProgress.Player = progressPair.second.PlayerGUID;
criteriasProgress.push_back(criteriaProgress);
}
}

View File

@@ -69,6 +69,7 @@ class TC_GAME_API Scenario : public CriteriaHandler
ScenarioStepState GetStepState(ScenarioStepEntry const* step);
ScenarioStepEntry const* GetStep() const { return _currentstep; }
ScenarioStepEntry const* GetFirstStep() const;
ScenarioStepEntry const* GetLastStep() const;
void SendScenarioState(Player* player);
void SendBootPlayer(Player* player);

View File

@@ -911,6 +911,11 @@ TransactionCallback& WorldSession::AddTransactionCallback(TransactionCallback&&
return _transactionCallbacks.AddCallback(std::move(callback));
}
bool WorldSession::CanAccessAlliedRaces() const
{
return GetAccountExpansion() >= EXPANSION_BATTLE_FOR_AZEROTH;
}
void WorldSession::InitWarden(SessionKey const& k)
{
if (_os == "Win")

View File

@@ -989,6 +989,8 @@ class TC_GAME_API WorldSession
uint8 GetExpansion() const { return m_expansion; }
std::string const& GetOS() const { return _os; }
bool CanAccessAlliedRaces() const;
void InitWarden(SessionKey const& k);
/// Session in auth.queue currently