aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQAston <qaston@gmail.com>2011-06-07 12:47:32 +0200
committerQAston <qaston@gmail.com>2011-06-07 12:47:32 +0200
commit3effdb2c23b9690e53376e9fcb77d48ebd91780e (patch)
tree8730349fe8bb0bf52068c1524ca9defef2ba4e4f
parentbbcfcabf3a37421e906c2826946d1bbd8fcb9db6 (diff)
Core/Auras: Add Aura::TryRefreshStackOrCreate function and remove stack checks from Aura::Create
-rwxr-xr-xsrc/server/game/Chat/Commands/Level3.cpp4
-rwxr-xr-xsrc/server/game/Entities/Pet/Pet.cpp2
-rwxr-xr-xsrc/server/game/Entities/Unit/Unit.cpp8
-rwxr-xr-xsrc/server/game/Spells/Auras/SpellAuras.cpp72
-rwxr-xr-xsrc/server/game/Spells/Auras/SpellAuras.h7
-rwxr-xr-xsrc/server/game/Spells/Spell.cpp2
-rwxr-xr-xsrc/server/game/Spells/SpellEffects.cpp2
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp2
8 files changed, 50 insertions, 49 deletions
diff --git a/src/server/game/Chat/Commands/Level3.cpp b/src/server/game/Chat/Commands/Level3.cpp
index a58c8660a1c..1babb5980ab 100755
--- a/src/server/game/Chat/Commands/Level3.cpp
+++ b/src/server/game/Chat/Commands/Level3.cpp
@@ -1956,7 +1956,7 @@ bool ChatHandler::HandleAuraCommand(const char *args)
uint32 spellID = extractSpellIdFromLink((char*)args);
if (SpellEntry const *spellInfo = sSpellStore.LookupEntry(spellID))
- Aura::TryCreate(spellInfo, target, target);
+ Aura::TryRefreshStackOrCreate(spellInfo, MAX_EFFECT_MASK, target, target);
return true;
}
@@ -4523,7 +4523,7 @@ bool ChatHandler::HandleFreezeCommand(const char *args)
//m_session->GetPlayer()->CastSpell(player, spellID, false);
if (SpellEntry const *spellInfo = sSpellStore.LookupEntry(9454))
- Aura::TryCreate(spellInfo, player, player);
+ Aura::TryRefreshStackOrCreate(spellInfo, MAX_EFFECT_MASK, player, player);
//save player
player->SaveToDB();
diff --git a/src/server/game/Entities/Pet/Pet.cpp b/src/server/game/Entities/Pet/Pet.cpp
index 1e9de679ea1..b4e95cc8f4c 100755
--- a/src/server/game/Entities/Pet/Pet.cpp
+++ b/src/server/game/Entities/Pet/Pet.cpp
@@ -1230,7 +1230,7 @@ void Pet::_LoadAuras(uint32 timediff)
else
remaincharges = 0;
- if (Aura * aura = Aura::TryCreate(spellproto, effmask, this, NULL, &baseDamage[0], NULL, caster_guid))
+ if (Aura* aura = Aura::TryCreate(spellproto, effmask, this, NULL, &baseDamage[0], NULL, caster_guid))
{
if (!aura->CanBeSaved())
{
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 8a70efff5bf..9347c8ddf04 100755
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -3815,7 +3815,7 @@ void Unit::RemoveAurasDueToSpellBySteal(uint32 spellId, uint64 casterGUID, Unit
if (aura->IsSingleTarget())
aura->UnregisterSingleTarget();
- if (newAura = Aura::TryCreate(aura->GetSpellProto(), effMask, stealer, NULL, &baseDamage[0], NULL, aura->GetCasterGUID()))
+ if (newAura = Aura::TryRefreshStackOrCreate(aura->GetSpellProto(), effMask, stealer, NULL, &baseDamage[0], NULL, aura->GetCasterGUID()))
{
// created aura must not be single target aura,, so stealer won't loose it on recast
if (newAura->IsSingleTarget())
@@ -16184,7 +16184,7 @@ Aura * Unit::AddAura(SpellEntry const *spellInfo, uint8 effMask, Unit *target)
effMask &= ~(1<<i);
}
- if (Aura * aura = Aura::TryCreate(spellInfo, effMask, target, this))
+ if (Aura * aura = Aura::TryRefreshStackOrCreate(spellInfo, effMask, target, this))
{
aura->ApplyForTargets();
return aura;
@@ -16765,7 +16765,7 @@ bool Unit::HandleSpellClick(Unit* clicker, int8 seatId)
else // This can happen during Player::_LoadAuras
{
int32 bp0 = seatId;
- Aura::TryCreate(spellEntry, this, clicker, &bp0, NULL, origCasterGUID);
+ Aura::TryRefreshStackOrCreate(spellEntry, MAX_EFFECT_MASK, this, clicker, &bp0, NULL, origCasterGUID);
}
}
else
@@ -16773,7 +16773,7 @@ bool Unit::HandleSpellClick(Unit* clicker, int8 seatId)
if (IsInMap(caster))
caster->CastSpell(target, spellEntry, true, NULL, NULL, origCasterGUID);
else
- Aura::TryCreate(spellEntry, this, clicker, NULL, NULL, origCasterGUID);
+ Aura::TryRefreshStackOrCreate(spellEntry, MAX_EFFECT_MASK, this, clicker, NULL, NULL, origCasterGUID);
}
success = true;
diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp
index e2cc64e8df7..9ca8cd3ffa4 100755
--- a/src/server/game/Spells/Auras/SpellAuras.cpp
+++ b/src/server/game/Spells/Auras/SpellAuras.cpp
@@ -213,12 +213,10 @@ void AuraApplication::ClientUpdate(bool remove)
m_target->SendMessageToSet(&data, true);
}
-Aura * Aura::TryCreate(SpellEntry const* spellproto, uint8 tryEffMask, WorldObject * owner, Unit * caster, int32 *baseAmount, Item * castItem, uint64 casterGUID)
+uint8 Aura::BuildEffectMaskForOwner(SpellEntry const* spellProto, uint8 avalibleEffectMask, WorldObject* owner)
{
- ASSERT(spellproto);
+ ASSERT(spellProto);
ASSERT(owner);
- ASSERT(caster || casterGUID);
- ASSERT(tryEffMask <= MAX_EFFECT_MASK);
uint8 effMask = 0;
switch(owner->GetTypeId())
{
@@ -226,57 +224,62 @@ Aura * Aura::TryCreate(SpellEntry const* spellproto, uint8 tryEffMask, WorldObje
case TYPEID_PLAYER:
for (uint8 i = 0; i< MAX_SPELL_EFFECTS; ++i)
{
- if (IsUnitOwnedAuraEffect(spellproto->Effect[i]))
+ if (IsUnitOwnedAuraEffect(spellProto->Effect[i]))
effMask |= 1 << i;
}
break;
case TYPEID_DYNAMICOBJECT:
for (uint8 i = 0; i< MAX_SPELL_EFFECTS; ++i)
{
- if (spellproto->Effect[i] == SPELL_EFFECT_PERSISTENT_AREA_AURA)
+ if (spellProto->Effect[i] == SPELL_EFFECT_PERSISTENT_AREA_AURA)
effMask |= 1 << i;
}
break;
default:
break;
}
- if (uint8 realMask = effMask & tryEffMask)
- return Create(spellproto, realMask, owner, caster, baseAmount, castItem, casterGUID);
- return NULL;
+ return effMask & avalibleEffectMask;
}
-Aura * Aura::TryCreate(SpellEntry const* spellproto, WorldObject * owner, Unit * caster, int32 *baseAmount, Item * castItem, uint64 casterGUID)
+Aura* Aura::TryRefreshStackOrCreate(SpellEntry const* spellproto, uint8 tryEffMask, WorldObject* owner, Unit* caster, int32* baseAmount /*= NULL*/, Item* castItem /*= NULL*/, uint64 casterGUID /*= 0*/, bool* refresh /*= NULL*/)
{
ASSERT(spellproto);
ASSERT(owner);
ASSERT(caster || casterGUID);
- uint8 effMask = 0;
- switch(owner->GetTypeId())
+ ASSERT(tryEffMask <= MAX_EFFECT_MASK);
+ if (refresh)
+ *refresh = false;
+ uint8 effMask = Aura::BuildEffectMaskForOwner(spellproto, tryEffMask, owner);
+ if (!effMask)
+ return NULL;
+ if (Aura* foundAura = owner->ToUnit()->_TryStackingOrRefreshingExistingAura(spellproto, effMask, caster, baseAmount, castItem, casterGUID))
{
- case TYPEID_UNIT:
- case TYPEID_PLAYER:
- for (uint8 i = 0; i< MAX_SPELL_EFFECTS; ++i)
- {
- if (IsUnitOwnedAuraEffect(spellproto->Effect[i]))
- effMask |= 1 << i;
- }
- break;
- case TYPEID_DYNAMICOBJECT:
- for (uint8 i = 0; i< MAX_SPELL_EFFECTS; ++i)
- {
- if (spellproto->Effect[i] == SPELL_EFFECT_PERSISTENT_AREA_AURA)
- effMask |= 1 << i;
- }
- break;
- default:
- break;
+ // we've here aura, which script triggered removal after modding stack amount
+ // check the state here, so we won't create new Aura object
+ if (foundAura->IsRemoved())
+ return NULL;
+
+ if (refresh)
+ *refresh = true;
+ return foundAura;
}
- if (effMask)
+ else
return Create(spellproto, effMask, owner, caster, baseAmount, castItem, casterGUID);
- return NULL;
}
-Aura* Aura::Create(SpellEntry const* spellproto, uint8 effMask, WorldObject* owner, Unit* caster, int32* baseAmount /*= NULL*/, Item* castItem /*= NULL*/, uint64 casterGUID /*= 0*/)
+Aura* Aura::TryCreate(SpellEntry const* spellproto, uint8 tryEffMask, WorldObject* owner, Unit* caster, int32* baseAmount /*= NULL*/, Item* castItem /*= NULL*/, uint64 casterGUID /*= 0*/)
+{
+ ASSERT(spellproto);
+ ASSERT(owner);
+ ASSERT(caster || casterGUID);
+ ASSERT(tryEffMask <= MAX_EFFECT_MASK);
+ uint8 effMask = Aura::BuildEffectMaskForOwner(spellproto, tryEffMask, owner);
+ if (!effMask)
+ return NULL;
+ return Create(spellproto, effMask, owner, caster, baseAmount, castItem, casterGUID);
+}
+
+Aura* Aura::Create(SpellEntry const* spellproto, uint8 effMask, WorldObject* owner, Unit* caster, int32* baseAmount, Item* castItem, uint64 casterGUID)
{
ASSERT(effMask);
ASSERT(spellproto);
@@ -306,10 +309,7 @@ Aura* Aura::Create(SpellEntry const* spellproto, uint8 effMask, WorldObject* own
{
case TYPEID_UNIT:
case TYPEID_PLAYER:
- if (Aura* foundAura = owner->ToUnit()->_TryStackingOrRefreshingExistingAura(spellproto, effMask, caster, baseAmount, castItem, casterGUID))
- aura = foundAura;
- else
- aura = new UnitAura(spellproto, effMask, owner, caster, baseAmount, castItem, casterGUID);
+ aura = new UnitAura(spellproto, effMask, owner, caster, baseAmount, castItem, casterGUID);
break;
case TYPEID_DYNAMICOBJECT:
aura = new DynObjAura(spellproto, effMask, owner, caster, baseAmount, castItem, casterGUID);
diff --git a/src/server/game/Spells/Auras/SpellAuras.h b/src/server/game/Spells/Auras/SpellAuras.h
index 9701c81869e..d022fc3d85f 100755
--- a/src/server/game/Spells/Auras/SpellAuras.h
+++ b/src/server/game/Spells/Auras/SpellAuras.h
@@ -83,9 +83,10 @@ class Aura
public:
typedef std::map<uint64, AuraApplication *> ApplicationMap;
- static Aura * TryCreate(SpellEntry const* spellproto, uint8 effMask, WorldObject * owner, Unit * caster, int32 *baseAmount = NULL, Item * castItem = NULL, uint64 casterGUID = 0);
- static Aura * TryCreate(SpellEntry const* spellproto, WorldObject * owner, Unit * caster, int32 *baseAmount = NULL, Item * castItem = NULL, uint64 casterGUID = 0);
- static Aura* Create(SpellEntry const* spellproto, uint8 effMask, WorldObject* owner, Unit* caster, int32* baseAmount = NULL, Item* castItem = NULL, uint64 casterGUID = 0);
+ static uint8 BuildEffectMaskForOwner(SpellEntry const* spellProto, uint8 avalibleEffectMask, WorldObject* owner);
+ static Aura* TryRefreshStackOrCreate(SpellEntry const* spellproto, uint8 tryEffMask, WorldObject* owner, Unit* caster, int32* baseAmount = NULL, Item* castItem = NULL, uint64 casterGUID = 0, bool* refresh = NULL);
+ static Aura* TryCreate(SpellEntry const* spellproto, uint8 effMask, WorldObject * owner, Unit * caster, int32 *baseAmount = NULL, Item * castItem = NULL, uint64 casterGUID = 0);
+ static Aura* Create(SpellEntry const* spellproto, uint8 effMask, WorldObject* owner, Unit* caster, int32* baseAmount, Item* castItem, uint64 casterGUID);
explicit Aura(SpellEntry const* spellproto, WorldObject * owner, Unit * caster, Item * castItem, uint64 casterGUID);
void _InitEffects(uint8 effMask, Unit * caster, int32 *baseAmount);
virtual ~Aura();
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index 5af387ca4cd..b8bd908cd65 100755
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -1427,7 +1427,7 @@ SpellMissInfo Spell::DoSpellHitOnUnit(Unit *unit, const uint32 effectMask, bool
if (m_originalCaster)
{
- m_spellAura = Aura::TryCreate(aurSpellInfo, effectMask, unit,
+ m_spellAura = Aura::TryRefreshStackOrCreate(aurSpellInfo, effectMask, unit,
m_originalCaster, (aurSpellInfo == m_spellInfo)? &m_spellValue->EffectBasePoints[0] : &basePoints[0], m_CastItem);
if (m_spellAura)
{
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index e5375ede40e..caed2ca93f4 100755
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -2543,7 +2543,7 @@ void Spell::EffectPersistentAA(SpellEffIndex effIndex)
dynObj->GetMap()->Add(dynObj);
- if (Aura* aura = Aura::TryCreate(m_spellInfo, dynObj, caster, &m_spellValue->EffectBasePoints[0]))
+ if (Aura* aura = Aura::TryCreate(m_spellInfo, MAX_EFFECT_MASK, dynObj, caster, &m_spellValue->EffectBasePoints[0]))
{
m_spellAura = aura;
m_spellAura->_RegisterForTargets();
diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp
index d65be72aec6..a409351ddd2 100644
--- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp
@@ -249,7 +249,7 @@ class boss_kelidan_the_breaker : public CreatureScript
if (SpellEntry *nova = GET_SPELL(SPELL_BURNING_NOVA))
{
- if (Aura * aura = Aura::TryCreate(nova, me, me))
+ if (Aura * aura = Aura::TryRefreshStackOrCreate(nova, MAX_EFFECT_MASK, me, me))
aura->ApplyForTargets();
}