Core/Achievements: Reduce the list of criteria types updated on login

* Implemented CriteriaType::ReachMaxLevel
* Corrected implementations for CriteriaType::ReachRenownLevel and CriteriaType::LearnTaxiNode
Port From (https://github.com/TrinityCore/TrinityCore/commit/6da1679cbfdc56cd5f1cab7148f645916bccecc1)
This commit is contained in:
Hondacrx
2025-02-24 11:01:12 -05:00
parent 70998199c0
commit 0d5c0b572d
5 changed files with 676 additions and 606 deletions
@@ -613,7 +613,7 @@ namespace Framework.Constants
TotalFactionsEncountered = 89, // Total factions encountered
LootAnyItem = 90, // Loot any item
ObtainAnyItem = 91, // Obtain any item
AnyoneTriggerGameEventScenario = 92, /*NYI*/ // Anyone will Trigger game event "{GameEvents}" (Scenario Only)
AnyoneTriggerGameEventScenario = 92, // Anyone will Trigger game event "{GameEvents}" (Scenario Only)
RollAnyNeed = 93, // Roll any number on need
RollAnyGreed = 94, // Roll any number on greed
ReleasedSpirit = 95, /*NYI*/ // Released Spirit
@@ -742,7 +742,7 @@ namespace Framework.Constants
CompleteAnyReplayQuest = 218, // Complete Any Replay Quest
BuyItemsFromVendors = 219, // Buy items from vendors
SellItemsToVendors = 220, // Sell items to vendors
ReachMaxLevel = 221, /*NYI*/ // Reach Max Level
ReachMaxLevel = 221, // Reach Max Level
MemorizeSpell = 222, /*NYI*/ // Memorize Spell "{Spell}"
LearnTransmogIllusion = 223, /*NYI*/ // Learn Transmog Illusion
LearnAnyTransmogIllusion = 224, /*NYI*/ // Learn Any Transmog Illusion
@@ -31,8 +31,8 @@ namespace Game.Achievements
public void CheckAllAchievementCriteria(Player referencePlayer)
{
// suppress sending packets
for (CriteriaType i = 0; i < CriteriaType.Count; ++i)
UpdateCriteria(i, 0, 0, 0, null, referencePlayer);
foreach (CriteriaType criteriaType in CriteriaManager.GetRetroactivelyUpdateableCriteriaTypes())
UpdateCriteria(criteriaType, 0, 0, 0, null, referencePlayer);
}
public bool HasAchieved(uint achievementId)
+86 -18
View File
@@ -144,6 +144,8 @@ namespace Game.Achievements
case CriteriaType.CompleteAnyReplayQuest:
case CriteriaType.BuyItemsFromVendors:
case CriteriaType.SellItemsToVendors:
case CriteriaType.ReachMaxLevel:
case CriteriaType.LearnTaxiNode:
SetCriteriaProgress(criteria, 1, referencePlayer, ProgressType.Accumulate);
break;
// std case: increment at miscValue1
@@ -815,6 +817,8 @@ namespace Game.Achievements
case CriteriaType.BuyItemsFromVendors:
case CriteriaType.SellItemsToVendors:
case CriteriaType.GainLevels:
case CriteriaType.ReachRenownLevel:
case CriteriaType.LearnTaxiNode:
return progress.Counter >= requiredAmount;
case CriteriaType.EarnAchievement:
case CriteriaType.CompleteQuest:
@@ -833,6 +837,7 @@ namespace Game.Achievements
case CriteriaType.PrestigeLevelIncrease:
case CriteriaType.ActivelyReachLevel:
case CriteriaType.CollectTransmogSetFromGroup:
case CriteriaType.ReachMaxLevel:
case CriteriaType.EnterTopLevelArea:
case CriteriaType.LeaveTopLevelArea:
return progress.Counter >= 1;
@@ -1173,6 +1178,7 @@ namespace Game.Achievements
return false;
break;
case CriteriaType.CurrencyGained:
case CriteriaType.ReachRenownLevel:
if (miscValue1 == 0 || miscValue2 == 0 || (long)miscValue2 < 0
|| miscValue1 != criteria.Entry.Asset)
return false;
@@ -1229,6 +1235,10 @@ namespace Game.Achievements
if (miscValue1 == 0 || miscValue1 != criteria.Entry.Asset)
return false;
break;
case CriteriaType.LearnTaxiNode:
if (miscValue1 != criteria.Entry.Asset)
return false;
break;
default:
break;
}
@@ -4086,6 +4096,62 @@ namespace Game.Achievements
return _criteriaModifiers.LookupByKey(modifierTreeId);
}
public static CriteriaType[] GetRetroactivelyUpdateableCriteriaTypes() =>
[
CriteriaType.CompleteResearchProject,
CriteriaType.CompleteAnyResearchProject,
CriteriaType.ReachLevel,
CriteriaType.SkillRaised,
CriteriaType.CompleteQuestsCount,
CriteriaType.CompleteAnyDailyQuestPerDay,
CriteriaType.CompleteQuestsInZone,
CriteriaType.CompleteQuest,
CriteriaType.LearnOrKnowSpell,
CriteriaType.AcquireItem,
CriteriaType.EarnPersonalArenaRating,
CriteriaType.AchieveSkillStep,
CriteriaType.RevealWorldMapOverlay,
//CriteriaType.EarnTitle, /*NYI*/
CriteriaType.BankSlotsPurchased,
CriteriaType.ReputationGained,
CriteriaType.TotalExaltedFactions,
//CriteriaType.CompleteQuestsInSort, /*NYI*/
CriteriaType.LearnSpellFromSkillLine,
CriteriaType.MostMoneyOwned,
CriteriaType.TotalReveredFactions,
CriteriaType.TotalHonoredFactions,
CriteriaType.TotalFactionsEncountered,
//CriteriaType.AccountKnownPet, /*NYI*/
CriteriaType.LearnTradeskillSkillLine,
CriteriaType.HonorableKills,
//CriteriaType.GuildBankTabsPurchased, /*NYI*/
//CriteriaType.EarnGuildAchievementPoints, /*NYI*/
//CriteriaType.EarnBattlegroundRating, /*NYI*/
//CriteriaType.GuildTabardCreated, /*NYI*/
CriteriaType.LearnedNewPet,
CriteriaType.UniquePetsOwned,
//CriteriaType.UpgradeGarrison, /*NYI*/
//CriteriaType.AcquireGarrison, /*NYI*/
//CriteriaType.LearnGarrisonBlueprint, /*NYI*/
//CriteriaType.LearnGarrisonSpecialization, /*NYI*/
//CriteriaType.LearnToy, /*NYI*/ // Learn Toy "{Item}"
//CriteriaType.LearnAnyToy, /*NYI*/ // Learn Any Toy
//CriteriaType.LearnTransmog, /*NYI*/
CriteriaType.HonorLevelIncrease,
//CriteriaType.AccountHonorLevelReached, /*NYI*/
CriteriaType.ReachMaxLevel,
//CriteriaType.MemorizeSpell, /*NYI*/
//CriteriaType.LearnTransmogIllusion, /*NYI*/
//CriteriaType.MythicPlusRatingAttained, /*NYI*/
//CriteriaType.MythicPlusDisplaySeasonEnded, /*NYI*/
//CriteriaType.CompleteTrackingQuest, /*NYI*/
//CriteriaType.WarbandBankTabPurchased, /*NYI*/
CriteriaType.LearnTaxiNode,
CriteriaType.EarnAchievementPoints,
CriteriaType.BattlePetAchievementPointsEarned,
CriteriaType.EarnAchievement // criteria possibly completed by retroactive scan, must be last
];
bool IsCriteriaTypeStoredByAsset(CriteriaType type)
{
switch (type)
@@ -4123,6 +4189,8 @@ namespace Game.Achievements
case CriteriaType.LandTargetedSpellOnTarget:
case CriteriaType.LearnTradeskillSkillLine:
case CriteriaType.DefeatDungeonEncounter:
case CriteriaType.LearnToy:
case CriteriaType.LearnAnyTransmog:
return true;
default:
return false;
@@ -4215,21 +4283,21 @@ namespace Game.Achievements
}
public class ModifierTreeNode
{
{
public ModifierTreeRecord Entry;
public List<ModifierTreeNode> Children = new();
}
}
public class Criteria
{
public class Criteria
{
public uint Id;
public CriteriaRecord Entry;
public ModifierTreeNode Modifier;
public CriteriaFlagsCu FlagsCu;
}
}
public class CriteriaTree
{
public class CriteriaTree
{
public uint Id;
public CriteriaTreeRecord Entry;
public AchievementRecord Achievement;
@@ -4237,19 +4305,19 @@ namespace Game.Achievements
public QuestObjective QuestObjective;
public Criteria Criteria;
public List<CriteriaTree> Children = new();
}
}
public class CriteriaProgress
{
public class CriteriaProgress
{
public ulong Counter;
public long Date; // latest update time.
public ObjectGuid PlayerGUID; // GUID of the player that completed this criteria (guild achievements)
public bool Changed;
}
}
[StructLayout(LayoutKind.Explicit)]
public class CriteriaData
{
[StructLayout(LayoutKind.Explicit)]
public class CriteriaData
{
[FieldOffset(0)]
public CriteriaDataType DataType;
@@ -4818,10 +4886,10 @@ namespace Game.Achievements
public uint Value2;
}
#endregion
}
}
public class CriteriaDataSet
{
public class CriteriaDataSet
{
uint _criteriaId;
List<CriteriaData> _storage = new();
@@ -4837,5 +4905,5 @@ namespace Game.Achievements
}
public void SetCriteriaId(uint id) { _criteriaId = id; }
}
}
}
+2
View File
@@ -5453,6 +5453,8 @@ namespace Game.Entities
UpdateCriteria(CriteriaType.ActivelyReachLevel, level);
if (level > oldLevel)
UpdateCriteria(CriteriaType.GainLevels, level - oldLevel);
if (IsMaxLevel())
UpdateCriteria(CriteriaType.ReachMaxLevel);
PushQuests();
@@ -22,8 +22,8 @@ namespace Game
public void CheckAllQuestObjectiveCriteria(Player referencePlayer)
{
// suppress sending packets
for (CriteriaType i = 0; i < CriteriaType.Count; ++i)
UpdateCriteria(i, 0, 0, 0, null, referencePlayer);
foreach (CriteriaType criteriaType in CriteriaManager.GetRetroactivelyUpdateableCriteriaTypes())
UpdateCriteria(criteriaType, 0, 0, 0, null, referencePlayer);
}
public override void Reset()