*Fix crash and area aura remove.

--HG--
branch : trunk
This commit is contained in:
QAston
2009-04-06 18:19:05 +02:00
parent c6c084cc45
commit fa1df5bac3
2 changed files with 21 additions and 24 deletions
+17 -23
View File
@@ -414,8 +414,8 @@ m_auraSlot(MAX_AURAS), m_auraLevel(1), m_procCharges(0), m_stackAmount(1),m_aura
else else
m_partAuras[i]=CreateAuraEffect(this, i, NULL , caster); m_partAuras[i]=CreateAuraEffect(this, i, NULL , caster);
// correct flags if aura couldn't be created // correct flags if aura couldn't be created
//if (!m_partAuras[i]) if (!m_partAuras[i])
//m_auraFlags &= (~(uint8(1) << i)); m_auraFlags &= uint8(~(uint8(1) << i));
} }
else else
{ {
@@ -628,12 +628,12 @@ void Aura::Update(uint32 diff)
if (caster->GetHealth()>manaPerSecond) if (caster->GetHealth()>manaPerSecond)
caster->ModifyHealth(-manaPerSecond); caster->ModifyHealth(-manaPerSecond);
else else
m_target->RemoveAurasDueToSpell(GetId(),GetCasterGUID()); RemoveAura();
} }
else if (caster->GetPower(powertype)>=manaPerSecond) else if (caster->GetPower(powertype)>=manaPerSecond)
caster->ModifyPower(powertype,-manaPerSecond); caster->ModifyPower(powertype,-manaPerSecond);
else else
m_target->RemoveAurasDueToSpell(GetId(),GetCasterGUID()); RemoveAura();
} }
} }
} }
@@ -645,7 +645,7 @@ void Aura::Update(uint32 diff)
Unit* caster = GetCaster(); Unit* caster = GetCaster();
if(!caster) if(!caster)
{ {
m_target->RemoveAurasDueToSpell(GetId(),GetCasterGUID()); RemoveAura();
return; return;
} }
// Get spell range // Get spell range
@@ -671,7 +671,7 @@ void Aura::Update(uint32 diff)
if(!caster->IsWithinDistInMap(m_target,radius)) if(!caster->IsWithinDistInMap(m_target,radius))
{ {
m_target->RemoveAurasDueToSpell(GetId(),GetCasterGUID()); RemoveAura();
return; return;
} }
} }
@@ -758,7 +758,7 @@ void AreaAuraEffect::Update(uint32 diff)
//if(actualSpellInfo != GetSpellProto()) //if(actualSpellInfo != GetSpellProto())
// actualBasePoints = actualSpellInfo->EffectBasePoints[m_effIndex]; // actualBasePoints = actualSpellInfo->EffectBasePoints[m_effIndex];
Aura * aur = (*tIter)->AddAuraEffect(actualSpellInfo->Id, GetEffIndex(), caster); Aura * aur = (*tIter)->AddAuraEffect(actualSpellInfo->Id, GetEffIndex(), caster);
aur->SetAuraDuration(aur->GetAuraDuration()); RemoveParentAura();
if(m_areaAuraType == AREA_AURA_ENEMY) if(m_areaAuraType == AREA_AURA_ENEMY)
caster->CombatStart(*tIter); caster->CombatStart(*tIter);
@@ -788,7 +788,7 @@ void AreaAuraEffect::Update(uint32 diff)
caster->IsFriendlyTo(tmp_target) != needFriendly caster->IsFriendlyTo(tmp_target) != needFriendly
) )
{ {
GetParentAura()->SetAuraDuration(0); GetParentAura()->RemoveAura();
} }
else if (!caster->IsWithinDistInMap(tmp_target, m_radius)) else if (!caster->IsWithinDistInMap(tmp_target, m_radius))
{ {
@@ -796,10 +796,10 @@ void AreaAuraEffect::Update(uint32 diff)
{ {
m_removeTime -= diff; m_removeTime -= diff;
if (m_removeTime < 0) if (m_removeTime < 0)
GetParentAura()->SetAuraDuration(0); GetParentAura()->RemoveAura();
} }
else else
GetParentAura()->SetAuraDuration(0); GetParentAura()->RemoveAura();
} }
else else
{ {
@@ -808,17 +808,17 @@ void AreaAuraEffect::Update(uint32 diff)
if( m_areaAuraType == AREA_AURA_PARTY) // check if in same sub group if( m_areaAuraType == AREA_AURA_PARTY) // check if in same sub group
{ {
if(!tmp_target->IsInPartyWith(caster)) if(!tmp_target->IsInPartyWith(caster))
GetParentAura()->SetAuraDuration(0); GetParentAura()->RemoveAura();
} }
else if( m_areaAuraType == AREA_AURA_RAID) else if( m_areaAuraType == AREA_AURA_RAID)
{ {
if(!tmp_target->IsInRaidWith(caster)) if(!tmp_target->IsInRaidWith(caster))
GetParentAura()->SetAuraDuration(0); GetParentAura()->RemoveAura();
} }
else if( m_areaAuraType == AREA_AURA_PET || m_areaAuraType == AREA_AURA_OWNER ) else if( m_areaAuraType == AREA_AURA_PET || m_areaAuraType == AREA_AURA_OWNER )
{ {
if( tmp_target->GetGUID() != caster->GetCharmerOrOwnerGUID() ) if( tmp_target->GetGUID() != caster->GetCharmerOrOwnerGUID() )
GetParentAura()->SetAuraDuration(0); GetParentAura()->RemoveAura();
} }
} }
} }
@@ -845,16 +845,10 @@ void PersistentAreaAuraEffect::Update(uint32 diff)
else else
remove = true; remove = true;
Unit *tmp_target = m_target;
uint32 tmp_id = GetId();
uint64 tmp_guid = GetCasterGUID();
// WARNING: the aura may get deleted during the update
// DO NOT access its members after update!
AuraEffect::Update(diff);
if(remove) if(remove)
GetParentAura()->SetAuraDuration(0); GetParentAura()->RemoveAura();
AuraEffect::Update(diff);
} }
void AuraEffect::ApplyModifier(bool apply, bool Real) void AuraEffect::ApplyModifier(bool apply, bool Real)
@@ -1073,7 +1067,7 @@ void Aura::_AddAura()
bool Aura::SetPartAura(AuraEffect* aurEff, uint8 effIndex) bool Aura::SetPartAura(AuraEffect* aurEff, uint8 effIndex)
{ {
if (m_auraFlags & 1<<effIndex) if (m_auraFlags & (1<<effIndex))
return false; return false;
m_auraFlags |= 1<<effIndex; m_auraFlags |= 1<<effIndex;
m_partAuras[effIndex]=aurEff; m_partAuras[effIndex]=aurEff;
+3
View File
@@ -92,6 +92,8 @@ class TRINITY_DLL_SPEC Aura
void SetNegative() { m_positive = false; } void SetNegative() { m_positive = false; }
void SetPositive() { m_positive = true; } void SetPositive() { m_positive = true; }
bool IsPermanent() const { return m_permanent; } bool IsPermanent() const { return m_permanent; }
void RemoveAura() { m_permanent = false; m_duration=0; }
bool IsPassive() const { return m_isPassive; } bool IsPassive() const { return m_isPassive; }
bool IsDeathPersistent() const { return m_isDeathPersist; } bool IsDeathPersistent() const { return m_isDeathPersist; }
bool IsRemovedOnShapeLost() const { return m_isRemovedOnShapeLost; } bool IsRemovedOnShapeLost() const { return m_isRemovedOnShapeLost; }
@@ -353,6 +355,7 @@ class TRINITY_DLL_SPEC AuraEffect
int32 GetAmount() const {return m_amount;} int32 GetAmount() const {return m_amount;}
void SetAmount(int32 amount) { m_amount = amount; } void SetAmount(int32 amount) { m_amount = amount; }
void CleanupTriggeredSpells(); void CleanupTriggeredSpells();
bool RemoveParentAura();
protected: protected:
AuraEffect (Aura * parentAura, uint8 effIndex, int32 * currentBasePoints , Unit * caster,Item * castItem); AuraEffect (Aura * parentAura, uint8 effIndex, int32 * currentBasePoints , Unit * caster,Item * castItem);