Core/Achievements: Optimized resetting achievement criteria by condition and changed the functionality to properly reset all possible criteria with given condition
Port From (https://github.com/TrinityCore/TrinityCore/commit/6f7ff9a3efd10cd4f776a67540109e7bb774f1c5)
This commit is contained in:
@@ -91,11 +91,15 @@ namespace Framework.Constants
|
|||||||
Unk2 = 2,
|
Unk2 = 2,
|
||||||
BgMap = 3,
|
BgMap = 3,
|
||||||
NoLose = 4,
|
NoLose = 4,
|
||||||
Unk5 = 5,
|
RemoveAura = 5,
|
||||||
Unk8 = 8,
|
CastSpell = 8,
|
||||||
NoSpellHit = 9,
|
NoSpellHit = 9,
|
||||||
NotInGroup = 10,
|
NotInGroup = 10,
|
||||||
Unk13 = 13
|
LostPetBattle = 11,
|
||||||
|
Unk13 = 13,
|
||||||
|
Event = 14,
|
||||||
|
|
||||||
|
Max
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum CriteriaAdditionalCondition
|
public enum CriteriaAdditionalCondition
|
||||||
|
|||||||
@@ -355,36 +355,37 @@ namespace Game.Achievements
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ResetCriteria(CriteriaTypes type, ulong miscValue1, ulong miscValue2, bool evenIfCriteriaComplete)
|
public void ResetCriteria(CriteriaCondition condition, uint failAsset, bool evenIfCriteriaComplete)
|
||||||
{
|
{
|
||||||
Log.outDebug(LogFilter.Achievement, "ResetAchievementCriteria({0}, {1}, {2})", type, miscValue1, miscValue2);
|
Log.outDebug(LogFilter.Achievement, $"ResetAchievementCriteria({condition}, {failAsset}, {evenIfCriteriaComplete})");
|
||||||
|
|
||||||
// disable for gamemasters with GM-mode enabled
|
// disable for gamemasters with GM-mode enabled
|
||||||
if (_owner.IsGameMaster())
|
if (_owner.IsGameMaster())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var achievementCriteriaList = GetCriteriaByType(type);
|
var achievementCriteriaList = Global.CriteriaMgr.GetCriteriaByFailEvent(condition, (int)failAsset);
|
||||||
foreach (Criteria achievementCriteria in achievementCriteriaList)
|
if (!achievementCriteriaList.Empty())
|
||||||
{
|
{
|
||||||
if (achievementCriteria.Entry.FailEvent != miscValue1 || (achievementCriteria.Entry.FailAsset != 0 && achievementCriteria.Entry.FailAsset != miscValue2))
|
foreach (Criteria achievementCriteria in achievementCriteriaList)
|
||||||
continue;
|
|
||||||
|
|
||||||
var trees = Global.CriteriaMgr.GetCriteriaTreesByCriteria(achievementCriteria.Id);
|
|
||||||
bool allComplete = true;
|
|
||||||
foreach (CriteriaTree tree in trees)
|
|
||||||
{
|
{
|
||||||
// don't update already completed criteria if not forced or achievement already complete
|
|
||||||
if (!(IsCompletedCriteriaTree(tree) && !evenIfCriteriaComplete) || !HasAchieved(tree.Achievement.Id))
|
var trees = Global.CriteriaMgr.GetCriteriaTreesByCriteria(achievementCriteria.Id);
|
||||||
|
bool allComplete = true;
|
||||||
|
foreach (CriteriaTree tree in trees)
|
||||||
{
|
{
|
||||||
allComplete = false;
|
// don't update already completed criteria if not forced or achievement already complete
|
||||||
break;
|
if (!(IsCompletedCriteriaTree(tree) && !evenIfCriteriaComplete) || !HasAchieved(tree.Achievement.Id))
|
||||||
|
{
|
||||||
|
allComplete = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (allComplete)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
RemoveCriteriaProgress(achievementCriteria);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (allComplete)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
RemoveCriteriaProgress(achievementCriteria);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2620,6 +2620,8 @@ namespace Game.Achievements
|
|||||||
{
|
{
|
||||||
Cypher.Assert(criteriaEntry.Type < CriteriaTypes.TotalTypes,
|
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}");
|
$"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.FailEvent < (byte)CriteriaCondition.Max, $"CRITERIA_CONDITION_MAX must be greater than or equal to {criteriaEntry.FailEvent + 1} but is currently equal to {CriteriaCondition.Max}");
|
||||||
|
|
||||||
var treeList = _criteriaTreeByCriteria.LookupByKey(criteriaEntry.Id);
|
var treeList = _criteriaTreeByCriteria.LookupByKey(criteriaEntry.Id);
|
||||||
if (treeList.Empty())
|
if (treeList.Empty())
|
||||||
@@ -2678,6 +2680,9 @@ namespace Game.Achievements
|
|||||||
|
|
||||||
if (criteriaEntry.StartTimer != 0)
|
if (criteriaEntry.StartTimer != 0)
|
||||||
_criteriasByTimedType.Add(criteriaEntry.StartEvent, criteria);
|
_criteriasByTimedType.Add(criteriaEntry.StartEvent, criteria);
|
||||||
|
|
||||||
|
if (criteriaEntry.FailEvent != 0)
|
||||||
|
_criteriasByFailEvent[criteriaEntry.FailEvent].Add((int)criteriaEntry.FailAsset, criteria);
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (var p in _criteriaTrees)
|
foreach (var p in _criteriaTrees)
|
||||||
@@ -2789,6 +2794,11 @@ namespace Game.Achievements
|
|||||||
return _criteriasByTimedType.LookupByKey(type);
|
return _criteriasByTimedType.LookupByKey(type);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<Criteria> GetCriteriaByFailEvent(CriteriaCondition condition, int asset)
|
||||||
|
{
|
||||||
|
return _criteriasByFailEvent[(int)condition].LookupByKey(asset);
|
||||||
|
}
|
||||||
|
|
||||||
public CriteriaDataSet GetCriteriaDataSet(Criteria criteria)
|
public CriteriaDataSet GetCriteriaDataSet(Criteria criteria)
|
||||||
{
|
{
|
||||||
return _criteriaDataMap.LookupByKey(criteria.Id);
|
return _criteriaDataMap.LookupByKey(criteria.Id);
|
||||||
@@ -2835,6 +2845,7 @@ namespace Game.Achievements
|
|||||||
MultiMap<CriteriaTypes, Criteria> _questObjectiveCriteriasByType = new MultiMap<CriteriaTypes, Criteria>();
|
MultiMap<CriteriaTypes, Criteria> _questObjectiveCriteriasByType = new MultiMap<CriteriaTypes, Criteria>();
|
||||||
|
|
||||||
MultiMap<CriteriaTimedTypes, Criteria> _criteriasByTimedType = new MultiMap<CriteriaTimedTypes, Criteria>();
|
MultiMap<CriteriaTimedTypes, Criteria> _criteriasByTimedType = new MultiMap<CriteriaTimedTypes, Criteria>();
|
||||||
|
MultiMap<int, Criteria>[] _criteriasByFailEvent = new MultiMap<int, Criteria>[(int)CriteriaCondition.Max];
|
||||||
}
|
}
|
||||||
|
|
||||||
public class ModifierTreeNode
|
public class ModifierTreeNode
|
||||||
|
|||||||
@@ -282,7 +282,7 @@ namespace Game.Arenas
|
|||||||
loserArenaTeam.MemberLost(player, winnerMatchmakerRating, loserMatchmakerChange);
|
loserArenaTeam.MemberLost(player, winnerMatchmakerRating, loserMatchmakerChange);
|
||||||
|
|
||||||
// Arena lost => reset the win_rated_arena having the "no_lose" condition
|
// Arena lost => reset the win_rated_arena having the "no_lose" condition
|
||||||
player.ResetCriteria(CriteriaTypes.WinRatedArena, (uint)CriteriaCondition.NoLose);
|
player.ResetCriteria(CriteriaCondition.NoLose, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -914,6 +914,9 @@ namespace Game.BattleGrounds
|
|||||||
// reset destination bg team
|
// reset destination bg team
|
||||||
player.SetBGTeam(0);
|
player.SetBGTeam(0);
|
||||||
|
|
||||||
|
// remove all criterias on bg leave
|
||||||
|
player.ResetCriteria(CriteriaCondition.BgMap, GetMapId(), true);
|
||||||
|
|
||||||
if (Transport)
|
if (Transport)
|
||||||
player.TeleportToBGEntryPoint();
|
player.TeleportToBGEntryPoint();
|
||||||
|
|
||||||
@@ -1036,17 +1039,8 @@ namespace Game.BattleGrounds
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
player.ResetCriteria(CriteriaTypes.KillCreature, (int)CriteriaCondition.BgMap, GetMapId(), true);
|
// reset all map criterias on map enter
|
||||||
player.ResetCriteria(CriteriaTypes.WinBg, (int)CriteriaCondition.BgMap, GetMapId(), true);
|
player.ResetCriteria(CriteriaCondition.BgMap, GetMapId(), true);
|
||||||
player.ResetCriteria(CriteriaTypes.DamageDone, (int)CriteriaCondition.BgMap, GetMapId(), true);
|
|
||||||
player.ResetCriteria(CriteriaTypes.BeSpellTarget, (int)CriteriaCondition.BgMap, GetMapId(), true);
|
|
||||||
player.ResetCriteria(CriteriaTypes.CastSpell, (int)CriteriaCondition.BgMap, GetMapId(), true);
|
|
||||||
player.ResetCriteria(CriteriaTypes.BgObjectiveCapture, (int)CriteriaCondition.BgMap, GetMapId(), true);
|
|
||||||
player.ResetCriteria(CriteriaTypes.HonorableKillAtArea, (int)CriteriaCondition.BgMap, GetMapId(), true);
|
|
||||||
player.ResetCriteria(CriteriaTypes.HonorableKill, (int)CriteriaCondition.BgMap, GetMapId(), true);
|
|
||||||
player.ResetCriteria(CriteriaTypes.HealingDone, (int)CriteriaCondition.BgMap, GetMapId(), true);
|
|
||||||
player.ResetCriteria(CriteriaTypes.GetKillingBlows, (int)CriteriaCondition.BgMap, GetMapId(), true);
|
|
||||||
player.ResetCriteria(CriteriaTypes.SpecialPvpKill, (int)CriteriaCondition.BgMap, GetMapId(), true);
|
|
||||||
|
|
||||||
// setup BG group membership
|
// setup BG group membership
|
||||||
PlayerAddedToBGCheckIfBGIsRunning(player);
|
PlayerAddedToBGCheckIfBGIsRunning(player);
|
||||||
|
|||||||
@@ -53,10 +53,10 @@ namespace Game.Entities
|
|||||||
m_achievementSys.RemoveCriteriaTimer(type, entry);
|
m_achievementSys.RemoveCriteriaTimer(type, entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ResetCriteria(CriteriaTypes type, ulong miscValue1 = 0, ulong miscValue2 = 0, bool evenIfCriteriaComplete = false)
|
public void ResetCriteria(CriteriaCondition condition, uint failAsset, bool evenIfCriteriaComplete = false)
|
||||||
{
|
{
|
||||||
m_achievementSys.ResetCriteria(type, miscValue1, miscValue2, evenIfCriteriaComplete);
|
m_achievementSys.ResetCriteria(condition, failAsset, evenIfCriteriaComplete);
|
||||||
m_questObjectiveCriteriaMgr.ResetCriteria(type, miscValue1, miscValue2, evenIfCriteriaComplete);
|
m_questObjectiveCriteriaMgr.ResetCriteria(condition, failAsset, evenIfCriteriaComplete);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void UpdateCriteria(CriteriaTypes type, ulong miscValue1 = 0, ulong miscValue2 = 0, ulong miscValue3 = 0, Unit unit = null)
|
public void UpdateCriteria(CriteriaTypes type, ulong miscValue1 = 0, ulong miscValue2 = 0, ulong miscValue3 = 0, Unit unit = null)
|
||||||
|
|||||||
@@ -774,9 +774,9 @@ namespace Game.Entities
|
|||||||
UpdateCriteria(CriteriaTypes.DeathAtMap, 1);
|
UpdateCriteria(CriteriaTypes.DeathAtMap, 1);
|
||||||
UpdateCriteria(CriteriaTypes.Death, 1);
|
UpdateCriteria(CriteriaTypes.Death, 1);
|
||||||
UpdateCriteria(CriteriaTypes.DeathInDungeon, 1);
|
UpdateCriteria(CriteriaTypes.DeathInDungeon, 1);
|
||||||
ResetCriteria(CriteriaTypes.BgObjectiveCapture, (uint)CriteriaCondition.NoDeath);
|
|
||||||
ResetCriteria(CriteriaTypes.HonorableKill, (uint)CriteriaCondition.NoDeath);
|
// reset all death criterias
|
||||||
ResetCriteria(CriteriaTypes.GetKillingBlows, (uint)CriteriaCondition.NoDeath);
|
ResetCriteria(CriteriaCondition.NoDeath, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
base.SetDeathState(s);
|
base.SetDeathState(s);
|
||||||
|
|||||||
@@ -163,20 +163,17 @@ namespace Game
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ResetCriteria(CriteriaTypes type, ulong miscValue1, ulong miscValue2, bool evenIfCriteriaComplete)
|
public void ResetCriteria(CriteriaCondition condition, uint failAsset, bool evenIfCriteriaComplete)
|
||||||
{
|
{
|
||||||
Log.outDebug(LogFilter.Player, "QuestObjectiveCriteriaMgr.ResetCriteria({type}, {miscValue1}, {miscValue2})");
|
Log.outDebug(LogFilter.Player, $"QuestObjectiveCriteriaMgr.ResetCriteria({condition}, {failAsset}, {evenIfCriteriaComplete})");
|
||||||
|
|
||||||
// disable for gamemasters with GM-mode enabled
|
// disable for gamemasters with GM-mode enabled
|
||||||
if (_owner.IsGameMaster())
|
if (_owner.IsGameMaster())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var playerCriteriaList = GetCriteriaByType(type);
|
var playerCriteriaList = Global.CriteriaMgr.GetCriteriaByFailEvent(condition, (int)failAsset);
|
||||||
foreach (Criteria playerCriteria in playerCriteriaList)
|
foreach (Criteria playerCriteria in playerCriteriaList)
|
||||||
{
|
{
|
||||||
if (playerCriteria.Entry.FailEvent != miscValue1 || (playerCriteria.Entry.FailAsset != 0 && playerCriteria.Entry.FailAsset != miscValue2))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
var trees = Global.CriteriaMgr.GetCriteriaTreesByCriteria(playerCriteria.Id);
|
var trees = Global.CriteriaMgr.GetCriteriaTreesByCriteria(playerCriteria.Id);
|
||||||
bool allComplete = true;
|
bool allComplete = true;
|
||||||
foreach (CriteriaTree tree in trees)
|
foreach (CriteriaTree tree in trees)
|
||||||
|
|||||||
Reference in New Issue
Block a user