aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorQAston <qaston@gmail.com>2010-12-31 14:39:18 +0100
committerQAston <qaston@gmail.com>2010-12-31 14:39:18 +0100
commit4eccbb81afd8c94950f704c317848d38831aaec9 (patch)
tree829e424276c204452f17a37eecfaea1153eaaf35 /src
parentc220fbbc458cd53da12ee47648d87dac0583874e (diff)
Core/Auras: Recheck aura presence on target after calling linked events in aura effect handlers. Prevents undefined behavious when aura effect remove handler is called before apply handler is finished.
Diffstat (limited to 'src')
-rwxr-xr-xsrc/server/game/Spells/Auras/SpellAuraEffects.cpp71
1 files changed, 58 insertions, 13 deletions
diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
index 275a7d38ab8..e82083a469e 100755
--- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp
+++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
@@ -988,8 +988,11 @@ void AuraEffect::HandleEffect(AuraApplication const * aurApp, uint8 mode, bool a
else
prevented = GetBase()->CallScriptEffectRemoveHandlers(const_cast<AuraEffect const *>(this), aurApp, (AuraEffectHandleModes)mode);
- if (!prevented)
- (*this.*AuraEffectHandler [GetAuraType()])(aurApp, mode, apply);
+ // check if script events have removed the aura or if default effect prevention was requested
+ if ((apply && aurApp->GetRemoveMode()) || prevented)
+ return;
+
+ (*this.*AuraEffectHandler [GetAuraType()])(aurApp, mode, apply);
}
void AuraEffect::HandleEffect(Unit * target, uint8 mode, bool apply)
@@ -2828,6 +2831,10 @@ void AuraEffect::HandleModStealth(AuraApplication const * aurApp, uint8 mode, bo
target->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_IMMUNE_OR_LOST_SELECTION);
}
+ // stop handling the effect if it was removed by linked event
+ if (aurApp->GetRemoveMode())
+ return;
+
target->m_stealth.AddFlag( type);
target->m_stealth.AddValue(type, GetAmount());
@@ -2953,6 +2960,10 @@ void AuraEffect::HandlePhase(AuraApplication const * aurApp, uint8 mode, bool ap
if (Battleground *bg = player->GetBattleground())
bg->EventPlayerDroppedFlag(player);
+ // stop handling the effect if it was removed by linked event
+ if (aurApp->GetRemoveMode())
+ return;
+
// GM-mode have mask 0xFFFFFFFF
if (player->isGameMaster())
newPhase = 0xFFFFFFFF;
@@ -3071,6 +3082,10 @@ void AuraEffect::HandleAuraModShapeshift(AuraApplication const * aurApp, uint8 m
// remove other shapeshift before applying a new one
target->RemoveAurasByType(SPELL_AURA_MOD_SHAPESHIFT, 0, GetBase());
+ // stop handling the effect if it was removed by linked event
+ if (aurApp->GetRemoveMode())
+ return;
+
if (modelid > 0)
target->SetDisplayId(modelid);
@@ -3117,6 +3132,9 @@ void AuraEffect::HandleAuraModShapeshift(AuraApplication const * aurApp, uint8 m
break;
}
}
+ // stop handling the effect if it was removed by linked event
+ if (aurApp->GetRemoveMode())
+ return;
target->SetShapeshiftForm(form);
}
@@ -3221,6 +3239,10 @@ void AuraEffect::HandleAuraModShapeshift(AuraApplication const * aurApp, uint8 m
}
}
+ // stop handling the effect if it was removed by linked event
+ if (apply && aurApp->GetRemoveMode())
+ return;
+
if (target->GetTypeId() == TYPEID_PLAYER)
{
SpellShapeshiftEntry const *shapeInfo = sSpellShapeshiftStore.LookupEntry(form);
@@ -3485,14 +3507,6 @@ void AuraEffect::HandleFeignDeath(AuraApplication const * aurApp, uint8 mode, bo
}
}
}
- // blizz like 2.0.x
- target->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_29);
- // blizz like 2.0.x
- target->SetFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH);
- // blizz like 2.0.x
- target->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD);
-
- target->AddUnitState(UNIT_STAT_DIED);
target->CombatStop();
target->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_IMMUNE_OR_LOST_SELECTION);
@@ -3501,6 +3515,18 @@ void AuraEffect::HandleFeignDeath(AuraApplication const * aurApp, uint8 mode, bo
target->FinishSpell(CURRENT_GENERIC_SPELL, false);
target->InterruptNonMeleeSpells(true);
target->getHostileRefManager().deleteReferences();
+
+ // stop handling the effect if it was removed by linked event
+ if (aurApp->GetRemoveMode())
+ return;
+ // blizz like 2.0.x
+ target->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_29);
+ // blizz like 2.0.x
+ target->SetFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH);
+ // blizz like 2.0.x
+ target->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD);
+
+ target->AddUnitState(UNIT_STAT_DIED);
}
else
{
@@ -3535,6 +3561,9 @@ void AuraEffect::HandleModUnattackable(AuraApplication const * aurApp, uint8 mod
target->CombatStop();
target->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_IMMUNE_OR_LOST_SELECTION);
}
+ // stop handling the effect if it was removed by linked event
+ if (aurApp->GetRemoveMode())
+ return;
}
// do not remove unit flag if there are more than this auraEffect of that kind on unit on unit
else if (target->HasAuraType(SPELL_AURA_MOD_UNATTACKABLE))
@@ -3600,8 +3629,6 @@ void AuraEffect::HandleAuraModDisarm(AuraApplication const * aurApp, uint8 mode,
}
}
-
-
if (target->GetTypeId() == TYPEID_UNIT && target->ToCreature()->GetCurrentEquipmentId())
target->UpdateDamagePhysical(attType);
}
@@ -4476,6 +4503,9 @@ void AuraEffect::HandleAuraModEffectImmunity(AuraApplication const * aurApp, uin
sOutdoorPvPMgr->HandleDropFlag((Player*)target,GetSpellProto()->Id);
}
}
+ // stop handling the effect if it was removed by linked event
+ if (apply && aurApp->GetRemoveMode())
+ return;
target->ApplySpellImmune(GetId(),IMMUNITY_EFFECT,GetMiscValue(),apply);
}
@@ -4491,6 +4521,9 @@ void AuraEffect::HandleAuraModStateImmunity(AuraApplication const * aurApp, uint
{
target->RemoveAurasByType(AuraType(GetMiscValue()), NULL , GetBase());
}
+ // stop handling the effect if it was removed by linked event
+ if (apply && aurApp->GetRemoveMode())
+ return;
target->ApplySpellImmune(GetId(), IMMUNITY_STATE, GetMiscValue(), apply);
}
@@ -4505,6 +4538,10 @@ void AuraEffect::HandleAuraModSchoolImmunity(AuraApplication const * aurApp, uin
if ((apply) && GetMiscValue() == SPELL_SCHOOL_MASK_NORMAL)
target->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_IMMUNE_OR_LOST_SELECTION);
+ // stop handling the effect if it was removed by linked event
+ if (apply && aurApp->GetRemoveMode())
+ return;
+
target->ApplySpellImmune(GetId(),IMMUNITY_SCHOOL,GetMiscValue(),(apply));
// remove all flag auras (they are positive, but they must be removed when you are immune)
@@ -4533,6 +4570,11 @@ void AuraEffect::HandleAuraModSchoolImmunity(AuraApplication const * aurApp, uin
++iter;
}
}
+
+ // stop handling the effect if it was removed by linked event
+ if (apply && aurApp->GetRemoveMode())
+ return;
+
if (GetSpellProto()->Mechanic == MECHANIC_BANISH)
{
if (apply)
@@ -6200,6 +6242,10 @@ void AuraEffect::HandleAuraDummy(AuraApplication const * aurApp, uint8 mode, boo
break;
}
+ // stop handling the effect if it was removed by linked event
+ if (apply && aurApp->GetRemoveMode())
+ return;
+
if (mode & AURA_EFFECT_HANDLE_REAL)
{
// pet auras
@@ -6405,7 +6451,6 @@ void AuraEffect::HandleAuraConvertRune(AuraApplication const * aurApp, uint8 mod
continue;
if (!plr->GetRuneCooldown(i))
{
- // ConvertRune(i,
plr->AddRuneByAuraEffect(i, RuneType(GetMiscValueB()), this);
--runes;
}