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:
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user