Core/Auras: Call Aura::HandleAuraSpecificMods in Aura::SetStackAmount to preserve compatibility with older scripts.
This commit is contained in:
@@ -3276,7 +3276,7 @@ void Unit::_ApplyAura(AuraApplication * aurApp, uint8 effMask)
|
|||||||
if (aurApp->GetRemoveMode())
|
if (aurApp->GetRemoveMode())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
aura->HandleAuraSpecificMods(aurApp, caster, true);
|
aura->HandleAuraSpecificMods(aurApp, caster, true, false);
|
||||||
|
|
||||||
// apply effects of the aura
|
// apply effects of the aura
|
||||||
for (uint8 i = 0 ; i < MAX_SPELL_EFFECTS; ++i)
|
for (uint8 i = 0 ; i < MAX_SPELL_EFFECTS; ++i)
|
||||||
@@ -3358,7 +3358,7 @@ void Unit::_UnapplyAura(AuraApplicationMap::iterator &i, AuraRemoveMode removeMo
|
|||||||
if (!auraStateFound)
|
if (!auraStateFound)
|
||||||
ModifyAuraState(auraState, false);
|
ModifyAuraState(auraState, false);
|
||||||
|
|
||||||
aura->HandleAuraSpecificMods(aurApp, caster, false);
|
aura->HandleAuraSpecificMods(aurApp, caster, false, false);
|
||||||
|
|
||||||
// only way correctly remove all auras from list
|
// only way correctly remove all auras from list
|
||||||
//if (removedAuras != m_removedAurasCount) new aura may be added
|
//if (removedAuras != m_removedAurasCount) new aura may be added
|
||||||
|
|||||||
@@ -403,7 +403,6 @@ void AuraEffect::GetTargetList(std::list<Unit *> & targetList) const
|
|||||||
void AuraEffect::GetApplicationList(std::list<AuraApplication*> & applicationList) const
|
void AuraEffect::GetApplicationList(std::list<AuraApplication*> & applicationList) const
|
||||||
{
|
{
|
||||||
Aura::ApplicationMap const & targetMap = GetBase()->GetApplicationMap();
|
Aura::ApplicationMap const & targetMap = GetBase()->GetApplicationMap();
|
||||||
// remove all targets which were not added to new list - they no longer deserve area aura
|
|
||||||
for (Aura::ApplicationMap::const_iterator appIter = targetMap.begin(); appIter != targetMap.end(); ++appIter)
|
for (Aura::ApplicationMap::const_iterator appIter = targetMap.begin(); appIter != targetMap.end(); ++appIter)
|
||||||
{
|
{
|
||||||
if (appIter->second->HasEffect(GetEffIndex()))
|
if (appIter->second->HasEffect(GetEffIndex()))
|
||||||
|
|||||||
@@ -780,9 +780,22 @@ void Aura::SetStackAmount(uint8 stackAmount)
|
|||||||
{
|
{
|
||||||
m_stackAmount = stackAmount;
|
m_stackAmount = stackAmount;
|
||||||
Unit * caster = GetCaster();
|
Unit * caster = GetCaster();
|
||||||
|
|
||||||
|
std::list<AuraApplication*> applications;
|
||||||
|
GetApplicationList(applications);
|
||||||
|
|
||||||
|
for (std::list<AuraApplication*>::const_iterator apptItr = applications.begin(); apptItr != applications.end(); ++apptItr)
|
||||||
|
if (!(*apptItr)->GetRemoveMode())
|
||||||
|
HandleAuraSpecificMods(*apptItr, caster, false, true);
|
||||||
|
|
||||||
for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
|
for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
|
||||||
if (HasEffect(i))
|
if (HasEffect(i))
|
||||||
m_effects[i]->ChangeAmount(m_effects[i]->CalculateAmount(caster), false, true);
|
m_effects[i]->ChangeAmount(m_effects[i]->CalculateAmount(caster), false, true);
|
||||||
|
|
||||||
|
for (std::list<AuraApplication*>::const_iterator apptItr = applications.begin(); apptItr != applications.end(); ++apptItr)
|
||||||
|
if (!(*apptItr)->GetRemoveMode())
|
||||||
|
HandleAuraSpecificMods(*apptItr, caster, true, true);
|
||||||
|
|
||||||
SetNeedClientUpdateForTargets();
|
SetNeedClientUpdateForTargets();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -919,6 +932,15 @@ void Aura::HandleAllEffects(AuraApplication * aurApp, uint8 mode, bool apply)
|
|||||||
m_effects[i]->HandleEffect(aurApp, mode, apply);
|
m_effects[i]->HandleEffect(aurApp, mode, apply);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Aura::GetApplicationList(std::list<AuraApplication*> & applicationList) const
|
||||||
|
{
|
||||||
|
for (Aura::ApplicationMap::const_iterator appIter = m_applications.begin(); appIter != m_applications.end(); ++appIter)
|
||||||
|
{
|
||||||
|
if (appIter->second->GetEffectMask())
|
||||||
|
applicationList.push_back(appIter->second);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Aura::SetNeedClientUpdateForTargets() const
|
void Aura::SetNeedClientUpdateForTargets() const
|
||||||
{
|
{
|
||||||
for (ApplicationMap::const_iterator appIter = m_applications.begin(); appIter != m_applications.end(); ++appIter)
|
for (ApplicationMap::const_iterator appIter = m_applications.begin(); appIter != m_applications.end(); ++appIter)
|
||||||
@@ -926,7 +948,7 @@ void Aura::SetNeedClientUpdateForTargets() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
// trigger effects on real aura apply/remove
|
// trigger effects on real aura apply/remove
|
||||||
void Aura::HandleAuraSpecificMods(AuraApplication const * aurApp, Unit * caster, bool apply)
|
void Aura::HandleAuraSpecificMods(AuraApplication const * aurApp, Unit * caster, bool apply, bool onReapply)
|
||||||
{
|
{
|
||||||
Unit * target = aurApp->GetTarget();
|
Unit * target = aurApp->GetTarget();
|
||||||
AuraRemoveMode removeMode = aurApp->GetRemoveMode();
|
AuraRemoveMode removeMode = aurApp->GetRemoveMode();
|
||||||
@@ -1172,7 +1194,7 @@ void Aura::HandleAuraSpecificMods(AuraApplication const * aurApp, Unit * caster,
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Remove Linked Auras
|
// Remove Linked Auras
|
||||||
if (removeMode != AURA_REMOVE_BY_DEATH)
|
if (!onReapply && removeMode != AURA_REMOVE_BY_DEATH)
|
||||||
{
|
{
|
||||||
if (uint32 customAttr = sSpellMgr->GetSpellCustomAttr(GetId()))
|
if (uint32 customAttr = sSpellMgr->GetSpellCustomAttr(GetId()))
|
||||||
{
|
{
|
||||||
@@ -1312,7 +1334,11 @@ void Aura::HandleAuraSpecificMods(AuraApplication const * aurApp, Unit * caster,
|
|||||||
switch(GetId())
|
switch(GetId())
|
||||||
{
|
{
|
||||||
case 48018: // Demonic Circle
|
case 48018: // Demonic Circle
|
||||||
target->RemoveGameObject(GetId(), true);
|
// Do not remove GO when aura is removed by stack
|
||||||
|
// to prevent remove GO added by new spell
|
||||||
|
// old one is already removed
|
||||||
|
if (!onReapply)
|
||||||
|
target->RemoveGameObject(GetId(), true);
|
||||||
target->RemoveAura(62388);
|
target->RemoveAura(62388);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -167,12 +167,13 @@ class Aura
|
|||||||
|
|
||||||
// Helpers for targets
|
// Helpers for targets
|
||||||
ApplicationMap const & GetApplicationMap() {return m_applications;}
|
ApplicationMap const & GetApplicationMap() {return m_applications;}
|
||||||
|
void GetApplicationList(std::list<AuraApplication*> & applicationList) const;
|
||||||
const AuraApplication * GetApplicationOfTarget (uint64 const & guid) const { ApplicationMap::const_iterator itr = m_applications.find(guid); if (itr != m_applications.end()) return itr->second; return NULL; }
|
const AuraApplication * GetApplicationOfTarget (uint64 const & guid) const { ApplicationMap::const_iterator itr = m_applications.find(guid); if (itr != m_applications.end()) return itr->second; return NULL; }
|
||||||
AuraApplication * GetApplicationOfTarget (uint64 const & guid) { ApplicationMap::iterator itr = m_applications.find(guid); if (itr != m_applications.end()) return itr->second; return NULL; }
|
AuraApplication * GetApplicationOfTarget (uint64 const & guid) { ApplicationMap::iterator itr = m_applications.find(guid); if (itr != m_applications.end()) return itr->second; return NULL; }
|
||||||
bool IsAppliedOnTarget(uint64 const & guid) const { return m_applications.find(guid) != m_applications.end(); }
|
bool IsAppliedOnTarget(uint64 const & guid) const { return m_applications.find(guid) != m_applications.end(); }
|
||||||
|
|
||||||
void SetNeedClientUpdateForTargets() const;
|
void SetNeedClientUpdateForTargets() const;
|
||||||
void HandleAuraSpecificMods(AuraApplication const * aurApp, Unit * caster, bool apply);
|
void HandleAuraSpecificMods(AuraApplication const * aurApp, Unit * caster, bool apply, bool onReapply);
|
||||||
bool CanBeAppliedOn(Unit *target);
|
bool CanBeAppliedOn(Unit *target);
|
||||||
bool CheckAreaTarget(Unit *target);
|
bool CheckAreaTarget(Unit *target);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user