All pastes #923660 Raw Edit

Jemand

public cpp v1 · immutable
#923660 ·published 2008-02-29 19:11 UTC
rendered paste body
Index: src/game/BattleGround.cpp===================================================================--- src/game/BattleGround.cpp	(revision 5333)+++ src/game/BattleGround.cpp	(working copy)@@ -720,7 +720,7 @@     SpellEntry const *spellInfo = sSpellStore.LookupEntry( SPELL_WAITING_FOR_RESURRECT );     if(spellInfo)     {-        Aura *Aur = new Aura(spellInfo, 0, NULL, plr);+        Aura *Aur = CreateAura(spellInfo, 0, NULL, plr);         plr->AddAura(Aur);     } }Index: src/game/Creature.cpp===================================================================--- src/game/Creature.cpp	(revision 5333)+++ src/game/Creature.cpp	(working copy)@@ -1706,7 +1706,7 @@                 continue;             } -            Aura* AdditionalAura = new Aura(AdditionalSpellInfo, cAura->effect_idx, NULL, this, this, 0);+            Aura* AdditionalAura = CreateAura(AdditionalSpellInfo, cAura->effect_idx, NULL, this, this, 0);             AddAura(AdditionalAura);             sLog.outDebug("Spell: %u with Aura %u added to creature (GUIDLow: %u Entry: %u )", cAura->spell_id, AdditionalSpellInfo->EffectApplyAuraName[0],GetGUIDLow(),GetEntry());         }Index: src/game/Level3.cpp===================================================================--- src/game/Level3.cpp	(revision 5333)+++ src/game/Level3.cpp	(working copy)@@ -2892,7 +2892,7 @@             else             if (eff == SPELL_EFFECT_APPLY_AURA || eff == SPELL_EFFECT_PERSISTENT_AREA_AURA)             {-                Aura *Aur = new Aura(spellInfo, i, NULL, target);+                Aura *Aur = CreateAura(spellInfo, i, NULL, target);                 target->AddAura(Aur);             }         }Index: src/game/Pet.cpp===================================================================--- src/game/Pet.cpp	(revision 5333)+++ src/game/Pet.cpp	(working copy)@@ -1253,7 +1253,7 @@             if(spellproto->Effect[effindex] == SPELL_EFFECT_APPLY_AREA_AURA)                 aura = new AreaAura(spellproto, effindex, NULL, this, NULL);             else-                aura = new Aura(spellproto, effindex, NULL, this, NULL);+                aura = CreateAura(spellproto, effindex, NULL, this, NULL);             if(!damage)                 damage = aura->GetModifier()->m_amount;             aura->SetLoadedState(caster_guid,damage,maxduration,remaintime,remaincharges);Index: src/game/Player.cpp===================================================================--- src/game/Player.cpp	(revision 5333)+++ src/game/Player.cpp	(working copy)@@ -13023,7 +13023,7 @@             if(spellproto->Effect[effindex] == SPELL_EFFECT_APPLY_AREA_AURA)                 aura = new AreaAura(spellproto, effindex, NULL, this, NULL);             else-                aura = new Aura(spellproto, effindex, NULL, this, NULL);+                aura = CreateAura(spellproto, effindex, NULL, this, NULL);             if(!damage)                 damage = aura->GetModifier()->m_amount;             aura->SetLoadedState(caster_guid,damage,maxduration,remaintime,remaincharges);Index: src/game/SpellAuras.cpp===================================================================--- src/game/SpellAuras.cpp	(revision 5333)+++ src/game/SpellAuras.cpp	(working copy)@@ -429,6 +429,40 @@ { } +SingleEnemyTargetAura::SingleEnemyTargetAura(SpellEntry const* spellproto, uint32 eff, int32 *currentBasePoints, Unit *target,+Unit *caster, Item* castItem) : Aura(spellproto, eff, currentBasePoints, target, caster, castItem)+{+    if (caster)+        m_casters_target_guid = caster->GetUInt64Value(UNIT_FIELD_TARGET);+}++SingleEnemyTargetAura::~SingleEnemyTargetAura()+{+}++Unit* SingleEnemyTargetAura::GetTriggerTarget() const+{+    return ObjectAccessor::GetUnit(*m_target, m_casters_target_guid);+}++Aura* CreateAura(SpellEntry const* spellproto, uint32 eff, int32 *currentBasePoints, Unit *target, Unit *caster, Item* castItem)+{+    uint32 triggeredSpellId = spellproto->EffectTriggerSpell[eff];++    bool hasTargetSingleEnemy = false;+    SpellEntry const* triggredSpellInfo = sSpellStore.LookupEntry(triggeredSpellId);+    if (triggredSpellInfo)+    {+        for (int i = 0; i < 3; ++i)+            hasTargetSingleEnemy |= (triggredSpellInfo->EffectImplicitTargetA[i] == TARGET_SINGLE_ENEMY);+    }+    +    if (hasTargetSingleEnemy)+        return new SingleEnemyTargetAura(spellproto, eff, currentBasePoints, target, caster, castItem);+    else+        return new Aura(spellproto, eff, currentBasePoints, target, caster, castItem);+}+ Unit* Aura::GetCaster() const {     if(m_caster_guid==m_target->GetGUID())@@ -1055,7 +1089,7 @@     // generic casting code with custom spells and target/caster customs     uint32 trigger_spell_id = GetSpellProto()->EffectTriggerSpell[m_effIndex];     Unit* caster = GetCaster();-    Unit* target = m_target;+    Unit* target = GetTriggerTarget();     uint64 originalCasterGUID = GetCasterGUID();      // specific code for cases with no trigger spell provided in field@@ -1077,14 +1111,6 @@         case 29528: trigger_spell_id = 28713; break;        // Inoculation          case 29917: trigger_spell_id = 29916; break;        // Feed Captured Animal-        case  1515:                                         // Tame Beast-        {-            // TODO: currently this used as hack for Tame beast triggered spell,-            // BUT this can be correct way to provide target for ALL this function calls-            // in case m_target==caster (or GetSpellProto()->EffectImplicitTargetA[m_effIndex]==TARGET_SELF )-            target = ObjectAccessor::GetUnit(*m_target, m_target->GetUInt64Value(UNIT_FIELD_TARGET));-            break;-        }         case 1010:                                          // Curse of Idiocy         {             // TODO: spell casted by result in correct way mostlyIndex: src/game/SpellAuras.h===================================================================--- src/game/SpellAuras.h	(revision 5333)+++ src/game/SpellAuras.h	(working copy)@@ -261,6 +261,8 @@          int32 m_procCharges; +        virtual Unit* GetTriggerTarget() const { return m_target; }+         // add/remove SPELL_AURA_MOD_SHAPESHIFT (36) linked auras         void HandleShapeshiftBoosts(bool apply);     protected:@@ -319,4 +321,18 @@         ~PersistentAreaAura();         void Update(uint32 diff); };++class MANGOS_DLL_SPEC SingleEnemyTargetAura : public Aura+{+    public:+        SingleEnemyTargetAura(SpellEntry const* spellproto, uint32 eff, int32 *currentBasePoints, Unit *target, Unit *caster  = NULL, Item* castItem = NULL);+        ~SingleEnemyTargetAura();+        Unit* GetTriggerTarget() const;++    protected:+        uint64 m_casters_target_guid;+};++Aura* CreateAura(SpellEntry const* spellproto, uint32 eff, int32 *currentBasePoints, Unit *target, Unit *caster = NULL, Item* castItem = NULL);+ #endifIndex: src/game/SpellEffects.cpp===================================================================--- src/game/SpellEffects.cpp	(revision 5333)+++ src/game/SpellEffects.cpp	(working copy)@@ -1520,7 +1520,7 @@      sLog.outDebug("Spell: Aura is: %u", m_spellInfo->EffectApplyAuraName[i]); -    Aura* Aur = new Aura(m_spellInfo, i, &m_currentBasePoints[i], unitTarget,m_caster, m_CastItem);+    Aura* Aur = CreateAura(m_spellInfo, i, &m_currentBasePoints[i], unitTarget,m_caster, m_CastItem);      if (!Aur->IsPositive() && Aur->GetCasterGUID() != Aur->GetTarget()->GetGUID())     {@@ -1640,31 +1640,11 @@         SpellEntry const *AdditionalSpellInfo = sSpellStore.LookupEntry(spellId);         if (AdditionalSpellInfo)         {-            Aura* AdditionalAura = new Aura(AdditionalSpellInfo, 0, &m_currentBasePoints[0], unitTarget,m_caster, 0);+            Aura* AdditionalAura = CreateAura(AdditionalSpellInfo, 0, &m_currentBasePoints[0], unitTarget,m_caster, 0);             unitTarget->AddAura(AdditionalAura);             sLog.outDebug("Spell: Additional Aura is: %u", AdditionalSpellInfo->EffectApplyAuraName[0]);         }     }--    // arcane missiles, do not affect tame beast-    if(Aur->IsTrigger() && m_spellInfo->Id != 1515)-    {-        SpellEntry const *spellInfo = sSpellStore.LookupEntry(m_spellInfo->EffectTriggerSpell[i]);-        if (!spellInfo) return;-        if (m_caster->GetTypeId() == TYPEID_PLAYER && spellInfo->EffectImplicitTargetA[0] == TARGET_SINGLE_ENEMY)-        {-            Unit *target = ObjectAccessor::GetUnit(*m_caster, ((Player*)m_caster)->GetSelection());-            if (target)-            {-                if (!m_caster->IsFriendlyTo(target))-                    Aur->SetTarget(target);-                else-                    cancel();-            }-            else-                cancel();-        }-    } }  void Spell::EffectUnlearnSpecialization( uint32 i )@@ -4799,7 +4779,7 @@             int32 basePoints = aur->GetBasePoints();              // construct the new aura for the attacker-            Aura * new_aur = new Aura(aur->GetSpellProto(), i, &basePoints, m_caster);+            Aura * new_aur = CreateAura(aur->GetSpellProto(), i, &basePoints, m_caster);              if(!new_aur)                 continue;Index: src/game/SpellMgr.cpp===================================================================--- src/game/SpellMgr.cpp	(revision 5333)+++ src/game/SpellMgr.cpp	(working copy)@@ -1524,4 +1524,4 @@         return true;      return false;-}+}\ No newline at end of fileIndex: src/game/SpellMgr.h===================================================================--- src/game/SpellMgr.h	(revision 5333)+++ src/game/SpellMgr.h	(working copy)@@ -106,6 +106,8 @@ bool CanUsedWhileStealthed(uint32 spellId); bool IsMechanicInvulnerabilityImmunityToSpell(SpellEntry const* spellInfo); +bool IsTargetSingleEnemyAura(SpellEntry const* spellInfo, uint8 effectId);+ // Spell affects related declarations (accessed using SpellMgr functions) struct SpellAffection {