Index: /trunk/src/game/SpellEffects.cpp
===================================================================
--- /trunk/src/game/SpellEffects.cpp (revision 186)
+++ /trunk/src/game/SpellEffects.cpp (revision 196)
@@ -312,5 +312,5 @@
 
                 // Meteor like spells (divided damage to targets)
-                if(spellmgr.GetSpellExtraAttr(m_spellInfo->Id, SPELL_EXTRA_ATTR_SHARE_DAMAGE))
+                if(spellmgr.GetSpellCustomAttr(m_spellInfo->Id) & SPELL_ATTR_CU_SHARE_DAMAGE)
                 {
                     uint32 count = 0;
Index: /trunk/src/game/World.cpp
===================================================================
--- /trunk/src/game/World.cpp (revision 181)
+++ /trunk/src/game/World.cpp (revision 196)
@@ -1096,5 +1096,5 @@
 
     sLog.outString( "Loading spell extra attributes...(TODO)" );
-    spellmgr.LoadSpellExtraAttr();
+    spellmgr.LoadSpellCustomAttr();
 
     sLog.outString( "Loading linked spells..." );
Index: /trunk/src/game/SpellAuras.cpp
===================================================================
--- /trunk/src/game/SpellAuras.cpp (revision 178)
+++ /trunk/src/game/SpellAuras.cpp (revision 196)
@@ -5624,5 +5624,5 @@
             // DO NOT ACCESS MEMBERS OF THE AURA FROM NOW ON (DealDamage can delete aura)
 
-            pCaster->ProcDamageAndSpell(target, PROC_FLAG_HIT_SPELL, PROC_FLAG_TAKE_DAMAGE, (pdamage <= absorb+resist) ? 0 : (pdamage-absorb-resist), GetSpellSchoolMask(spellProto), spellProto);
+            pCaster->ProcDamageAndSpell(target, PROC_FLAG_NONE, PROC_FLAG_TAKE_DAMAGE, (pdamage <= absorb+resist) ? 0 : (pdamage-absorb-resist), GetSpellSchoolMask(spellProto), spellProto);
             break;
         }
@@ -5737,5 +5737,5 @@
             // DO NOT ACCESS MEMBERS OF THE AURA FROM NOW ON (DealDamage can delete aura)
 
-            pCaster->ProcDamageAndSpell(target, PROC_FLAG_HIT_SPELL, PROC_FLAG_TAKE_DAMAGE, new_damage, GetSpellSchoolMask(spellProto), spellProto);
+            pCaster->ProcDamageAndSpell(target, PROC_FLAG_HEALED, PROC_FLAG_TAKE_DAMAGE, new_damage, GetSpellSchoolMask(spellProto), spellProto);
             if (!target->isAlive() && pCaster->IsNonMeleeSpellCasted(false))
             {
@@ -5840,5 +5840,5 @@
             // ignore item heals
             if(procSpell && !haveCastItem)
-                pCaster->ProcDamageAndSpell(target,PROC_FLAG_HEAL, PROC_FLAG_HEALED, pdamage, SPELL_SCHOOL_MASK_NONE, spellProto);
+                pCaster->ProcDamageAndSpell(target,PROC_FLAG_NONE, PROC_FLAG_HEALED, pdamage, SPELL_SCHOOL_MASK_NONE, spellProto);
             break;
         }
Index: /trunk/src/game/SpellMgr.h
===================================================================
--- /trunk/src/game/SpellMgr.h (revision 157)
+++ /trunk/src/game/SpellMgr.h (revision 196)
@@ -635,17 +635,12 @@
 }
 
-enum SpellExtraAttributeType
-{
-    SPELL_EXTRA_ATTR_MAX_TARGETS,
-    SPELL_EXTRA_ATTR_CONE_TYPE,
-    SPELL_EXTRA_ATTR_SHARE_DAMAGE
-};
-
-struct SpellExtraAttribute
-{
-    uint32 attr[3];
-};
-
-typedef std::map<uint32, SpellExtraAttribute> SpellExtraAttrMap;
+#define SPELL_ATTR_CU_PLAYERS_ONLY      0x00000001
+#define SPELL_ATTR_CU_CONE_BACK         0x00000002
+#define SPELL_ATTR_CU_CONE_LINE         0x00000004
+#define SPELL_ATTR_CU_SHARE_DAMAGE      0x00000008
+#define SPELL_ATTR_CU_EFFECT_HEAL       0x00000010
+#define SPELL_ATTR_CU_EFFECT_DAMAGE     0x00000020
+
+typedef std::map<uint32, uint32> SpellCustomAttrMap;
 
 typedef std::map<int32, std::vector<int32> > SpellLinkedMap;
@@ -849,9 +844,9 @@
         }
 
-        uint32 GetSpellExtraAttr(uint32 spell_id, uint32 type) const
-        {
-            SpellExtraAttrMap::const_iterator itr = mSpellExtraAttrMap.find(spell_id);
-            if(itr != mSpellExtraAttrMap.end())
-                return itr->second.attr[type];
+        uint32 GetSpellCustomAttr(uint32 spell_id) const
+        {
+            SpellCustomAttrMap::const_iterator itr = mSpellCustomAttrMap.find(spell_id);
+            if(itr != mSpellCustomAttrMap.end())
+                return itr->second;
             else
                 return 0;
@@ -880,5 +875,5 @@
         void LoadSkillLineAbilityMap();
         void LoadSpellPetAuras();
-        void LoadSpellExtraAttr();
+        void LoadSpellCustomAttr();
         void LoadSpellLinked();
 
@@ -895,5 +890,5 @@
         SkillLineAbilityMap mSkillLineAbilityMap;
         SpellPetAuraMap     mSpellPetAuraMap;
-        SpellExtraAttrMap   mSpellExtraAttrMap;
+        SpellCustomAttrMap  mSpellCustomAttrMap;
         SpellLinkedMap      mSpellLinkedMap;
 };
Index: /trunk/src/game/Spell.cpp
===================================================================
--- /trunk/src/game/Spell.cpp (revision 194)
+++ /trunk/src/game/Spell.cpp (revision 196)
@@ -1047,6 +1047,7 @@
                 float multiplier = m_spellInfo->DmgMultiplier[effectNumber];
                 // Apply multiplier mods
-                if(Player* modOwner = m_originalCaster->GetSpellModOwner())
-                    modOwner->ApplySpellMod(m_spellInfo->Id, SPELLMOD_EFFECT_PAST_FIRST, multiplier,this);
+                if(m_originalCaster)
+                    if(Player* modOwner = m_originalCaster->GetSpellModOwner())
+                        modOwner->ApplySpellMod(m_spellInfo->Id, SPELLMOD_EFFECT_PAST_FIRST, multiplier,this);
                 m_damageMultipliers[effectNumber] *= multiplier;
             }
@@ -1069,4 +1070,13 @@
                 unit->CastSpell(unit, *i, true, 0, 0, m_caster->GetGUID());
         }
+    }
+
+    if(spellmgr.GetSpellCustomAttr(m_spellInfo->Id) && m_originalCaster)
+    {
+        uint32 flag = spellmgr.GetSpellCustomAttr(m_spellInfo->Id);
+        if(flag & SPELL_ATTR_CU_EFFECT_HEAL)
+            m_originalCaster->ProcDamageAndSpell(unit, PROC_FLAG_HEAL, PROC_FLAG_NONE, 0, GetSpellSchoolMask(m_spellInfo), m_spellInfo);
+        if(m_originalCaster != unit && (flag & SPELL_ATTR_CU_EFFECT_DAMAGE)) 
+            m_originalCaster->ProcDamageAndSpell(unit, PROC_FLAG_HIT_SPELL, PROC_FLAG_STRUCK_SPELL, 0, GetSpellSchoolMask(m_spellInfo), m_spellInfo);
     }
 }
@@ -1283,5 +1293,5 @@
         cell_lock->Visit(cell_lock, world_object_notifier, *MapManager::Instance().GetMap(m_caster->GetMapId(), m_caster));
     }
-    if(!spellmgr.GetSpellExtraAttr(m_spellInfo->Id, SPELL_EXTRA_ATTR_MAX_TARGETS))
+    if(!(spellmgr.GetSpellCustomAttr(m_spellInfo->Id) & SPELL_ATTR_CU_PLAYERS_ONLY))
     {
         TypeContainerVisitor<Trinity::SpellNotifierCreatureAndPlayer, GridTypeMapContainer >  grid_object_notifier(notifier);
@@ -1343,6 +1353,5 @@
     uint32 EffectChainTarget = m_spellInfo->EffectChainTarget[i];
     uint32 unMaxTargets = m_spellInfo->MaxAffectedTargets;
-    if(!unMaxTargets)
-        unMaxTargets = spellmgr.GetSpellExtraAttr(m_spellInfo->Id, SPELL_EXTRA_ATTR_MAX_TARGETS);
+
     if(m_originalCaster)
     {
@@ -1504,17 +1513,11 @@
         case TARGET_IN_FRONT_OF_CASTER:
         case TARGET_UNIT_CONE_ENEMY_UNKNOWN:
-            switch(spellmgr.GetSpellExtraAttr(m_spellInfo->Id, SPELL_EXTRA_ATTR_CONE_TYPE))
-            {
-                default:
-                case 0:
-                    SearchAreaTarget(TagUnitMap, radius, PUSH_IN_FRONT, SPELL_TARGETS_AOE_DAMAGE);
-                    break;
-                case 1:
-                    SearchAreaTarget(TagUnitMap, radius, PUSH_IN_BACK, SPELL_TARGETS_AOE_DAMAGE);
-                    break;
-                case 2:
-                    SearchAreaTarget(TagUnitMap, radius, PUSH_IN_LINE, SPELL_TARGETS_AOE_DAMAGE);
-                    break;
-            }break;
+            if(spellmgr.GetSpellCustomAttr(m_spellInfo->Id) & SPELL_ATTR_CU_CONE_BACK)
+                SearchAreaTarget(TagUnitMap, radius, PUSH_IN_BACK, SPELL_TARGETS_AOE_DAMAGE);
+            else if(spellmgr.GetSpellCustomAttr(m_spellInfo->Id) & SPELL_ATTR_CU_CONE_LINE)
+                SearchAreaTarget(TagUnitMap, radius, PUSH_IN_LINE, SPELL_TARGETS_AOE_DAMAGE);
+            else
+                SearchAreaTarget(TagUnitMap, radius, PUSH_IN_FRONT, SPELL_TARGETS_AOE_DAMAGE);
+            break;
         case TARGET_UNIT_CONE_ALLY:
             SearchAreaTarget(TagUnitMap, radius, PUSH_IN_FRONT, SPELL_TARGETS_FRIENDLY);
Index: /trunk/src/game/SpellMgr.cpp
===================================================================
--- /trunk/src/game/SpellMgr.cpp (revision 186)
+++ /trunk/src/game/SpellMgr.cpp (revision 196)
@@ -1970,80 +1970,72 @@
 
 // set data in core for now
-void SpellMgr::LoadSpellExtraAttr()
-{
-    SpellExtraAttribute tempAttr;
-    tempAttr.attr[SPELL_EXTRA_ATTR_CONE_TYPE] = 0;
-    tempAttr.attr[SPELL_EXTRA_ATTR_MAX_TARGETS] = 0;
-    tempAttr.attr[SPELL_EXTRA_ATTR_SHARE_DAMAGE] = 0;
-
-    tempAttr.attr[SPELL_EXTRA_ATTR_CONE_TYPE] = 1;
-    {
-        SpellEntry const* tempSpell;
-        for(uint32 i = 0; i < GetSpellStore()->GetNumRows(); ++i)
-        {
-            tempSpell = GetSpellStore()->LookupEntry(i);
-            if(tempSpell && tempSpell->SpellVisual == 3879)
-                mSpellExtraAttrMap[tempSpell->Id] = tempAttr;
-        }
-    }
-    tempAttr.attr[SPELL_EXTRA_ATTR_CONE_TYPE] = 2;
-    mSpellExtraAttrMap[26029] = tempAttr; // dark glare
-    mSpellExtraAttrMap[37433] = tempAttr; // spout
-    mSpellExtraAttrMap[43140] = tempAttr; // flame breath
-    mSpellExtraAttrMap[43215] = tempAttr; // flame breath
-    tempAttr.attr[SPELL_EXTRA_ATTR_CONE_TYPE] = 0;
-
-    tempAttr.attr[SPELL_EXTRA_ATTR_SHARE_DAMAGE] = 1;
-    for(uint32 i = 0; i < 46000; ++i)
-    {
-        switch(i)
-        {
-            case 24340: case 26558: case 28884:     // Meteor
-            case 36837: case 38903: case 41276:     // Meteor
-            case 26789:                             // Shard of the Fallen Star
-            case 31436:                             // Malevolent Cleave
-            case 35181:                             // Dive Bomb
-            case 40810: case 43267: case 43268:     // Saber Lash
-            case 42384:                             // Brutal Swipe
-            case 45150:                             // Meteor Slash
-                mSpellExtraAttrMap[i] = tempAttr;
-                break;
-            default:
-                break;
-        }
-    }
-    tempAttr.attr[SPELL_EXTRA_ATTR_SHARE_DAMAGE] = 0;
-
-    tempAttr.attr[SPELL_EXTRA_ATTR_MAX_TARGETS] = 1;
-    for(uint32 i = 0; i < 46000; ++i)
-    {
-        switch(i)
-        {
-            case 44978: case 45001: case 45002:     // Wild Magic
-            case 45004: case 45006: case 45010:     // Wild Magic
-            case 31347: // Doom
-            case 41635: // Prayer of Mending
-                mSpellExtraAttrMap[i] = tempAttr;
-                break;
-            default:
-                break;
-        }
-    }
-    tempAttr.attr[SPELL_EXTRA_ATTR_MAX_TARGETS] = 3;
-    mSpellExtraAttrMap[41376] = tempAttr;   //Spite
-    mSpellExtraAttrMap[39992] = tempAttr;   //Needle Spine
-    tempAttr.attr[SPELL_EXTRA_ATTR_MAX_TARGETS] = 0;
-
-    //hack here, only for those strange exceptions!
-    // Psychic Scream
+void SpellMgr::LoadSpellCustomAttr()
+{
     SpellEntry *tempSpell;
-    if(tempSpell = (SpellEntry*)GetSpellStore()->LookupEntry(8122))
-        tempSpell->Attributes |= SPELL_ATTR_BREAKABLE_BY_DAMAGE;
-    if(tempSpell = (SpellEntry*)GetSpellStore()->LookupEntry(8124))
-        tempSpell->Attributes |= SPELL_ATTR_BREAKABLE_BY_DAMAGE;
-    if(tempSpell = (SpellEntry*)GetSpellStore()->LookupEntry(10888))
-        tempSpell->Attributes |= SPELL_ATTR_BREAKABLE_BY_DAMAGE;
-    if(tempSpell = (SpellEntry*)GetSpellStore()->LookupEntry(10890))
-        tempSpell->Attributes |= SPELL_ATTR_BREAKABLE_BY_DAMAGE;
+    for(uint32 i = 0; i < GetSpellStore()->GetNumRows(); ++i)
+    {
+        tempSpell = (SpellEntry*)GetSpellStore()->LookupEntry(i);
+        if(!tempSpell)
+            continue;
+
+        mSpellCustomAttrMap[tempSpell->Id] = 0;
+
+        for(uint32 i = 0; i < 3; ++i)
+        {
+            switch(tempSpell->EffectApplyAuraName[i])
+            {
+                case SPELL_AURA_PERIODIC_DAMAGE:
+                case SPELL_AURA_PERIODIC_DAMAGE_PERCENT:
+                case SPELL_AURA_PERIODIC_LEECH:
+                    mSpellCustomAttrMap[tempSpell->Id] |= SPELL_ATTR_CU_EFFECT_DAMAGE;
+                    break;
+                case SPELL_AURA_PERIODIC_HEAL:
+                case SPELL_AURA_OBS_MOD_HEALTH:
+                    mSpellCustomAttrMap[tempSpell->Id] |= SPELL_ATTR_CU_EFFECT_HEAL;
+                    break;
+                default:
+                    break;
+            }
+        }
+
+        if(tempSpell->SpellVisual == 3879)
+            mSpellCustomAttrMap[tempSpell->Id] |= SPELL_ATTR_CU_CONE_BACK;
+
+        switch(tempSpell->Id)
+        {
+        case 26029: // dark glare
+        case 37433: // spout
+        case 43140: case 43215: // flame breath
+            mSpellCustomAttrMap[tempSpell->Id] |= SPELL_ATTR_CU_CONE_LINE;
+            break;
+        case 24340: case 26558: case 28884:     // Meteor
+        case 36837: case 38903: case 41276:     // Meteor
+        case 26789:                             // Shard of the Fallen Star
+        case 31436:                             // Malevolent Cleave
+        case 35181:                             // Dive Bomb
+        case 40810: case 43267: case 43268:     // Saber Lash
+        case 42384:                             // Brutal Swipe
+        case 45150:                             // Meteor Slash
+            mSpellCustomAttrMap[tempSpell->Id] |= SPELL_ATTR_CU_SHARE_DAMAGE;
+            break;
+        case 44978: case 45001: case 45002:     // Wild Magic
+        case 45004: case 45006: case 45010:     // Wild Magic
+        case 31347: // Doom
+        case 41635: // Prayer of Mending
+            mSpellCustomAttrMap[tempSpell->Id] |= SPELL_ATTR_CU_PLAYERS_ONLY;
+            tempSpell->MaxAffectedTargets = 1;
+            break;
+        case 41376: // Spite
+        case 39992: // Needle Spine
+            mSpellCustomAttrMap[tempSpell->Id] |= SPELL_ATTR_CU_PLAYERS_ONLY;
+            tempSpell->MaxAffectedTargets = 3;
+            break;
+        case 8122: case 8124: case 10888: case 10890: // Psychic Scream
+            tempSpell->Attributes |= SPELL_ATTR_BREAKABLE_BY_DAMAGE;
+            break;
+        default:
+            break;
+        }
+    }
 }
 
