Core/Players: Fixed traits not updating aura values when changing rank

Port From (https://github.com/TrinityCore/TrinityCore/commit/e6b553b913152667bcd1cfb79790ec70790d0f6e)
This commit is contained in:
Hondacrx
2025-08-18 10:32:35 -04:00
parent 51fbf8e33e
commit 32d166380c
4 changed files with 91 additions and 60 deletions
+18 -5
View File
@@ -1014,9 +1014,8 @@ namespace Game.Entities
List<TraitEntryPacket> costEntries = new();
// apply new traits
for (var i = 0; i < newConfig.Entries.Count; ++i)
foreach (TraitEntryPacket newEntry in newConfig.Entries)
{
TraitEntryPacket newEntry = newConfig.Entries[i];
int oldEntryIndex = editedConfig.Entries.FindIndexIf(ufEntry => ufEntry.TraitNodeID == newEntry.TraitNodeID && ufEntry.TraitNodeEntryID == newEntry.TraitNodeEntryID);
if (oldEntryIndex < 0)
{
@@ -1033,7 +1032,10 @@ namespace Game.Entities
AddDynamicUpdateFieldValue(newTraitConfig.ModifyValue(newTraitConfig.Entries), newUfEntry);
if (applyTraits)
{
ApplyTraitEntry(newEntry.TraitNodeEntryID, 0, 0, false);
ApplyTraitEntry(newUfEntry.TraitNodeEntryID, newUfEntry.Rank, 0, true);
}
}
else if (newEntry.Rank != editedConfig.Entries[oldEntryIndex].Rank || newEntry.GrantedRanks != editedConfig.Entries[oldEntryIndex].GrantedRanks)
{
@@ -1080,9 +1082,8 @@ namespace Game.Entities
}
}
for (int i = 0; i < newConfig.SubTrees.Count; ++i)
foreach (TraitSubTreeCachePacket newSubTree in newConfig.SubTrees)
{
var newSubTree = newConfig.SubTrees[i];
int oldSubTreeIndex = editedConfig.SubTrees.FindIndexIf(ufSubTree => ufSubTree.TraitSubTreeID == newSubTree.TraitSubTreeID);
List<TraitEntry> subTreeEntries = new();
@@ -1094,6 +1095,7 @@ namespace Game.Entities
newUfEntry.Rank = newSubTree.Entries[j].Rank;
newUfEntry.GrantedRanks = newSubTree.Entries[j].GrantedRanks;
}
if (oldSubTreeIndex < 0)
{
TraitSubTreeCache newUfSubTree = new();
@@ -1182,13 +1184,24 @@ namespace Game.Entities
if (traitDefinition.SpellID != 0)
{
Cypher.Assert(traitNodeEntry.TraitDefinitionID <= 0xFFFFFF && rank + grantedRanks <= 0xFF);
if (apply)
LearnSpell(traitDefinition.SpellID, true, 0, false, traitNodeEntry.TraitDefinitionID);
LearnSpell(traitDefinition.SpellID, true, 0, false, new PlayerSpellTrait(traitNodeEntry.TraitDefinitionID, rank + grantedRanks));
else
RemoveSpell(traitDefinition.SpellID);
}
}
public PlayerSpellTrait GetTraitInfoForSpell(uint spellId)
{
PlayerSpell spell = m_spells.LookupByKey(spellId);
if (spell != null)
return spell.Trait;
return null;
}
public void SetTraitConfigUseStarterBuild(int traitConfigId, bool useStarterBuild)
{
int configIndex = m_activePlayerData.TraitConfigs.FindIndexIf(traitConfig =>