diff --git a/Source/Framework/Constants/AchievementConst.cs b/Source/Framework/Constants/AchievementConst.cs index 6dec1001e..ded0454d9 100644 --- a/Source/Framework/Constants/AchievementConst.cs +++ b/Source/Framework/Constants/AchievementConst.cs @@ -420,6 +420,27 @@ namespace Framework.Constants Max } + public enum CriteriaStartEvent : byte + { + None = 0, // - NONE - + ReachLevel = 1, // Reach level {#Level} + CompleteDailyQuest = 2, // Complete daily quest "{QuestV2}" + StartBattleground = 3, // Start battleground "{Map}" + WinRankedArenaMatchWithTeamSize = 4, // Win a ranked arena match with team size {#Team Size} + GainAura = 5, // Gain aura "{Spell}" + GainAuraEffect = 6, // Gain aura effect "{SpellAuraNames.EnumID}" + CastSpell = 7, // Cast spell "{Spell}" + BeSpellTarget = 8, // Have spell "{Spell}" cast on you + AcceptQuest = 9, // Accept quest "{QuestV2}" + KillNPC = 10, // Kill NPC "{Creature}" + KillPlayer = 11, // Kill player + UseItem = 12, // Use item "{Item}" + SendEvent = 13, // Send event "{GameEvents}" (player-sent/instance only) + BeginScenarioStep = 14, // Begin scenario step "{#Step}" (for use with "Player on Scenario" modifier only) + + Max + } + public enum CriteriaFlags { ShowProgressBar = 0x01, @@ -430,21 +451,6 @@ namespace Framework.Constants MoneyCounter = 0x20 } - public enum CriteriaTimedTypes : byte - { - Event = 1, // Timer Is Started By Internal Event With Id In Timerstartevent - Quest = 2, // Timer Is Started By Accepting Quest With Entry In Timerstartevent - SpellCaster = 5, // Timer Is Started By Casting A Spell With Entry In Timerstartevent - SpellTarget = 6, // Timer Is Started By Being Target Of Spell With Entry In Timerstartevent - Creature = 7, // Timer Is Started By Killing Creature With Entry In Timerstartevent - Item = 9, // Timer Is Started By Using Item With Entry In Timerstartevent - Unk = 10, // Unknown - Unk2 = 13, // Unknown - ScenarioStage = 14, // Timer is started by changing stages in a scenario - - Max - } - public enum CriteriaTypes : byte { KillCreature = 0, diff --git a/Source/Game/Achievements/CriteriaHandler.cs b/Source/Game/Achievements/CriteriaHandler.cs index a3be3e7a7..79fae86dc 100644 --- a/Source/Game/Achievements/CriteriaHandler.cs +++ b/Source/Game/Achievements/CriteriaHandler.cs @@ -484,9 +484,9 @@ namespace Game.Achievements } } - public void StartCriteriaTimer(CriteriaTimedTypes type, uint entry, uint timeLost = 0) + public void StartCriteriaTimer(CriteriaStartEvent startEvent, uint entry, uint timeLost = 0) { - List criteriaList = Global.CriteriaMgr.GetTimedCriteriaByType(type); + List criteriaList = Global.CriteriaMgr.GetTimedCriteriaByType(startEvent); foreach (Criteria criteria in criteriaList) { if (criteria.Entry.StartAsset != entry) @@ -515,9 +515,9 @@ namespace Game.Achievements } } - public void RemoveCriteriaTimer(CriteriaTimedTypes type, uint entry) + public void RemoveCriteriaTimer(CriteriaStartEvent startEvent, uint entry) { - List criteriaList = Global.CriteriaMgr.GetTimedCriteriaByType(type); + List criteriaList = Global.CriteriaMgr.GetTimedCriteriaByType(startEvent); foreach (Criteria criteria in criteriaList) { if (criteria.Entry.StartAsset != entry) @@ -2626,7 +2626,7 @@ namespace Game.Achievements MultiMap _scenarioCriteriasByType = new(); MultiMap _questObjectiveCriteriasByType = new(); - MultiMap _criteriasByTimedType = new(); + MultiMap _criteriasByTimedType = new(); MultiMap[] _criteriasByFailEvent = new MultiMap[(int)CriteriaFailEvent.Max]; CriteriaManager() @@ -2758,7 +2758,7 @@ namespace Game.Achievements { Cypher.Assert(criteriaEntry.Type < CriteriaTypes.TotalTypes, $"CRITERIA_TYPE_TOTAL must be greater than or equal to {criteriaEntry.Type + 1} but is currently equal to {CriteriaTypes.TotalTypes}"); - Cypher.Assert(criteriaEntry.StartEvent < CriteriaTimedTypes.Max, $"CRITERIA_TYPE_TOTAL must be greater than or equal to {criteriaEntry.StartEvent + 1} but is currently equal to {CriteriaTimedTypes.Max}"); + Cypher.Assert(criteriaEntry.StartEvent < (byte)CriteriaStartEvent.Max, $"CRITERIA_TYPE_TOTAL must be greater than or equal to {criteriaEntry.StartEvent + 1} but is currently equal to {CriteriaStartEvent.Max}"); Cypher.Assert(criteriaEntry.FailEvent < (byte)CriteriaFailEvent.Max, $"CRITERIA_CONDITION_MAX must be greater than or equal to {criteriaEntry.FailEvent + 1} but is currently equal to {CriteriaFailEvent.Max}"); var treeList = _criteriaTreeByCriteria.LookupByKey(criteriaEntry.Id); @@ -2841,7 +2841,7 @@ namespace Game.Achievements } if (criteriaEntry.StartTimer != 0) - _criteriasByTimedType.Add(criteriaEntry.StartEvent, criteria); + _criteriasByTimedType.Add((CriteriaStartEvent)criteriaEntry.StartEvent, criteria); if (criteriaEntry.FailEvent != 0) _criteriasByFailEvent[criteriaEntry.FailEvent].Add((int)criteriaEntry.FailAsset, criteria); @@ -2995,9 +2995,9 @@ namespace Game.Achievements return _criteriaTreeByCriteria.LookupByKey(criteriaId); } - public List GetTimedCriteriaByType(CriteriaTimedTypes type) + public List GetTimedCriteriaByType(CriteriaStartEvent startEvent) { - return _criteriasByTimedType.LookupByKey(type); + return _criteriasByTimedType.LookupByKey(startEvent); } public List GetCriteriaByFailEvent(CriteriaFailEvent failEvent, int asset) diff --git a/Source/Game/BattleGrounds/BattleGround.cs b/Source/Game/BattleGrounds/BattleGround.cs index 3616aa386..eb10eed02 100644 --- a/Source/Game/BattleGrounds/BattleGround.cs +++ b/Source/Game/BattleGrounds/BattleGround.cs @@ -1772,13 +1772,13 @@ namespace Game.BattleGrounds return Global.ObjectMgr.GetClosestGraveYard(player, player.GetTeam(), player); } - public void StartCriteriaTimer(CriteriaTimedTypes type, uint entry) + public void StartCriteriaTimer(CriteriaStartEvent startEvent, uint entry) { foreach (var guid in GetPlayers().Keys) { Player player = Global.ObjAccessor.FindPlayer(guid); if (player) - player.StartCriteriaTimer(type, entry); + player.StartCriteriaTimer(startEvent, entry); } } diff --git a/Source/Game/BattleGrounds/Zones/ArathiBasin.cs b/Source/Game/BattleGrounds/Zones/ArathiBasin.cs index e0804216a..fc952ee56 100644 --- a/Source/Game/BattleGrounds/Zones/ArathiBasin.cs +++ b/Source/Game/BattleGrounds/Zones/ArathiBasin.cs @@ -212,7 +212,7 @@ namespace Game.BattleGrounds.Zones DoorOpen(ABObjectTypes.GateH); // Achievement: Let's Get This Done - StartCriteriaTimer(CriteriaTimedTypes.Event, EventStartBattle); + StartCriteriaTimer(CriteriaStartEvent.SendEvent, EventStartBattle); } public override void AddPlayer(Player player) diff --git a/Source/Game/BattleGrounds/Zones/EyeofStorm.cs b/Source/Game/BattleGrounds/Zones/EyeofStorm.cs index ad76c9ef5..143333219 100644 --- a/Source/Game/BattleGrounds/Zones/EyeofStorm.cs +++ b/Source/Game/BattleGrounds/Zones/EyeofStorm.cs @@ -132,7 +132,7 @@ namespace Game.BattleGrounds.Zones } // Achievement: Flurry - StartCriteriaTimer(CriteriaTimedTypes.Event, EotSMisc.EventStartBattle); + StartCriteriaTimer(CriteriaStartEvent.SendEvent, EotSMisc.EventStartBattle); } void AddPoints(Team Team, uint Points) diff --git a/Source/Game/BattleGrounds/Zones/StrandofAncients.cs b/Source/Game/BattleGrounds/Zones/StrandofAncients.cs index 7c8d75d64..612666fcd 100644 --- a/Source/Game/BattleGrounds/Zones/StrandofAncients.cs +++ b/Source/Game/BattleGrounds/Zones/StrandofAncients.cs @@ -344,7 +344,7 @@ namespace Game.BattleGrounds.Zones ToggleTimer(); DemolisherStartState(false); Status = SAStatus.RoundOne; - StartCriteriaTimer(CriteriaTimedTypes.Event, (Attackers == TeamId.Alliance) ? 23748 : 21702u); + StartCriteriaTimer(CriteriaStartEvent.SendEvent, (Attackers == TeamId.Alliance) ? 23748 : 21702u); } if (TotalTime >= SATimers.BoatStart) StartShips(); @@ -367,7 +367,7 @@ namespace Game.BattleGrounds.Zones ToggleTimer(); DemolisherStartState(false); Status = SAStatus.RoundTwo; - StartCriteriaTimer(CriteriaTimedTypes.Event, (Attackers == TeamId.Alliance) ? 23748 : 21702u); + StartCriteriaTimer(CriteriaStartEvent.SendEvent, (Attackers == TeamId.Alliance) ? 23748 : 21702u); // status was set to STATUS_WAIT_JOIN manually for Preparation, set it back now SetStatus(BattlegroundStatus.InProgress); foreach (var pair in GetPlayers()) diff --git a/Source/Game/BattleGrounds/Zones/WarsongGluch.cs b/Source/Game/BattleGrounds/Zones/WarsongGluch.cs index 67c75f96e..da0561d4d 100644 --- a/Source/Game/BattleGrounds/Zones/WarsongGluch.cs +++ b/Source/Game/BattleGrounds/Zones/WarsongGluch.cs @@ -195,7 +195,7 @@ namespace Game.BattleGrounds.Zones SpawnBGObject(WSGObjectTypes.DoorH4, BattlegroundConst.RespawnOneDay); // players joining later are not eligibles - StartCriteriaTimer(CriteriaTimedTypes.Event, 8563); + StartCriteriaTimer(CriteriaStartEvent.SendEvent, 8563); } public override void AddPlayer(Player player) @@ -446,7 +446,7 @@ namespace Game.BattleGrounds.Zones UpdateFlagState(Team.Horde, WSGFlagState.OnPlayer); UpdateWorldState(WSGWorldStates.FlagUnkAlliance, 1); player.CastSpell(player, WSGSpellId.SilverwingFlag, true); - player.StartCriteriaTimer(CriteriaTimedTypes.SpellTarget, WSGSpellId.SilverwingFlagPicked); + player.StartCriteriaTimer(CriteriaStartEvent.BeSpellTarget, WSGSpellId.SilverwingFlagPicked); if (_flagState[1] == WSGFlagState.OnPlayer) _bothFlagsKept = true; } @@ -464,7 +464,7 @@ namespace Game.BattleGrounds.Zones UpdateFlagState(Team.Alliance, WSGFlagState.OnPlayer); UpdateWorldState(WSGWorldStates.FlagUnkHorde, 1); player.CastSpell(player, WSGSpellId.WarsongFlag, true); - player.StartCriteriaTimer(CriteriaTimedTypes.SpellTarget, WSGSpellId.WarsongFlagPicked); + player.StartCriteriaTimer(CriteriaStartEvent.BeSpellTarget, WSGSpellId.WarsongFlagPicked); if (_flagState[0] == WSGFlagState.OnPlayer) _bothFlagsKept = true; } diff --git a/Source/Game/DataStorage/Structs/C_Records.cs b/Source/Game/DataStorage/Structs/C_Records.cs index 0ce205b96..d9cc059a6 100644 --- a/Source/Game/DataStorage/Structs/C_Records.cs +++ b/Source/Game/DataStorage/Structs/C_Records.cs @@ -479,7 +479,7 @@ namespace Game.DataStorage public CriteriaTypes Type; public uint Asset; public uint ModifierTreeId; - public CriteriaTimedTypes StartEvent; + public byte StartEvent; public uint StartAsset; public ushort StartTimer; public byte FailEvent; diff --git a/Source/Game/Entities/Player/Player.Achievement.cs b/Source/Game/Entities/Player/Player.Achievement.cs index 5d7bb86d8..0f5c4ec18 100644 --- a/Source/Game/Entities/Player/Player.Achievement.cs +++ b/Source/Game/Entities/Player/Player.Achievement.cs @@ -43,14 +43,14 @@ namespace Game.Entities { return m_achievementSys.HasAchieved(achievementId); } - public void StartCriteriaTimer(CriteriaTimedTypes type, uint entry, uint timeLost = 0) + public void StartCriteriaTimer(CriteriaStartEvent startEvent, uint entry, uint timeLost = 0) { - m_achievementSys.StartCriteriaTimer(type, entry, timeLost); + m_achievementSys.StartCriteriaTimer(startEvent, entry, timeLost); } - public void RemoveCriteriaTimer(CriteriaTimedTypes type, uint entry) + public void RemoveCriteriaTimer(CriteriaStartEvent startEvent, uint entry) { - m_achievementSys.RemoveCriteriaTimer(type, entry); + m_achievementSys.RemoveCriteriaTimer(startEvent, entry); } public void ResetCriteria(CriteriaFailEvent failEvent, uint failAsset, bool evenIfCriteriaComplete = false) diff --git a/Source/Game/Entities/Player/Player.Quest.cs b/Source/Game/Entities/Player/Player.Quest.cs index b31555d28..48948efcf 100644 --- a/Source/Game/Entities/Player/Player.Quest.cs +++ b/Source/Game/Entities/Player/Player.Quest.cs @@ -810,7 +810,7 @@ namespace Game.Entities m_QuestStatusSave[questId] = QuestSaveType.Default; - StartCriteriaTimer(CriteriaTimedTypes.Quest, questId); + StartCriteriaTimer(CriteriaStartEvent.AcceptQuest, questId); SendQuestUpdate(questId); @@ -2234,7 +2234,7 @@ namespace Game.Entities real_entry = killed.GetEntry(); } - StartCriteriaTimer(CriteriaTimedTypes.Creature, real_entry); // MUST BE CALLED FIRST + StartCriteriaTimer(CriteriaStartEvent.KillNPC, real_entry); // MUST BE CALLED FIRST UpdateCriteria(CriteriaTypes.KillCreature, real_entry, addKillCount, 0, killed); UpdateQuestObjectiveProgress(QuestObjectiveType.Monster, (int)entry, 1, guid); diff --git a/Source/Game/Handlers/QuestHandler.cs b/Source/Game/Handlers/QuestHandler.cs index f1d588e8c..cdd3b0671 100644 --- a/Source/Game/Handlers/QuestHandler.cs +++ b/Source/Game/Handlers/QuestHandler.cs @@ -460,7 +460,7 @@ namespace Game GetPlayer().TakeQuestSourceItem(questId, true); // remove quest src item from player GetPlayer().AbandonQuest(questId); // remove all quest items player received before abandoning quest. Note, this does not remove normal drop items that happen to be quest requirements. GetPlayer().RemoveActiveQuest(questId); - GetPlayer().RemoveCriteriaTimer(CriteriaTimedTypes.Quest, questId); + GetPlayer().RemoveCriteriaTimer(CriteriaStartEvent.AcceptQuest, questId); Log.outInfo(LogFilter.Network, "Player {0} abandoned quest {1}", GetPlayer().GetGUID().ToString(), questId); diff --git a/Source/Game/Maps/Instances/InstanceScript.cs b/Source/Game/Maps/Instances/InstanceScript.cs index 34832bb6e..9ed2b5035 100644 --- a/Source/Game/Maps/Instances/InstanceScript.cs +++ b/Source/Game/Maps/Instances/InstanceScript.cs @@ -615,23 +615,23 @@ namespace Game.Maps } // Start timed achievement for all players in instance - public void DoStartCriteriaTimer(CriteriaTimedTypes type, uint entry) + public void DoStartCriteriaTimer(CriteriaStartEvent startEvent, uint entry) { var PlayerList = instance.GetPlayers(); if (!PlayerList.Empty()) foreach (var player in PlayerList) - player.StartCriteriaTimer(type, entry); + player.StartCriteriaTimer(startEvent, entry); } // Stop timed achievement for all players in instance - public void DoStopCriteriaTimer(CriteriaTimedTypes type, uint entry) + public void DoStopCriteriaTimer(CriteriaStartEvent startEvent, uint entry) { var PlayerList = instance.GetPlayers(); if (!PlayerList.Empty()) foreach (var player in PlayerList) - player.RemoveCriteriaTimer(type, entry); + player.RemoveCriteriaTimer(startEvent, entry); } // Remove Auras due to Spell on all players in instance diff --git a/Source/Game/Spells/Spell.cs b/Source/Game/Spells/Spell.cs index 6bd6f43e1..584989aea 100644 --- a/Source/Game/Spells/Spell.cs +++ b/Source/Game/Spells/Spell.cs @@ -2092,7 +2092,7 @@ namespace Game.Spells Player player = unit.ToPlayer(); if (player != null) { - player.StartCriteriaTimer(CriteriaTimedTypes.SpellTarget, m_spellInfo.Id); + player.StartCriteriaTimer(CriteriaStartEvent.BeSpellTarget, m_spellInfo.Id); player.UpdateCriteria(CriteriaTypes.BeSpellTarget, m_spellInfo.Id, 0, 0, m_caster); player.UpdateCriteria(CriteriaTypes.BeSpellTarget2, m_spellInfo.Id); } @@ -2100,7 +2100,7 @@ namespace Game.Spells player = m_caster.ToPlayer(); if (player != null) { - player.StartCriteriaTimer(CriteriaTimedTypes.SpellCaster, m_spellInfo.Id); + player.StartCriteriaTimer(CriteriaStartEvent.CastSpell, m_spellInfo.Id); player.UpdateCriteria(CriteriaTypes.CastSpell2, m_spellInfo.Id, 0, 0, unit); } @@ -2848,7 +2848,7 @@ namespace Game.Spells { if (!Convert.ToBoolean(_triggeredCastFlags & TriggerCastFlags.IgnoreCastItem) && m_CastItem != null) { - player.StartCriteriaTimer(CriteriaTimedTypes.Item, m_CastItem.GetEntry()); + player.StartCriteriaTimer(CriteriaStartEvent.UseItem, m_CastItem.GetEntry()); player.UpdateCriteria(CriteriaTypes.UseItem, m_CastItem.GetEntry()); }