rendered paste bodyIndex: SpellAuras.cpp===================================================================--- SpellAuras.cpp (revision 5688)+++ SpellAuras.cpp (working copy)@@ -790,7 +790,7 @@ // we can found aura in NULL_AURA_SLOT and then need store state instead check slot != NULL_AURA_SLOT bool samespell = false;-+ bool secondaura = false; uint8 slot = NULL_AURA_SLOT; for(uint8 i = 0; i < 3; i++)@@ -802,6 +802,8 @@ if(itr->second->GetCasterGUID()==GetCasterGUID()) { samespell = true;+ if (m_effIndex > itr->second->GetEffIndex())+ secondaura = true; slot = itr->second->GetAuraSlot(); break; }@@ -865,6 +867,9 @@ SetAuraFlag(slot, true); SetAuraLevel(slot,caster ? caster->getLevel() : sWorld.getConfig(CONFIG_MAX_PLAYER_LEVEL)); + if (m_procCharges >= 1) // Add charge count (as aura stack count) for show in client+ SetAuraApplication(slot, m_procCharges - 1);+ // update for out of range group members m_target->UpdateAuraForGroup(slot); }@@ -875,7 +880,9 @@ else // use found slot { SetAuraSlot( slot );- UpdateSlotCounterAndDuration(true);+ // Not recalculate stack count for second aura of the same spell+ if (!secondaura)+ UpdateSlotCounterAndDuration(true); } // Update Seals information@@ -935,6 +942,7 @@ if(itr->second->GetAuraSlot()==slot) { samespell = true;+ break; } }@@ -949,6 +957,7 @@ SetAuraFlag(slot, false); SetAuraLevel(slot,caster ? caster->getLevel() : sWorld.getConfig(CONFIG_MAX_PLAYER_LEVEL)); + SetAuraApplication(slot, 0); // update for out of range group members m_target->UpdateAuraForGroup(slot); @@ -1019,7 +1028,7 @@ uint32 byte = (slot % 4) * 8; uint32 val = m_target->GetUInt32Value(UNIT_FIELD_AURAAPPLICATIONS + index); val &= ~(0xFF << byte);- val |= (count << byte);+ val |= ((uint8(count)) << byte); m_target->SetUInt32Value(UNIT_FIELD_AURAAPPLICATIONS + index, val); } @@ -3165,7 +3174,10 @@ // some spell have charges by functionality not have its in spell data switch (m_spellId) {- case 28200: m_procCharges = 6; break; // Ascendance (Talisman of Ascendance trinket+ case 28200: // Ascendance (Talisman of Ascendance trinket+ m_procCharges = 6; + UpdateAuraCharges(); + break; default: break; } }Index: SpellAuras.h===================================================================--- SpellAuras.h (revision 5688)+++ SpellAuras.h (working copy)@@ -239,6 +239,12 @@ uint8 GetAuraSlot() const { return m_auraSlot; } void SetAuraSlot(uint8 slot) { m_auraSlot = slot; }+ void UpdateAuraCharges()+ {+ uint8 slot = GetAuraSlot();+ if (slot < MAX_AURAS && m_procCharges >= 1)+ SetAuraApplication(slot, m_procCharges - 1);+ } bool IsPositive() { return m_positive; } void SetNegative() { m_positive = false; }Index: Unit.cpp===================================================================--- Unit.cpp (revision 5688)+++ Unit.cpp (working copy)@@ -9499,6 +9499,22 @@ break; } }+ // Update charge (aura can be removed by triggers)+ // Not validate aura on check (for speed)+ if(i->triggeredByAura->m_procCharges > 0)+ {+ // need found aura (can be dropped by triggers)+ AuraMap::const_iterator lower = GetAuras().lower_bound(i->triggeredByAura_SpellPair);+ AuraMap::const_iterator upper = GetAuras().upper_bound(i->triggeredByAura_SpellPair);+ for(AuraMap::const_iterator itr = lower; itr!= upper; ++itr)+ {+ if(itr->second == i->triggeredByAura)+ {+ i->triggeredByAura->UpdateAuraCharges();+ break;+ }+ }+ } } // Safely remove auras with zero charges