Index: /trunk/src/game/Object.cpp
===================================================================
--- /trunk/src/game/Object.cpp (revision 120)
+++ /trunk/src/game/Object.cpp (revision 122)
@@ -1538,4 +1538,4 @@
 	if (angle_offset_ratio < 0.05) angle_offset_ratio = 0.05;
 	// angle to face `obj` to `this`plus a random angle offset(from -90 degree to 90 degree)*angle_offset_ratio using distance from distance2dMin to distance2dMax includes size of `obj`
-	GetNearPoint(obj,x,y,z,object_size,distance2dMin+(distance2dMax-distance2dMin)*rand_norm(), GetAngle( obj ) + (M_PI_2 - M_PI * rand_norm()) * angle_offset_ratio);
-}
+	GetNearPoint(obj,x,y,z,object_size,distance2dMin+(distance2dMax-distance2dMin)*rand_norm(), GetAngle( obj ) + (M_PI/2 - M_PI * rand_norm()) * angle_offset_ratio);
+}
Index: /trunk/src/game/SpellEffects.cpp
===================================================================
--- /trunk/src/game/SpellEffects.cpp (revision 110)
+++ /trunk/src/game/SpellEffects.cpp (revision 122)
@@ -313,5 +313,5 @@
 
                 // Meteor like spells (divided damage to targets)
-                if(spellmgr.GetSpellExtraInfo(m_spellInfo->Id, SPELL_EXTRA_INFO_SHARE_DAMAGE))
+                if(spellmgr.GetSpellExtraAttr(m_spellInfo->Id, SPELL_EXTRA_ATTR_SHARE_DAMAGE))
                 {
                     uint32 count = 0;
Index: /trunk/src/game/SpellMgr.h
===================================================================
--- /trunk/src/game/SpellMgr.h (revision 110)
+++ /trunk/src/game/SpellMgr.h (revision 122)
@@ -635,17 +635,19 @@
 }
 
-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;
+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;
+
+typedef std::map<int32, int32> SpellLinkedMap;
 
 class SpellMgr
@@ -847,9 +849,18 @@
         }
 
-        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];
+        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];
+            else
+                return 0;
+        }
+
+        int32 GetSpellLinked(int32 spell_id) const
+        {
+            SpellLinkedMap::const_iterator itr = mSpellLinkedMap.find(spell_id);
+            if(itr != mSpellLinkedMap.end())
+                return itr->second;
             else
                 return 0;
@@ -872,5 +883,6 @@
         void LoadSkillLineAbilityMap();
         void LoadSpellPetAuras();
-        void LoadSpellExtraInfo();
+        void LoadSpellExtraAttr();
+        void LoadSpellLinked();
 
     private:
@@ -886,5 +898,6 @@
         SkillLineAbilityMap mSkillLineAbilityMap;
         SpellPetAuraMap     mSpellPetAuraMap;
-        SpellExtraInfoMap   mSpellExtraInfoMap;
+        SpellExtraAttrMap   mSpellExtraAttrMap;
+        SpellLinkedMap      mSpellLinkedMap;
 };
 
Index: /trunk/src/game/World.cpp
===================================================================
--- /trunk/src/game/World.cpp (revision 112)
+++ /trunk/src/game/World.cpp (revision 122)
@@ -1094,6 +1094,6 @@
     spellmgr.LoadSpellPetAuras();
 
-    sLog.outString( "Loading spell extra infos...(TODO)" );
-    spellmgr.LoadSpellExtraInfo();
+    sLog.outString( "Loading spell extra attributes...(TODO)" );
+    spellmgr.LoadSpellExtraAttr();
 
     sLog.outString( "Loading player Create Info & Level Stats..." );
Index: /trunk/src/game/Spell.cpp
===================================================================
--- /trunk/src/game/Spell.cpp (revision 114)
+++ /trunk/src/game/Spell.cpp (revision 122)
@@ -1229,5 +1229,5 @@
         cell_lock->Visit(cell_lock, world_object_notifier, *MapManager::Instance().GetMap(m_caster->GetMapId(), m_caster));
     }
-    if(!spellmgr.GetSpellExtraInfo(m_spellInfo->Id, SPELL_EXTRA_INFO_MAX_TARGETS))
+    if(!spellmgr.GetSpellExtraAttr(m_spellInfo->Id, SPELL_EXTRA_ATTR_MAX_TARGETS))
     {
         TypeContainerVisitor<Trinity::SpellNotifierCreatureAndPlayer, GridTypeMapContainer >  grid_object_notifier(notifier);
@@ -1358,5 +1358,5 @@
         {
             if(!unMaxTargets)
-                unMaxTargets = spellmgr.GetSpellExtraInfo(m_spellInfo->Id, SPELL_EXTRA_INFO_MAX_TARGETS);
+                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;
@@ -1424,5 +1424,5 @@
         case TARGET_UNIT_CONE_ENEMY_UNKNOWN:
         {
-            switch(spellmgr.GetSpellExtraInfo(m_spellInfo->Id, SPELL_EXTRA_INFO_CONE_TYPE))
+            switch(spellmgr.GetSpellExtraAttr(m_spellInfo->Id, SPELL_EXTRA_ATTR_CONE_TYPE))
             {
                 default:
Index: /trunk/src/game/SpellMgr.cpp
===================================================================
--- /trunk/src/game/SpellMgr.cpp (revision 110)
+++ /trunk/src/game/SpellMgr.cpp (revision 122)
@@ -1970,27 +1970,29 @@
 
 // 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;
+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)
     {
@@ -2005,5 +2007,5 @@
             case 42384:                             // Brutal Swipe
             case 45150:                             // Meteor Slash
-                mSpellExtraInfoMap[i] = info;
+                mSpellExtraAttrMap[i] = tempAttr;
                 break;
             default:
@@ -2011,7 +2013,7 @@
         }
     }
-    info.info[SPELL_EXTRA_INFO_SHARE_DAMAGE] = 0;
-
-    info.info[SPELL_EXTRA_INFO_MAX_TARGETS] = 1;
+    tempAttr.attr[SPELL_EXTRA_ATTR_SHARE_DAMAGE] = 0;
+
+    tempAttr.attr[SPELL_EXTRA_ATTR_MAX_TARGETS] = 1;
     for(uint32 i = 0; i < 46000; ++i)
     {
@@ -2022,5 +2024,5 @@
             case 31347: // Doom
             case 41635: // Prayer of Mending
-                mSpellExtraInfoMap[i] = info;
+                mSpellExtraAttrMap[i] = tempAttr;
                 break;
             default:
@@ -2028,7 +2030,93 @@
         }
     }
-    info.info[SPELL_EXTRA_INFO_MAX_TARGETS] = 3;
-    mSpellExtraInfoMap[41376] = info;   //Spite
-    info.info[SPELL_EXTRA_INFO_MAX_TARGETS] = 0;
+    tempAttr.attr[SPELL_EXTRA_ATTR_MAX_TARGETS] = 3;
+    mSpellExtraAttrMap[41376] = tempAttr;   //Spite
+    tempAttr.attr[SPELL_EXTRA_ATTR_MAX_TARGETS] = 0;
+
+    //hack here, only for those strange exceptions!
+    // Psychic Scream
+    SpellEntry *tempSpell;
+    if(tempSpell = (SpellEntry*)GetSpellStore()->LookupEntry(8122))
+        tempSpell->AttributesEx |= SPELL_ATTR_BREAKABLE_BY_DAMAGE;
+    if(tempSpell = (SpellEntry*)GetSpellStore()->LookupEntry(8124))
+        tempSpell->AttributesEx |= SPELL_ATTR_BREAKABLE_BY_DAMAGE;
+    if(tempSpell = (SpellEntry*)GetSpellStore()->LookupEntry(10888))
+        tempSpell->AttributesEx |= SPELL_ATTR_BREAKABLE_BY_DAMAGE;
+    if(tempSpell = (SpellEntry*)GetSpellStore()->LookupEntry(10890))
+        tempSpell->AttributesEx |= SPELL_ATTR_BREAKABLE_BY_DAMAGE;
+}
+
+void SpellMgr::LoadSpellLinked()
+{
+    mSpellLinkedMap.clear();    // need for reload case
+    uint32 count = 0;
+
+    //                                                0       1
+    QueryResult *result = WorldDatabase.Query("SELECT spell0, spell1 FROM spell_linked_spell");
+    if( !result )
+    {
+        barGoLink bar( 1 );
+        bar.step();
+        sLog.outString();
+        sLog.outString( ">> Loaded %u spell pet auras", count );
+        return;
+    }
+
+    barGoLink bar( result->GetRowCount() );
+
+    do
+    {
+        Field *fields = result->Fetch();
+
+        bar.step();
+
+        uint16 spell = fields[0].GetUInt16();
+        uint16 pet = fields[1].GetUInt16();
+        uint16 aura = fields[2].GetUInt16();
+
+        SpellPetAuraMap::iterator itr = mSpellPetAuraMap.find(spell);
+        if(itr != mSpellPetAuraMap.end())
+        {
+            itr->second.AddAura(pet, aura);
+        }
+        else
+        {
+            SpellEntry const* spellInfo = sSpellStore.LookupEntry(spell);
+            if (!spellInfo)
+            {
+                sLog.outErrorDb("Spell %u listed in `spell_pet_auras` does not exist", spell);
+                continue;
+            }
+            int i = 0;
+            for(; i < 3; ++i)
+                if((spellInfo->Effect[i] == SPELL_EFFECT_APPLY_AURA &&
+                    spellInfo->EffectApplyAuraName[i] == SPELL_AURA_DUMMY) ||
+                    spellInfo->Effect[i] == SPELL_EFFECT_DUMMY)
+                    break;
+
+            if(i == 3)
+            {
+                sLog.outError("Spell %u listed in `spell_pet_auras` does not have dummy aura or dummy effect", spell);
+                continue;
+            }
+
+            SpellEntry const* spellInfo2 = sSpellStore.LookupEntry(aura);
+            if (!spellInfo2)
+            {
+                sLog.outErrorDb("Aura %u listed in `spell_pet_auras` does not exist", aura);
+                continue;
+            }
+
+            PetAura pa(pet, aura, spellInfo->EffectImplicitTargetA[i] == TARGET_PET, spellInfo->EffectBasePoints[i] + spellInfo->EffectBaseDice[i]);
+            mSpellPetAuraMap[spell] = pa;
+        }
+
+        ++count;
+    } while( result->NextRow() );
+
+    delete result;
+
+    sLog.outString();
+    sLog.outString( ">> Loaded %u spell pet auras", count );
 }
 
Index: /trunk/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_felmyst.cpp
===================================================================
--- /trunk/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_felmyst.cpp (revision 90)
+++ /trunk/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_felmyst.cpp (revision 122)
@@ -158,13 +158,15 @@
         FlightCount = 0;
 
-        m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING);
+        m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING + MOVEMENTFLAG_ONTRANSPORT);
         m_creature->SetFloatValue(UNIT_FIELD_BOUNDINGRADIUS, 10);
         m_creature->SetFloatValue(UNIT_FIELD_COMBATREACH, 10);
 
         DespawnSummons(MOB_VAPOR_TRAIL);
+  m_creature->setActive(false);
     }
 
     void Aggro(Unit *who)
     {
+  m_creature->setActive(true);
         DoZoneInCombat();
         m_creature->CastSpell(m_creature, AURA_SUNWELL_RADIANCE, true);
@@ -283,5 +285,5 @@
             m_creature->GetMotionMaster()->Clear(false);
             m_creature->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
-            m_creature->SetUnitMovementFlags(MOVEMENTFLAG_LEVITATING);
+            m_creature->SetUnitMovementFlags(MOVEMENTFLAG_LEVITATING + MOVEMENTFLAG_ONTRANSPORT);
             m_creature->StopMoving();
             DoYell(YELL_TAKEOFF, LANG_UNIVERSAL, NULL);
@@ -290,11 +292,9 @@
             break;
         case 1:
-            m_creature->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT);
             m_creature->GetMotionMaster()->MovePoint(0, m_creature->GetPositionX()+1, m_creature->GetPositionY(), m_creature->GetPositionZ()+10);
-            m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT);
             Timer[EVENT_FLIGHT_SEQUENCE] = 0;
             break;
         case 2:
-            if(Player* target = SelectRandomPlayer(50))
+            if(Player* target = SelectRandomPlayer(150))
             {
                 Creature* Vapor = m_creature->SummonCreature(MOB_VAPOR, target->GetPositionX()-5+rand()%10, target->GetPositionY()-5+rand()%10, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 9000);
@@ -312,5 +312,5 @@
             DespawnSummons(MOB_VAPOR_TRAIL);
             //m_creature->CastSpell(m_creature, SPELL_VAPOR_SELECT); need core support
-            if(Player* target = SelectRandomPlayer(50))
+            if(Player* target = SelectRandomPlayer(150))
             {
                 //target->CastSpell(target, SPELL_VAPOR_SUMMON, true); need core support
@@ -331,13 +331,11 @@
             break;
         case 5:
-            if(Player* target = SelectRandomPlayer(80))
+            if(Player* target = SelectRandomPlayer(150))
             {
                 BreathX = target->GetPositionX();
                 BreathY = target->GetPositionY();
                 float x, y, z;
-                target->GetContactPoint(m_creature, x, y, z, 40);
-                m_creature->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT);
+                target->GetContactPoint(m_creature, x, y, z, 70);
                 m_creature->GetMotionMaster()->MovePoint(0, x, y, z+10);
-                m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT);
             }else EnterEvadeMode();
             Timer[EVENT_FLIGHT_SEQUENCE] = 0;
@@ -356,7 +354,5 @@
                 x = 2 * BreathX - x;
                 y = 2 * BreathY - y;
-                m_creature->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT);
                 m_creature->GetMotionMaster()->MovePoint(0, x, y, z);
-                m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT);
             }
             Timer[EVENT_SUMMON_FOG] = 1;
@@ -375,12 +371,10 @@
                 float x, y, z;
                 target->GetContactPoint(m_creature, x, y, z);
-                m_creature->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT);
                 m_creature->GetMotionMaster()->MovePoint(0, x, y, z);
-                m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT);
             }else EnterEvadeMode();
             Timer[EVENT_FLIGHT_SEQUENCE] = 0;
             break;
         case 10:
-            m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING);
+            m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING + MOVEMENTFLAG_ONTRANSPORT);
             m_creature->StopMoving();
             m_creature->HandleEmoteCommand(EMOTE_ONESHOT_LAND);
@@ -440,5 +434,5 @@
                 break;
             case EVENT_ENCAPSULATE:
-                if(Unit* target = SelectRandomPlayer(50))
+                if(Unit* target = SelectRandomPlayer(150))
                 {
                     m_creature->CastSpell(target, SPELL_ENCAPSULATE_CHANNEL, false);
