Core/Players: Fixed trait config validation

Port From (https://github.com/TrinityCore/TrinityCore/commit/bb9907f0196544faf16ffc5277c60e5f42fa3748)
This commit is contained in:
hondacrx
2023-01-06 16:15:08 -05:00
parent 54413bf584
commit 5a5feca121
+29 -11
View File
@@ -438,8 +438,15 @@ namespace Game
if (condition.AchievementID != 0 && !player.HasAchieved(condition.AchievementID)) if (condition.AchievementID != 0 && !player.HasAchieved(condition.AchievementID))
return false; return false;
if (condition.SpecSetID != 0 && !Global.DB2Mgr.IsSpecSetMember(condition.SpecSetID, player.GetPrimarySpecialization())) if (condition.SpecSetID != 0)
{
uint chrSpecializationId = player.GetPrimarySpecialization();
if (traitConfig.Type == TraitConfigType.Combat)
chrSpecializationId = (uint)traitConfig.ChrSpecializationID;
if (!Global.DB2Mgr.IsSpecSetMember(condition.SpecSetID, chrSpecializationId))
return false; return false;
}
if (condition.TraitCurrencyID != 0 && condition.SpentAmountRequired != 0) if (condition.TraitCurrencyID != 0 && condition.SpentAmountRequired != 0)
{ {
@@ -565,6 +572,23 @@ namespace Game
Dictionary<int, int> spentCurrencies = new(); Dictionary<int, int> spentCurrencies = new();
FillSpentCurrenciesMap(traitConfig, spentCurrencies); FillSpentCurrenciesMap(traitConfig, spentCurrencies);
bool meetsConditions(List<TraitCondRecord> conditions)
{
bool hasConditions = false;
foreach (TraitCondRecord condition in conditions)
{
if (condition.GetCondType() == TraitConditionType.Available || condition.GetCondType() == TraitConditionType.Visible)
{
if (MeetsTraitCondition(traitConfig, player, condition, ref spentCurrencies))
return true;
hasConditions = true;
}
}
return !hasConditions;
}
foreach (TraitEntryPacket traitEntry in traitConfig.Entries) foreach (TraitEntryPacket traitEntry in traitConfig.Entries)
{ {
if (!IsValidEntry(traitEntry)) if (!IsValidEntry(traitEntry))
@@ -576,20 +600,14 @@ namespace Game
return TalentLearnResult.FailedUnknown; return TalentLearnResult.FailedUnknown;
foreach (NodeEntry entry in node.Entries) foreach (NodeEntry entry in node.Entries)
foreach (TraitCondRecord condition in entry.Conditions) if (!meetsConditions(entry.Conditions))
if ((condition.GetCondType() == TraitConditionType.Available || condition.GetCondType() == TraitConditionType.Visible)
&& !MeetsTraitCondition(traitConfig, player, condition, ref spentCurrencies))
return TalentLearnResult.FailedUnknown; return TalentLearnResult.FailedUnknown;
foreach (TraitCondRecord condition in node.Conditions) if (!meetsConditions(node.Conditions))
if ((condition.GetCondType() == TraitConditionType.Available || condition.GetCondType() == TraitConditionType.Visible)
&& !MeetsTraitCondition(traitConfig, player, condition, ref spentCurrencies))
return TalentLearnResult.FailedUnknown; return TalentLearnResult.FailedUnknown;
foreach (NodeGroup group in node.Groups) foreach (NodeGroup group in node.Groups)
foreach (TraitCondRecord condition in group.Conditions) if (!meetsConditions(group.Conditions))
if ((condition.GetCondType() == TraitConditionType.Available || condition.GetCondType() == TraitConditionType.Visible)
&& !MeetsTraitCondition(traitConfig, player, condition, ref spentCurrencies))
return TalentLearnResult.FailedUnknown; return TalentLearnResult.FailedUnknown;
if (!node.ParentNodes.Empty()) if (!node.ParentNodes.Empty())
@@ -697,7 +715,7 @@ namespace Game
newEntry.Rank = addedRanks; newEntry.Rank = addedRanks;
if (!HasEnoughCurrency(newEntry, currencies)) if (!HasEnoughCurrency(newEntry, currencies))
break; continue;
if (entryInConfig != null) if (entryInConfig != null)
entryInConfig.Rank += addedRanks; entryInConfig.Rank += addedRanks;