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

Port From (https://github.com/TrinityCore/TrinityCore/commit/d0be92ec0ad0334c38b4073a7e24a571982b17da)
This commit is contained in:
hondacrx
2021-06-07 13:13:46 -04:00
parent 9c58042e07
commit 1941148d8f
18 changed files with 1677 additions and 674 deletions
+324 -312
View File
@@ -91,319 +91,331 @@ namespace Framework.Constants
QuestObjective = 0x10 QuestObjective = 0x10
} }
public enum CriteriaAdditionalCondition public enum ModifierTreeType
{ {
SourceDrunkValue = 1, None = 0, // No modifier
SourcePlayerCondition = 2, PlayerInebriationLevelEqualOrGreaterThan = 1, // Player inebriation level is {#Drunkenness} or more
ItemLevel = 3, PlayerMeetsCondition = 2, // Player meets condition "{PlayerCondition}"
TargetCreatureEntry = 4, MinimumItemLevel = 3, // Minimum item level is {#Item Level}
TargetMustBePlayer = 5, TargetCreatureId = 4, // Target is NPC "{Creature}"
TargetMustBeDead = 6, TargetIsPlayer = 5, // Target is player
TargetMustBeEnemy = 7, TargetIsDead = 6, // Target is dead
SourceHasAura = 8, TargetIsOppositeFaction = 7, // Target is opposite faction
SourceHasAuraType = 9, PlayerHasAura = 8, // Player has aura "{Spell}"
TargetHasAura = 10, PlayerHasAuraEffect = 9, // Player has aura effect "{SpellAuraNames.EnumID}"
TargetHasAuraType = 11, TargetHasAura = 10, // Target has aura "{Spell}"
SourceAuraState = 12, TargetHasAuraEffect = 11, // Target has aura effect "{SpellAuraNames.EnumID}"
TargetAuraState = 13, TargetHasAuraState = 12, // Target has aura state "{$Aura State}"
ItemQualityMin = 14, PlayerHasAuraState = 13, // Player has aura state "{$Aura State}"
ItemQualityEquals = 15, ItemQualityIsAtLeast = 14, // Item quality is at least {$Item Quality}
SourceIsAlive = 16, ItemQualityIsExactly = 15, // Item quality is exactly {$Item Quality}
SourceAreaOrZone = 17, PlayerIsAlive = 16, // Player is alive
TargetAreaOrZone = 18, PlayerIsInArea = 17, // Player is in area "{AreaTable}"
//Unk19 = 19, TargetIsInArea = 18, // Target is in area "{AreaTable}"
MapDifficultyOld = 20, ItemId = 19, // Item is "{Item}"
TargetCreatureYieldsXp = 21, // Nyi LegacyDungeonDifficulty = 20, // Legacy dungeon difficulty is "{$Dungeon Difficulty}"
SourceLevelAboveTarget = 22, PlayerToTargetLevelDeltaGreaterThan = 21, // Exceeds the target's level by {#Level Delta} levels
SourceLevelEqualTarget = 23, TargetToPlayerLevelDeltaGreaterThan = 22, // Target exceeds your level by {#Level Delta} levels
ArenaType = 24, PlayerLevelEqualTargetLevel = 23, // You and the target are equal level
SourceRace = 25, PlayerInArenaWithTeamSize = 24, // Player is in an arena with team size {#Team Size}
SourceClass = 26, PlayerRace = 25, // Player race is "{ChrRaces}"
TargetRace = 27, PlayerClass = 26, // Player class is "{ChrClasses}"
TargetClass = 28, TargetRace = 27, // Target race is "{ChrRaces}"
MaxGroupMembers = 29, TargetClass = 28, // Target class is "{ChrClasses}"
TargetCreatureType = 30, LessThanTappers = 29, // Less than {#Tappers} tappers
TargetCreatureFamily = 31, CreatureType = 30, // Creature is type "{CreatureType}"
SourceMap = 32, CreatureFamily = 31, // Creature is family "{CreatureFamily}"
ClientVersion = 33, PlayerMap = 32, // Player is on map "{Map}"
BattlePetTeamLevel = 34, ClientVersionEqualOrLessThan = 33, // Milestone is at or before "{WowStaticSchemas}"
NotInGroup = 35, BattlePetTeamLevel = 34, // All three winning battle pets are at or above level {#Battle Pet Level}
InGroup = 36, PlayerIsNotInParty = 35, // Player is not in a party
MinPersonalRating = 37, // Nyi PlayerIsInParty = 36, // Player is in a party
TitleBitIndex = 38, HasPersonalRatingEqualOrGreaterThan = 37, // Has a Personal Rating of at least {#Personal Rating}
SourceLevel = 39, HasTitle = 38, // Has title "{CharTitles.Mask_ID}"
TargetLevel = 40, PlayerLevelEqual = 39, // Player is exactly level {#Level}
SourceZone = 41, TargetLevelEqual = 40, // Target is exactly level {#Level}
TargetZone = 42, PlayerIsInZone = 41, // Player is in top-level area "{AreaTable}"
SourceHealthPctLower = 43, TargetIsInZone = 42, // Target is in top-level area "{AreaTable}"
SourceHealthPctGreater = 44, PlayerHealthBelowPercent = 43, // Player health below {#Percent}%
SourceHealthPctEqual = 45, PlayerHealthAbovePercent = 44, // Player health above {#Percent}%
TargetHealthPctLower = 46, PlayerHealthEqualsPercent = 45, // Player health equals {#Percent}%
TargetHealthPctGreater = 47, TargetHealthBelowPercent = 46, // Target health below {#Percent}%
TargetHealthPctEqual = 48, TargetHealthAbovePercent = 47, // Target health above {#Percent}%
SourceHealthLower = 49, TargetHealthEqualsPercent = 48, // Target health equals {#Percent}%
SourceHealthGreater = 50, PlayerHealthBelowValue = 49, // Player health below {#Hit Points} HP
SourceHealthEqual = 51, PlayerHealthAboveValue = 50, // Player health above {#Hit Points} HP
TargetHealthLower = 52, PlayerHealthEqualsValue = 51, // Player health equals {#Hit Points} HP
TargetHealthGreater = 53, TargetHealthBelowValue = 52, // Target health below {#Hit Points} HP
TargetHealthEqual = 54, TargetHealthAboveValue = 53, // Target health above {#Hit Points} HP
TargetPlayerCondition = 55, TargetHealthEqualsValue = 54, // Target health equals {#Hit Points} HP
MinAchievementPoints = 56, TargetIsPlayerAndMeetsCondition = 55, // Target is a player with condition "{PlayerCondition}"
InLfgDungeon = 57, PlayerHasMoreThanAchievementPoints = 56, // Player has over {#Achievement Pts} achievement points
InLfgRandomDungeon = 58, PlayerInLfgDungeon = 57, // Player is in a LFG dungeon
InLfgFirstRandomDungeon = 59, PlayerInRandomLfgDungeon = 58, // Player is in a random LFG dungeon
//Unk60 = 60, // Nyi PlayerInFirstRandomLfgDungeon = 59, // Player is in a first random LFG dungeon
RequiresGuildGroup = 61, // Nyi PlayerInRankedArenaMatch = 60, // Player is in a ranked arena match
GuildReputation = 62, PlayerInGuildParty = 61, /*NYI*/ // Player is in a guild party
RatedBattleground = 63, // Nyi PlayerGuildReputationEqualOrGreaterThan = 62, // Player has guild reputation of {#Guild Reputation} or more
RatedBattlegroundRating = 64, PlayerInRatedBattleground = 63, // Player is in rated battleground
ProjectRarity = 65, PlayerBattlegroundRatingEqualOrGreaterThan = 64, // Player has a battleground rating of {#Battleground Rating} or more
ProjectRace = 66, ResearchProjectRarity = 65, /*NYI*/ // Research project rarity is "{$Project Rarity}"
WorldStateExpression = 67, ResearchProjectBranch = 66, /*NYI*/ // Research project is in branch "{ResearchBranch}"
MapDifficulty = 68, WorldStateExpression = 67, // World state expression "{WorldStateExpression}" is true
SourceLevelGreater = 69, DungeonDifficulty = 68, // Dungeon difficulty is "{Difficulty}"
TargetLevelGreater = 70, PlayerLevelEqualOrGreaterThan = 69, // Player level is {#Level} or more
SourceLevelLower = 71, TargetLevelEqualOrGreaterThan = 70, // Target level is {#Level} or more
TargetLevelLower = 72, PlayerLevelEqualOrLessThan = 71, // Player level is {#Level} or less
ModifierTree = 73, TargetLevelEqualOrLessThan = 72, // Target level is {#Level} or less
ScenarioId = 74, ModifierTree = 73, // Modifier tree "{ModifierTree}" is also true
TheTillersReputation = 75, PlayerScenario = 74, // Player is on scenario "{Scenario}"
PetBattleAchievementPoints = 76, // Nyi TillersReputationGreaterThan = 75, // Reputation with Tillers is above {#Reputation}
//Unk77 = 77, // Nyi BattlePetAchievementPointsEqualOrGreaterThan = 76, // Battle pet achievement points are at least {#Achievement Pts}
BattlePetFamily = 78, // Nyi UniqueBattlePetsEqualOrGreaterThan = 77, // (Account) At least {#Pets Known} unique pets known
BattlePetHealthPct = 79, // Nyi BattlePetType = 78, // Battlepet is of type "{$Battle Pet Types}"
GuildGroupMembers = 80, // Nyi BattlePetHealthPercentLessThan = 79, /*NYI*/ // (Account) Battlepet's health is below {#Health Percent} percent
BattlePetEntry = 81, // Nyi GuildGroupMemberCountEqualOrGreaterThan = 80, // Be in a group with at least {#Members} guild members
ScenarioStepIndex = 82, BattlePetOpponentCreatureId = 81, /*NYI*/ // Battle pet opponent is "{Creature}"
ChallengeModeMedal = 83, // Nyi PlayerScenarioStep = 82, // Player is on scenario step number {#Step Number}
IsOnQuest = 84, ChallengeModeMedal = 83, // Challenge mode medal earned is "{#Challenge Mode Medal(OBSOLETE)}" (OBSOLETE)
ExaltedWithFaction = 85, // Nyi PlayerOnQuest = 84, // Player is currently on the quest "{QuestV2}"
HasAchievement = 86, ExaltedWithFaction = 85, // Reach exalted with "{Faction}"
HasAchievementOnCharacter = 87, // Nyi EarnedAchievementOnAccount = 86, // Earned achievement "{Achievement}" on this account
CloudSerpentReputation = 88, EarnedAchievementOnPlayer = 87, // Earned achievement "{Achievement}" on this player
BattlePetBreedQualityId = 89, // Nyi OrderOfTheCloudSerpentReputationGreaterThan = 88, // Reputation with Order of the Cloud Serpent is above {#Reputation}
PetBattleIsPvp = 90, // Nyi BattlePetQuality = 89, /*NYI*/ // Battle pet is of quality "{BattlePetBreedQuality}"
BattlePetSpecies = 91, BattlePetFightWasPVP = 90, /*NYI*/ // Battle pet fight was PVP
ActiveExpansion = 92, BattlePetSpecies = 91, // Battle pet is species type "{BattlePetSpecies}"
//Unk93 = 93, // Nyi ServerExpansionEqualOrGreaterThan = 92, // Server expansion level is "{$Expansion Level}" or higher
FriendshipRepReaction = 94, // Nyi PlayerHasBattlePetJournalLock = 93, // Player has battle pet journal lock
FactionStanding = 95, FriendshipRepReactionIsMet = 94, // Friendship rep reaction "{FriendshipRepReaction}" is met
ItemClassAndSubclass = 96, // Nyi ReputationWithFactionIsEqualOrGreaterThan = 95, // Reputation with "{Faction}" is {#Reputation} or more
SourceSex = 97, ItemClassAndSubclass = 96, // Item is class "{ItemClass.ClassID}", subclass "{^ItemSubclass.SubclassID:ItemSubclass.ClassID = ?}"
SourceNativeSex = 98, PlayerGender = 97, // Player's gender is "{$Gender}"
Skill = 99, PlayerNativeGender = 98, // Player's native gender is "{$Gender}"
//Unk100 = 100, // Nyi PlayerSkillEqualOrGreaterThan = 99, // Player skill "{SkillLine}" is level {#Skill Level} or higher
NormalPhaseShift = 101, PlayerLanguageSkillEqualOrGreaterThan = 100, // Player language "{Languages}" is level {#Language Level} or higher
InPhase = 102, PlayerIsInNormalPhase = 101, // Player is in normal phase
NotInPhase = 103, PlayerIsInPhase = 102, // Player is in phase "{Phase}"
HasSpell = 104, PlayerIsInPhaseGroup = 103, // Player is in phase group "{PhaseGroup}"
ItemCount = 105, PlayerKnowsSpell = 104, // Player knows spell "{Spell}"
AccountExpansion = 106, PlayerHasItemQuantity = 105, // Player is carrying item "{Item}", quantity {#Quantity}
SourceHasAuraLabel = 107, // Nyi, Spelllabel PlayerExpansionLevelEqualOrGreaterThan = 106, // Player expansion level is "{$Expansion Level}" or higher
//Unk108 = 108, // Nyi PlayerHasAuraWithLabel = 107, // Player has aura with label {Label}
TimeInRange = 109, // Nyi, Packed Time Between Asset And Secondaryasset PlayersRealmWorldState = 108, // Player's realm state "{WorldState}" equals {#Value}
RewardedQuest = 110, TimeBetween = 109, // Time is between "{/Begin Date}" and "{/End Date}"
CompletedQuest = 111, PlayerHasCompletedQuest = 110, // Player has previously completed quest "{QuestV2}"
CompletedQuestObjective = 112, // Questobjectiveid PlayerIsReadyToTurnInQuest = 111, // Player is ready to turn in quest "{QuestV2}"
ExploredArea = 113, PlayerHasCompletedQuestObjective = 112, // Player has completed Quest Objective "{QuestObjective}"
ItemCountIncludingBank = 114, PlayerHasExploredArea = 113, // Player has explored area "{AreaTable}"
//Unk115 = 115, // Nyi PlayerHasItemQuantityIncludingBank = 114, // Player or bank has item "{Item}", quantity {#Quantity}
SourcePvpFactionIndex = 116, Weather = 115, // Weather is "{Weather}"
LfgValueEqual = 117, PlayerFaction = 116, // Player faction is {$Player Faction}
LfgValueGreater = 118, LfgStatusEqual = 117, // Looking-for-group status "{$LFG Status}" equals {#Value}
CurrencyAmount = 119, LFgStatusEqualOrGreaterThan = 118, // Looking-for-group status "{$LFG Status}" is {#Value} or more
//Unk120 = 120, // Nyi PlayerHasCurrencyEqualOrGreaterThan = 119, // Player has currency "{CurrencyTypes}" in amount {#Amount} or more
CurrencyTrackedAmount = 121, TargetThreatListSizeLessThan = 120, // Player Killed creature with less than "{#Targets}" threat list targets
MapInstanceType = 122, PlayerHasTrackedCurrencyEqualOrGreaterThan = 121, // Player has currency "{CurrencyTypes}" tracked (per season) in amount {#Amount} or more
Mentor = 123, PlayerMapInstanceType = 122, // Player is on a map of type "{@INSTANCE_TYPE}"
//Unk124 = 124, // Nyi PlayerInTimeWalkerInstance = 123, // Player was in a Time Walker instance
//Unk125 = 125, // Nyi PvpSeasonIsActive = 124, // PVP season is active
GarrisonLevelAbove = 126, // Asset: Garrlevel, Secondaryasset: Garrtype PvpSeason = 125, // Current PVP season is {#Season}
GarrisonFollowersAboveLevel = 127, // Asset: Count, Secondaryasset: Followerlevel, Tertiaryasset: Garrtype GarrisonTierEqualOrGreaterThan = 126, // Garrison is tier {#Tier} or higher for garrison type "{GarrType}"
GarrisonFollowersAboveQuality = 128, // Asset: Count, Secondaryasset: Followerquality, Tertiaryasset: Garrtype GarrisonFollowersWithLevelEqualOrGreaterThan = 127, // At least {#Followers} followers of at least level {#Level} for follower type "{GarrFollowerType}"
GarrisonFollowerAboveLevelWithAbility = 129, // Asset: Followerlevel, Secondaryasset: Ability, Tertiaryasset: Garrtype GarrisonFollowersWithQualityEqualOrGreaterThan = 128, // At least {#Followers} followers at least quality "{@GARR_FOLLOWER_QUALITY}" for follower type "{GarrFollowerType}"
GarrisonFollowerAboveLevelWithTrait = 130, // Asset: Followerlevel, Secondaryasset: Ability, Tertiaryasset: Garrtype (Same As Above But Ability Must Have GarrisonAbilityFlagTrait) GarrisonFollowerWithAbilityAtLevelEqualOrGreaterThan = 129, // Follower of at least level {#Level} has ability {GarrAbility} for follower type "{GarrFollowerType}"
GarrisonFollowerWithAbilityInBuilding = 131, // Asset: Ability, Secondaryasset: Buildingtype, Tertiaryasset: Garrtype GarrisonFollowerWithTraitAtLevelEqualOrGreaterThan = 130, // Follower of at least level {#Level} has trait {GarrAbility} for follower type "{GarrFollowerType}"
GarrisonFollowerWithTraitInBuilding = 132, // Asset: Ability, Secondaryasset: Buildingtype, Tertiaryasset: Garrtype GarrisonFollowerWithAbilityAssignedToBuilding = 131, // Follower with ability "{GarrAbility}" is assigned to building type "{@GARRISON_BUILDING_TYPE}" for garrison type "{GarrType}"
GarrisonFollowerAboveLevelInBuilding = 133, // Asset: Followerlevel, Secondaryasset: Buildingtype, Tertiaryasset: Garrtype GarrisonFollowerWithTraitAssignedToBuilding = 132, // Follower with trait "{GarrAbility}" is assigned to building type "{@GARRISON_BUILDING_TYPE}" for garrison type "{GarrType}"
GarrisonBuildingAboveLevel = 134, // Asset: Buildingtype, Secondaryasset: Buildinglevel, Tertiaryasset: Garrtype GarrisonFollowerWithLevelAssignedToBuilding = 133, // Follower at least level {#Level} is assigned to building type "{@GARRISON_BUILDING_TYPE}" for garrison type "GarrType}"
GarrisonBlueprint = 135, // Nyi GarrisonBuildingWithLevelEqualOrGreaterThan = 134, // Building "{@GARRISON_BUILDING_TYPE}" is at least level {#Level} for garrison type "{GarrType}"
//Unk136 = 136, // Nyi HasBlueprintForGarrisonBuilding = 135, // Has blueprint for garrison building "{GarrBuilding}" of type "{GarrType}"
//Unk137 = 137, // Nyi HasGarrisonBuildingSpecialization = 136, // Has garrison building specialization "{GarrSpecialization}"
//Unk138 = 138, // Nyi AllGarrisonPlotsAreFull = 137, // All garrison type "{GarrType}" plots are full
//Unk139 = 139, // Nyi PlayerIsInOwnGarrison = 138, // Player is in their own garrison
GarrisonBuildingInactive = 140, GarrisonShipmentOfTypeIsPending = 139, /*NYI*/ // Shipment of type "{CharShipmentContainer}" is pending
//Unk141 = 141, // Nyi GarrisonBuildingIsUnderConstruction = 140, // Garrison building "{GarrBuilding}" is under construction
GarrisonBuildingEqualLevel = 142, // Asset: Buildingtype, Secondaryasset: Buildinglevel, Tertiaryasset: Garrtype GarrisonMissionHasBeenCompleted = 141, /*NYI*/ // Garrison mission "{GarrMission}" has been completed
GarrisonFollowerWithAbility = 143, // Asset: Ability, Secondaryasset: Garrtype GarrisonBuildingLevelEqual = 142, // Building {@GARRISON_BUILDING_TYPE} is exactly level {#Level} for garrison type "{GarrType}"
GarrisonFollowerWithTrait = 144, // Asset: Ability, Secondaryasset: Garrtype GarrisonFollowerHasAbility = 143, // This follower has ability "{GarrAbility}" for garrison type "{GarrType}"
GarrisonFollowerAboveQualityWod = 145, // Asset: Followerquality GarrisonFollowerHasTrait = 144, // This follower has trait "{GarrAbility}" for garrison type "{GarrType}"
GarrisonFollowerEqualLevel = 146, // Asset: Followerlevel, Secondaryasset: Garrtype GarrisonFollowerQualityEqual = 145, // This Garrison Follower is {@GARR_FOLLOWER_QUALITY} quality
GarrisonRareMission = 147, // Nyi GarrisonFollowerLevelEqual = 146, // This Garrison Follower is level {#Level}
//Unk148 = 148, // Nyi GarrisonMissionIsRare = 147, /*NYI*/ // This Garrison Mission is Rare
GarrisonBuildingLevel = 149, // Nyi GarrisonMissionIsElite = 148, /*NYI*/ // This Garrison Mission is Elite
//Unk150 = 150, // Nyi CurrentGarrisonBuildingLevelEqual = 149, // This Garrison Building is level {#Level} - building type passed as argument
BattlePetSpeciesInTeam = 151, // Asset: Count, Secondaryasset: Battlepetspeciesid GarrisonPlotInstanceHasBuildingThatIsReadyToActivate = 150, // Garrison plot instance "{GarrPlotInstance}" has building that is ready to activate
BattlePetFamilyInTeam = 152, // Asset: Count, Secondaryasset: Battlepetfamily BattlePetTeamWithSpeciesEqualOrGreaterThan = 151, // Battlepet: with at least {#Amount} "{BattlePetSpecies}"
//Unk153 = 153, // Nyi BattlePetTeamWithTypeEqualOrGreaterThan = 152, // Battlepet: with at least {#Amount} pets of type "{$Battle Pet Types}"
//Unk154 = 154, // Nyi PetBattleLastAbility = 153, /*NYI*/ // Battlepet: last ability was "{BattlePetAbility}"
//Unk155 = 155, // Nyi PetBattleLastAbilityType = 154, /*NYI*/ // Battlepet: last ability was of type "{$Battle Pet Types}"
//Unk156 = 156, // Nyi BattlePetTeamWithAliveEqualOrGreaterThan = 155, // Battlepet: with at least {#Alive} alive
GarrisonFollowerId = 157, // Follower With Id, In Any Garrison HasGarrisonBuildingActiveSpecialization = 156, // Has Garrison building active specialization "{GarrSpecialization}"
QuestObjectiveProgressEqual = 158, // Nyi Asset: Questobjectiveid, Secondaryasset: Progress HasGarrisonFollower = 157, // Has Garrison follower "{GarrFollower}"
QuestObjectiveProgressAbove = 159, // Nyi Asset: Questobjectiveid, Secondaryasset: Progress PlayerQuestObjectiveProgressEqual = 158, // Player's progress on Quest Objective "{QuestObjective}" is equal to {#Value}
//Unk160 = 160, // Nyi PlayerQuestObjectiveProgressEqualOrGreaterThan = 159, // Player's progress on Quest Objective "{QuestObjective}" is at least {#Value}
//Unk161 = 161, // Nyi IsPTRRealm = 160, // This is a PTR Realm
//Unk162 = 162, // Nyi IsBetaRealm = 161, // This is a Beta Realm
//Unk163 = 163, // Nyi IsQARealm = 162, // This is a QA Realm
//Unk164 = 164, // Nyi GarrisonShipmentContainerIsFull = 163, /*NYI*/ // Shipment Container "{CharShipmentContainer}" is full
//Unk165 = 165, // Nyi PlayerCountIsValidToStartGarrisonInvasion = 164, // Player count is valid to start garrison invasion
//Unk166 = 166, // Nyi InstancePlayerCountEqualOrLessThan = 165, // Instance has at most {#Players} players
GarrisonMissionType = 167, // Nyi AllGarrisonPlotsFilledWithBuildingsWithLevelEqualOrGreater = 166, // All plots are full and at least level {#Level} for garrison type "{GarrType}"
GarrisonFollowerAboveItemLevel = 168, // Asset: Followeritemlevel GarrisonMissionType = 167, /*NYI*/ // This mission is type "{GarrMissionType}"
GarrisonFollowersAboveItemLevel = 169, // Asset: Count, Secondaryasset: Followeritemlevel, Tertiaryasset: Garrtype GarrisonFollowerItemLevelEqualOrGreaterThan = 168, // This follower is at least item level {#Level}
GarrisonLevelEqual = 170, // Asset: Count GarrisonFollowerCountWithItemLevelEqualOrGreaterThan = 169, // At least {#Followers} followers are at least item level {#Level} for follower type "{GarrFollowerType}"
GarrisonGroupSize = 171, // Nyi GarrisonTierEqual = 170, // Garrison is exactly tier {#Tier} for garrison type "{GarrType}"
//Unk172 = 172, // Nyi Something To Do With Currency But Only Used On Criterias That Require The Same Currency InstancePlayerCountEqual = 171, // Instance has exactly {#Players} players
TargetingCorpse = 173, CurrencyId = 172, // The currency is type "{CurrencyTypes}"
//Unk174 = 174, // Nyi SelectionIsPlayerCorpse = 173, // Target is player corpse
GarrisonFollowersLevelEqual = 175, // Asset: Count, Secondaryasset: Followerlevel, Tertiaryasset: Garrtype PlayerCanAcceptQuest = 174, // Player is currently eligible for quest "{QuestV2}"
GarrisonFollowerIdInBuilding = 176, // Asset: Followerid, Secondaryasset: Buildingtype GarrisonFollowerCountWithLevelEqualOrGreaterThan = 175, // At least {#Followers} followers exactly level {#Level} for follower type "{GarrFollowerType}"
//Unk177 = 177, // Nyi GarrisonFollowerIsInBuilding = 176, // Garrison follower "{GarrFollower}" is in building "{GarrBuilding}"
//Unk178 = 178, // Nyi GarrisonMissionCountLessThan = 177, /*NYI*/ // Player has less than {#Available} available and {#In-Progress} in-progress missions of garrison type "{GarrType}"
WorldPvpArea = 179, // Nyi GarrisonPlotInstanceCountEqualOrGreaterThan = 178, // Player has at least {#Amount} instances of plot "{GarrPlot}" available
NonOwnGarrison = 180, // Nyi CurrencySource = 179, /*NYI*/ // Currency source is {$Currency Source}
//Unk181 = 181, // Nyi PlayerIsInNotOwnGarrison = 180, // Player is in another garrison (not their own)
//Unk182 = 183, // Nyi HasActiveGarrisonFollower = 181, // Has active Garrison follower "{GarrFollower}"
//Unk183 = 183, // Nyi PlayerDailyRandomValueMod_X_Equals = 182, /*NYI*/ // Player daily random value mod {#Mod Value} equals {#Equals Value}
GarrisonFollowersItemLevelAbove = 184, PlayerHasMount = 183, // Player has Mount "{Mount}"
//Unk185 = 185, // Nyi GarrisonFollowerCountWithInactiveWithItemLevelEqualOrGreaterThan = 184, // At least {#Followers} followers (including inactive) are at least item level {#Level} for follower type "{GarrFollowerType}"
//Unk186 = 186, // Nyi GarrisonFollowerIsOnAMission = 185, // Garrison follower "{GarrFollower}" is on a mission
GarrisonFollowerType = 187, // Nyi GarrisonMissionCountInSetLessThan = 186, /*NYI*/ // Player has less than {#Missions} available and in-progress missions of set "{GarrMissionSet}" in garrison type "{GarrType}"
UsedLevelBoostLessThanTwoHoursAgo = 188, // Nyi GarrisonFollowerType = 187, // This Garrison Follower is of type "{GarrFollowerType}"
//Unk189 = 189, // Nyi PlayerUsedBoostLessThanHoursAgoRealTime = 188, /*NYI*/ // Player has boosted and boost occurred < {#Hours} hours ago (real time)
//Unk190 = 190, // Nyi PlayerUsedBoostLessThanHoursAgoGameTime = 189, /*NYI*/ // Player has boosted and boost occurred < {#Hours} hours ago (in-game time)
//Unk191 = 191, // Nyi PlayerIsMercenary = 190, // Player is currently Mercenary
//Unk192 = 192, // Nyi PlayerEffectiveRace = 191, /*NYI*/ // Player effective race is "{ChrRaces}"
HonorLevel = 193, TargetEffectiveRace = 192, /*NYI*/ // Target effective race is "{ChrRaces}"
PrestigeLevel = 194, HonorLevelEqualOrGreaterThan = 193, // Honor level >= {#Level}
//Unk195 = 195, // Nyi PrestigeLevelEqualOrGreaterThan = 194, // Prestige level >= {#Level}
//Unk196 = 196, // Nyi GarrisonMissionIsReadyToCollect = 195, /*NYI*/ // Garrison mission "{GarrMission}" is ready to collect
//Unk197 = 197, // Nyi PlayerIsInstanceOwner = 196, /*NYI*/ // Player is the instance owner (requires 'Lock Instance Owner' LFGDungeon flag)
//Unk198 = 198, // Nyi PlayerHasHeirloom = 197, // Player has heirloom "{Item}"
//Unk198 = 199, // Nyi TeamPoints = 198, /*NYI*/ // Team has {#Points} Points
ItemModifiedAppearance = 200, PlayerHasToy = 199, // Player has toy "{Item}"
GarrisonSelectedTalent = 201, // Nyi Asset: Garrtalentid (Talent Selected, Research Timer Doesn'T Matter) PlayerHasTransmog = 200, // Player has transmog "{ItemModifiedAppearance}"
GarrisonResearchedTalent = 202, // Nyi Asset: Garrtalentid (Talent Selected, Research Must Be Finished) GarrisonTalentSelected = 201, /*NYI*/ // Garrison has talent "{GarrTalent}" selected
HasCharacterRestrictions = 203, GarrisonTalentResearched = 202, /*NYI*/ // Garrison has talent "{GarrTalent}" researched
//Unk204 = 204, // Nyi PlayerHasRestriction = 203, // Player has restriction of type "{@CHARACTER_RESTRICTION_TYPE}"
//Unk205 = 205, // Nyi PlayerCreatedCharacterLessThanHoursAgoRealTime = 204, /*NYI*/ // Player has created their character < {#Hours} hours ago (real time)
QuestInfoId = 206, PlayerCreatedCharacterLessThanHoursAgoGameTime = 205, // Player has created their character < {#Hours} hours ago (in-game time)
GarrisonResearchingTalent = 207, // Nyi Asset: Garrtalentid (Talent Selected, Research Must Be In Progress) QuestHasQuestInfoId = 206, // Quest has Quest Info "{QuestInfo}"
ArtifactAppearanceSetUsed = 208, GarrisonTalentResearchInProgress = 207, /*NYI*/ // Garrison is researching talent "{GarrTalent}"
CurrencyAmountEqual = 209, PlayerEquippedArtifactAppearanceSet = 208, // Player has equipped Artifact Appearance Set "{ArtifactAppearanceSet}"
//Unk210 = 210, // Nyi PlayerHasCurrencyEqual = 209, // Player has currency "{CurrencyTypes}" in amount {#Amount} exactly
ScenarioType = 211, MinimumAverageItemHighWaterMarkForSpec = 210, /*NYI*/ // Minimum average item high water mark is {#Item High Water Mark} for "{$Item History Spec Match}")
AccountExpansionEqual = 212, PlayerScenarioType = 211, // Player in scenario of type "{$Scenario Type}"
//Unk213 = 213, // Nyi PlayersAuthExpansionLevelEqualOrGreaterThan = 212, // Player's auth expansion level is "{$Expansion Level}" or higher
//Unk214 = 214, // Nyi PlayerLastWeek2v2Rating = 213, /*NYI*/ // Player achieved at least a rating of {#Rating} in 2v2 last week player played
//Unk215 = 215, // Nyi PlayerLastWeek3v3Rating = 214, /*NYI*/ // Player achieved at least a rating of {#Rating} in 3v3 last week player played
ChallengeModeMedal2 = 216, // Nyi Keystone Master, Asset = 3 PlayerLastWeekRBGRating = 215, /*NYI*/ // Player achieved at least a rating of {#Rating} in RBG last week player played
//Unk217 = 217, // Nyi GroupMemberCountFromConnectedRealmEqualOrGreaterThan = 216, // At least {#Num Players} members of the group are from your connected realms
//Unk218 = 218, // Nyi ArtifactTraitUnlockedCountEqualOrGreaterThan = 217, // At least {#Num Traits} traits have been unlocked in artifact "{Item}"
//Unk219 = 219, // Nyi ParagonReputationLevelEqualOrGreaterThan = 218, // Paragon level >= "{#Level}"
//Unk220 = 220, // Nyi GarrisonShipmentIsReady = 219, /*NYI*/ // Shipment in container type "{CharShipmentContainer}" ready
//Unk221 = 221, // Nyi PlayerIsInPvpBrawl = 220, // Player is in PvP Brawl
//Unk222 = 222, // Nyi ParagonReputationLevelWithFactionEqualOrGreaterThan = 221, // Paragon level >= "{#Level}" with faction "{Faction}"
//Unk223 = 223, // Nyi PlayerHasItemWithBonusListFromTreeAndQuality = 222, // Player has an item with bonus list from tree "{ItemBonusTree}" and of quality "{$Item Quality}"
//Unk224 = 224, // Nyi PlayerHasEmptyInventorySlotCountEqualOrGreaterThan = 223, // Player has at least "{#Number of empty slots}" empty inventory slots
//Unk225 = 225, // Nyi PlayerHasItemInHistoryOfProgressiveEvent = 224, /*NYI*/ // Player has item "{Item}" in the item history of progressive event "{ProgressiveEvent}"
UsedLevelBoost = 226, // Nyi PlayerHasArtifactPowerRankCountPurchasedEqualOrGreaterThan = 225, // Player has at least {#Purchased Ranks} ranks of {ArtifactPower} on equipped artifact
UsedRaceChange = 227, // Nyi PlayerHasBoosted = 226, // Player has boosted
UsedFactionChange = 228, // Nyi PlayerHasRaceChanged = 227, // Player has race changed
//Unk229 = 229, // Nyi PlayerHasBeenGrantedLevelsFromRaF = 228, // Player has been granted levels from Recruit a Friend
//Unk230 = 230, // Nyi IsTournamentRealm = 229, // Is Tournament Realm
AchievementGloballyIncompleted = 231, // Hall Of Fame Stuff, Asset: Unk, Secondaryasset: Achievementid PlayerCanAccessAlliedRaces = 230, // Player can access allied races
MainHandVisibleSubclass = 232, GroupMemberCountWithAchievementEqualOrLessThan = 231, // No More Than {#Group Members} With Achievement {Achievement} In Group (true if no group)
OffHandVisibleSubclass = 233, PlayerMainhandWeaponType = 232, // Player has main hand weapon of type "{$Weapon Type}"
PvpTier = 234, // Nyi Asset: Pvptierid PlayerOffhandWeaponType = 233, // Player has off-hand weapon of type "{$Weapon Type}"
AzeriteItemLevel = 235, PlayerPvpTier = 234, // Player is in PvP tier {PvpTier}
//Unk236 = 236, // Nyi PlayerAzeriteLevelEqualOrGreaterThan = 235, // Players' Azerite Item is at or above level "{#Azerite Level}"
//Unk237 = 237, // Nyi PlayerIsOnQuestInQuestline = 236, // Player is on quest in questline "{QuestLine}"
//Unk238 = 238, // Nyi PlayerIsQnQuestLinkedToScheduledWorldStateGroup = 237, // Player is on quest associated with current progressive unlock group "{ScheduledWorldStateGroup}"
PvpTierGreater = 239, // Nyi Asset: Pvptierenum, Secondaryasset: Pvpbracket PlayerIsInRaidGroup = 238, // Player is in raid group
//Unk240 = 240, // Nyi PlayerPvpTierInBracketEqualOrGreaterThan = 239, // Player is at or above "{@PVP_TIER_ENUM}" for "{@PVP_BRACKET}"
//Unk241 = 241, // Nyi PlayerCanAcceptQuestInQuestline = 240, // Player is eligible for quest in questline "{Questline}"
//Unk242 = 242, // Nyi PlayerHasCompletedQuestline = 241, // Player has completed questline "{Questline}"
//Unk243 = 243, // Nyi PlayerHasCompletedQuestlineQuestCount = 242, // Player has completed "{#Quests}" quests in questline "{Questline}"
//Unk244 = 244, // Nyi PlayerHasCompletedPercentageOfQuestline = 243, // Player has completed "{#Percentage}" % of quests in questline "{Questline}"
InWarMode = 245, PlayerHasWarModeEnabled = 244, // Player has WarMode Enabled (regardless of shard state)
//Unk246 = 246, // Nyi PlayerIsOnWarModeShard = 245, // Player is on a WarMode Shard
KeystoneLevel = 247, // Nyi PlayerIsAllowedToToggleWarModeInArea = 246, // Player is allowed to toggle WarMode in area
//Unk248 = 248, // Nyi MythicPlusKeystoneLevelEqualOrGreaterThan = 247, /*NYI*/ // Mythic Plus Keystone Level Atleast {#Level}
KeystoneDungeon = 249, // Nyi Asset: Mapchallengemodeid MythicPlusCompletedInTime = 248, /*NYI*/ // Mythic Plus Completed In Time
//Unk250 = 250, // Nyi MythicPlusMapChallengeMode = 249, /*NYI*/ // Mythic Plus Map Challenge Mode {MapChallengeMode}
PvpSeason = 251, // Nyi Asset: That Unknown Column In Pvpseason.Db2 MythicPlusDisplaySeason = 250, /*NYI*/ // Mythic Plus Display Season {#Season}
SourceDisplayRace = 252, MythicPlusMilestoneSeason = 251, /*NYI*/ // Mythic Plus Milestone Season {#Season}
TargetDisplayRace = 253, PlayerVisibleRace = 252, // Player visible race is "{ChrRaces}"
FriendshipRepReactionExact = 254, // Nyi TargetVisibleRace = 253, // Target visible race is "{ChrRaces}"
SourceAuraCountEqual = 255, FriendshipRepReactionEqual = 254, // Friendship rep reaction is exactly "{FriendshipRepReaction}"
TargetAuraCountEqual = 256, PlayerAuraStackCountEqual = 255, // Player has exactly {#Stacks} stacks of aura "{Spell}"
SourceAuraCountGreater = 257, TargetAuraStackCountEqual = 256, // Target has exactly {#Stacks} stacks of aura "{Spell}"
TargetAuraCountGreater = 258, PlayerAuraStackCountEqualOrGreaterThan = 257, // Player has at least {#Stacks} stacks of aura "{Spell}"
UnlockedAzeriteEssenceRankLower = 259, TargetAuraStackCountEqualOrGreaterThan = 258, // Target has at least {#Stacks} stacks of aura "{Spell}"
UnlockedAzeriteEssenceRankEqual = 260, PlayerHasAzeriteEssenceRankLessThan = 259, // Player has Azerite Essence {AzeriteEssence} at less than rank {#rank}
UnlockedAzeriteEssenceRankGreater = 261, PlayerHasAzeriteEssenceRankEqual = 260, // Player has Azerite Essence {AzeriteEssence} at rank {#rank}
SourceHasAuraEffectIndex = 262, // Asset: Spellid, Secondaryasset: Index PlayerHasAzeriteEssenceRankGreaterThan = 261, // Player has Azerite Essence {AzeriteEssence} at greater than rank {#rank}
SourceSpecializationRole = 263, PlayerHasAuraWithEffectIndex = 262, // Player has Aura {Spell} with Effect Index {#index} active
SourceLevel120 = 264, PlayerLootSpecializationMatchesRole = 263, // Player loot specialization matches role {@LFG_ROLE}
//Unk265 = 265, PlayerIsAtMaxExpansionLevel = 264, // Player is at max expansion level
SelectedAzeriteEssenceRankLower = 266, TransmogSource = 265, // Transmog Source is "{@TRANSMOG_SOURCE}"
SelectedAzeriteEssenceRankGreater = 267, PlayerHasAzeriteEssenceInSlotAtRankLessThan = 266, // Player has Azerite Essence in slot {@AZERITE_ESSENCE_SLOT} at less than rank {#rank}
SourceLevelInRangeCt = 268, PlayerHasAzeriteEssenceInSlotAtRankGreaterThan = 267, // Player has Azerite Essence in slot {@AZERITE_ESSENCE_SLOT} at greater than rank {#rank}
TargetLevelInRangeCt = 269, PlayerLevelWithinContentTuning = 268, // Player has level within Content Tuning {ContentTuning}
//Unk270 = 270, TargetLevelWithinContentTuning = 269, // Target has level within Content Tuning {ContentTuning}
//Unk271 = 271, PlayerIsScenarioInitiator = 270, /*NYI*/ // Player is Scenario Initiator
SourceLevelGreaterCt = 272, // Compare Levels Using Content Tuning PlayerHasCompletedQuestOrIsOnQuest = 271, // Player is currently on or previously completed quest "{QuestV2}"
TargetLevelGreaterCt = 273, // Compare Levels Using Content Tuning PlayerLevelWithinOrAboveContentTuning = 272, // Player has level within or above Content Tuning {ContentTuning}
//Unk274 = 274, TargetLevelWithinOrAboveContentTuning = 273, // Target has level within or above Content Tuning {ContentTuning}
//Unk275 = 275, PlayerLevelWithinOrAboveLevelRange = 274, /*NYI*/ // Player has level within or above Level Range {LevelRange}
//Unk276 = 276, TargetLevelWithinOrAboveLevelRange = 275, /*NYI*/ // Target has level within or above Level Range {LevelRange}
RafRecruitInParty = 277, // NYI MaxJailersTowerLevelEqualOrGreaterThan = 276, // Max Jailers Tower Level Atleast {#Level}
//Unk278 = 278, GroupedWithRaFRecruit = 277, // Grouped With Recruit
//Unk279 = 279, GroupedWithRaFRecruiter = 278, // Grouped with Recruiter
MapOrCosmeticMap = 280, PlayerSpecialization = 279, // Specialization is "{ChrSpecialization}"
//Unk281 = 281, PlayerMapOrCosmeticChildMap = 280, // Player is on map or cosmetic child map "{Map}"
HasEntitlement = 282, // NYI PlayerCanAccessShadowlandsPrepurchaseContent = 281, // Player can access Shadowlands (9.0) prepurchase content
HasQuestSession = 283, // NYI PlayerHasEntitlement = 282, /*NYI*/ // Player has entitlement "{BattlePayDeliverable}"
//Unk284 = 284, PlayerIsInPartySyncGroup = 283, /*NYI*/ // Player is in party sync group
//Unk285 = 285, QuestHasPartySyncRewards = 284, /*NYI*/ // Quest is eligible for party sync rewards
//Unk286 = 286, HonorGainSource = 285, /*NYI*/ // Player gained honor from source {@SPECIAL_MISC_HONOR_GAIN_SOURCE}
//Unk287 = 287, JailersTowerActiveFloorIndexEqualOrGreaterThan = 286, /*NYI*/ // Active Floor Index Atleast {#Level}
Covenant = 288, JailersTowerActiveFloorDifficultyEqualOrGreaterThan = 287, /*NYI*/ // Active Floor Difficulty Atleast {#Level}
//Unk289 = 289, // Related To Pvp Ranking PlayerCovenant = 288, // Player is member of covenant "{Covenant}"
PermanentAnimaDiversionTalent = 290, // NYI HasTimeEventPassed = 289, // Has time event "{TimeEvent}" passed
Soulbind = 291, GarrisonHasPermanentTalent = 290, /*NYI*/ // Garrison has permanent talent "{GarrTalent}"
//Unk292 = 292, HasActiveSoulbind = 291, // Has Active Soulbind "{Soulbind}"
SourceAreaOrZoneInGroup = 293, HasMemorizedSpell = 292, /*NYI*/ // Has memorized spell "{Spell}"
//Unk294 = 294, PlayerHasAPACSubscriptionReward_2020 = 293, // Player has APAC Subscription Reward 2020
//Unk295 = 295, PlayerHasTBCCDEWarpStalker_Mount = 294, // Player has TBCC:DE Warp Stalker Mount
//Unk296 = 296, PlayerHasTBCCDEDarkPortal_Toy = 295, // Player has TBCC:DE Dark Portal Toy
//Unk297 = 297, PlayerHasTBCCDEPathOfIllidan_Toy = 296, // Player has TBCC:DE Path of Illidan Toy
//Unk298 = 298, PlayerHasImpInABallToySubscriptionReward = 297, // Player has Imp in a Ball Toy Subscription Reward
//Unk299 = 299, PlayerIsInAreaGroup = 298, // Player is in area group "{AreaGroup}"
SourceInSpecificChromieTime = 300, TargetIsInAreaGroup = 299, // Target is in area group "{AreaGroup}"
SourceInAnyChromieTime = 301, PlayerIsInChromieTime = 300, // Player has selected Chromie Time ID "{UiChromieTimeExpansionInfo}"
//Unk302 = 302, PlayerIsInAnyChromieTime = 301, // Player has selected ANY Chromie Time ID
SourceRuneforgeLegendaryKnown = 303, ItemIsAzeriteArmor = 302, // Item is Azerite Armor
//Unk304 = 304, PlayerHasRuneforgePower = 303, // Player Has Runeforge Power "{RuneforgeLegendaryAbility}"
//Unk305 = 305, PlayerInChromieTimeForScaling = 304, // Player is Chromie Time for Scaling
//Unk306 = 306, IsRaFRecruit = 305, // Is RAF recruit
SoulbindConduitRank = 307, // NYI AllPlayersInGroupHaveAchievement = 306, // All Players In Group Have Achievement "{Achievement}"
ShapeshiftFormCustomizationDisplay = 308, PlayerHasSoulbindConduitRankEqualOrGreaterThan = 307, /*NYI*/ // Player has Conduit "{SoulbindConduit}" at Rank {#Rank} or Higher
SoulbindMinConduitsAtRank = 309, // NYI PlayerSpellShapeshiftFormCreatureDisplayInfoSelection = 308, // Player has chosen {CreatureDisplayInfo} for shapeshift form {SpellShapeshiftForm}
IsRestrictedAccount = 310, // NYI PlayerSoulbindConduitCountAtRankEqualOrGreaterThan = 309, /*NYI*/ // Player has at least {#Level} Conduits at Rank {#Rank} or higher.
SourceFlying = 311, 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
} }
public enum CriteriaFailEvent : byte public enum CriteriaFailEvent : byte
+1
View File
@@ -988,6 +988,7 @@ namespace Framework.Constants
Max Max
} }
[Flags]
public enum BattlemasterListFlags : int public enum BattlemasterListFlags : int
{ {
Disabled = 0x01, Disabled = 0x01,
@@ -469,6 +469,7 @@ namespace Framework.Constants
UsingPartGarrison = 0x100, UsingPartGarrison = 0x100,
CanUseObjectsMounted = 0x200, CanUseObjectsMounted = 0x200,
CanVisitPartyGarrison = 0x400, CanVisitPartyGarrison = 0x400,
WarMode = 0x800,
AccountSecured = 0x1000, // Script_IsAccountSecured AccountSecured = 0x1000, // Script_IsAccountSecured
OverrideTransportServerTime = 0x8000, OverrideTransportServerTime = 0x8000,
MentorRestricted = 0x20000, MentorRestricted = 0x20000,
@@ -44,6 +44,7 @@ namespace Framework.Constants
public const int MaxAzeriteEmpoweredTier = 5; public const int MaxAzeriteEmpoweredTier = 5;
public const int MaxAzeriteEssenceSlot = 4; public const int MaxAzeriteEssenceSlot = 4;
public const int MaxAzeriteEssenceRank = 4; public const int MaxAzeriteEssenceRank = 4;
public const int AchivementCategoryPetBattles = 15117;
/// <summary> /// <summary>
/// BattlePets Const /// BattlePets Const
@@ -59,6 +59,11 @@ namespace Game.Achievements
return _achievementPoints; return _achievementPoints;
} }
public ICollection<uint> GetCompletedAchievementIds()
{
return _completedAchievements.Keys;
}
public override bool CanUpdateCriteriaTree(Criteria criteria, CriteriaTree tree, Player referencePlayer) public override bool CanUpdateCriteriaTree(Criteria criteria, CriteriaTree tree, Player referencePlayer)
{ {
AchievementRecord achievement = tree.Achievement; AchievementRecord achievement = tree.Achievement;
File diff suppressed because it is too large Load Diff
@@ -319,6 +319,15 @@ namespace Game.BattlePets
return (byte)_pets.Values.Count(battlePet => battlePet.PacketInfo.Species == species && battlePet.SaveInfo != BattlePetSaveInfo.Removed); return (byte)_pets.Values.Count(battlePet => battlePet.PacketInfo.Species == species && battlePet.SaveInfo != BattlePetSaveInfo.Removed);
} }
public uint GetPetUniqueSpeciesCount()
{
HashSet<uint> speciesIds = new();
foreach (var pair in _pets)
speciesIds.Add(pair.Value.PacketInfo.Species);
return (uint)speciesIds.Count;
}
public void UnlockSlot(byte slot) public void UnlockSlot(byte slot)
{ {
if (!_slots[slot].Locked) if (!_slots[slot].Locked)
@@ -460,6 +469,8 @@ namespace Game.BattlePets
public ushort GetTrapLevel() { return _trapLevel; } public ushort GetTrapLevel() { return _trapLevel; }
public List<BattlePetSlot> GetSlots() { return _slots; } public List<BattlePetSlot> GetSlots() { return _slots; }
public bool HasJournalLock() { return true; }
WorldSession _owner; WorldSession _owner;
ushort _trapLevel; ushort _trapLevel;
Dictionary<ulong, BattlePet> _pets = new(); Dictionary<ulong, BattlePet> _pets = new();
+11
View File
@@ -1463,6 +1463,17 @@ namespace Game.DataStorage
return bonusListIDs; return bonusListIDs;
} }
public List<uint> GetAllItemBonusTreeBonuses(uint itemBonusTreeId)
{
List<uint> bonusListIDs = new List<uint>();
VisitItemBonusTree(itemBonusTreeId, true, bonusTreeNode =>
{
if (bonusTreeNode.ChildItemBonusListID != 0)
bonusListIDs.Add(bonusTreeNode.ChildItemBonusListID);
});
return bonusListIDs;
}
void LoadAzeriteEmpoweredItemUnlockMappings(MultiMap<uint, AzeriteUnlockMappingRecord> azeriteUnlockMappingsBySet, uint itemId) void LoadAzeriteEmpoweredItemUnlockMappings(MultiMap<uint, AzeriteUnlockMappingRecord> azeriteUnlockMappingsBySet, uint itemId)
{ {
var itemIdRange = _itemToBonusTree.LookupByKey(itemId); var itemIdRange = _itemToBonusTree.LookupByKey(itemId);
+24
View File
@@ -2089,6 +2089,30 @@ namespace Game.Entities
} }
} }
public uint GetTotalUnlockedArtifactPowers()
{
uint purchased = GetTotalPurchasedArtifactPowers();
ulong artifactXp = m_itemData.ArtifactXP;
uint currentArtifactTier = GetModifier(ItemModifier.ArtifactTier);
uint extraUnlocked = 0;
do
{
ulong xpCost = 0;
var cost = CliDB.ArtifactLevelXPGameTable.GetRow(purchased + extraUnlocked + 1);
if (cost != null)
xpCost = (ulong)(currentArtifactTier == PlayerConst.MaxArtifactTier ? cost.XP2 : cost.XP);
if (artifactXp < xpCost)
break;
artifactXp -= xpCost;
++extraUnlocked;
} while (true);
return purchased + extraUnlocked;
}
public uint GetTotalPurchasedArtifactPowers() public uint GetTotalPurchasedArtifactPowers()
{ {
uint purchasedRanks = 0; uint purchasedRanks = 0;
@@ -728,7 +728,7 @@ namespace Game.Entities
{ {
int transmogSlot = Item.ItemTransmogrificationSlots[(int)item.inventoryType]; int transmogSlot = Item.ItemTransmogrificationSlots[(int)item.inventoryType];
if (transmogSlot >= 0) if (transmogSlot >= 0)
_owner.GetPlayer().UpdateCriteria(CriteriaTypes.AppearanceUnlockedBySlot, (ulong)transmogSlot, 1); _owner.GetPlayer().UpdateCriteria(CriteriaTypes.AppearanceUnlockedBySlot, (ulong)transmogSlot, itemModifiedAppearance.Id);
} }
var sets = Global.DB2Mgr.GetTransmogSetsForItemModifiedAppearance(itemModifiedAppearance.Id); var sets = Global.DB2Mgr.GetTransmogSetsForItemModifiedAppearance(itemModifiedAppearance.Id);
@@ -20,6 +20,7 @@ using Game.Achievements;
using Game.DataStorage; using Game.DataStorage;
using Game.Guilds; using Game.Guilds;
using Game.Scenarios; using Game.Scenarios;
using System.Collections.Generic;
namespace Game.Entities namespace Game.Entities
{ {
@@ -39,6 +40,12 @@ namespace Game.Entities
{ {
return m_achievementSys.GetAchievementPoints(); return m_achievementSys.GetAchievementPoints();
} }
public ICollection<uint> GetCompletedAchievementIds()
{
return m_achievementSys.GetCompletedAchievementIds();
}
public bool HasAchieved(uint achievementId) public bool HasAchieved(uint achievementId)
{ {
return m_achievementSys.HasAchieved(achievementId); return m_achievementSys.HasAchieved(achievementId);
+71 -25
View File
@@ -1511,7 +1511,7 @@ namespace Game.Entities
InventoryResult res = InventoryResult.Ok; InventoryResult res = InventoryResult.Ok;
uint tempcount = 0; uint tempcount = 0;
bool result = ForEachStorageItem(ItemSearchLocation.Equipment, pItem => bool result = ForEachItem(ItemSearchLocation.Equipment, pItem =>
{ {
if (pItem.GetEntry() == item) if (pItem.GetEntry() == item)
{ {
@@ -2615,7 +2615,7 @@ namespace Game.Entities
public Item GetItemByGuid(ObjectGuid guid) public Item GetItemByGuid(ObjectGuid guid)
{ {
Item result = null; Item result = null;
ForEachStorageItem(ItemSearchLocation.Everywhere, item => ForEachItem(ItemSearchLocation.Everywhere, item =>
{ {
if (item.GetGUID() == guid) if (item.GetGUID() == guid)
{ {
@@ -2637,7 +2637,7 @@ namespace Game.Entities
location |= ItemSearchLocation.Bank; location |= ItemSearchLocation.Bank;
uint count = 0; uint count = 0;
ForEachStorageItem(location, pItem => ForEachItem(location, pItem =>
{ {
if (pItem != skipItem) if (pItem != skipItem)
{ {
@@ -2684,7 +2684,7 @@ namespace Game.Entities
public Item GetItemByEntry(uint entry, ItemSearchLocation where = ItemSearchLocation.Default) public Item GetItemByEntry(uint entry, ItemSearchLocation where = ItemSearchLocation.Default)
{ {
Item result = null; Item result = null;
ForEachStorageItem(where, item => ForEachItem(where, item =>
{ {
if (item.GetEntry() == entry) if (item.GetEntry() == entry)
{ {
@@ -2704,7 +2704,7 @@ namespace Game.Entities
location |= ItemSearchLocation.Bank; location |= ItemSearchLocation.Bank;
List<Item> itemList = new(); List<Item> itemList = new();
ForEachStorageItem(location, item => ForEachItem(location, item =>
{ {
if (item.GetEntry() == entry) if (item.GetEntry() == entry)
itemList.Add(item); itemList.Add(item);
@@ -2721,7 +2721,7 @@ namespace Game.Entities
location |= ItemSearchLocation.Bank; location |= ItemSearchLocation.Bank;
uint currentCount = 0; uint currentCount = 0;
return !ForEachStorageItem(location, pItem => return !ForEachItem(location, pItem =>
{ {
if (pItem && pItem.GetEntry() == item && !pItem.IsInTrade()) if (pItem && pItem.GetEntry() == item && !pItem.IsInTrade())
{ {
@@ -2791,7 +2791,7 @@ namespace Game.Entities
public Item GetChildItemByGuid(ObjectGuid guid) public Item GetChildItemByGuid(ObjectGuid guid)
{ {
Item result = null; Item result = null;
ForEachStorageItem(ItemSearchLocation.Equipment | ItemSearchLocation.Inventory, item => ForEachItem(ItemSearchLocation.Equipment | ItemSearchLocation.Inventory, item =>
{ {
if (item.GetGUID() == guid) if (item.GetGUID() == guid)
{ {
@@ -2807,7 +2807,7 @@ namespace Game.Entities
uint GetItemCountWithLimitCategory(uint limitCategory, Item skipItem) uint GetItemCountWithLimitCategory(uint limitCategory, Item skipItem)
{ {
uint count = 0; uint count = 0;
ForEachStorageItem(ItemSearchLocation.Everywhere, item => ForEachItem(ItemSearchLocation.Everywhere, item =>
{ {
if (item != skipItem) if (item != skipItem)
{ {
@@ -3428,23 +3428,16 @@ namespace Game.Entities
return false; return false;
} }
uint GetMaxPersonalArenaRatingRequirement(uint minarenaslot) public uint GetMaxPersonalArenaRatingRequirement(uint minarenaslot)
{ {
// returns the maximal personal arena rating that can be used to purchase items requiring this condition // 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](personalrating[teamtype])
// so return max[in arenateams](min(personalrating[teamtype], teamrating[teamtype]))
uint max_personal_rating = 0; uint max_personal_rating = 0;
for (byte i = (byte)minarenaslot; i < SharedConst.MaxArenaSlot; ++i) for (byte i = (byte)minarenaslot; i < SharedConst.MaxArenaSlot; ++i)
{ {
ArenaTeam at = Global.ArenaTeamMgr.GetArenaTeamById(GetArenaTeamId(i)); uint p_rating = GetArenaPersonalRating(i);
if (at != null) if (max_personal_rating < p_rating)
{ max_personal_rating = p_rating;
uint p_rating = GetArenaPersonalRating(i);
uint 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;
}
} }
return max_personal_rating; return max_personal_rating;
} }
@@ -4469,7 +4462,60 @@ namespace Game.Entities
{ {
return StoreItem(dest, pItem, update); return StoreItem(dest, pItem, update);
} }
public uint GetFreeInventorySlotCount(ItemSearchLocation location = ItemSearchLocation.Inventory)
{
uint freeSlotCount = 0;
if (location.HasFlag(ItemSearchLocation.Equipment))
for (byte i = EquipmentSlot.Start; i < EquipmentSlot.End; ++i)
if (GetItemByPos(InventorySlots.Bag0, i) == null)
++freeSlotCount;
if (location.HasFlag(ItemSearchLocation.Inventory))
{
int inventoryEnd = InventorySlots.ItemStart + GetInventorySlotCount();
for (byte i = InventorySlots.ItemStart; i < inventoryEnd; ++i)
if (GetItemByPos(InventorySlots.Bag0, i) == null)
++freeSlotCount;
for (byte i = InventorySlots.BagStart; i < InventorySlots.BagEnd; ++i)
{
Bag bag = GetBagByPos(i);
if (bag != null)
{
for (byte j = 0; j < bag.GetBagSize(); ++j)
if (bag.GetItemByPos(j) == null)
++freeSlotCount;
}
}
}
if (location.HasFlag(ItemSearchLocation.Bank))
{
for (byte i = InventorySlots.BankItemStart; i < InventorySlots.BankItemEnd; ++i)
if (GetItemByPos(InventorySlots.Bag0, i) == null)
++freeSlotCount;
for (byte i = InventorySlots.BankBagStart; i < InventorySlots.BankBagEnd; ++i)
{
Bag bag = GetBagByPos(i);
if (bag != null)
{
for (byte j = 0; j < bag.GetBagSize(); ++j)
if (bag.GetItemByPos(j) == null)
++freeSlotCount;
}
}
}
if (location.HasFlag(ItemSearchLocation.ReagentBank))
for (byte i = InventorySlots.ReagentStart; i < InventorySlots.ReagentEnd; ++i)
if (GetItemByPos(InventorySlots.Bag0, i) == null)
++freeSlotCount;
return freeSlotCount;
}
//Bags //Bags
public Bag GetBagByPos(byte bag) public Bag GetBagByPos(byte bag)
{ {
@@ -5242,7 +5288,7 @@ namespace Game.Entities
ItemTemplate pProto = Global.ObjectMgr.GetItemTemplate(item); ItemTemplate pProto = Global.ObjectMgr.GetItemTemplate(item);
bool includeGems = pProto?.GetGemProperties() != 0; bool includeGems = pProto?.GetGemProperties() != 0;
return !ForEachStorageItem(ItemSearchLocation.Equipment, pItem => return !ForEachItem(ItemSearchLocation.Equipment, pItem =>
{ {
if (pItem.GetSlot() != except_slot) if (pItem.GetSlot() != except_slot)
{ {
@@ -5261,7 +5307,7 @@ namespace Game.Entities
bool HasItemWithLimitCategoryEquipped(uint limitCategory, uint count, byte except_slot) bool HasItemWithLimitCategoryEquipped(uint limitCategory, uint count, byte except_slot)
{ {
uint tempcount = 0; uint tempcount = 0;
return !ForEachStorageItem(ItemSearchLocation.Equipment, pItem => return !ForEachItem(ItemSearchLocation.Equipment, pItem =>
{ {
if (pItem.GetSlot() == except_slot) if (pItem.GetSlot() == except_slot)
return true; return true;
@@ -5280,7 +5326,7 @@ namespace Game.Entities
bool HasGemWithLimitCategoryEquipped(uint limitCategory, uint count, byte except_slot) bool HasGemWithLimitCategoryEquipped(uint limitCategory, uint count, byte except_slot)
{ {
uint tempcount = 0; uint tempcount = 0;
return !ForEachStorageItem(ItemSearchLocation.Equipment, pItem => return !ForEachItem(ItemSearchLocation.Equipment, pItem =>
{ {
if (pItem.GetSlot() == except_slot) if (pItem.GetSlot() == except_slot)
return true; return true;
@@ -6555,7 +6601,7 @@ namespace Game.Entities
// @todo other types of power scaling such as timewalking // @todo other types of power scaling such as timewalking
} }
bool ForEachStorageItem(ItemSearchLocation location, Func<Item, bool> callback) public bool ForEachItem(ItemSearchLocation location, Func<Item, bool> callback)
{ {
if (location.HasAnyFlag(ItemSearchLocation.Equipment)) if (location.HasAnyFlag(ItemSearchLocation.Equipment))
{ {
@@ -6720,7 +6766,7 @@ namespace Game.Entities
(InventoryType inventoryType, uint itemLevel, ObjectGuid guid)[] bestItemLevels = new (InventoryType inventoryType, uint itemLevel, ObjectGuid guid)[EquipmentSlot.End]; (InventoryType inventoryType, uint itemLevel, ObjectGuid guid)[] bestItemLevels = new (InventoryType inventoryType, uint itemLevel, ObjectGuid guid)[EquipmentSlot.End];
float sum = 0; float sum = 0;
ForEachStorageItem(ItemSearchLocation.Everywhere, item => ForEachItem(ItemSearchLocation.Everywhere, item =>
{ {
ItemTemplate itemTemplate = item.GetTemplate(); ItemTemplate itemTemplate = item.GetTemplate();
if (itemTemplate != null) if (itemTemplate != null)
+17 -7
View File
@@ -5015,7 +5015,7 @@ namespace Game.Entities
return true; return true;
} }
bool CanEnableWarModeInArea() public bool CanEnableWarModeInArea()
{ {
var area = CliDB.AreaTableStorage.LookupByKey(GetAreaId()); var area = CliDB.AreaTableStorage.LookupByKey(GetAreaId());
if (area == null || !IsFriendlyArea(area)) if (area == null || !IsFriendlyArea(area))
@@ -5878,6 +5878,16 @@ namespace Game.Entities
return reputationMgr; return reputationMgr;
} }
public void SetReputation(uint factionentry, int value)
{
GetReputationMgr().SetReputation(CliDB.FactionStorage.LookupByKey(factionentry), value);
}
public int GetReputation(uint factionentry)
{
return GetReputationMgr().GetReputation(CliDB.FactionStorage.LookupByKey(factionentry));
}
#region Sends / Updates #region Sends / Updates
void BeforeVisibilityDestroy(WorldObject obj, Player p) void BeforeVisibilityDestroy(WorldObject obj, Player p)
{ {
@@ -6423,12 +6433,12 @@ namespace Game.Entities
SendMovementSetCollisionHeight(scale * GetCollisionHeight(), UpdateCollisionHeightReason.Scale); SendMovementSetCollisionHeight(scale * GetCollisionHeight(), UpdateCollisionHeightReason.Scale);
} }
bool HasRaceChanged() { return m_ExtraFlags.HasFlag(PlayerExtraFlags.HasRaceChanged); } public bool HasRaceChanged() { return m_ExtraFlags.HasFlag(PlayerExtraFlags.HasRaceChanged); }
void SetHasRaceChanged() { m_ExtraFlags |= PlayerExtraFlags.HasRaceChanged; } public void SetHasRaceChanged() { m_ExtraFlags |= PlayerExtraFlags.HasRaceChanged; }
bool HasBeenGrantedLevelsFromRaF() { return m_ExtraFlags.HasFlag(PlayerExtraFlags.GrantedLevelsFromRaf); } public bool HasBeenGrantedLevelsFromRaF() { return m_ExtraFlags.HasFlag(PlayerExtraFlags.GrantedLevelsFromRaf); }
void SetBeenGrantedLevelsFromRaF() { m_ExtraFlags |= PlayerExtraFlags.GrantedLevelsFromRaf; } public void SetBeenGrantedLevelsFromRaF() { m_ExtraFlags |= PlayerExtraFlags.GrantedLevelsFromRaf; }
bool HasLevelBoosted() { return m_ExtraFlags.HasFlag(PlayerExtraFlags.LevelBoosted); } public bool HasLevelBoosted() { return m_ExtraFlags.HasFlag(PlayerExtraFlags.LevelBoosted); }
void SetHasLevelBoosted() { m_ExtraFlags |= PlayerExtraFlags.LevelBoosted; } public void SetHasLevelBoosted() { m_ExtraFlags |= PlayerExtraFlags.LevelBoosted; }
public uint GetXP() { return m_activePlayerData.XP; } public uint GetXP() { return m_activePlayerData.XP; }
public uint GetXPForNextLevel() { return m_activePlayerData.NextLevelXP; } public uint GetXPForNextLevel() { return m_activePlayerData.NextLevelXP; }
+1 -1
View File
@@ -310,7 +310,7 @@ namespace Game.Garrisons
return _plots.Values; return _plots.Values;
} }
Plot GetPlot(uint garrPlotInstanceId) public Plot GetPlot(uint garrPlotInstanceId)
{ {
return _plots.LookupByKey(garrPlotInstanceId); return _plots.LookupByKey(garrPlotInstanceId);
} }
+1 -1
View File
@@ -123,7 +123,7 @@ namespace Game
while (result.NextRow()); while (result.NextRow());
} }
charResult.IsAlliedRacesCreationAllowed = GetAccountExpansion() >= Expansion.BattleForAzeroth; charResult.IsAlliedRacesCreationAllowed = CanAccessAlliedRaces();
foreach (var requirement in Global.ObjectMgr.GetRaceUnlockRequirements()) foreach (var requirement in Global.ObjectMgr.GetRaceUnlockRequirements())
{ {
+1 -1
View File
@@ -182,7 +182,7 @@ namespace Game
return GetForcedRankIfAny(factionTemplateEntry.Faction); return GetForcedRankIfAny(factionTemplateEntry.Faction);
} }
int GetParagonLevel(uint paragonFactionId) public int GetParagonLevel(uint paragonFactionId)
{ {
return GetParagonLevel(CliDB.FactionStorage.LookupByKey(paragonFactionId)); return GetParagonLevel(CliDB.FactionStorage.LookupByKey(paragonFactionId));
} }
+31 -15
View File
@@ -35,8 +35,8 @@ namespace Game.Scenarios
//ASSERT(_data); //ASSERT(_data);
foreach (var step in _data.Steps) foreach (var scenarioStep in _data.Steps.Values)
SetStepState(step.Value, ScenarioStepState.NotStarted); SetStepState(scenarioStep, ScenarioStepState.NotStarted);
ScenarioStepRecord firstStep = GetFirstStep(); ScenarioStepRecord firstStep = GetFirstStep();
if (firstStep != null) if (firstStep != null)
@@ -80,16 +80,16 @@ namespace Game.Scenarios
return; return;
ScenarioStepRecord newStep = null; ScenarioStepRecord newStep = null;
foreach (var _step in _data.Steps.Values) foreach (var scenarioStep in _data.Steps.Values)
{ {
if (_step.IsBonusObjective()) if (scenarioStep.IsBonusObjective())
continue; continue;
if (GetStepState(_step) == ScenarioStepState.Done) if (GetStepState(scenarioStep) == ScenarioStepState.Done)
continue; continue;
if (newStep == null || _step.OrderIndex < newStep.OrderIndex) if (newStep == null || scenarioStep.OrderIndex < newStep.OrderIndex)
newStep = _step; newStep = scenarioStep;
} }
SetStep(newStep); SetStep(newStep);
@@ -129,12 +129,12 @@ namespace Game.Scenarios
bool IsComplete() bool IsComplete()
{ {
foreach (var step in _data.Steps.Values) foreach (var scenarioStep in _data.Steps.Values)
{ {
if (step.IsBonusObjective()) if (scenarioStep.IsBonusObjective())
continue; continue;
if (GetStepState(step) != ScenarioStepState.Done) if (GetStepState(scenarioStep) != ScenarioStepState.Done)
return false; return false;
} }
@@ -278,6 +278,22 @@ namespace Game.Scenarios
return firstStep; return firstStep;
} }
public ScenarioStepRecord GetLastStep()
{
// Do it like this because we don't know what order they're in inside the container.
ScenarioStepRecord lastStep = null;
foreach (var scenarioStep in _data.Steps.Values)
{
if (scenarioStep.IsBonusObjective())
continue;
if (lastStep == null || scenarioStep.OrderIndex > lastStep.OrderIndex)
lastStep = scenarioStep;
}
return lastStep;
}
public void SendScenarioState(Player player) public void SendScenarioState(Player player)
{ {
ScenarioState scenarioState = new(); ScenarioState scenarioState = new();
@@ -288,16 +304,16 @@ namespace Game.Scenarios
List<BonusObjectiveData> GetBonusObjectivesData() List<BonusObjectiveData> GetBonusObjectivesData()
{ {
List<BonusObjectiveData> bonusObjectivesData = new(); List<BonusObjectiveData> bonusObjectivesData = new();
foreach (var step in _data.Steps.Values) foreach (var scenarioStep in _data.Steps.Values)
{ {
if (!step.IsBonusObjective()) if (!scenarioStep.IsBonusObjective())
continue; continue;
if (Global.CriteriaMgr.GetCriteriaTree(step.CriteriaTreeId) != null) if (Global.CriteriaMgr.GetCriteriaTree(scenarioStep.CriteriaTreeId) != null)
{ {
BonusObjectiveData bonusObjectiveData; BonusObjectiveData bonusObjectiveData;
bonusObjectiveData.BonusObjectiveID = (int)step.Id; bonusObjectiveData.BonusObjectiveID = (int)scenarioStep.Id;
bonusObjectiveData.ObjectiveComplete = GetStepState(step) == ScenarioStepState.Done; bonusObjectiveData.ObjectiveComplete = GetStepState(scenarioStep) == ScenarioStepState.Done;
bonusObjectivesData.Add(bonusObjectiveData); bonusObjectivesData.Add(bonusObjectiveData);
} }
} }
+5
View File
@@ -676,6 +676,11 @@ namespace Game
{ {
return _transactionCallbacks.AddCallback(callback); return _transactionCallbacks.AddCallback(callback);
} }
public bool CanAccessAlliedRaces()
{
return GetAccountExpansion() >= Expansion.BattleForAzeroth;
}
void InitWarden(BigInteger k) void InitWarden(BigInteger k)
{ {