mirror of
https://github.com/mangosfour/server.git
synced 2025-12-18 01:37:01 +00:00
[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:
parent
284b3a4865
commit
780b041f62
2 changed files with 26 additions and 22 deletions
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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__
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue