aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authormegamage <none@none>2009-08-05 15:35:43 -0500
committermegamage <none@none>2009-08-05 15:35:43 -0500
commit11488f2063b6340630e38f50f0d64da69dd9dfb8 (patch)
tree730cd4c49a5cec841aa21448cc2949ed57297b43 /src
parent62055d85a972263131003552816aa218e3955692 (diff)
[8295] Remove single target auras at caster/target shift to not accessable phase. Author: VladimirMangos
This must fix another source of "Couldn't find the caster of the single target aura" errors. --HG-- branch : trunk
Diffstat (limited to 'src')
-rw-r--r--src/game/Unit.cpp27
-rw-r--r--src/game/Unit.h5
2 files changed, 26 insertions, 6 deletions
diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp
index 4622c4cfe9e..3bd529be8f1 100644
--- a/src/game/Unit.cpp
+++ b/src/game/Unit.cpp
@@ -4174,13 +4174,24 @@ void Unit::RemoveAurasByTypeWithDispel(AuraType auraType, Spell * spell)
}
}
-void Unit::RemoveNotOwnSingleTargetAuras()
+void Unit::RemoveNotOwnSingleTargetAuras(uint32 newPhase)
{
// single target auras from other casters
for (AuraMap::iterator iter = m_Auras.begin(); iter != m_Auras.end(); )
{
if (iter->second->GetCasterGUID()!=GetGUID() && IsSingleTargetSpell(iter->second->GetSpellProto()))
- RemoveAura(iter);
+ {
+ if(!newPhase)
+ RemoveAura(iter);
+ else
+ {
+ Unit* caster = iter->second->GetCaster();
+ if(!caster || !caster->InSamePhase(newPhase))
+ RemoveAura(iter);
+ else
+ ++iter;
+ }
+ }
else
++iter;
}
@@ -4189,12 +4200,12 @@ void Unit::RemoveNotOwnSingleTargetAuras()
AuraList& scAuras = GetSingleCastAuras();
for (AuraList::iterator iter = scAuras.begin(); iter != scAuras.end();)
{
- Aura * aur=*iter;
+ Aura * aura=*iter;
++iter;
- if (aur->GetTarget()!=this)
+ if (aura->GetTarget() != this && !aura->GetTarget()->InSamePhase(newPhase))
{
uint32 removedAuras = m_removedAurasCount;
- aur->GetTarget()->RemoveAura(aur->GetId(),aur->GetCasterGUID());
+ aura->GetTarget()->RemoveAura(aura->GetId(),aura->GetCasterGUID());
if (removedAuras+1<m_removedAurasCount)
iter=scAuras.begin();
}
@@ -14837,6 +14848,12 @@ float Unit::MeleeSpellMissChance(const Unit *pVictim, WeaponAttackType attType,
void Unit::SetPhaseMask(uint32 newPhaseMask, bool update)
{
+ if(newPhaseMask==GetPhaseMask())
+ return;
+
+ if(IsInWorld())
+ RemoveNotOwnSingleTargetAuras(newPhaseMask); // we can lost access to caster or target
+
WorldObject::SetPhaseMask(newPhaseMask,update);
if(!IsInWorld())
diff --git a/src/game/Unit.h b/src/game/Unit.h
index 5a09d0f8c0e..6d200566a2b 100644
--- a/src/game/Unit.h
+++ b/src/game/Unit.h
@@ -1450,7 +1450,10 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
void RemoveAurasDueToItemSpell(Item* castItem,uint32 spellId);
void RemoveAurasByType(AuraType auraType, uint64 casterGUID = 0, Aura * except=NULL, bool negative = true, bool positive = true);
void RemoveAurasByTypeWithDispel(AuraType auraType, Spell * spell = NULL);
- void RemoveNotOwnSingleTargetAuras();
+ void RemoveNotOwnSingleTargetAuras(uint32 newPhase = 0x0);
+
+ void RemoveSpellsCausingAura(AuraType auraType);
+ void RemoveRankAurasDueToSpell(uint32 spellId);
bool RemoveNoStackAurasDueToAura(Aura *Aur);
void RemoveAurasWithInterruptFlags(uint32 flag, uint32 except = NULL);
void RemoveAurasWithFamily(uint32 family, uint32 familyFlag1, uint32 familyFlag2, uint32 familyFlag3, uint64 casterGUID);