[7602] Fixed possible crash at instant stealth aura apply interrupt at internal visibility update.

Signed-off-by: VladimirMangos <vladimir@getmangos.com>
This commit is contained in:
NoFantasy 2009-04-02 05:19:27 +04:00 committed by VladimirMangos
parent 284b3a4865
commit 780b041f62
2 changed files with 26 additions and 22 deletions

View file

@ -3486,52 +3486,56 @@ void Aura::HandleAuraModStun(bool apply, bool Real)
void Aura::HandleModStealth(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 // 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 // only at real aura add
if(Real) if (Real)
{ {
m_target->SetStandFlags(UNIT_STAND_FLAGS_CREEP); pTarget->SetStandFlags(UNIT_STAND_FLAGS_CREEP);
if(m_target->GetTypeId()==TYPEID_PLAYER)
m_target->SetFlag(PLAYER_FIELD_BYTES2, 0x2000); if (pTarget->GetTypeId()==TYPEID_PLAYER)
pTarget->SetFlag(PLAYER_FIELD_BYTES2, 0x2000);
// apply only if not in GM invisibility (and overwrite invisibility state) // 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); pTarget->SetVisibility(VISIBILITY_GROUP_NO_DETECT);
m_target->SetVisibility(VISIBILITY_GROUP_STEALTH); pTarget->SetVisibility(VISIBILITY_GROUP_STEALTH);
} }
} }
} }
else else
{ {
// only at real aura remove // only at real aura remove
if(Real) if (Real)
{ {
// if last SPELL_AURA_MOD_STEALTH and no GM invisibility // 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); pTarget->RemoveStandFlags(UNIT_STAND_FLAGS_CREEP);
if(m_target->GetTypeId()==TYPEID_PLAYER)
m_target->RemoveFlag(PLAYER_FIELD_BYTES2, 0x2000); if (pTarget->GetTypeId()==TYPEID_PLAYER)
pTarget->RemoveFlag(PLAYER_FIELD_BYTES2, 0x2000);
// restore invisibility if any // 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); pTarget->SetVisibility(VISIBILITY_GROUP_NO_DETECT);
m_target->SetVisibility(VISIBILITY_GROUP_INVISIBILITY); pTarget->SetVisibility(VISIBILITY_GROUP_INVISIBILITY);
} }
else else
m_target->SetVisibility(VISIBILITY_ON); pTarget->SetVisibility(VISIBILITY_ON);
} }
} }
} }
// Master of Subtlety // 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) for(Unit::AuraList::const_iterator i = mDummyAuras.begin();i != mDummyAuras.end(); ++i)
{ {
if ((*i)->GetSpellProto()->SpellIconID == 2114) if ((*i)->GetSpellProto()->SpellIconID == 2114)
@ -3539,10 +3543,10 @@ void Aura::HandleModStealth(bool apply, bool Real)
if (apply) if (apply)
{ {
int32 bp = (*i)->GetModifier()->m_amount; 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 else
m_target->CastSpell(m_target,31666,true); pTarget->CastSpell(pTarget,31666,true);
break; break;
} }
} }

View file

@ -1,4 +1,4 @@
#ifndef __REVISION_NR_H__ #ifndef __REVISION_NR_H__
#define __REVISION_NR_H__ #define __REVISION_NR_H__
#define REVISION_NR "7601" #define REVISION_NR "7602"
#endif // __REVISION_NR_H__ #endif // __REVISION_NR_H__