From fde94074becb09b0eca028604b31160fe55a4710 Mon Sep 17 00:00:00 2001 From: hondacrx Date: Thu, 1 Feb 2024 10:55:35 -0500 Subject: [PATCH] Core/Achievements: Fix CriteriaTypes related to areas and zones Port From (https://github.com/TrinityCore/TrinityCore/commit/10b06ff50f77cc0516c5f17adffef8eb75f1d555) --- .../Framework/Constants/AchievementConst.cs | 6 +-- Source/Game/Achievements/CriteriaHandler.cs | 37 +++++++++++++------ Source/Game/Entities/Player/Player.Map.cs | 11 +++++- 3 files changed, 37 insertions(+), 17 deletions(-) diff --git a/Source/Framework/Constants/AchievementConst.cs b/Source/Framework/Constants/AchievementConst.cs index 7e7f834b6..0dd5e213b 100644 --- a/Source/Framework/Constants/AchievementConst.cs +++ b/Source/Framework/Constants/AchievementConst.cs @@ -666,8 +666,8 @@ namespace Framework.Constants BattlePetReachLevel = 160, // (Account Only) Battle pet has reached level {#Level} PlayerObtainPetThroughBattle = 161, /*NYI*/ // (Player) Obtain a pet through battle ActivelyEarnPetLevel = 162, // (Player) Actively earn level {#Level} with a pet by a player - EnterArea = 163, /*NYI*/ // Enter Map Area "{AreaTable}" - LeaveArea = 164, /*NYI*/ // Leave Map Area "{AreaTable}" + EnterArea = 163, // Enter Map Area "{AreaTable}" + LeaveArea = 164, // Leave Map Area "{AreaTable}" DefeatDungeonEncounter = 165, /*NYI*/ // Defeat Encounter "{DungeonEncounter}" PlaceAnyGarrisonBuilding = 166, /*NYI*/ // Garrison Building: Place any PlaceGarrisonBuilding = 167, // Garrison Building: Place "{GarrBuilding}" @@ -729,7 +729,7 @@ namespace Framework.Constants LearnTransmogIllusion = 223, /*NYI*/ // Learn Transmog Illusion LearnAnyTransmogIllusion = 224, /*NYI*/ // Learn Any Transmog Illusion EnterTopLevelArea = 225, // Enter Top Level Map Area "{AreaTable}" - LeaveTopLevelArea = 226, /*NYI*/ // Leave Top Level Map Area "{AreaTable}" + LeaveTopLevelArea = 226, // Leave Top Level Map Area "{AreaTable}" SocketGarrisonTalent = 227, /*NYI*/ // Socket Garrison Talent {GarrTalent} SocketAnySoulbindConduit = 228, /*NYI*/ // Socket Any Soulbind Conduit ObtainAnyItemWithCurrencyValue = 229, /*NYI*/ // Obtain Any Item With Currency Value "{CurrencyTypes}" diff --git a/Source/Game/Achievements/CriteriaHandler.cs b/Source/Game/Achievements/CriteriaHandler.cs index 8185a1ea5..3855fad62 100644 --- a/Source/Game/Achievements/CriteriaHandler.cs +++ b/Source/Game/Achievements/CriteriaHandler.cs @@ -133,11 +133,9 @@ namespace Game.Achievements case CriteriaType.HonorLevelIncrease: case CriteriaType.PrestigeLevelIncrease: case CriteriaType.LearnAnyTransmogInSlot: - case CriteriaType.CollectTransmogSetFromGroup: case CriteriaType.CompleteAnyReplayQuest: case CriteriaType.BuyItemsFromVendors: case CriteriaType.SellItemsToVendors: - case CriteriaType.EnterTopLevelArea: SetCriteriaProgress(criteria, 1, referencePlayer, ProgressType.Accumulate); break; // std case: increment at miscValue1 @@ -246,16 +244,21 @@ namespace Game.Achievements // miscValue1 is the ingame fallheight*100 as stored in dbc SetCriteriaProgress(criteria, miscValue1, referencePlayer); break; + case CriteriaType.EarnAchievement: case CriteriaType.CompleteQuest: case CriteriaType.LearnOrKnowSpell: case CriteriaType.RevealWorldMapOverlay: case CriteriaType.GotHaircut: case CriteriaType.EquipItemInSlot: case CriteriaType.EquipItem: - case CriteriaType.EarnAchievement: - case CriteriaType.RecruitGarrisonFollower: case CriteriaType.LearnedNewPet: + case CriteriaType.EnterArea: + case CriteriaType.LeaveArea: + case CriteriaType.RecruitGarrisonFollower: case CriteriaType.ActivelyReachLevel: + case CriteriaType.CollectTransmogSetFromGroup: + case CriteriaType.EnterTopLevelArea: + case CriteriaType.LeaveTopLevelArea: SetCriteriaProgress(criteria, 1, referencePlayer); break; case CriteriaType.BankSlotsPurchased: @@ -381,8 +384,6 @@ namespace Game.Achievements case CriteriaType.AccountObtainPetThroughBattle: case CriteriaType.WinPetBattle: case CriteriaType.PlayerObtainPetThroughBattle: - case CriteriaType.EnterArea: - case CriteriaType.LeaveArea: case CriteriaType.DefeatDungeonEncounter: case CriteriaType.ActivateGarrisonBuilding: case CriteriaType.UpgradeGarrison: @@ -767,14 +768,11 @@ namespace Game.Achievements case CriteriaType.BankSlotsPurchased: case CriteriaType.ReputationGained: case CriteriaType.TotalExaltedFactions: - case CriteriaType.GotHaircut: - case CriteriaType.EquipItemInSlot: case CriteriaType.RollNeed: case CriteriaType.RollGreed: case CriteriaType.DeliverKillingBlowToClass: case CriteriaType.DeliverKillingBlowToRace: case CriteriaType.DoEmote: - case CriteriaType.EquipItem: case CriteriaType.MoneyEarnedFromQuesting: case CriteriaType.MoneyLootedFromCreatures: case CriteriaType.UseGameobject: @@ -801,18 +799,24 @@ namespace Game.Achievements case CriteriaType.CompleteAnyReplayQuest: case CriteriaType.BuyItemsFromVendors: case CriteriaType.SellItemsToVendors: - case CriteriaType.EnterTopLevelArea: return progress.Counter >= requiredAmount; case CriteriaType.EarnAchievement: case CriteriaType.CompleteQuest: case CriteriaType.LearnOrKnowSpell: case CriteriaType.RevealWorldMapOverlay: - case CriteriaType.RecruitGarrisonFollower: + case CriteriaType.GotHaircut: + case CriteriaType.EquipItemInSlot: + case CriteriaType.EquipItem: case CriteriaType.LearnedNewPet: case CriteriaType.HonorLevelIncrease: case CriteriaType.PrestigeLevelIncrease: + case CriteriaType.EnterArea: + case CriteriaType.LeaveArea: + case CriteriaType.RecruitGarrisonFollower: case CriteriaType.ActivelyReachLevel: case CriteriaType.CollectTransmogSetFromGroup: + case CriteriaType.EnterTopLevelArea: + case CriteriaType.LeaveTopLevelArea: return progress.Counter >= 1; case CriteriaType.AchieveSkillStep: return progress.Counter >= (requiredAmount * 75); @@ -1148,10 +1152,14 @@ namespace Game.Achievements return false; break; case CriteriaType.PVPKillInArea: - case CriteriaType.EnterTopLevelArea: + case CriteriaType.EnterArea: if (miscValue1 == 0 || !Global.DB2Mgr.IsInArea((uint)miscValue1, criteria.Entry.Asset)) return false; break; + case CriteriaType.LeaveArea: + if (miscValue1 == 0 || Global.DB2Mgr.IsInArea((uint)miscValue1, criteria.Entry.Asset)) + return false; + break; case CriteriaType.CurrencyGained: if (miscValue1 == 0 || miscValue2 == 0 || (long)miscValue2 < 0 || miscValue1 != criteria.Entry.Asset) @@ -1185,6 +1193,11 @@ namespace Game.Achievements if (miscValue1 == 0 || miscValue1 != criteria.Entry.Asset) return false; break; + case CriteriaType.EnterTopLevelArea: + case CriteriaType.LeaveTopLevelArea: + if (miscValue1 == 0 || miscValue1 != criteria.Entry.Asset) + return false; + break; default: break; } diff --git a/Source/Game/Entities/Player/Player.Map.cs b/Source/Game/Entities/Player/Player.Map.cs index 4ce98c0ac..9b0a21a18 100644 --- a/Source/Game/Entities/Player/Player.Map.cs +++ b/Source/Game/Entities/Player/Player.Map.cs @@ -134,13 +134,17 @@ namespace Game.Entities PushQuests(); - UpdateCriteria(CriteriaType.EnterTopLevelArea, newArea); - UpdateMountCapability(); if ((oldAreaEntry != null && oldAreaEntry.GetFlags2().HasFlag(AreaFlags2.UseSubzoneForChatChannel)) || (area != null && area.GetFlags2().HasFlag(AreaFlags2.UseSubzoneForChatChannel))) UpdateLocalChannels(newArea); + + if (oldArea != newArea) + { + UpdateCriteria(CriteriaType.EnterArea, newArea); + UpdateCriteria(CriteriaType.LeaveArea, oldArea); + } } public void UpdateZone(uint newZone, uint newArea) @@ -223,6 +227,9 @@ namespace Game.Entities Guild guild = GetGuild(); if (guild != null) guild.UpdateMemberData(this, GuildMemberData.ZoneId, newZone); + + UpdateCriteria(CriteriaType.EnterTopLevelArea, newZone); + UpdateCriteria(CriteriaType.LeaveTopLevelArea, oldZone); } }