From 780b041f62492b4cd47fc61daf77823ffb3c20a1 Mon Sep 17 00:00:00 2001 From: NoFantasy Date: Thu, 2 Apr 2009 05:19:27 +0400 Subject: [PATCH] [7602] Fixed possible crash at instant stealth aura apply interrupt at internal visibility update. Signed-off-by: VladimirMangos --- src/game/SpellAuras.cpp | 46 ++++++++++++++++++++++------------------ src/shared/revision_nr.h | 2 +- 2 files changed, 26 insertions(+), 22 deletions(-) diff --git a/src/game/SpellAuras.cpp b/src/game/SpellAuras.cpp index 1a5fd6a53..debda4800 100644 --- a/src/game/SpellAuras.cpp +++ b/src/game/SpellAuras.cpp @@ -3486,52 +3486,56 @@ void Aura::HandleAuraModStun(bool apply, bool Real) void Aura::HandleModStealth(bool apply, bool Real) { - if(apply) + Unit* pTarget = m_target; + + if (apply) { // drop flag at stealth in bg - m_target->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_IMMUNE_OR_LOST_SELECTION); + pTarget->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_IMMUNE_OR_LOST_SELECTION); // only at real aura add - if(Real) + if (Real) { - m_target->SetStandFlags(UNIT_STAND_FLAGS_CREEP); - if(m_target->GetTypeId()==TYPEID_PLAYER) - m_target->SetFlag(PLAYER_FIELD_BYTES2, 0x2000); + pTarget->SetStandFlags(UNIT_STAND_FLAGS_CREEP); + + if (pTarget->GetTypeId()==TYPEID_PLAYER) + pTarget->SetFlag(PLAYER_FIELD_BYTES2, 0x2000); // apply only if not in GM invisibility (and overwrite invisibility state) - if(m_target->GetVisibility()!=VISIBILITY_OFF) + if (pTarget->GetVisibility()!=VISIBILITY_OFF) { - m_target->SetVisibility(VISIBILITY_GROUP_NO_DETECT); - m_target->SetVisibility(VISIBILITY_GROUP_STEALTH); + pTarget->SetVisibility(VISIBILITY_GROUP_NO_DETECT); + pTarget->SetVisibility(VISIBILITY_GROUP_STEALTH); } } } else { // only at real aura remove - if(Real) + if (Real) { // if last SPELL_AURA_MOD_STEALTH and no GM invisibility - if(!m_target->HasAuraType(SPELL_AURA_MOD_STEALTH) && m_target->GetVisibility()!=VISIBILITY_OFF) + if (!pTarget->HasAuraType(SPELL_AURA_MOD_STEALTH) && pTarget->GetVisibility()!=VISIBILITY_OFF) { - m_target->RemoveStandFlags(UNIT_STAND_FLAGS_CREEP); - if(m_target->GetTypeId()==TYPEID_PLAYER) - m_target->RemoveFlag(PLAYER_FIELD_BYTES2, 0x2000); + pTarget->RemoveStandFlags(UNIT_STAND_FLAGS_CREEP); + + if (pTarget->GetTypeId()==TYPEID_PLAYER) + pTarget->RemoveFlag(PLAYER_FIELD_BYTES2, 0x2000); // restore invisibility if any - if(m_target->HasAuraType(SPELL_AURA_MOD_INVISIBILITY)) + if (pTarget->HasAuraType(SPELL_AURA_MOD_INVISIBILITY)) { - m_target->SetVisibility(VISIBILITY_GROUP_NO_DETECT); - m_target->SetVisibility(VISIBILITY_GROUP_INVISIBILITY); + pTarget->SetVisibility(VISIBILITY_GROUP_NO_DETECT); + pTarget->SetVisibility(VISIBILITY_GROUP_INVISIBILITY); } else - m_target->SetVisibility(VISIBILITY_ON); + pTarget->SetVisibility(VISIBILITY_ON); } } } // Master of Subtlety - Unit::AuraList const& mDummyAuras = m_target->GetAurasByType(SPELL_AURA_DUMMY); + Unit::AuraList const& mDummyAuras = pTarget->GetAurasByType(SPELL_AURA_DUMMY); for(Unit::AuraList::const_iterator i = mDummyAuras.begin();i != mDummyAuras.end(); ++i) { if ((*i)->GetSpellProto()->SpellIconID == 2114) @@ -3539,10 +3543,10 @@ void Aura::HandleModStealth(bool apply, bool Real) if (apply) { int32 bp = (*i)->GetModifier()->m_amount; - m_target->CastCustomSpell(m_target,31665,&bp,NULL,NULL,true); + pTarget->CastCustomSpell(pTarget,31665,&bp,NULL,NULL,true); } else - m_target->CastSpell(m_target,31666,true); + pTarget->CastSpell(pTarget,31666,true); break; } } diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 0b0e294bc..f8cd0af70 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "7601" + #define REVISION_NR "7602" #endif // __REVISION_NR_H__