Index: trunk/src/game/SpellEffects.cpp
===================================================================
--- trunk/src/game/SpellEffects.cpp (revision 106)
+++ trunk/src/game/SpellEffects.cpp (revision 110)
@@ -312,24 +312,17 @@
                 }
 
+                // Meteor like spells (divided damage to targets)
+                if(spellmgr.GetSpellExtraInfo(m_spellInfo->Id, SPELL_EXTRA_INFO_SHARE_DAMAGE))
+                {
+                    uint32 count = 0;
+                    for(std::list<TargetInfo>::iterator ihit= m_UniqueTargetInfo.begin();ihit != m_UniqueTargetInfo.end();++ihit)
+                        if(ihit->effectMask & (1<<effect_idx))
+                            ++count;
+
+                    damage /= count;                    // divide to all targets
+                }
+
                 switch(m_spellInfo->Id)                     // better way to check unknown
                 {
-                    // Meteor like spells (divided damage to targets)
-                    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
-                    {
-                        uint32 count = 0;
-                        for(std::list<TargetInfo>::iterator ihit= m_UniqueTargetInfo.begin();ihit != m_UniqueTargetInfo.end();++ihit)
-                            if(ihit->effectMask & (1<<effect_idx))
-                                ++count;
-
-                        damage /= count;                    // divide to all targets
-                        break;
-                    }
                     // percent from health with min
                     case 25599:                             // Thundercrash
Index: trunk/src/game/SpellMgr.h
===================================================================
--- trunk/src/game/SpellMgr.h (revision 102)
+++ trunk/src/game/SpellMgr.h (revision 110)
@@ -635,4 +635,18 @@
 }
 
+enum SpellExtraInfoType
+{
+    SPELL_EXTRA_INFO_MAX_TARGETS,
+    SPELL_EXTRA_INFO_CONE_TYPE,
+    SPELL_EXTRA_INFO_SHARE_DAMAGE
+};
+
+struct SpellExtraInfo
+{
+    uint32 info[3];
+};
+
+typedef std::map<uint32, SpellExtraInfo> SpellExtraInfoMap;
+
 class SpellMgr
 {
@@ -831,4 +845,13 @@
             else
                 return NULL;
+        }
+
+        uint32 GetSpellExtraInfo(uint32 spell_id, uint32 type) const
+        {
+            SpellExtraInfoMap::const_iterator itr = mSpellExtraInfoMap.find(spell_id);
+            if(itr != mSpellExtraInfoMap.end())
+                return itr->second.info[type];
+            else
+                return 0;
         }
 
@@ -849,4 +872,5 @@
         void LoadSkillLineAbilityMap();
         void LoadSpellPetAuras();
+        void LoadSpellExtraInfo();
 
     private:
@@ -862,4 +886,5 @@
         SkillLineAbilityMap mSkillLineAbilityMap;
         SpellPetAuraMap     mSpellPetAuraMap;
+        SpellExtraInfoMap   mSpellExtraInfoMap;
 };
 
Index: trunk/src/game/Unit.h
===================================================================
--- trunk/src/game/Unit.h (revision 102)
+++ trunk/src/game/Unit.h (revision 110)
@@ -1096,4 +1096,5 @@
         void SetInFront(Unit const* target);
         bool isInBack(Unit const* target, float distance, float arc = M_PI) const;
+        bool isInLine(Unit const* target, float distance) const;
 
         // Visibility system
Index: trunk/src/game/Unit.cpp
===================================================================
--- trunk/src/game/Unit.cpp (revision 102)
+++ trunk/src/game/Unit.cpp (revision 110)
@@ -3447,4 +3447,13 @@
 {
     return IsWithinDistInMap(target, distance) && !HasInArc( 2 * M_PI - arc, target );
+}
+
+bool Unit::isInLine(Unit const* target, float distance) const
+{
+    if(!HasInArc(M_PI, target) || !IsWithinDistInMap(target, distance)) return false;
+    float width = (GetObjectSize() / 2 + target->GetObjectSize()) / 2;
+    float angle = GetAngle(target);
+    angle -= GetOrientation();
+    return abs(sin(angle)) * distance < width;
 }
 
Index: trunk/src/game/Spell.h
===================================================================
--- trunk/src/game/Spell.h (revision 108)
+++ trunk/src/game/Spell.h (revision 110)
@@ -74,4 +74,5 @@
     PUSH_IN_FRONT,
     PUSH_IN_BACK,
+    PUSH_IN_LINE,
     PUSH_SELF_CENTER,
     PUSH_DEST_CENTER,
@@ -603,9 +604,13 @@
                 {
                     case PUSH_IN_FRONT:
-                        if(i_spell.GetCaster()->isInFront((Unit*)(itr->getSource()), i_radius, 2*M_PI/3 ))
+                        if(i_spell.GetCaster()->isInFront((Unit*)(itr->getSource()), i_radius, M_PI/3 ))
                             i_data->push_back(itr->getSource());
                         break;
                     case PUSH_IN_BACK:
-                        if(i_spell.GetCaster()->isInBack((Unit*)(itr->getSource()), i_radius, 2*M_PI/3 ))
+                        if(i_spell.GetCaster()->isInBack((Unit*)(itr->getSource()), i_radius, M_PI/3 ))
+                            i_data->push_back(itr->getSource());
+                        break;
+                    case PUSH_IN_LINE:
+                        if(i_spell.GetCaster()->isInLine((Unit*)(itr->getSource()), i_radius ))
                             i_data->push_back(itr->getSource());
                         break;
Index: trunk/src/game/World.cpp
===================================================================
--- trunk/src/game/World.cpp (revision 102)
+++ trunk/src/game/World.cpp (revision 110)
@@ -1096,4 +1096,7 @@
     spellmgr.LoadSpellPetAuras();
 
+    sLog.outString( "Loading spell extra infos...(TODO)" );
+    spellmgr.LoadSpellExtraInfo();
+
     sLog.outString( "Loading player Create Info & Level Stats..." );
     objmgr.LoadPlayerInfo();
Index: trunk/src/game/Spell.cpp
===================================================================
--- trunk/src/game/Spell.cpp (revision 108)
+++ trunk/src/game/Spell.cpp (revision 110)
@@ -1227,6 +1227,9 @@
         cell_lock->Visit(cell_lock, world_object_notifier, *MapManager::Instance().GetMap(m_caster->GetMapId(), m_caster));
     }
-    TypeContainerVisitor<Trinity::SpellNotifierCreatureAndPlayer, GridTypeMapContainer >  grid_object_notifier(notifier);
-    cell_lock->Visit(cell_lock, grid_object_notifier, *MapManager::Instance().GetMap(m_caster->GetMapId(), m_caster));
+    if(!spellmgr.GetSpellExtraInfo(m_spellInfo->Id, SPELL_EXTRA_INFO_MAX_TARGETS))
+    {
+        TypeContainerVisitor<Trinity::SpellNotifierCreatureAndPlayer, GridTypeMapContainer >  grid_object_notifier(notifier);
+        cell_lock->Visit(cell_lock, grid_object_notifier, *MapManager::Instance().GetMap(m_caster->GetMapId(), m_caster));
+    }
 }
 
@@ -1352,4 +1355,6 @@
         case TARGET_ALL_AROUND_CASTER:
         {
+            if(!unMaxTargets)
+                unMaxTargets = spellmgr.GetSpellExtraInfo(m_spellInfo->Id, SPELL_EXTRA_INFO_MAX_TARGETS);
             m_caster->GetPosition(m_targets.m_destX, m_targets.m_destY, m_targets.m_destZ);
         }break;
@@ -1414,8 +1419,25 @@
         }break;
         case TARGET_IN_FRONT_OF_CASTER:
-        {
-            bool inFront = m_spellInfo->SpellVisual != 3879;
-            SearchAreaTarget(TagUnitMap, radius, inFront ? PUSH_IN_FRONT : PUSH_IN_BACK,SPELL_TARGETS_AOE_DAMAGE);
+        case TARGET_UNIT_CONE_ENEMY_UNKNOWN:
+        {
+            switch(spellmgr.GetSpellExtraInfo(m_spellInfo->Id, SPELL_EXTRA_INFO_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;
+        case TARGET_UNIT_CONE_ALLY:
+        {
+            SearchAreaTarget(TagUnitMap, radius, PUSH_IN_FRONT, SPELL_TARGETS_FRIENDLY);
+        }break;
+
 
         // nearby target
Index: trunk/src/game/SpellMgr.cpp
===================================================================
--- trunk/src/game/SpellMgr.cpp (revision 108)
+++ trunk/src/game/SpellMgr.cpp (revision 110)
@@ -1969,4 +1969,68 @@
 }
 
+// set data in core for now
+void SpellMgr::LoadSpellExtraInfo()
+{
+    SpellExtraInfo info;
+    info.info[SPELL_EXTRA_INFO_CONE_TYPE] = 0;
+    info.info[SPELL_EXTRA_INFO_MAX_TARGETS] = 0;
+    info.info[SPELL_EXTRA_INFO_SHARE_DAMAGE] = 0;
+
+    info.info[SPELL_EXTRA_INFO_CONE_TYPE] = 1;
+    SpellEntry const* tempSpell;
+    for(uint32 i = 0; i < GetSpellStore()->GetNumRows(); ++i)
+    {
+        tempSpell = GetSpellStore()->LookupEntry(i);
+        if(tempSpell && tempSpell->SpellVisual == 3879)
+            mSpellExtraInfoMap[tempSpell->Id] = info;
+    }
+    info.info[SPELL_EXTRA_INFO_CONE_TYPE] = 2;
+    mSpellExtraInfoMap[26029] = info; // dark glare
+    mSpellExtraInfoMap[37433] = info; // spout
+    mSpellExtraInfoMap[43140] = info; // flame breath
+    mSpellExtraInfoMap[43215] = info; // flame breath
+    info.info[SPELL_EXTRA_INFO_CONE_TYPE] = 0;
+
+    info.info[SPELL_EXTRA_INFO_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
+                mSpellExtraInfoMap[i] = info;
+                break;
+            default:
+                break;
+        }
+    }
+    info.info[SPELL_EXTRA_INFO_SHARE_DAMAGE] = 0;
+
+    info.info[SPELL_EXTRA_INFO_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
+                mSpellExtraInfoMap[i] = info;
+                break;
+            default:
+                break;
+        }
+    }
+    info.info[SPELL_EXTRA_INFO_MAX_TARGETS] = 3;
+    mSpellExtraInfoMap[41376] = info;   //Spite
+    info.info[SPELL_EXTRA_INFO_MAX_TARGETS] = 0;
+}
+
 /// Some checks for spells, to prevent adding depricated/broken spells for trainers, spell book, etc
 bool SpellMgr::IsSpellValid(SpellEntry const* spellInfo, Player* pl, bool msg)
