Index: /trunk/src/game/SocialMgr.h
===================================================================
--- /trunk/src/game/SocialMgr.h (revision 102)
+++ /trunk/src/game/SocialMgr.h (revision 139)
@@ -112,4 +112,7 @@
 };
 
+#define SOCIALMGR_FRIEND_LIMIT  50
+#define SOCIALMGR_IGNORE_LIMIT  25
+
 class PlayerSocial
 {
@@ -129,4 +132,5 @@
         uint32 GetPlayerGUID() { return m_playerGUID; }
         void SetPlayerGUID(uint32 guid) { m_playerGUID = guid; }
+        uint32 GetNumberOfSocialsWithFlag(SocialFlag flag);
     private:
         PlayerSocialMap m_playerSocialMap;
Index: /trunk/src/game/MiscHandler.cpp
===================================================================
--- /trunk/src/game/MiscHandler.cpp (revision 102)
+++ /trunk/src/game/MiscHandler.cpp (revision 139)
@@ -773,5 +773,6 @@
         ignoreResult = FRIEND_IGNORE_ADDED;
 
-        _player->GetSocial()->AddToSocialList(GUID_LOPART(IgnoreGuid), true);
+        if(!_player->GetSocial()->AddToSocialList(GUID_LOPART(IgnoreGuid), true))
+            ignoreResult = FRIEND_IGNORE_FULL;
     }
     else if(ignoreResult==FRIEND_IGNORE_ALREADY)
Index: /trunk/src/game/Unit.cpp
===================================================================
--- /trunk/src/game/Unit.cpp (revision 138)
+++ /trunk/src/game/Unit.cpp (revision 139)
@@ -5086,5 +5086,6 @@
 
                     // Cast finish spell (triggeredByAura already not exist!)
-                    CastSpell(this, 27285, true, castItem, NULL, casterGuid);
+                    if(Unit* caster = GetUnit(*this, casterGuid))
+                        caster->CastSpell(this, 27285, true, castItem);
                     return true;                            // no hidden cooldown
                 }
@@ -5108,5 +5109,6 @@
 
                     // Cast finish spell (triggeredByAura already not exist!)
-                    CastSpell(this, 32865, true, castItem, NULL, casterGuid);
+                    if(Unit* caster = GetUnit(*this, casterGuid))
+                        caster->CastSpell(this, 32865, true, castItem);
                     return true;                            // no hidden cooldown
                 }
Index: /trunk/src/game/SocialMgr.cpp
===================================================================
--- /trunk/src/game/SocialMgr.cpp (revision 102)
+++ /trunk/src/game/SocialMgr.cpp (revision 139)
@@ -42,9 +42,28 @@
 }
 
+uint32 PlayerSocial::GetNumberOfSocialsWithFlag(SocialFlag flag)
+{
+    uint32 counter = 0;
+    for(PlayerSocialMap::iterator itr = m_playerSocialMap.begin(); itr != m_playerSocialMap.end(); ++itr)
+    {
+        if(itr->second.Flags & flag)
+            counter++;
+    }
+    return counter;
+}
+
 bool PlayerSocial::AddToSocialList(uint32 friend_guid, bool ignore)
 {
-    // client limit
-    if(m_playerSocialMap.size() >= 50)
-        return false;
+    // check client limits
+    if(ignore)
+    {
+        if(GetNumberOfSocialsWithFlag(SOCIAL_FLAG_IGNORED) >= SOCIALMGR_IGNORE_LIMIT)
+            return false;
+    }
+    else
+    {
+        if(GetNumberOfSocialsWithFlag(SOCIAL_FLAG_FRIEND) >= SOCIALMGR_FRIEND_LIMIT)
+            return false;
+    }
 
     uint32 flag = SOCIAL_FLAG_FRIEND;
Index: /trunk/src/game/SpellAuras.h
===================================================================
--- /trunk/src/game/SpellAuras.h (revision 102)
+++ /trunk/src/game/SpellAuras.h (revision 139)
@@ -362,17 +362,4 @@
 };
 
-class TRINITY_DLL_SPEC SingleEnemyTargetAura : public Aura
-{
-    friend Aura* CreateAura(SpellEntry const* spellproto, uint32 eff, int32 *currentBasePoints, Unit *target, Unit *caster, Item* castItem);
-
-    public:
-        ~SingleEnemyTargetAura();
-        Unit* GetTriggerTarget() const;
-
-    protected:
-        SingleEnemyTargetAura(SpellEntry const* spellproto, uint32 eff, int32 *currentBasePoints, Unit *target, Unit *caster  = NULL, Item* castItem = NULL);
-        uint64 m_casters_target_guid;
-};
-
 Aura* CreateAura(SpellEntry const* spellproto, uint32 eff, int32 *currentBasePoints, Unit *target, Unit *caster = NULL, Item* castItem = NULL);
 #endif
Index: /trunk/src/game/Spell.h
===================================================================
--- /trunk/src/game/Spell.h (revision 110)
+++ /trunk/src/game/Spell.h (revision 139)
@@ -108,11 +108,12 @@
             m_itemTargetEntry  = target.m_itemTargetEntry;
 
-            m_srcX = target.m_srcX;
-            m_srcY = target.m_srcY;
-            m_srcZ = target.m_srcZ;
+            //m_srcX = target.m_srcX;
+            //m_srcY = target.m_srcY;
+            //m_srcZ = target.m_srcZ;
 
             m_destX = target.m_destX;
             m_destY = target.m_destY;
             m_destZ = target.m_destZ;
+            m_hasDest = target.m_hasDest;
 
             m_strTarget = target.m_strTarget;
@@ -126,5 +127,6 @@
         Unit *getUnitTarget() const { return m_unitTarget; }
         void setUnitTarget(Unit *target);
-        void setDestination(float x, float y, float z);
+        void setDestination(float x, float y, float z, bool send = true);
+        void setDestination(Unit *target, bool send = true);
 
         uint64 getGOTargetGUID() const { return m_GOTargetGUID; }
@@ -148,4 +150,5 @@
 
         bool IsEmpty() const { return m_GOTargetGUID==0 && m_unitTargetGUID==0 && m_itemTarget==0 && m_CorpseTargetGUID==0; }
+        bool HasDest() const { return m_hasDest; }
 
         void Update(Unit* caster);
@@ -153,4 +156,5 @@
         float m_srcX, m_srcY, m_srcZ;
         float m_destX, m_destY, m_destZ;
+        bool m_hasDest;
         std::string m_strTarget;
 
@@ -552,5 +556,5 @@
             : i_data(&data), i_spell(spell), i_push_type(type), i_radius(radius), i_TargetType(TargetType), i_entry(entry)
         {
-            i_originalCaster = spell.GetOriginalCaster();
+            i_originalCaster = spell.GetCaster();
         }
 
Index: /trunk/src/game/SpellAuras.cpp
===================================================================
--- /trunk/src/game/SpellAuras.cpp (revision 123)
+++ /trunk/src/game/SpellAuras.cpp (revision 139)
@@ -472,34 +472,8 @@
 }
 
-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->GetTypeId()==TYPEID_PLAYER ? ((Player*)caster)->GetSelection() : caster->GetUInt64Value(UNIT_FIELD_TARGET);
-    else
-        m_casters_target_guid = 0;
-}
-
-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)
 {
     if (IsAreaAuraEffect(spellproto->Effect[eff]))
         return new AreaAura(spellproto, eff, currentBasePoints, target, caster, castItem);
-
-    uint32 triggeredSpellId = spellproto->EffectTriggerSpell[eff];
-
-    SpellEntry const* triggredSpellInfo = sSpellStore.LookupEntry(triggeredSpellId);
-    if (triggredSpellInfo)
-        for (int i = 0; i < 3; ++i)
-            if (triggredSpellInfo->EffectImplicitTargetA[i] == TARGET_SINGLE_ENEMY)
-                return new SingleEnemyTargetAura(spellproto, eff, currentBasePoints, target, caster, castItem);
 
     return new Aura(spellproto, eff, currentBasePoints, target, caster, castItem);
@@ -1908,5 +1882,5 @@
     }
     // All ok cast by default case
-    Spell *spell = new Spell(caster, triggredSpellInfo, true, originalCasterGUID );
+    Spell *spell = new Spell(m_target, triggredSpellInfo, true, originalCasterGUID );
 
     SpellCastTargets targets;
Index: /trunk/src/game/Spell.cpp
===================================================================
--- /trunk/src/game/Spell.cpp (revision 138)
+++ /trunk/src/game/Spell.cpp (revision 139)
@@ -76,4 +76,5 @@
 
     m_srcX = m_srcY = m_srcZ = m_destX = m_destY = m_destZ = 0;
+    m_hasDest = false;
     m_strTarget = "";
     m_targetMask = 0;
@@ -87,4 +88,24 @@
 {
     if (!target)
+        return;
+
+    m_unitTarget = target;
+    m_unitTargetGUID = target->GetGUID();
+    m_targetMask |= TARGET_FLAG_UNIT;
+}
+
+void SpellCastTargets::setDestination(float x, float y, float z, bool send)
+{
+    m_destX = x;
+    m_destY = y;
+    m_destZ = z;
+    m_hasDest = true;
+    if(send)
+        m_targetMask |= TARGET_FLAG_DEST_LOCATION;
+}
+
+void SpellCastTargets::setDestination(Unit *target, bool send)
+{
+    if(!target)
         return;
 
@@ -92,15 +113,7 @@
     m_destY = target->GetPositionY();
     m_destZ = target->GetPositionZ();
-    m_unitTarget = target;
-    m_unitTargetGUID = target->GetGUID();
-    m_targetMask |= TARGET_FLAG_UNIT;
-}
-
-void SpellCastTargets::setDestination(float x, float y, float z)
-{
-    m_destX = x;
-    m_destY = y;
-    m_destZ = z;
-    m_targetMask |= TARGET_FLAG_DEST_LOCATION;
+    m_hasDest = true;
+    if(send)
+        m_targetMask |= TARGET_FLAG_DEST_LOCATION;
 }
 
@@ -160,7 +173,7 @@
     if(m_targetMask == TARGET_FLAG_SELF)
     {
-        m_destX = caster->GetPositionX();
-        m_destY = caster->GetPositionY();
-        m_destZ = caster->GetPositionZ();
+        //m_destX = caster->GetPositionX();
+        //m_destY = caster->GetPositionY();
+        //m_destZ = caster->GetPositionZ();
         m_unitTarget = caster;
         m_unitTargetGUID = caster->GetGUID();
@@ -180,5 +193,5 @@
             return false;
 
-    if( m_targetMask & TARGET_FLAG_SOURCE_LOCATION )
+    /*if( m_targetMask & TARGET_FLAG_SOURCE_LOCATION )
     {
         if(data->rpos()+4+4+4 > data->size())
@@ -188,7 +201,7 @@
         if(!Trinity::IsValidMapCoord(m_srcX, m_srcY, m_srcZ))
             return false;
-    }
-
-    if( m_targetMask & TARGET_FLAG_DEST_LOCATION )
+    }*/
+
+    if( m_targetMask & (TARGET_FLAG_SOURCE_LOCATION | TARGET_FLAG_DEST_LOCATION) )
     {
         if(data->rpos()+4+4+4 > data->size())
@@ -196,4 +209,5 @@
 
         *data >> m_destX >> m_destY >> m_destZ;
+        m_hasDest = true;
         if(!Trinity::IsValidMapCoord(m_destX, m_destY, m_destZ))
             return false;
@@ -415,7 +429,49 @@
         }
 
+        if(m_targets.HasDest())
+        {
+            switch(m_spellInfo->Effect[i])
+            {
+                case SPELL_EFFECT_SUMMON:
+                case SPELL_EFFECT_SUMMON_WILD:
+                case SPELL_EFFECT_SUMMON_GUARDIAN:
+                case SPELL_EFFECT_SUMMON_PET:
+                case SPELL_EFFECT_SUMMON_POSSESSED:
+                case SPELL_EFFECT_SUMMON_TOTEM:
+                case SPELL_EFFECT_SUMMON_OBJECT_WILD:
+                case SPELL_EFFECT_SUMMON_TOTEM_SLOT1:
+                case SPELL_EFFECT_SUMMON_TOTEM_SLOT2:
+                case SPELL_EFFECT_SUMMON_TOTEM_SLOT3:
+                case SPELL_EFFECT_SUMMON_TOTEM_SLOT4:
+                case SPELL_EFFECT_SUMMON_CRITTER:
+                case SPELL_EFFECT_SUMMON_OBJECT_SLOT1:
+                case SPELL_EFFECT_SUMMON_OBJECT_SLOT2:
+                case SPELL_EFFECT_SUMMON_OBJECT_SLOT3:
+                case SPELL_EFFECT_SUMMON_OBJECT_SLOT4:
+                case SPELL_EFFECT_SUMMON_DEAD_PET:
+                case SPELL_EFFECT_SUMMON_DEMON:
+                {
+                    tmpUnitMap.push_back(m_caster);
+                    break;
+                }
+            }
+        }
+
+        if(!m_spellInfo->EffectImplicitTargetA[i])
+        {
+            switch(m_spellInfo->Effect[i])
+            {
+                case SPELL_EFFECT_PARRY:
+                case SPELL_EFFECT_BLOCK:
+                case SPELL_EFFECT_SKILL: // always with dummy 3 as A
+                case SPELL_EFFECT_LEARN_SPELL:
+                    tmpUnitMap.push_back(m_caster);
+                    break;
+            }
+        }
+
         if(tmpUnitMap.empty())
         {
-            if( m_spellInfo->EffectImplicitTargetA[i]==TARGET_SCRIPT ||
+            /*if( m_spellInfo->EffectImplicitTargetA[i]==TARGET_SCRIPT ||
                 m_spellInfo->EffectImplicitTargetB[i]==TARGET_SCRIPT ||
                 m_spellInfo->EffectImplicitTargetA[i]==TARGET_SCRIPT_COORDINATES ||
@@ -424,5 +480,6 @@
                 if(!(m_targets.m_targetMask & TARGET_FLAG_DEST_LOCATION))
                     continue;
-            }
+            }*/
+
             // add here custom effects that need default target.
             // FOR EVERY TARGET TYPE THERE IS A DIFFERENT FILL!!
@@ -500,14 +557,9 @@
                 }
                 case SPELL_EFFECT_RESURRECT:
-                case SPELL_EFFECT_PARRY:
-                case SPELL_EFFECT_BLOCK:
                 case SPELL_EFFECT_CREATE_ITEM:
                 case SPELL_EFFECT_TRIGGER_SPELL:
                 case SPELL_EFFECT_TRIGGER_MISSILE:
-                case SPELL_EFFECT_LEARN_SPELL:
                 case SPELL_EFFECT_SKILL_STEP:
                 case SPELL_EFFECT_PROFICIENCY:
-                case SPELL_EFFECT_SUMMON_POSSESSED:
-                case SPELL_EFFECT_SUMMON_OBJECT_WILD:
                 case SPELL_EFFECT_SELF_RESURRECT:
                 case SPELL_EFFECT_REPUTATION:
@@ -537,26 +589,9 @@
                     }
                     break;
-                case SPELL_EFFECT_SUMMON:
-                    if(m_spellInfo->EffectMiscValueB[i] == SUMMON_TYPE_POSESSED || m_spellInfo->EffectMiscValueB[i] == SUMMON_TYPE_POSESSED2)
-                    {
-                        if(m_targets.getUnitTarget())
-                            tmpUnitMap.push_back(m_targets.getUnitTarget());
-                    }
-                    else
-                        tmpUnitMap.push_back(m_caster);
-                    break;
                 case SPELL_EFFECT_SUMMON_CHANGE_ITEM:
-                case SPELL_EFFECT_SUMMON_WILD:
-                case SPELL_EFFECT_SUMMON_GUARDIAN:
                 case SPELL_EFFECT_TRANS_DOOR:
                 case SPELL_EFFECT_ADD_FARSIGHT:
                 case SPELL_EFFECT_STUCK:
                 case SPELL_EFFECT_DESTROY_ALL_TOTEMS:
-                case SPELL_EFFECT_SUMMON_DEMON:
-                case SPELL_EFFECT_SKILL:
-                case SPELL_EFFECT_SUMMON_OBJECT_SLOT1:
-                case SPELL_EFFECT_SUMMON_OBJECT_SLOT2:
-                case SPELL_EFFECT_SUMMON_OBJECT_SLOT3:
-                case SPELL_EFFECT_SUMMON_OBJECT_SLOT4:
                     tmpUnitMap.push_back(m_caster);
                     break;
@@ -1218,5 +1253,5 @@
 void Spell::SearchAreaTarget(std::list<Unit*> &TagUnitMap, float radius, const uint32 &type, SpellTargets TargetType, uint32 entry)
 {
-    if(type == PUSH_DEST_CENTER && !m_targets.m_destX && !m_targets.m_destY && !m_targets.m_destZ)
+    if(type == PUSH_DEST_CENTER && !m_targets.HasDest())
     {
         sLog.outError( "SPELL: cannot find destination for spell ID %u\n", m_spellInfo->Id );
@@ -1297,4 +1332,6 @@
     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)
     {
@@ -1361,25 +1398,44 @@
         }break;
 
+        // channel
+        case TARGET_SINGLE_ENEMY:
+            if(m_caster->m_currentSpells[CURRENT_CHANNELED_SPELL])
+            {
+                if(Unit* target = m_caster->m_currentSpells[CURRENT_CHANNELED_SPELL]->m_targets.getUnitTarget())
+                    TagUnitMap.push_back(target);
+                else
+                    sLog.outError( "SPELL: cannot find channel spell target for spell ID %u\n", m_spellInfo->Id );
+            }
+            else
+                sLog.outError( "SPELL: no current channeled spell for spell ID %u\n", m_spellInfo->Id );
+            break;
+        case TARGET_DEST_CHANNEL:
+            if(m_caster->m_currentSpells[CURRENT_CHANNELED_SPELL])
+            {
+                if(m_caster->m_currentSpells[CURRENT_CHANNELED_SPELL]->m_targets.HasDest())
+                    m_targets = m_caster->m_currentSpells[CURRENT_CHANNELED_SPELL]->m_targets;
+                else
+                    sLog.outError( "SPELL: cannot find channel spell destination for spell ID %u\n", m_spellInfo->Id );
+            }
+            else
+                sLog.outError( "SPELL: no current channeled spell for spell ID %u\n", m_spellInfo->Id );
+            break;
+
         // reference dest
         case TARGET_EFFECT_SELECT:
-            m_targets.m_targetMask |= TARGET_FLAG_DEST_LOCATION;
+            m_targets.setDestination(m_caster, true);
+            break;
         case TARGET_ALL_AROUND_CASTER:
-        {
-            if(!unMaxTargets)
-                unMaxTargets = spellmgr.GetSpellExtraAttr(m_spellInfo->Id, SPELL_EXTRA_ATTR_MAX_TARGETS);
-            m_caster->GetPosition(m_targets.m_destX, m_targets.m_destY, m_targets.m_destZ);
-        }break;
+            m_targets.setDestination(m_caster, false);
+            break;
         case TARGET_CURRENT_ENEMY_COORDINATES:
-            m_targets.m_targetMask |= TARGET_FLAG_DEST_LOCATION;
+            m_targets.setDestination(m_targets.getUnitTarget(), true);
+            break;
         case TARGET_DUELVSPLAYER_COORDINATES: // no ground?
-        {
-            if(Unit* currentTarget = m_targets.getUnitTarget())
-                currentTarget->GetPosition(m_targets.m_destX, m_targets.m_destY, m_targets.m_destZ);
-        }break;
+            m_targets.setDestination(m_targets.getUnitTarget(), false);
+            break;
         case TARGET_DEST_TABLE_UNKNOWN2:
         case TARGET_TABLE_X_Y_Z_COORDINATES:
-        {
-            SpellTargetPosition const* st = spellmgr.GetSpellTargetPosition(m_spellInfo->Id);
-            if(st)
+            if(SpellTargetPosition const* st = spellmgr.GetSpellTargetPosition(m_spellInfo->Id))
             {
                 if (st->target_mapId == m_caster->GetMapId())
@@ -1388,24 +1444,20 @@
             else
                 sLog.outError( "SPELL: unknown target coordinates for spell ID %u\n", m_spellInfo->Id );
-        }break;
+            break;
 
         // area targets
 		case TARGET_AREAEFFECT_CUSTOM:
         case TARGET_ALL_ENEMY_IN_AREA_INSTANT:
-        {
             if(m_spellInfo->Effect[i] == SPELL_EFFECT_PERSISTENT_AREA_AURA)
                 break;
             m_targets.m_targetMask |= TARGET_FLAG_DEST_LOCATION;
-        }
         case TARGET_ALL_ENEMY_IN_AREA:
-        {
             SearchAreaTarget(TagUnitMap, radius, PUSH_DEST_CENTER, SPELL_TARGETS_AOE_DAMAGE);
-        }break;
+            break;
         case TARGET_ALL_FRIENDLY_UNITS_IN_AREA:
             m_targets.m_targetMask |= TARGET_FLAG_DEST_LOCATION;
         case TARGET_ALL_FRIENDLY_UNITS_AROUND_CASTER:
-        {
             SearchAreaTarget(TagUnitMap, radius, PUSH_DEST_CENTER, SPELL_TARGETS_FRIENDLY);
-        }break;
+            break;
         //case TARGET_AREAEFFECT_CUSTOM:
         //    m_targets.m_targetMask |= TARGET_FLAG_DEST_LOCATION;
@@ -1451,5 +1503,4 @@
             SearchAreaTarget(TagUnitMap, radius, PUSH_IN_FRONT, SPELL_TARGETS_FRIENDLY);
         }break;
-
 
         // nearby target
@@ -1695,15 +1746,4 @@
             }
         }break;
-        case TARGET_MINION:
-        {
-            if(m_spellInfo->Effect[i] != SPELL_EFFECT_DUEL)
-                TagUnitMap.push_back(m_caster);
-        }break;
-        case TARGET_SINGLE_ENEMY:
-        {
-            Unit* pUnitTarget = SelectMagnetTarget();
-            if(pUnitTarget)
-                TagUnitMap.push_back(pUnitTarget);
-        }break;
         case TARGET_AREAEFFECT_PARTY:
         {
@@ -1879,4 +1919,7 @@
         case TARGET_DEST_CASTER_FRONT_RIGHT:
         case TARGET_DEST_CASTER_FRONT:
+        case TARGET_MINION:
+        case TARGET_DEST_CASTER_FRONT_LEAP:
+        case TARGET_DEST_CASTER_FRONT_UNKNOWN:
         case TARGET_DEST_CASTER_BACK:
         case TARGET_DEST_CASTER_RIGHT:
@@ -1903,4 +1946,7 @@
                 case TARGET_DEST_CASTER_BACK_RIGHT: angle = 3*M_PI/4;   break;
                 case TARGET_DEST_CASTER_FRONT_RIGHT:angle = M_PI/4;     break;
+                case TARGET_MINION:
+                case TARGET_DEST_CASTER_FRONT_LEAP:
+                case TARGET_DEST_CASTER_FRONT_UNKNOWN:
                 case TARGET_DEST_CASTER_FRONT:      angle = 0.0f;       break;
                 case TARGET_DEST_CASTER_BACK:       angle = M_PI;       break;
@@ -1971,4 +2017,5 @@
         }break;
         case TARGET_SELF2:
+            m_targets.m_hasDest = true;
             break;
         default:
Index: /trunk/src/game/SharedDefines.h
===================================================================
--- /trunk/src/game/SharedDefines.h (revision 112)
+++ /trunk/src/game/SharedDefines.h (revision 139)
@@ -600,5 +600,5 @@
     SPELL_EFFECT_THREAT_ALL                = 91,
     SPELL_EFFECT_ENCHANT_HELD_ITEM         = 92,
-    SPELL_EFFECT_SUMMON_PHANTASM           = 93,
+    SPELL_EFFECT_SUMMON_PHANTASM           = 93, //unused
     SPELL_EFFECT_SELF_RESURRECT            = 94,
     SPELL_EFFECT_SKINNING                  = 95,
