Index: trunk/src/bindings/scripts/scripts/zone/black_temple/boss_warlord_najentus.cpp
===================================================================
--- trunk/src/bindings/scripts/scripts/zone/black_temple/boss_warlord_najentus.cpp (revision 90)
+++ trunk/src/bindings/scripts/scripts/zone/black_temple/boss_warlord_najentus.cpp (revision 160)
@@ -59,6 +59,5 @@
 
 //Spells
-#define SPELL_NEEDLE_SPINE             39835
-#define SPELL_NEEDLE_AOE               39968
+#define SPELL_NEEDLE_SPINE             39992
 #define SPELL_TIDAL_BURST              39878
 #define SPELL_TIDAL_SHIELD             39872
@@ -181,13 +180,12 @@
         }else EnrageTimer -= diff;
 
-        // Needle
         if(NeedleSpineTimer < diff)
         {
-            for(uint8 i = 0; i < 3; ++i)
-            {
-                if(Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0)) 
-                    m_creature->CastSpell(target, SPELL_NEEDLE_SPINE, true);
-            }
-            NeedleSpineTimer = 30000;
+            //m_creature->CastSpell(m_creature, SPELL_NEEDLE_SPINE, true);
+            std::list<Unit*> target;
+            SelectUnitList(target, 3, SELECT_TARGET_RANDOM, 80, true);
+            for(std::list<Unit*>::iterator i = target.begin(); i != target.end(); ++i)
+                m_creature->CastSpell(*i, 39835, true);
+            NeedleSpineTimer = 20000+rand()%5000;
         }else NeedleSpineTimer -= diff;
 
Index: trunk/src/bindings/scripts/scripts/zone/black_temple/boss_supremus.cpp
===================================================================
--- trunk/src/bindings/scripts/scripts/zone/black_temple/boss_supremus.cpp (revision 158)
+++ trunk/src/bindings/scripts/scripts/zone/black_temple/boss_supremus.cpp (revision 160)
@@ -26,11 +26,9 @@
 
 //Spells
+#define SPELL_MOLTEN_PUNCH          40126
 #define SPELL_HURTFUL_STRIKE        41926
-#define SPELL_DEMON_FIRE            40029
 #define SPELL_MOLTEN_FLAME          40253
-#define SPELL_VOLCANIC_ERUPTION     40276
-#define SPELL_VOLCANIC_FIREBALL     40118
-#define SPELL_VOLCANIC_GEYSER       42055
-#define SPELL_MOLTEN_PUNCH          40126
+#define SPELL_VOLCANIC_ERUPTION     40117
+#define SPELL_VOLCANIC_SUMMON       40276
 #define SPELL_BERSERK               45078
 
@@ -42,61 +40,24 @@
     molten_flameAI(Creature *c) : ScriptedAI(c)
     {
-        Reset();
-    }
-
-    uint64 SupremusGUID;
-    bool TargetLocked;
-    uint32 CheckTimer;
-
-    void Reset()
-    {
-        SupremusGUID = 0;
-        TargetLocked = false;
-
-        CheckTimer = 1000;
-    }
-
+        FlameTimer = 0;
+        float x, y, z;
+        m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+        m_creature->GetNearPoint(m_creature, x, y, z, 1, 50, M_PI*2*rand_norm());
+        m_creature->GetMotionMaster()->MovePoint(0, x, y, z);
+    }
+
+    uint32 FlameTimer;
+
+    void Reset() {}
     void Aggro(Unit *who) {}
     void AttackStart(Unit* who) {}
-    void MoveInLineOfSight(Unit *who)
-    {
-        if(TargetLocked)
-            return;                                         // stop it from aggroing players who move in LOS if we have a target.
-        if(who && (who != m_creature) && (m_creature->IsWithinDistInMap(who, 10)))
-            StalkTarget(who);
-    }
-
-    void SetSupremusGUID(uint64 GUID) { SupremusGUID = GUID; }
-
-    void StalkTarget(Unit* target)
-    {
-        if(!target) return;
-
-        m_creature->AddThreat(target, 50000000.0f);
-        m_creature->GetMotionMaster()->MoveChase(target);
-        DoCast(m_creature, SPELL_DEMON_FIRE, true);
-        // DoCast(m_creature, SPELL_MOLTEN_FLAME, true); // This spell damages self, so disabled for now
-        TargetLocked = true;
-    }
-
+    void MoveInLineOfSight(Unit *who) {}
     void UpdateAI(const uint32 diff)
     {
-        if (!m_creature->SelectHostilTarget())
-            return;
-
-        if(m_creature->getVictim() && m_creature->isAlive())
-        {
-            if(CheckTimer < diff)
-            {
-                if(SupremusGUID)
-                {
-                    Unit* Supremus = NULL;
-                    Supremus = Unit::GetUnit((*m_creature), SupremusGUID);
-                    if(Supremus && (!Supremus->isAlive()))
-                        m_creature->DealDamage(m_creature, m_creature->GetHealth(), 0, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
-                }
-                CheckTimer = 2000;
-            }else CheckTimer -= diff;
-        }
+        if(FlameTimer < diff)
+        {
+            m_creature->CastSpell(m_creature, SPELL_MOLTEN_FLAME, true);
+            FlameTimer = 1000;
+        }else FlameTimer -= diff;
     }
 };
@@ -104,44 +65,21 @@
 struct TRINITY_DLL_DECL npc_volcanoAI : public ScriptedAI
 {
-    npc_volcanoAI(Creature *c) : ScriptedAI(c) {Reset();}
-
-    uint32 CheckTimer;
-    uint64 SupremusGUID;
-    uint32 FireballTimer;
-    uint32 GeyserTimer;
-
-    void Reset()
-    {
-        CheckTimer = 1000;
-        SupremusGUID = 0;
-        FireballTimer = 500;
-        GeyserTimer = 0;
+    npc_volcanoAI(Creature *c) : ScriptedAI(c)
+    {
+        m_creature->CastSpell(m_creature, SPELL_VOLCANIC_ERUPTION, false);
         m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
         m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
     }
 
+    void Reset() {}
     void Aggro(Unit *who) {}
     void AttackStart(Unit* who) {}
     void MoveInLineOfSight(Unit* who) {}
-
-    void UpdateAI(const uint32 diff)
-    {
-        if(GeyserTimer < diff)
-        {
-            DoCast(m_creature, SPELL_VOLCANIC_GEYSER);
-            GeyserTimer = 18000;
-        }else GeyserTimer -= diff;
-
-        if(FireballTimer < diff)
-        {
-            DoCast(m_creature, SPELL_VOLCANIC_FIREBALL, true);
-            FireballTimer = 1000;
-        }else FireballTimer -= diff;
-    }
+    void UpdateAI(const uint32 diff) {}
 };
 
 struct TRINITY_DLL_DECL boss_supremusAI : public ScriptedAI
 {
-    boss_supremusAI(Creature *c) : ScriptedAI(c)
+    boss_supremusAI(Creature *c) : ScriptedAI(c), summons(m_creature)
     {
         pInstance = ((ScriptedInstance*)c->GetInstanceData());
@@ -160,4 +98,6 @@
     bool Phase1;
 
+    SummonList summons;
+
     void Reset()
     {
@@ -180,4 +120,5 @@
 
         Phase1 = true;
+        summons.DespawnAll();
     }
 
@@ -206,33 +147,9 @@
             ToggleDoors(false);
         }
-    }
-
-    float CalculateRandomCoord(float initial)
-    {
-        float coord = 0;
-
-        switch(rand()%2)
-        {
-            case 0: coord = initial + 20 + rand()%20; break;
-            case 1: coord = initial - 20 - rand()%20; break;
-        }
-
-        return coord;
-    }
-
-    Creature* SummonCreature(uint32 entry, Unit* target)
-    {
-        if(target && entry)
-        {
-            Creature* Summon = m_creature->SummonCreature(entry, CalculateRandomCoord(target->GetPositionX()), CalculateRandomCoord(target->GetPositionY()), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 20000);
-            if(Summon)
-            {
-                Summon->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
-                Summon->setFaction(m_creature->getFaction());
-                return Summon;
-            }
-        }
-        return NULL;
-    }
+        summons.DespawnAll();
+    }
+
+    void JustSummoned(Creature *summon) {summons.Summon(summon);}
+    void SummonedCreatureDespawn(Creature *summon) {summons.Despawn(summon);}
 
     Unit* CalculateHurtfulStrikeTarget()
@@ -271,22 +188,6 @@
         if(SummonFlameTimer < diff)
         {
-            Unit* target = NULL;
-            target = SelectUnit(SELECT_TARGET_RANDOM, 1);
-
-            if(!target)                                     // someone is trying to solo, set target as current victim.
-                target = m_creature->getVictim();
-
-            if(target)
-            {
-                Creature* MoltenFlame = SummonCreature(CREATURE_STALKER, target);
-                if(MoltenFlame)
-                {
-                    // Invisible model
-                    MoltenFlame->SetUInt32Value(UNIT_FIELD_DISPLAYID, 11686);
-                    ((molten_flameAI*)MoltenFlame->AI())->SetSupremusGUID(m_creature->GetGUID());
-                    ((molten_flameAI*)MoltenFlame->AI())->StalkTarget(target);
-                    SummonFlameTimer = 20000;
-                }
-            }
+            DoCast(m_creature, SPELL_MOLTEN_PUNCH);
+            SummonFlameTimer = 20000;
         }else SummonFlameTimer -= diff;
 
@@ -295,6 +196,5 @@
             if(HurtfulStrikeTimer < diff)
             {
-                Unit* target = CalculateHurtfulStrikeTarget();
-                if(target)
+                if(Unit* target = CalculateHurtfulStrikeTarget())
                 {
                     DoCast(target, SPELL_HURTFUL_STRIKE);
@@ -308,6 +208,5 @@
             if(SwitchTargetTimer < diff)
             {
-                Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0);
-                if(target)
+                if(Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 1, 100, true))
                 {
                     DoResetThreat();
@@ -316,17 +215,11 @@
                     SwitchTargetTimer = 10000;
                 }
-
             }else SwitchTargetTimer -= diff;
 
             if(SummonVolcanoTimer < diff)
             {
-                Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 1);
-
-                if(!target)
-                    target = m_creature->getVictim();
-
-                if(target)
-                {
-                    DoCast(target, SPELL_VOLCANIC_ERUPTION);
+                if(Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0, 999, true))
+                {
+                    DoCast(target, SPELL_VOLCANIC_SUMMON);
                     DoTextEmote("roars and the ground begins to crack open!", NULL);
                     SummonVolcanoTimer = 10000;
@@ -342,5 +235,5 @@
                 DoResetThreat();
                 PhaseSwitchTimer = 60000;
-                m_creature->SetSpeed(MOVE_RUN, 1.0f);
+                m_creature->SetSpeed(MOVE_RUN, 1.2f);
                 DoZoneInCombat();
             }
