Core/Achievements: Fixed achievement criteria StartEvent and FailEvent

* Criteria using StartEvent cannot be updated without that event triggering first (not only for timed achievements)
* Implemented most StartEvent and FailEvent types
* Fixed saving criteria removed by RemoveCriteriaProgress
Port From (https://github.com/TrinityCore/TrinityCore/commit/41a20b1e4008d450d075847ef1fe367f0e3a240f)
This commit is contained in:
hondacrx
2024-01-30 10:22:01 -05:00
parent 902b217d88
commit a1cb1d95ee
16 changed files with 148 additions and 211 deletions
@@ -6,6 +6,7 @@ using Game.Achievements;
using Game.DataStorage;
using Game.Guilds;
using Game.Scenarios;
using System;
using System.Collections.Generic;
namespace Game.Entities
@@ -36,20 +37,16 @@ namespace Game.Entities
{
return m_achievementSys.HasAchieved(achievementId);
}
public void StartCriteriaTimer(CriteriaStartEvent startEvent, uint entry, uint timeLost = 0)
public void StartCriteria(CriteriaStartEvent startEvent, uint entry, TimeSpan timeLost = default)
{
m_achievementSys.StartCriteriaTimer(startEvent, entry, timeLost);
m_achievementSys.StartCriteria(startEvent, entry, timeLost);
}
public void RemoveCriteriaTimer(CriteriaStartEvent startEvent, uint entry)
public void FailCriteria(CriteriaFailEvent failEvent, uint failAsset)
{
m_achievementSys.RemoveCriteriaTimer(startEvent, entry);
}
public void ResetCriteria(CriteriaFailEvent failEvent, uint failAsset, bool evenIfCriteriaComplete = false)
{
m_achievementSys.ResetCriteria(failEvent, failAsset, evenIfCriteriaComplete);
m_questObjectiveCriteriaMgr.ResetCriteria(failEvent, failAsset, evenIfCriteriaComplete);
m_achievementSys.FailCriteria(failEvent, failAsset);
m_questObjectiveCriteriaMgr.FailCriteria(failEvent, failAsset);
}
public void UpdateCriteria(CriteriaType type, ulong miscValue1 = 0, ulong miscValue2 = 0, ulong miscValue3 = 0, WorldObject refe = null)
+6 -2
View File
@@ -194,6 +194,8 @@ namespace Game.Entities
if (_garrison != null)
_garrison.ResetFollowerActivationLimit();
FailCriteria(CriteriaFailEvent.DailyQuestsCleared, 0);
}
public void ResetWeeklyQuestStatus()
@@ -837,7 +839,7 @@ namespace Game.Entities
m_QuestStatusSave[questId] = QuestSaveType.Default;
StartCriteriaTimer(CriteriaStartEvent.AcceptQuest, questId);
StartCriteria(CriteriaStartEvent.AcceptQuest, questId);
SendQuestUpdate(questId);
@@ -1146,6 +1148,7 @@ namespace Game.Entities
SetDailyQuestStatus(questId);
if (quest.IsDaily())
{
StartCriteria(CriteriaStartEvent.CompleteDailyQuest, 0);
UpdateCriteria(CriteriaType.CompleteDailyQuest, questId);
UpdateCriteria(CriteriaType.CompleteAnyDailyQuestPerDay, questId);
}
@@ -2393,7 +2396,7 @@ namespace Game.Entities
real_entry = killed.GetEntry();
}
StartCriteriaTimer(CriteriaStartEvent.KillNPC, real_entry); // MUST BE CALLED FIRST
StartCriteria(CriteriaStartEvent.KillNPC, real_entry); // MUST BE CALLED FIRST
UpdateCriteria(CriteriaType.KillCreature, real_entry, addKillCount, 0, killed);
UpdateQuestObjectiveProgress(QuestObjectiveType.Monster, (int)entry, 1, guid);
@@ -2401,6 +2404,7 @@ namespace Game.Entities
public void KilledPlayerCredit(ObjectGuid victimGuid)
{
StartCriteria(CriteriaStartEvent.KillPlayer, 0);
UpdateQuestObjectiveProgress(QuestObjectiveType.PlayerKills, 0, 1, victimGuid);
}
+3 -2
View File
@@ -416,7 +416,7 @@ namespace Game.Entities
}
}
m_achievementSys.UpdateTimedCriteria(diff);
m_achievementSys.UpdateTimedCriteria(TimeSpan.FromMilliseconds(diff));
if (HasUnitState(UnitState.MeleeAttacking) && !HasUnitState(UnitState.Casting | UnitState.Charging))
{
@@ -662,7 +662,7 @@ namespace Game.Entities
UpdateCriteria(CriteriaType.DieInInstance, 1);
// reset all death criterias
ResetCriteria(CriteriaFailEvent.Death, 0);
FailCriteria(CriteriaFailEvent.Death, 0);
}
base.SetDeathState(s);
@@ -5365,6 +5365,7 @@ namespace Game.Entities
DB.Characters.CommitTransaction(trans);
}
StartCriteria(CriteriaStartEvent.ReachLevel, level);
UpdateCriteria(CriteriaType.ReachLevel);
UpdateCriteria(CriteriaType.ActivelyReachLevel, level);
+20 -1
View File
@@ -3754,8 +3754,12 @@ namespace Game.Entities
Player player = ToPlayer();
if (player != null)
{
if (Global.ConditionMgr.IsSpellUsedInSpellClickConditions(aurApp.GetBase().GetId()))
player.UpdateVisibleGameobjectsOrSpellClicks();
player.FailCriteria(CriteriaFailEvent.LoseAura, aurApp.GetBase().GetId());
}
}
public void _UnapplyAura(AuraApplication aurApp, AuraRemoveMode removeMode)
@@ -3970,8 +3974,14 @@ namespace Game.Entities
Player player = ToPlayer();
if (player != null)
{
if (Global.ConditionMgr.IsSpellUsedInSpellClickConditions(aurApp.GetBase().GetId()))
player.UpdateVisibleGameobjectsOrSpellClicks();
player.UpdateVisibleGameobjectsOrSpellClicks();
player.FailCriteria(CriteriaFailEvent.GainAura, aurApp.GetBase().GetId());
player.StartCriteria(CriteriaStartEvent.GainAura, aurApp.GetBase().GetId());
player.UpdateCriteria(CriteriaType.GainAura, aurApp.GetBase().GetId());
}
}
public void _AddAura(UnitAura aura, Unit caster)
@@ -4370,10 +4380,19 @@ namespace Game.Entities
public void _RegisterAuraEffect(AuraEffect aurEff, bool apply)
{
if (apply)
{
m_modAuras.Add(aurEff.GetAuraType(), aurEff);
Player player = ToPlayer();
if (player != null)
{
player.StartCriteria(CriteriaStartEvent.GainAuraEffect, (uint)aurEff.GetAuraType());
player.FailCriteria(CriteriaFailEvent.GainAuraEffect, (uint)aurEff.GetAuraType());
}
}
else
m_modAuras.Remove(aurEff.GetAuraType(), aurEff);
}
public float GetTotalAuraModValue(UnitMods unitMod)
{
if (unitMod >= UnitMods.End)