diff options
author | QAston <qaston@gmail.com> | 2011-06-07 12:47:32 +0200 |
---|---|---|
committer | QAston <qaston@gmail.com> | 2011-06-07 12:47:32 +0200 |
commit | 3effdb2c23b9690e53376e9fcb77d48ebd91780e (patch) | |
tree | 8730349fe8bb0bf52068c1524ca9defef2ba4e4f | |
parent | bbcfcabf3a37421e906c2826946d1bbd8fcb9db6 (diff) |
Core/Auras: Add Aura::TryRefreshStackOrCreate function and remove stack checks from Aura::Create
-rwxr-xr-x | src/server/game/Chat/Commands/Level3.cpp | 4 | ||||
-rwxr-xr-x | src/server/game/Entities/Pet/Pet.cpp | 2 | ||||
-rwxr-xr-x | src/server/game/Entities/Unit/Unit.cpp | 8 | ||||
-rwxr-xr-x | src/server/game/Spells/Auras/SpellAuras.cpp | 72 | ||||
-rwxr-xr-x | src/server/game/Spells/Auras/SpellAuras.h | 7 | ||||
-rwxr-xr-x | src/server/game/Spells/Spell.cpp | 2 | ||||
-rwxr-xr-x | src/server/game/Spells/SpellEffects.cpp | 2 | ||||
-rw-r--r-- | src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp | 2 |
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(); } |