All pastes #631438 Raw Edit

Untitled

public text v1 · immutable
#631438 ·published 2007-07-23 23:31 UTC
rendered paste body
Index: ScriptMgr.cpp
===================================================================
--- ScriptMgr.cpp	(revision 85)
+++ ScriptMgr.cpp	(working copy)
@@ -1067,6 +1067,20 @@
     }
 }
 
+void ScriptedAI::DoMeleeAttackIfReady()
+{
+    //If we are within range melee the target
+    if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
+    {
+        //Make sure our attack is ready and we arn't currently casting
+        if( m_creature->isAttackReady() && !m_creature->m_currentSpells[CURRENT_GENERIC_SPELL])
+        {
+            m_creature->AttackerStateUpdate(m_creature->getVictim());
+            m_creature->resetAttackTimer();
+        }
+    }
+}
+
 void ScriptedAI::DoStartRangedAttack(Unit* victim)
 {
     if (!victim)
@@ -1093,14 +1107,14 @@
 
 void ScriptedAI::DoCast(Unit* victim, uint32 spelId)
 {
-    if (!victim || m_creature->m_currentSpell)
+    if (!victim || m_creature->m_currentSpells[CURRENT_GENERIC_SPELL])
         return;
     m_creature->CastSpell(victim, spelId, false);
 }
 
 void ScriptedAI::DoCastSpell(Unit* who,SpellEntry const *spellInfo)
 {
-    if (!who || m_creature->m_currentSpell)
+    if (!who || m_creature->m_currentSpells[CURRENT_GENERIC_SPELL])
         return;
 
     m_creature->StopMoving();
Index: ScriptMgr.h
===================================================================
--- ScriptMgr.h	(revision 85)
+++ ScriptMgr.h	(working copy)
@@ -172,6 +172,9 @@
     //Start attack of victim but stay in position
     void DoStartRangedAttack(Unit* victim);
 
+    //Do melee swing of current victim if in rnage and ready and not casting
+    void DoMeleeAttackIfReady();
+
     //Stop attack of current victim
     void DoStopAttack();
 
Index: scripts/boss/boss_emeriss.cpp
===================================================================
--- scripts/boss/boss_emeriss.cpp	(revision 85)
+++ scripts/boss/boss_emeriss.cpp	(working copy)
@@ -189,17 +189,7 @@
                 } else CorruptionofEarth_Timer -= diff;
             }
 
-
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/boss/boss_taerar.cpp
===================================================================
--- scripts/boss/boss_taerar.cpp	(revision 85)
+++ scripts/boss/boss_taerar.cpp	(working copy)
@@ -125,7 +125,6 @@
             //Become unbanished again 
             m_creature->setFaction(14);
             m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
-            m_creature->m_canMove = true; 
             Shades = false;
         } else if (Shades)
                {
@@ -208,77 +207,61 @@
             if ( !Shades  && (int) (m_creature->GetHealth()*100 / m_creature->GetMaxHealth() +0.5) == 75)
             {
 
-		if (Summon_Timer < diff)
-		{
+		        if (Summon_Timer < diff)
+		        {
 
-                //Inturrupt any spell casting
-                 m_creature->InterruptSpell();
-                 m_creature->m_canMove = false; 
-                m_creature->setFaction(35);
-                m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+                    //Inturrupt any spell casting
+                    m_creature->InterruptSpell(CURRENT_GENERIC_SPELL);
+                    m_creature->setFaction(35);
+                    m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
 
-                //Cast
-                SummonShades(m_creature->getVictim());
-                SummonShades(m_creature->getVictim());
-                SummonShades(m_creature->getVictim());
-                Summon_Timer = 120000;
+                    //Cast
+                    SummonShades(m_creature->getVictim());
+                    SummonShades(m_creature->getVictim());
+                    SummonShades(m_creature->getVictim());
+                    Summon_Timer = 120000;
                 } else Summon_Timer -= diff;
-	    }
+	        }
 
             //Summon 3 Shades
             if ( !Shades  && (int) (m_creature->GetHealth()*100 / m_creature->GetMaxHealth() +0.5) == 50)
             {
 
-		if (Summon_Timer < diff)
-		{
+                if (Summon_Timer < diff)
+                {
 
-                //Inturrupt any spell casting
-                 m_creature->InterruptSpell();
-                 m_creature->m_canMove = false; 
-                m_creature->setFaction(35);
-                m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+                    //Inturrupt any spell casting
+                    m_creature->InterruptSpell(CURRENT_GENERIC_SPELL);
+                    m_creature->setFaction(35);
+                    m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
 
-                //Cast
-                SummonShades(m_creature->getVictim());
-                SummonShades(m_creature->getVictim());
-                SummonShades(m_creature->getVictim());
-                Summon_Timer = 120000;
+                    //Cast
+                    SummonShades(m_creature->getVictim());
+                    SummonShades(m_creature->getVictim());
+                    SummonShades(m_creature->getVictim());
+                    Summon_Timer = 120000;
                 } else Summon_Timer -= diff;
-	    }
+            }
 
-
-
             //Summon 3 Shades
             if ( !Shades  && (int) (m_creature->GetHealth()*100 / m_creature->GetMaxHealth() +0.5) == 25)
             {
+                if (Summon_Timer < diff)
+                {
+                    //Inturrupt any spell casting
+                    m_creature->InterruptSpell(CURRENT_GENERIC_SPELL);
+                    m_creature->setFaction(35);
+                    m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
 
-		if (Summon_Timer < diff)
-		{
-
-                //Inturrupt any spell casting
-                 m_creature->InterruptSpell();
-                 m_creature->m_canMove = false; 
-                m_creature->setFaction(35);
-                m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
-
-                //Cast
-                SummonShades(m_creature->getVictim());
-                SummonShades(m_creature->getVictim());
-                SummonShades(m_creature->getVictim());
-                Summon_Timer = 120000;
+                    //Cast
+                    SummonShades(m_creature->getVictim());
+                    SummonShades(m_creature->getVictim());
+                    SummonShades(m_creature->getVictim());
+                    Summon_Timer = 120000;
                 } else Summon_Timer -= diff;
-	    }
-
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
             }
+
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/boss/boss_ysondre.cpp
===================================================================
--- scripts/boss/boss_ysondre.cpp	(revision 85)
+++ scripts/boss/boss_ysondre.cpp	(working copy)
@@ -242,16 +242,7 @@
                 } else SummonDruids_Timer -= diff;
             }
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/creature/mob_defias.cpp
===================================================================
--- scripts/creature/mob_defias.cpp	(revision 85)
+++ scripts/creature/mob_defias.cpp	(working copy)
@@ -68,7 +68,6 @@
                 DoStartMeleeAttack(who);
                 if (!m_creature->IsWithinDistInMap(who, ATTACK_DISTANCE))
                 {
-                    m_creature->m_canMove = false;
                     IsSelfRooted = true;
                 }
 
@@ -149,7 +148,7 @@
             if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
             {
                 //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
+                if( m_creature->isAttackReady() && !m_creature->m_currentSpells[CURRENT_GENERIC_SPELL])
                 {
                     bool Healing = false;
                     SpellEntry const *info = NULL;
@@ -180,7 +179,7 @@
             else 
             {
                 //Only run this code if we arn't already casting
-                if (!m_creature->m_currentSpell)
+                if (!m_creature->m_currentSpells[CURRENT_GENERIC_SPELL])
                 {
                     bool Healing = false;
                     SpellEntry const *info = NULL;
@@ -199,7 +198,6 @@
                         //If we are currently moving stop us and set the movement generator
                         if (!IsSelfRooted)
                         {
-                            m_creature->m_canMove = false;
                             IsSelfRooted = true;
                         }
 
@@ -218,8 +216,7 @@
                     else if (IsSelfRooted)
                     {
                         //Cancel our current spell and then allow movement agian
-                        m_creature->InterruptSpell();
-                        m_creature->m_canMove = true;
+                        m_creature->InterruptSpell(CURRENT_GENERIC_SPELL);
                         IsSelfRooted = false;
                     }
                 }
Index: scripts/creature/mob_generic_creature.cpp
===================================================================
--- scripts/creature/mob_generic_creature.cpp	(revision 85)
+++ scripts/creature/mob_generic_creature.cpp	(working copy)
@@ -54,7 +54,6 @@
             DoStartMeleeAttack(who);
             if (!m_creature->IsWithinDistInMap(who, ATTACK_DISTANCE))
             {
-                m_creature->m_canMove = false;
                 IsSelfRooted = true;
             }
 
@@ -79,7 +78,6 @@
                 DoStartMeleeAttack(who);
                 if (!m_creature->IsWithinDistInMap(who, ATTACK_DISTANCE))
                 {
-                    m_creature->m_canMove = false;
                     IsSelfRooted = true;
                 }
 
@@ -134,7 +132,7 @@
             if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
             {
                 //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
+                if( m_creature->isAttackReady() && !m_creature->m_currentSpells[CURRENT_GENERIC_SPELL])
                 {
                     bool Healing = false;
                     SpellEntry const *info = NULL;
@@ -165,7 +163,7 @@
             else 
             {
                 //Only run this code if we arn't already casting
-                if (!m_creature->m_currentSpell)
+                if (!m_creature->m_currentSpells[CURRENT_GENERIC_SPELL])
                 {
                     bool Healing = false;
                     SpellEntry const *info = NULL;
@@ -184,7 +182,6 @@
                         //If we are currently moving stop us and set the movement generator
                         if (!IsSelfRooted)
                         {
-                            m_creature->m_canMove = false;
                             IsSelfRooted = true;
                         }
 
@@ -203,8 +200,7 @@
                     else if (IsSelfRooted)
                     {
                         //Cancel our current spell and then allow movement agian
-                        m_creature->InterruptSpell();
-                        m_creature->m_canMove = true;
+                        m_creature->InterruptSpell(CURRENT_GENERIC_SPELL);
                         IsSelfRooted = false;
                     }
                 }
Index: scripts/creature/mob_kobold.cpp
===================================================================
--- scripts/creature/mob_kobold.cpp	(revision 85)
+++ scripts/creature/mob_kobold.cpp	(working copy)
@@ -134,7 +134,7 @@
             if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
             {
                 //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
+                if( m_creature->isAttackReady() && !m_creature->m_currentSpells[CURRENT_GENERIC_SPELL])
                 {
                     bool Healing = false;
                     SpellEntry const *info = NULL;
@@ -165,7 +165,7 @@
             else 
             {
                 //Only run this code if we arn't already casting
-                if (!m_creature->m_currentSpell)
+                if (!m_creature->m_currentSpells[CURRENT_GENERIC_SPELL])
                 {
                     bool Healing = false;
                     SpellEntry const *info = NULL;
@@ -203,7 +203,7 @@
                     else if ((*m_creature)->top()->GetMovementGeneratorType()!=TARGETED_MOTION_TYPE)
                     {
                         //Cancel our current spell and then mutate new movement generator
-                        m_creature->InterruptSpell();
+                        m_creature->InterruptSpell(CURRENT_GENERIC_SPELL);
                         (*m_creature)->Clear(false);
                         (*m_creature)->Mutate(new TargetedMovementGenerator(*m_creature->getVictim()));
                     }
Index: scripts/creature/mob_shade_of_taerar.cpp
===================================================================
--- scripts/creature/mob_shade_of_taerar.cpp	(revision 85)
+++ scripts/creature/mob_shade_of_taerar.cpp	(working copy)
@@ -102,16 +102,7 @@
                 PosionBreath_Timer = 15000;
             }else PosionBreath_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/creature/simple_ai.cpp
===================================================================
--- scripts/creature/simple_ai.cpp	(revision 85)
+++ scripts/creature/simple_ai.cpp	(working copy)
@@ -195,7 +195,7 @@
             if (Spell_Timer[i] < diff)
             {
                 //Check Current spell
-                if (!(Spell[i].InturruptPreviousCast && m_creature->m_currentSpell))
+                if (!(Spell[i].InturruptPreviousCast && m_creature->m_currentSpells[CURRENT_GENERIC_SPELL]))
                 {
                     Unit* target = NULL;
 
@@ -244,15 +244,6 @@
 
         }
 
-        //If we are within range melee the target
-        if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-        {
-            //Make sure our attack is ready and we arn't currently casting
-            if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-            {
-                m_creature->AttackerStateUpdate(m_creature->getVictim());
-                m_creature->resetAttackTimer();
-            }
-        }
+        DoMeleeAttackIfReady();
     }
 }
\ No newline at end of file
Index: scripts/custom/custom_example.cpp
===================================================================
--- scripts/custom/custom_example.cpp	(revision 85)
+++ scripts/custom/custom_example.cpp	(working copy)
@@ -254,22 +254,7 @@
                     DoCast(m_creature,SPELL_ENRAGE);
                 }else Phase_Timer -= diff;
 
-
-            //If we are within range melee the target
-            if( m_creature->getVictim() && m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Check if our attack is ready (swing timer)
-                if( m_creature->isAttackReady() )
-                {
-                    //This here causes us to flip between targets.
-                    //It doesn't do very much right now but it is a decent placeholder
-                    //for when we get an aggro system in place
-
-                    //Send our melee swing and then reset our attack timer
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/guard/guard_ai.cpp
===================================================================
--- scripts/guard/guard_ai.cpp	(revision 85)
+++ scripts/guard/guard_ai.cpp	(working copy)
@@ -131,7 +131,7 @@
         if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
         {
             //Make sure our attack is ready and we arn't currently casting
-            if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
+            if( m_creature->isAttackReady() && !m_creature->m_currentSpells[CURRENT_GENERIC_SPELL])
             {
                 bool Healing = false;
                 SpellEntry const *info = NULL;
@@ -162,7 +162,7 @@
         else 
         {
             //Only run this code if we arn't already casting
-            if (!m_creature->m_currentSpell)
+            if (!m_creature->m_currentSpells[CURRENT_GENERIC_SPELL])
             {
                 bool Healing = false;
                 SpellEntry const *info = NULL;
@@ -200,7 +200,7 @@
                 else if ((*m_creature)->top()->GetMovementGeneratorType()!=TARGETED_MOTION_TYPE)
                 {
                     //Cancel our current spell and then mutate new movement generator
-                    m_creature->InterruptSpell();
+                    m_creature->InterruptSpell(CURRENT_GENERIC_SPELL);
                     (*m_creature)->Clear(false);
                     (*m_creature)->Mutate(new TargetedMovementGenerator(*m_creature->getVictim()));
                 }
Index: scripts/item/purification_mixture.cpp
===================================================================
--- scripts/item/purification_mixture.cpp	(revision 85)
+++ scripts/item/purification_mixture.cpp	(working copy)
@@ -25,7 +25,7 @@
 {
     player->CastSpell(player,SPELL_PURIFY,true);
 
-    if(!player->m_currentSpell)
+    if(!player->m_currentSpells[CURRENT_GENERIC_SPELL])
     {
         if (rand()%100 < 65)
         {
Index: scripts/zone/azshara/boss_azuregos.cpp
===================================================================
--- scripts/zone/azshara/boss_azuregos.cpp	(revision 85)
+++ scripts/zone/azshara/boss_azuregos.cpp	(working copy)
@@ -145,17 +145,7 @@
                 Enrage_Timer = 30000;  
             }else Enrage_Timer -= diff;
 
-
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/blackrock_depths/boss_ambassador_flamelash.cpp
===================================================================
--- scripts/zone/blackrock_depths/boss_ambassador_flamelash.cpp	(revision 85)
+++ scripts/zone/blackrock_depths/boss_ambassador_flamelash.cpp	(working copy)
@@ -131,17 +131,7 @@
                 Spirit_Timer = 30000;
             }else Spirit_Timer -= diff;
 
-
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/blackrock_depths/boss_angerrel.cpp
===================================================================
--- scripts/zone/blackrock_depths/boss_angerrel.cpp	(revision 85)
+++ scripts/zone/blackrock_depths/boss_angerrel.cpp	(working copy)
@@ -121,18 +121,7 @@
                Strike_Timer = 10000;
             }else Strike_Timer -= diff;
 
-
-
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/blackrock_depths/boss_anubshiah.cpp
===================================================================
--- scripts/zone/blackrock_depths/boss_anubshiah.cpp	(revision 85)
+++ scripts/zone/blackrock_depths/boss_anubshiah.cpp	(working copy)
@@ -156,16 +156,7 @@
                EnvelopingWeb_Timer = 12000;
             }else EnvelopingWeb_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/blackrock_depths/boss_baelgar.cpp
===================================================================
--- scripts/zone/blackrock_depths/boss_baelgar.cpp	(revision 85)
+++ scripts/zone/blackrock_depths/boss_baelgar.cpp	(working copy)
@@ -103,16 +103,7 @@
                 SpawnOfBaelgar_Timer = 25000;
             }else SpawnOfBaelgar_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/blackrock_depths/boss_doomrel.cpp
===================================================================
--- scripts/zone/blackrock_depths/boss_doomrel.cpp	(revision 85)
+++ scripts/zone/blackrock_depths/boss_doomrel.cpp	(working copy)
@@ -172,16 +172,7 @@
                 Voidwalkers = true;
             }
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/blackrock_depths/boss_doperel.cpp
===================================================================
--- scripts/zone/blackrock_depths/boss_doperel.cpp	(revision 85)
+++ scripts/zone/blackrock_depths/boss_doperel.cpp	(working copy)
@@ -117,17 +117,7 @@
                 Gouge_Timer = 8000;
             }else Gouge_Timer -= diff;
 
-
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/blackrock_depths/boss_emperor_dagran_thaurissan.cpp
===================================================================
--- scripts/zone/blackrock_depths/boss_emperor_dagran_thaurissan.cpp	(revision 85)
+++ scripts/zone/blackrock_depths/boss_emperor_dagran_thaurissan.cpp	(working copy)
@@ -132,18 +132,7 @@
                 MortalStrike_Timer = 16000;
             }else MortalStrike_Timer -= diff;
 
-
-
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/blackrock_depths/boss_fineous_darkvire.cpp
===================================================================
--- scripts/zone/blackrock_depths/boss_fineous_darkvire.cpp	(revision 85)
+++ scripts/zone/blackrock_depths/boss_fineous_darkvire.cpp	(working copy)
@@ -113,16 +113,7 @@
                 Kick_Timer = 7000;
             }else Kick_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/blackrock_depths/boss_general_angerforge.cpp
===================================================================
--- scripts/zone/blackrock_depths/boss_general_angerforge.cpp	(revision 85)
+++ scripts/zone/blackrock_depths/boss_general_angerforge.cpp	(working copy)
@@ -195,16 +195,7 @@
                 Medics = true;
             }
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/blackrock_depths/boss_gloomrel.cpp
===================================================================
--- scripts/zone/blackrock_depths/boss_gloomrel.cpp	(revision 85)
+++ scripts/zone/blackrock_depths/boss_gloomrel.cpp	(working copy)
@@ -117,17 +117,7 @@
                 MortalStrike_Timer = 12000;
             }else MortalStrike_Timer -= diff;
 
-
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/blackrock_depths/boss_golem_lord_argelmach.cpp
===================================================================
--- scripts/zone/blackrock_depths/boss_golem_lord_argelmach.cpp	(revision 85)
+++ scripts/zone/blackrock_depths/boss_golem_lord_argelmach.cpp	(working copy)
@@ -116,18 +116,7 @@
                 LightningShield_Timer = 45000;
             }else LightningShield_Timer -= diff;
 
-
-
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/blackrock_depths/boss_gorosh_the_dervish.cpp
===================================================================
--- scripts/zone/blackrock_depths/boss_gorosh_the_dervish.cpp	(revision 85)
+++ scripts/zone/blackrock_depths/boss_gorosh_the_dervish.cpp	(working copy)
@@ -105,17 +105,7 @@
                 MortalStrike_Timer = 15000;
             }else MortalStrike_Timer -= diff;
 
-
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/blackrock_depths/boss_grizzle.cpp
===================================================================
--- scripts/zone/blackrock_depths/boss_grizzle.cpp	(revision 85)
+++ scripts/zone/blackrock_depths/boss_grizzle.cpp	(working copy)
@@ -110,18 +110,7 @@
                 }else Frenzy_Timer -= diff;
             }
 
-
-
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/blackrock_depths/boss_haterel.cpp
===================================================================
--- scripts/zone/blackrock_depths/boss_haterel.cpp	(revision 85)
+++ scripts/zone/blackrock_depths/boss_haterel.cpp	(working copy)
@@ -140,18 +140,7 @@
                Strike_Timer = 10000;
             }else Strike_Timer -= diff;
 
-
-
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/blackrock_depths/boss_high_interrogator_gerstahn.cpp
===================================================================
--- scripts/zone/blackrock_depths/boss_high_interrogator_gerstahn.cpp	(revision 85)
+++ scripts/zone/blackrock_depths/boss_high_interrogator_gerstahn.cpp	(working copy)
@@ -139,18 +139,7 @@
                ShadowShield_Timer = 25000;
             }else ShadowShield_Timer -= diff;
 
-
-
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/blackrock_depths/boss_lord_incendius.cpp
===================================================================
--- scripts/zone/blackrock_depths/boss_lord_incendius.cpp	(revision 85)
+++ scripts/zone/blackrock_depths/boss_lord_incendius.cpp	(working copy)
@@ -119,16 +119,7 @@
                 Curse_Timer = 22000;
             }else Curse_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/blackrock_depths/boss_lord_roccor.cpp
===================================================================
--- scripts/zone/blackrock_depths/boss_lord_roccor.cpp	(revision 85)
+++ scripts/zone/blackrock_depths/boss_lord_roccor.cpp	(working copy)
@@ -121,18 +121,7 @@
                GroundTremor_Timer = 15000;
             }else GroundTremor_Timer -= diff;
 
-
-
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/blackrock_depths/boss_magmus.cpp
===================================================================
--- scripts/zone/blackrock_depths/boss_magmus.cpp	(revision 85)
+++ scripts/zone/blackrock_depths/boss_magmus.cpp	(working copy)
@@ -109,18 +109,7 @@
                 }else WarStomp_Timer -= diff;
             }
 
-
-
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/blackrock_depths/boss_pyromancer_loregrain.cpp
===================================================================
--- scripts/zone/blackrock_depths/boss_pyromancer_loregrain.cpp	(revision 85)
+++ scripts/zone/blackrock_depths/boss_pyromancer_loregrain.cpp	(working copy)
@@ -136,18 +136,7 @@
                SearingTotem_Timer = 25000;
             }else SearingTotem_Timer -= diff;
 
-
-
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/blackrock_depths/boss_seethrel.cpp
===================================================================
--- scripts/zone/blackrock_depths/boss_seethrel.cpp	(revision 85)
+++ scripts/zone/blackrock_depths/boss_seethrel.cpp	(working copy)
@@ -152,16 +152,7 @@
                 FrostWard_Timer = 68000;
             }else FrostWard_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/blackrock_depths/boss_verek.cpp
===================================================================
--- scripts/zone/blackrock_depths/boss_verek.cpp	(revision 85)
+++ scripts/zone/blackrock_depths/boss_verek.cpp	(working copy)
@@ -106,16 +106,7 @@
                 FrostNova_Timer = 8000;
             }else FrostNova_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/blackrock_depths/boss_vilerel.cpp
===================================================================
--- scripts/zone/blackrock_depths/boss_vilerel.cpp	(revision 85)
+++ scripts/zone/blackrock_depths/boss_vilerel.cpp	(working copy)
@@ -137,17 +137,7 @@
                Shield_Timer = 30000;
             }else Shield_Timer -= diff;
 
-
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/blackrock_depths/boss_warder_stilgiss.cpp
===================================================================
--- scripts/zone/blackrock_depths/boss_warder_stilgiss.cpp	(revision 85)
+++ scripts/zone/blackrock_depths/boss_warder_stilgiss.cpp	(working copy)
@@ -106,16 +106,7 @@
                 FrostNova_Timer = 5000;
             }else FrostNova_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/blackrock_depths/mob_overmaster_pyron.cpp
===================================================================
--- scripts/zone/blackrock_depths/mob_overmaster_pyron.cpp	(revision 85)
+++ scripts/zone/blackrock_depths/mob_overmaster_pyron.cpp	(working copy)
@@ -107,16 +107,7 @@
                FireBlast_Timer = 12000;
             }else FireBlast_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/blackrock_depths/mob_phalanx.cpp
===================================================================
--- scripts/zone/blackrock_depths/mob_phalanx.cpp	(revision 85)
+++ scripts/zone/blackrock_depths/mob_phalanx.cpp	(working copy)
@@ -123,18 +123,7 @@
                MightyBlow_Timer = 10000;
             }else MightyBlow_Timer -= diff;
 
-
-
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/blackrock_spire/boss_drakkisath.cpp
===================================================================
--- scripts/zone/blackrock_spire/boss_drakkisath.cpp	(revision 85)
+++ scripts/zone/blackrock_spire/boss_drakkisath.cpp	(working copy)
@@ -133,17 +133,7 @@
                 Thunderclap_Timer = 20000;
             }else Thunderclap_Timer -= diff;
 
-
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/blackrock_spire/boss_gyth.cpp
===================================================================
--- scripts/zone/blackrock_spire/boss_gyth.cpp	(revision 85)
+++ scripts/zone/blackrock_spire/boss_gyth.cpp	(working copy)
@@ -109,7 +109,6 @@
             if (!Aggro && Aggro_Timer < diff)
             {
                 m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID,9723);  // Visible now!
-                m_creature->m_canMove = true; 
                 m_creature->setFaction(14);
                 m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
                 Aggro = true;
@@ -118,8 +117,6 @@
 
         if (!Event && !RootSelf)
         {
-            //Root self
-            m_creature->m_canMove = false; 
             RootSelf = true;
         }
 
@@ -216,7 +213,7 @@
 
                 // summon Rend and Change model to normal Gyth
                 //Inturrupt any spell casting
-                m_creature->InterruptSpell();
+                m_creature->InterruptSpell(CURRENT_GENERIC_SPELL);
                 m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID,9806);     //Gyth model
                 m_creature->SummonCreature(10429, m_creature->GetPositionX(), m_creature->GetPositionY(), m_creature->GetPositionZ(),0,TEMPSUMMON_TIMED_DESPAWN,900000);
                 SummonedRend = true;
@@ -225,14 +222,9 @@
 
 
             //If we are within range melee the target
-            if( Aggro && m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
+            if( Aggro )
             {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
+                DoMeleeAttackIfReady();
             }
         }
     }
Index: scripts/zone/blackrock_spire/boss_halycon.cpp
===================================================================
--- scripts/zone/blackrock_spire/boss_halycon.cpp	(revision 85)
+++ scripts/zone/blackrock_spire/boss_halycon.cpp	(working copy)
@@ -119,18 +119,7 @@
                 Summoned = true;                
             }
 
-
-
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/blackrock_spire/boss_highlord_omokk.cpp
===================================================================
--- scripts/zone/blackrock_spire/boss_highlord_omokk.cpp	(revision 85)
+++ scripts/zone/blackrock_spire/boss_highlord_omokk.cpp	(working copy)
@@ -181,16 +181,7 @@
                 Dazed_Timer = 12000;
             }else Dazed_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/blackrock_spire/boss_mother_smolderweb.cpp
===================================================================
--- scripts/zone/blackrock_spire/boss_mother_smolderweb.cpp	(revision 85)
+++ scripts/zone/blackrock_spire/boss_mother_smolderweb.cpp	(working copy)
@@ -132,16 +132,7 @@
                 WebExplosion_Timer = 20000;
             }else WebExplosion_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/blackrock_spire/boss_overlord_wyrmthalak.cpp
===================================================================
--- scripts/zone/blackrock_spire/boss_overlord_wyrmthalak.cpp	(revision 85)
+++ scripts/zone/blackrock_spire/boss_overlord_wyrmthalak.cpp	(working copy)
@@ -158,18 +158,7 @@
                 Summoned = true; 
             }
 
-
-
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/blackrock_spire/boss_pyroguard_emberseer.cpp
===================================================================
--- scripts/zone/blackrock_spire/boss_pyroguard_emberseer.cpp	(revision 85)
+++ scripts/zone/blackrock_spire/boss_pyroguard_emberseer.cpp	(working copy)
@@ -123,17 +123,7 @@
                 PyroBlast_Timer = 15000;
             }else PyroBlast_Timer -= diff;
 
-
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/blackrock_spire/boss_rend_blackhand.cpp
===================================================================
--- scripts/zone/blackrock_spire/boss_rend_blackhand.cpp	(revision 85)
+++ scripts/zone/blackrock_spire/boss_rend_blackhand.cpp	(working copy)
@@ -123,17 +123,7 @@
                 Thunderclap_Timer = 16000;
             }else Thunderclap_Timer -= diff;
 
-
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/blackrock_spire/boss_shadow_hunter_voshgajin.cpp
===================================================================
--- scripts/zone/blackrock_spire/boss_shadow_hunter_voshgajin.cpp	(revision 85)
+++ scripts/zone/blackrock_spire/boss_shadow_hunter_voshgajin.cpp	(working copy)
@@ -119,16 +119,7 @@
                 Cleave_Timer = 7000;
             }else Cleave_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/blackrock_spire/boss_the_beast.cpp
===================================================================
--- scripts/zone/blackrock_spire/boss_the_beast.cpp	(revision 85)
+++ scripts/zone/blackrock_spire/boss_the_beast.cpp	(working copy)
@@ -120,16 +120,7 @@
                 TerrifyingRoar_Timer = 20000;
             }else TerrifyingRoar_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/blackrock_spire/boss_warmaster_voone.cpp
===================================================================
--- scripts/zone/blackrock_spire/boss_warmaster_voone.cpp	(revision 85)
+++ scripts/zone/blackrock_spire/boss_warmaster_voone.cpp	(working copy)
@@ -169,16 +169,7 @@
                 Dazed_Timer = 24000;
             }else Dazed_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/blackrock_spire/mob_chromatic_elite_guard.cpp
===================================================================
--- scripts/zone/blackrock_spire/mob_chromatic_elite_guard.cpp	(revision 85)
+++ scripts/zone/blackrock_spire/mob_chromatic_elite_guard.cpp	(working copy)
@@ -101,17 +101,7 @@
                 KnockDown_Timer = 8000;
             }else KnockDown_Timer -= diff;
 
-
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/blackrock_spire/mob_quartermaster_zigris.cpp
===================================================================
--- scripts/zone/blackrock_spire/mob_quartermaster_zigris.cpp	(revision 85)
+++ scripts/zone/blackrock_spire/mob_quartermaster_zigris.cpp	(working copy)
@@ -118,18 +118,7 @@
                 Dazed_Timer = 18000;
             }else Dazed_Timer -= diff;
 
-
-
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/blackwing_lair/boss_broodlord_lashlayer.cpp
===================================================================
--- scripts/zone/blackwing_lair/boss_broodlord_lashlayer.cpp	(revision 85)
+++ scripts/zone/blackwing_lair/boss_broodlord_lashlayer.cpp	(working copy)
@@ -157,16 +157,7 @@
                 KnockBack_Timer = 25000;
             }else KnockBack_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                { 
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 };
Index: scripts/zone/blackwing_lair/boss_chromaggus.cpp
===================================================================
--- scripts/zone/blackwing_lair/boss_chromaggus.cpp	(revision 85)
+++ scripts/zone/blackwing_lair/boss_chromaggus.cpp	(working copy)
@@ -393,16 +393,7 @@
                 Enraged = true;
             }
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 };
Index: scripts/zone/blackwing_lair/boss_ebonroc.cpp
===================================================================
--- scripts/zone/blackwing_lair/boss_ebonroc.cpp	(revision 85)
+++ scripts/zone/blackwing_lair/boss_ebonroc.cpp	(working copy)
@@ -116,16 +116,7 @@
                 ShadowOfEbonroc_Timer = 45000;
             }else ShadowOfEbonroc_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 };
Index: scripts/zone/blackwing_lair/boss_firemaw.cpp
===================================================================
--- scripts/zone/blackwing_lair/boss_firemaw.cpp	(revision 85)
+++ scripts/zone/blackwing_lair/boss_firemaw.cpp	(working copy)
@@ -113,18 +113,8 @@
                 //cast this every 5 seconds
                 FlameBuffet_Timer = 5000;
             }else FlameBuffet_Timer -= diff;
-            
-            
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+
+            DoMeleeAttackIfReady();
         }
     }
 };
Index: scripts/zone/blackwing_lair/boss_flamegor.cpp
===================================================================
--- scripts/zone/blackwing_lair/boss_flamegor.cpp	(revision 85)
+++ scripts/zone/blackwing_lair/boss_flamegor.cpp	(working copy)
@@ -113,18 +113,8 @@
                 //cast this every 10-15 seconds
                 Frenzy_Timer = 10000 + (rand()%5000);
             }else Frenzy_Timer -= diff;
-            
-            
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+
+            DoMeleeAttackIfReady();
         }
     }
 };
Index: scripts/zone/blackwing_lair/boss_nefarian.cpp
===================================================================
--- scripts/zone/blackwing_lair/boss_nefarian.cpp	(revision 85)
+++ scripts/zone/blackwing_lair/boss_nefarian.cpp	(working copy)
@@ -313,16 +313,7 @@
                 DoPlaySoundToSet(m_creature,SOUND_RAISE_SKELETONS);
             }
             
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 };
Index: scripts/zone/blackwing_lair/boss_razorgore.cpp
===================================================================
--- scripts/zone/blackwing_lair/boss_razorgore.cpp	(revision 85)
+++ scripts/zone/blackwing_lair/boss_razorgore.cpp	(working copy)
@@ -138,16 +138,7 @@
                 Conflagration_Timer = 30000;
             }else Conflagration_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 };
Index: scripts/zone/blackwing_lair/boss_vaelastrasz.cpp
===================================================================
--- scripts/zone/blackwing_lair/boss_vaelastrasz.cpp	(revision 85)
+++ scripts/zone/blackwing_lair/boss_vaelastrasz.cpp	(working copy)
@@ -278,16 +278,7 @@
                 TailSwipe_Timer = 20000;
             }else TailSwipe_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 };
Index: scripts/zone/blackwing_lair/npc_victor_nefarius.cpp
===================================================================
--- scripts/zone/blackwing_lair/npc_victor_nefarius.cpp	(revision 85)
+++ scripts/zone/blackwing_lair/npc_victor_nefarius.cpp	(working copy)
@@ -297,7 +297,7 @@
                         //MapManager::Instance().GetMap(m_creature->GetMapId(), m_creature)->CreatureRelocation(m_creature,0,0,-5000,0);
                         
                         //Inturrupt any spell casting
-                        m_creature->InterruptSpell();
+                        m_creature->InterruptSpell(CURRENT_GENERIC_SPELL);
 
                         //Root self
                         DoCast(m_creature,33356);
Index: scripts/zone/blasted_lands/boss_kruul.cpp
===================================================================
--- scripts/zone/blasted_lands/boss_kruul.cpp	(revision 85)
+++ scripts/zone/blasted_lands/boss_kruul.cpp	(working copy)
@@ -211,18 +211,7 @@
                 Hound_Timer = 45000;
             }else Hound_Timer -= diff;
 
-
-
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/blasted_lands/mob_teremus_the_devourer.cpp
===================================================================
--- scripts/zone/blasted_lands/mob_teremus_the_devourer.cpp	(revision 85)
+++ scripts/zone/blasted_lands/mob_teremus_the_devourer.cpp	(working copy)
@@ -116,16 +116,7 @@
                 ResistAll_Timer = 45000;
             }else ResistAll_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/gruuls_lair/boss_gruul.cpp
===================================================================
--- scripts/zone/gruuls_lair/boss_gruul.cpp	(revision 85)
+++ scripts/zone/gruuls_lair/boss_gruul.cpp	(working copy)
@@ -171,7 +171,6 @@
                 {
                     case 0:
                     {
-                        m_creature->m_canMove = false; 
                         IsInGroundSlam= true;
 
                         // **Ground Slam Knockback**
@@ -290,9 +289,6 @@
                             }
                         }
 
-                        //Allow movement
-                        m_creature->m_canMove = true; 
-
                         // resets everything
                         IsInGroundSlam= false;
                         GroundSlam_Timer =120000;
@@ -305,16 +301,7 @@
                 }
             }else GroundSlam_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 };
Index: scripts/zone/hellfire_peninsula/boss_doomlord_kazzak.cpp
===================================================================
--- scripts/zone/hellfire_peninsula/boss_doomlord_kazzak.cpp	(revision 85)
+++ scripts/zone/hellfire_peninsula/boss_doomlord_kazzak.cpp	(working copy)
@@ -169,17 +169,7 @@
                 Rage_Timer = 27000;
             }else Rage_Timer -= diff;
 
-
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/hellfire_peninsula/mobs_bonechewer_orc.cpp
===================================================================
--- scripts/zone/hellfire_peninsula/mobs_bonechewer_orc.cpp	(revision 85)
+++ scripts/zone/hellfire_peninsula/mobs_bonechewer_orc.cpp	(working copy)
@@ -66,7 +66,6 @@
             DoStartMeleeAttack(who);
             if (!m_creature->IsWithinDistInMap(who, ATTACK_DISTANCE))
             {
-                m_creature->m_canMove = false;
                 IsSelfRooted = true;
             }
 
@@ -91,7 +90,6 @@
                 DoStartMeleeAttack(who);
                 if (!m_creature->IsWithinDistInMap(who, ATTACK_DISTANCE))
                 {
-                    m_creature->m_canMove = false;
                     IsSelfRooted = true;
                 }
 
@@ -146,7 +144,7 @@
             if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
             {
                 //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
+                if( m_creature->isAttackReady() && !m_creature->m_currentSpells[CURRENT_GENERIC_SPELL])
                 {
                     bool Healing = false;
                     SpellEntry const *info = NULL;
@@ -177,7 +175,7 @@
             else 
             {
                 //Only run this code if we arn't already casting
-                if (!m_creature->m_currentSpell)
+                if (!m_creature->m_currentSpells[CURRENT_GENERIC_SPELL])
                 {
                     bool Healing = false;
                     SpellEntry const *info = NULL;
@@ -196,7 +194,6 @@
                         //If we are currently moving stop us and set the movement generator
                         if (!IsSelfRooted)
                         {
-                            m_creature->m_canMove = false;
                             IsSelfRooted = true;
                         }
 
@@ -215,8 +212,7 @@
                     else if (IsSelfRooted)
                     {
                         //Cancel our current spell and then allow movement agian
-                        m_creature->InterruptSpell();
-                        m_creature->m_canMove = true;
+                        m_creature->InterruptSpell(CURRENT_GENERIC_SPELL);
                         IsSelfRooted = false;
                     }
                 }
Index: scripts/zone/karazhan/boss_curator.cpp
===================================================================
--- scripts/zone/karazhan/boss_curator.cpp	(revision 85)
+++ scripts/zone/karazhan/boss_curator.cpp	(working copy)
@@ -162,7 +162,7 @@
         {
             if(m_creature->GetPower(POWER_MANA) <= 0)
             {
-                m_creature->InterruptSpell();
+                m_creature->InterruptSpell(CURRENT_GENERIC_SPELL);
                 DoYell(SAY_EVOCATE, LANG_UNIVERSAL, NULL);
                 DoPlaySoundToSet(m_creature, SOUND_EVOCATE);
                 DoCast(m_creature, SPELL_EVOCATION);
@@ -234,18 +234,7 @@
                 DoPlaySoundToSet(m_creature, SOUND_ENRAGE);
             }
 
-
-
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)                        
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 };
Index: scripts/zone/karazhan/boss_maiden_of_virtue.cpp
===================================================================
--- scripts/zone/karazhan/boss_maiden_of_virtue.cpp	(revision 85)
+++ scripts/zone/karazhan/boss_maiden_of_virtue.cpp	(working copy)
@@ -209,16 +209,7 @@
                  Divinewrath_Timer = (rand()%50)*1000; 
             }else Divinewrath_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                { 
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 };
Index: scripts/zone/karazhan/boss_prince_malchezaar.cpp
===================================================================
--- scripts/zone/karazhan/boss_prince_malchezaar.cpp	(revision 85)
+++ scripts/zone/karazhan/boss_prince_malchezaar.cpp	(working copy)
@@ -570,16 +570,7 @@
 
             }
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)                        
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 };
Index: scripts/zone/maraudon/boss_landslide.cpp
===================================================================
--- scripts/zone/maraudon/boss_landslide.cpp	(revision 85)
+++ scripts/zone/maraudon/boss_landslide.cpp	(working copy)
@@ -147,17 +147,7 @@
                 } else Adds_Timer -= diff;
             }
 
-
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/maraudon/boss_lord_vyletongue.cpp
===================================================================
--- scripts/zone/maraudon/boss_lord_vyletongue.cpp	(revision 85)
+++ scripts/zone/maraudon/boss_lord_vyletongue.cpp	(working copy)
@@ -102,16 +102,7 @@
                 SmokeBomb_Timer = 12000;
             }else SmokeBomb_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/maraudon/boss_noxxion.cpp
===================================================================
--- scripts/zone/maraudon/boss_noxxion.cpp	(revision 85)
+++ scripts/zone/maraudon/boss_noxxion.cpp	(working copy)
@@ -111,7 +111,6 @@
             //Become visible again 
             m_creature->setFaction(14);
             m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
-            m_creature->m_canMove = true; 
             m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID,11172);     //Noxxion model
             Invisible = false;
         } else if (Invisible)
@@ -155,8 +154,7 @@
             {
 
                 //Inturrupt any spell casting
-                 m_creature->InterruptSpell();
-                m_creature->m_canMove = false;
+                 m_creature->InterruptSpell(CURRENT_GENERIC_SPELL);
                 m_creature->setFaction(35);
                 m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
                 m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID,11686);  // Invisible Model
@@ -171,17 +169,7 @@
                 Adds_Timer = 40000;
             }else Adds_Timer -= diff;
 
-
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/maraudon/boss_princess_theradras.cpp
===================================================================
--- scripts/zone/maraudon/boss_princess_theradras.cpp	(revision 85)
+++ scripts/zone/maraudon/boss_princess_theradras.cpp	(working copy)
@@ -134,16 +134,7 @@
                 RepulsiveGaze_Timer = 20000;
             }else RepulsiveGaze_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/maraudon/boss_rotgrip.cpp
===================================================================
--- scripts/zone/maraudon/boss_rotgrip.cpp	(revision 85)
+++ scripts/zone/maraudon/boss_rotgrip.cpp	(working copy)
@@ -90,16 +90,7 @@
                 Puncture_Timer = 12000;
             }else Puncture_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/maraudon/boss_tinkerer_gizlock.cpp
===================================================================
--- scripts/zone/maraudon/boss_tinkerer_gizlock.cpp	(revision 85)
+++ scripts/zone/maraudon/boss_tinkerer_gizlock.cpp	(working copy)
@@ -105,16 +105,7 @@
                 Bomb_Timer = 14000;
             }else Bomb_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/maraudon/mob_celebras_the_cursed.cpp
===================================================================
--- scripts/zone/maraudon/mob_celebras_the_cursed.cpp	(revision 85)
+++ scripts/zone/maraudon/mob_celebras_the_cursed.cpp	(working copy)
@@ -157,18 +157,7 @@
                 Adds_Timer = 28000;
             }else Adds_Timer -= diff;
 
-
-
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/maraudon/mob_meshlok_the_harvester.cpp
===================================================================
--- scripts/zone/maraudon/mob_meshlok_the_harvester.cpp	(revision 85)
+++ scripts/zone/maraudon/mob_meshlok_the_harvester.cpp	(working copy)
@@ -102,16 +102,7 @@
                 Strike_Timer = 9000;
             }else Strike_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/maraudon/mob_razorlash.cpp
===================================================================
--- scripts/zone/maraudon/mob_razorlash.cpp	(revision 85)
+++ scripts/zone/maraudon/mob_razorlash.cpp	(working copy)
@@ -119,18 +119,7 @@
                 ThornVolley_Timer = 12000;
             }else ThornVolley_Timer -= diff;
 
-
-
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/molten_core/boss_baron_geddon.cpp
===================================================================
--- scripts/zone/molten_core/boss_baron_geddon.cpp	(revision 85)
+++ scripts/zone/molten_core/boss_baron_geddon.cpp	(working copy)
@@ -95,7 +95,7 @@
         {
 
             //If we are <2% hp cast Armageddom
-            if ( m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 2 && !m_creature->m_currentSpell)
+            if ( m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 2 && !m_creature->m_currentSpells[CURRENT_GENERIC_SPELL])
             {
                 DoCast(m_creature,SPELL_ARMAGEDDOM);
                 DoTextEmote("performs one last service for Ragnaros.",NULL);
@@ -139,16 +139,7 @@
                 LivingBomb_Timer = 35000;
             }else LivingBomb_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/molten_core/boss_garr.cpp
===================================================================
--- scripts/zone/molten_core/boss_garr.cpp	(revision 85)
+++ scripts/zone/molten_core/boss_garr.cpp	(working copy)
@@ -111,16 +111,7 @@
                 MagmaShackles_Timer = 15000;
             }else MagmaShackles_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/molten_core/boss_gehennas.cpp
===================================================================
--- scripts/zone/molten_core/boss_gehennas.cpp	(revision 85)
+++ scripts/zone/molten_core/boss_gehennas.cpp	(working copy)
@@ -126,16 +126,7 @@
                 GehennasCurse_Timer = 30000;
             }else GehennasCurse_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/molten_core/boss_golemagg.cpp
===================================================================
--- scripts/zone/molten_core/boss_golemagg.cpp	(revision 85)
+++ scripts/zone/molten_core/boss_golemagg.cpp	(working copy)
@@ -121,27 +121,16 @@
             //EarthQuake_Timer
             if ( m_creature->GetHealth()*100 / m_creature->GetMaxHealth() < 11 )
             {
-		if (EarthQuake_Timer < diff)
-	        {
-                DoCast(m_creature->getVictim(),SPELL_EARTHQUAKE);
+                if (EarthQuake_Timer < diff)
+                {
+                    DoCast(m_creature->getVictim(),SPELL_EARTHQUAKE);
 
-                //12 seconds
-                EarthQuake_Timer = 12000;
+                    //12 seconds
+                    EarthQuake_Timer = 12000;
                 }else EarthQuake_Timer -= diff;
             }
 
-
-
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/molten_core/boss_lucifron.cpp
===================================================================
--- scripts/zone/molten_core/boss_lucifron.cpp	(revision 85)
+++ scripts/zone/molten_core/boss_lucifron.cpp	(working copy)
@@ -122,16 +122,7 @@
                 ShadowShock_Timer = 6000;
             }else ShadowShock_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/molten_core/boss_magmadar.cpp
===================================================================
--- scripts/zone/molten_core/boss_magmadar.cpp	(revision 85)
+++ scripts/zone/molten_core/boss_magmadar.cpp	(working copy)
@@ -145,16 +145,7 @@
                 Lavabomb_Timer = 12000;
             }else Lavabomb_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/molten_core/boss_majordomo_executus.cpp
===================================================================
--- scripts/zone/molten_core/boss_majordomo_executus.cpp	(revision 85)
+++ scripts/zone/molten_core/boss_majordomo_executus.cpp	(working copy)
@@ -168,16 +168,7 @@
                 Blastwave_Timer = 10000;
             }else Blastwave_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/molten_core/boss_ragnaros.cpp
===================================================================
--- scripts/zone/molten_core/boss_ragnaros.cpp	(revision 85)
+++ scripts/zone/molten_core/boss_ragnaros.cpp	(working copy)
@@ -260,7 +260,7 @@
                 //is not very well supported in the core
                 //so added normaly spawning and banish workaround and attack again after 90 secs.
 
-                 m_creature->InterruptSpell();
+                 m_creature->InterruptSpell(CURRENT_GENERIC_SPELL);
                 //Root self
                 DoCast(m_creature,23973);
                 m_creature->setFaction(35);
@@ -327,7 +327,7 @@
             if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
             {
                 //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
+                if( m_creature->isAttackReady() && !m_creature->m_currentSpells[CURRENT_GENERIC_SPELL])
                 {
                     m_creature->AttackerStateUpdate(m_creature->getVictim());
                     m_creature->resetAttackTimer();
Index: scripts/zone/molten_core/boss_shazzrah.cpp
===================================================================
--- scripts/zone/molten_core/boss_shazzrah.cpp	(revision 85)
+++ scripts/zone/molten_core/boss_shazzrah.cpp	(working copy)
@@ -140,16 +140,7 @@
                 Countspell_Timer = 20000;
             }else Countspell_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/molten_core/boss_sulfuron_harbinger.cpp
===================================================================
--- scripts/zone/molten_core/boss_sulfuron_harbinger.cpp	(revision 85)
+++ scripts/zone/molten_core/boss_sulfuron_harbinger.cpp	(working copy)
@@ -139,16 +139,7 @@
                 Flamespear_Timer = 15000;
             }else Flamespear_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/molten_core/mob_ancient_core_hound.cpp
===================================================================
--- scripts/zone/molten_core/mob_ancient_core_hound.cpp	(revision 85)
+++ scripts/zone/molten_core/mob_ancient_core_hound.cpp	(working copy)
@@ -130,16 +130,7 @@
                 ConeOfFire_Timer = 7000;
             }else ConeOfFire_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/molten_core/mob_core_rager.cpp
===================================================================
--- scripts/zone/molten_core/mob_core_rager.cpp	(revision 85)
+++ scripts/zone/molten_core/mob_core_rager.cpp	(working copy)
@@ -108,17 +108,7 @@
                 Mangle_Timer = 12000;
             }else Mangle_Timer -= diff;
 
-
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/molten_core/mob_firelord.cpp
===================================================================
--- scripts/zone/molten_core/mob_firelord.cpp	(revision 85)
+++ scripts/zone/molten_core/mob_firelord.cpp	(working copy)
@@ -121,17 +121,7 @@
                 SummonLavaSpawn_Timer = 30000;
             }else SummonLavaSpawn_Timer -= diff;
 
-
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 };
Index: scripts/zone/molten_core/mob_firesworn.cpp
===================================================================
--- scripts/zone/molten_core/mob_firesworn.cpp	(revision 85)
+++ scripts/zone/molten_core/mob_firesworn.cpp	(working copy)
@@ -112,26 +112,16 @@
                 Immolate_Timer = 7000;
             }else Immolate_Timer -= diff;
 
-
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
+
 CreatureAI* GetAI_mob_firesworn(Creature *_Creature)
 {
     return new mob_fireswornAI (_Creature);
 }
 
-
 void AddSC_mob_firesworn()
 {
     Script *newscript;
Index: scripts/zone/molten_core/mob_firewalker.cpp
===================================================================
--- scripts/zone/molten_core/mob_firewalker.cpp	(revision 85)
+++ scripts/zone/molten_core/mob_firewalker.cpp	(working copy)
@@ -115,16 +115,7 @@
                 MeltArmor_Timer = 15000;
             }else MeltArmor_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/molten_core/mob_flame_guard.cpp
===================================================================
--- scripts/zone/molten_core/mob_flame_guard.cpp	(revision 85)
+++ scripts/zone/molten_core/mob_flame_guard.cpp	(working copy)
@@ -125,17 +125,7 @@
                 ConeOfFire_Timer = 11000;
             }else ConeOfFire_Timer -= diff;
 
-
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/molten_core/mob_flamewaker.cpp
===================================================================
--- scripts/zone/molten_core/mob_flamewaker.cpp	(revision 85)
+++ scripts/zone/molten_core/mob_flamewaker.cpp	(working copy)
@@ -127,17 +127,7 @@
                 Strike_Timer = 10000;
             }else Strike_Timer -= diff;
 
-
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/molten_core/mob_flamewaker_elite.cpp
===================================================================
--- scripts/zone/molten_core/mob_flamewaker_elite.cpp	(revision 85)
+++ scripts/zone/molten_core/mob_flamewaker_elite.cpp	(working copy)
@@ -122,16 +122,7 @@
                 Blastwave_Timer = 12000;
             }else Blastwave_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/molten_core/mob_flamewaker_healer.cpp
===================================================================
--- scripts/zone/molten_core/mob_flamewaker_healer.cpp	(revision 85)
+++ scripts/zone/molten_core/mob_flamewaker_healer.cpp	(working copy)
@@ -126,16 +126,7 @@
                 ShadowBolt_Timer = 2000;
             }else ShadowBolt_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/molten_core/mob_flamewaker_protector.cpp
===================================================================
--- scripts/zone/molten_core/mob_flamewaker_protector.cpp	(revision 85)
+++ scripts/zone/molten_core/mob_flamewaker_protector.cpp	(working copy)
@@ -119,16 +119,7 @@
                 DominateMind_Timer = 20000;
             }else DominateMind_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/molten_core/mob_lavaspawn.cpp
===================================================================
--- scripts/zone/molten_core/mob_lavaspawn.cpp	(revision 85)
+++ scripts/zone/molten_core/mob_lavaspawn.cpp	(working copy)
@@ -116,7 +116,7 @@
             {
 
                 //Inturrupt any spell casting
-                 m_creature->InterruptSpell();
+                 m_creature->InterruptSpell(CURRENT_GENERIC_SPELL);
 
                 //Cast
                 Split(m_creature->getVictim());
@@ -125,18 +125,7 @@
                 Split_Timer = 8000;
             }else Split_Timer -= diff;
 
-
-
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 };
Index: scripts/zone/molten_core/mob_molten_destroyer.cpp
===================================================================
--- scripts/zone/molten_core/mob_molten_destroyer.cpp	(revision 85)
+++ scripts/zone/molten_core/mob_molten_destroyer.cpp	(working copy)
@@ -115,16 +115,7 @@
                 KnockBack_Timer = 8000;
             }else KnockBack_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/molten_core/mob_molten_giant.cpp
===================================================================
--- scripts/zone/molten_core/mob_molten_giant.cpp	(revision 85)
+++ scripts/zone/molten_core/mob_molten_giant.cpp	(working copy)
@@ -111,16 +111,7 @@
                 Stomp_Timer = 12000;
             }else Stomp_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/naxxramas/boss_anubrekhan.cpp
===================================================================
--- scripts/zone/naxxramas/boss_anubrekhan.cpp	(revision 85)
+++ scripts/zone/naxxramas/boss_anubrekhan.cpp	(working copy)
@@ -240,16 +240,7 @@
                 Summon_Timer = 45000;
             }else Summon_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 };
Index: scripts/zone/naxxramas/boss_faerlina.cpp
===================================================================
--- scripts/zone/naxxramas/boss_faerlina.cpp	(revision 85)
+++ scripts/zone/naxxramas/boss_faerlina.cpp	(working copy)
@@ -232,16 +232,7 @@
                 Enrage_Timer = 61000;
             }else Enrage_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/naxxramas/boss_gluth.cpp
===================================================================
--- scripts/zone/naxxramas/boss_gluth.cpp	(revision 85)
+++ scripts/zone/naxxramas/boss_gluth.cpp	(working copy)
@@ -208,18 +208,7 @@
                 Summon_Timer = 28000;
             } else Summon_Timer -= diff;
             
-
-
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/naxxramas/boss_highlord_mograine.cpp
===================================================================
--- scripts/zone/naxxramas/boss_highlord_mograine.cpp	(revision 85)
+++ scripts/zone/naxxramas/boss_highlord_mograine.cpp	(working copy)
@@ -196,16 +196,7 @@
                 RighteousFire_Timer = 2000; // right
             }else RighteousFire_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/naxxramas/boss_kelthuzad.cpp
===================================================================
--- scripts/zone/naxxramas/boss_kelthuzad.cpp	(revision 85)
+++ scripts/zone/naxxramas/boss_kelthuzad.cpp	(working copy)
@@ -538,16 +538,7 @@
                 }
                 else GuardiansOfIcecrown_Timer -= diff;
             
-            //Melee if we can
-            if(m_creature->IsWithinDistInMap(m_creature->getVictim(),ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if(m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 };
Index: scripts/zone/naxxramas/boss_lady_blaumeux.cpp
===================================================================
--- scripts/zone/naxxramas/boss_lady_blaumeux.cpp	(revision 85)
+++ scripts/zone/naxxramas/boss_lady_blaumeux.cpp	(working copy)
@@ -162,16 +162,7 @@
                 VoidZone_Timer = 12000; // right
             }else VoidZone_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/naxxramas/boss_loatheb.cpp
===================================================================
--- scripts/zone/naxxramas/boss_loatheb.cpp	(revision 85)
+++ scripts/zone/naxxramas/boss_loatheb.cpp	(working copy)
@@ -285,18 +285,7 @@
                 Summon_Timer = 28000;
                } else Summon_Timer -= diff;
             
-
-
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/naxxramas/boss_maexxna.cpp
===================================================================
--- scripts/zone/naxxramas/boss_maexxna.cpp	(revision 85)
+++ scripts/zone/naxxramas/boss_maexxna.cpp	(working copy)
@@ -156,16 +156,7 @@
                 Enraged = true;
             }
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 };
Index: scripts/zone/naxxramas/boss_noth.cpp
===================================================================
--- scripts/zone/naxxramas/boss_noth.cpp	(revision 85)
+++ scripts/zone/naxxramas/boss_noth.cpp	(working copy)
@@ -238,18 +238,7 @@
                 Summon_Timer = 30500;
             } else Summon_Timer -= diff;
             
-
-
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/naxxramas/boss_patchwerk.cpp
===================================================================
--- scripts/zone/naxxramas/boss_patchwerk.cpp	(revision 85)
+++ scripts/zone/naxxramas/boss_patchwerk.cpp	(working copy)
@@ -185,16 +185,7 @@
                 Enraged = true;
             }
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 };
Index: scripts/zone/naxxramas/boss_razuvious.cpp
===================================================================
--- scripts/zone/naxxramas/boss_razuvious.cpp	(revision 85)
+++ scripts/zone/naxxramas/boss_razuvious.cpp	(working copy)
@@ -220,16 +220,7 @@
                 CommandSound_Timer = 40000;
             }else CommandSound_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 };
Index: scripts/zone/naxxramas/boss_sir_zeliek.cpp
===================================================================
--- scripts/zone/naxxramas/boss_sir_zeliek.cpp	(revision 85)
+++ scripts/zone/naxxramas/boss_sir_zeliek.cpp	(working copy)
@@ -161,16 +161,7 @@
                 HolyWrath_Timer = 12000;
             }else HolyWrath_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/naxxramas/boss_thane_korthazz.cpp
===================================================================
--- scripts/zone/naxxramas/boss_thane_korthazz.cpp	(revision 85)
+++ scripts/zone/naxxramas/boss_thane_korthazz.cpp	(working copy)
@@ -163,16 +163,7 @@
                 Meteor_Timer = 20000; // wrong
             }else Meteor_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/onyxias_lair/boss_onyxia.cpp
===================================================================
--- scripts/zone/onyxias_lair/boss_onyxia.cpp	(revision 85)
+++ scripts/zone/onyxias_lair/boss_onyxia.cpp	(working copy)
@@ -85,7 +85,7 @@
 
 
 //        m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1, 3);
-        m_creature->InterruptSpell();
+        m_creature->InterruptSpell(CURRENT_GENERIC_SPELL);
         m_creature->SetHover(false);
         (*m_creature)->Clear(false);
         m_creature->RemoveAllAuras();
@@ -211,7 +211,7 @@
                 if (movement_timer < diff)
                 {
                     //Inturrupt whatever we are casting then move to random position
-                    m_creature->InterruptSpell();
+                    m_creature->InterruptSpell(CURRENT_GENERIC_SPELL);
                     uint32 position = rand()%9;
 
                     switch (position)
@@ -328,7 +328,7 @@
             if ( phase == 1 && (m_creature->GetHealth()*100) / m_creature->GetMaxHealth() < 61)
             {
                 phase = 2;
-                m_creature->InterruptSpell();
+                m_creature->InterruptSpell(CURRENT_GENERIC_SPELL);
                 m_creature->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
                 (*m_creature)->Clear(false);
                 (*m_creature)->Idle();
@@ -344,7 +344,7 @@
             if ( phase == 2 && (m_creature->GetHealth()*100) / m_creature->GetMaxHealth() < 41)
             {
                 phase = 3;
-                m_creature->InterruptSpell();
+                m_creature->InterruptSpell(CURRENT_GENERIC_SPELL);
                  SpecialMove(-65.8444,-213.809,-85.2985,5000);
                 m_creature->Relocate(-65,-213,-85,0);
                 //m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE,EMOTE_STATE_STAND);
Index: scripts/zone/razorfen_downs/boss_amnennar_the_coldbringer.cpp
===================================================================
--- scripts/zone/razorfen_downs/boss_amnennar_the_coldbringer.cpp	(revision 85)
+++ scripts/zone/razorfen_downs/boss_amnennar_the_coldbringer.cpp	(working copy)
@@ -160,16 +160,7 @@
                 Spectrals = true;
             }
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/ruins_of_ahnqiraj/boss_ayamiss.cpp
===================================================================
--- scripts/zone/ruins_of_ahnqiraj/boss_ayamiss.cpp	(revision 85)
+++ scripts/zone/ruins_of_ahnqiraj/boss_ayamiss.cpp	(working copy)
@@ -90,7 +90,7 @@
             }
 
 			//If he is 70% start phase 2
-            if (phase==1 && m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 70 && !m_creature->m_currentSpell)
+            if (phase==1 && m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 70 && !m_creature->m_currentSpells[CURRENT_GENERIC_SPELL])
             {
 				phase=2;
 				
@@ -119,17 +119,7 @@
                 SUMMONSWARMER_Timer = 60000;
             }else SUMMONSWARMER_Timer -= diff;
 
-
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/ruins_of_ahnqiraj/boss_kurinnaxx.cpp
===================================================================
--- scripts/zone/ruins_of_ahnqiraj/boss_kurinnaxx.cpp	(revision 85)
+++ scripts/zone/ruins_of_ahnqiraj/boss_kurinnaxx.cpp	(working copy)
@@ -98,7 +98,7 @@
             }
 
             //If we are <30% cast enrage
-            if (i==0 && m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 30 && !m_creature->m_currentSpell)
+            if (i==0 && m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 30 && !m_creature->m_currentSpells[CURRENT_GENERIC_SPELL])
             {
 				i=1;
 			DoCast(m_creature->getVictim(),SPELL_ENRAGE);
@@ -124,18 +124,7 @@
                 SANDTRAP_Timer = 30000;
             }else SANDTRAP_Timer -= diff;
 
-
-
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/ruins_of_ahnqiraj/boss_moam.cpp
===================================================================
--- scripts/zone/ruins_of_ahnqiraj/boss_moam.cpp	(revision 85)
+++ scripts/zone/ruins_of_ahnqiraj/boss_moam.cpp	(working copy)
@@ -103,14 +103,14 @@
             }
 
 			//If we are 100%MANA cast Arcane Erruption
-            //if (j==1 && m_creature->GetMana()*100 / m_creature->GetMaxMana() == 100 && !m_creature->m_currentSpell)
+            //if (j==1 && m_creature->GetMana()*100 / m_creature->GetMaxMana() == 100 && !m_creature->m_currentSpells[CURRENT_GENERIC_SPELL])
             {
 				DoCast(m_creature->getVictim(),SPELL_ARCANEERUPTION);
 				DoYell(SAY_MANA,LANG_UNIVERSAL,NULL);
             }
 
             //If we are <50%HP cast MANA FIEND (Summon Mana) and Sleep
-            //if (i==0 && m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 50 && !m_creature->m_currentSpell)
+            //if (i==0 && m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 50 && !m_creature->m_currentSpells[CURRENT_GENERIC_SPELL])
             {
 				i=1;
 			DoCast(m_creature->getVictim(),SPELL_SUMMONMANA);
@@ -146,18 +146,7 @@
                 DRAINMANA_Timer = 30000;
             }else DRAINMANA_Timer -= diff;
 
-
-
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/scarlet_monastery/boss_arcanist_doan.cpp
===================================================================
--- scripts/zone/scarlet_monastery/boss_arcanist_doan.cpp	(revision 85)
+++ scripts/zone/scarlet_monastery/boss_arcanist_doan.cpp	(working copy)
@@ -125,7 +125,7 @@
         {
 
             //If we are <50% hp cast Arcane Bubble and start casting SPECIAL FIRE AOE
-            if (m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 50 && !m_creature->m_currentSpell)
+            if (m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 50 && !m_creature->m_currentSpells[CURRENT_GENERIC_SPELL])
             {
                 //SpecialAoE -> Fucking bitch took lot of my time to test :S
                 if (Polymorph_Timer < diff)
@@ -214,16 +214,7 @@
                 ManaShield4_Timer = 70000;
             }else ManaShield4_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/scarlet_monastery/boss_azshir_the_sleepless.cpp
===================================================================
--- scripts/zone/scarlet_monastery/boss_azshir_the_sleepless.cpp	(revision 85)
+++ scripts/zone/scarlet_monastery/boss_azshir_the_sleepless.cpp	(working copy)
@@ -87,7 +87,7 @@
         if( m_creature->getVictim() && m_creature->isAlive())
         {
             //If we are <50% hp cast Soul Siphon rank 1
-            if ( m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 50 && !m_creature->m_currentSpell)
+            if ( m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 50 && !m_creature->m_currentSpells[CURRENT_GENERIC_SPELL])
             {
                 //SoulSiphon_Timer
                 if (SoulSiphon_Timer < diff)
@@ -121,16 +121,7 @@
                 Terrify_Timer = 20000;
             }else Terrify_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 };
Index: scripts/zone/scarlet_monastery/boss_bloodmage_thalnos.cpp
===================================================================
--- scripts/zone/scarlet_monastery/boss_bloodmage_thalnos.cpp	(revision 85)
+++ scripts/zone/scarlet_monastery/boss_bloodmage_thalnos.cpp	(working copy)
@@ -175,16 +175,7 @@
                 FireNova_Timer = 20000;
             }else FireNova_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 };
Index: scripts/zone/scarlet_monastery/boss_herod.cpp
===================================================================
--- scripts/zone/scarlet_monastery/boss_herod.cpp	(revision 85)
+++ scripts/zone/scarlet_monastery/boss_herod.cpp	(working copy)
@@ -153,7 +153,7 @@
         {
 
             //If we are <10% hp goes Enraged
-            if ( m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 10 && !m_creature->m_currentSpell && Enrage_Timer < diff)
+            if ( m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 10 && !m_creature->m_currentSpells[CURRENT_GENERIC_SPELL] && Enrage_Timer < diff)
             {
                 DoYell(SAY_ENRAGE,LANG_UNIVERSAL,NULL);
                 DoPlaySoundToSet(m_creature,SOUND_ENRAGE);
@@ -250,16 +250,7 @@
                 ConeOfCold5_Timer = 40000;
             }else ConeOfCold5_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 };
Index: scripts/zone/scarlet_monastery/boss_high_inquisitor_fairbanks.cpp
===================================================================
--- scripts/zone/scarlet_monastery/boss_high_inquisitor_fairbanks.cpp	(revision 85)
+++ scripts/zone/scarlet_monastery/boss_high_inquisitor_fairbanks.cpp	(working copy)
@@ -101,7 +101,7 @@
         if( m_creature->getVictim() && m_creature->isAlive())
         {
             //If we are <45% hp cast Renew rank 6 or Flash heal rank 4
-            if ( m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 45 && !m_creature->m_currentSpell && Healing_Timer < diff)
+            if ( m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 45 && !m_creature->m_currentSpells[CURRENT_GENERIC_SPELL] && Healing_Timer < diff)
             {
                 DoCast(m_creature->getVictim(),SPELL_RENEW6 || SPELL_FLASHHEAL4);
                 
@@ -170,16 +170,7 @@
                 MindBlast5_Timer = 30000;
             }else MindBlast5_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 };
Index: scripts/zone/scarlet_monastery/boss_high_inquisitor_whitemane.cpp
===================================================================
--- scripts/zone/scarlet_monastery/boss_high_inquisitor_whitemane.cpp	(revision 85)
+++ scripts/zone/scarlet_monastery/boss_high_inquisitor_whitemane.cpp	(working copy)
@@ -134,7 +134,7 @@
         {
 
             //If we are <75% hp cast healing spells at self and Mograine
-            if ( m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 75 && !m_creature->m_currentSpell)
+            if ( m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 75 && !m_creature->m_currentSpells[CURRENT_GENERIC_SPELL])
             {
                 
                 //Healing_Timer
@@ -148,7 +148,7 @@
                     Healing_Timer = 80000;
                 }else Healing_Timer -= diff;      
                 
-                if ( m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 30 && !m_creature->m_currentSpell)
+                if ( m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 30 && !m_creature->m_currentSpells[CURRENT_GENERIC_SPELL])
                 {
 
                     if (Healing_Timer < diff)
@@ -224,16 +224,7 @@
                 MindBlast6_Timer = 35000;
             }else MindBlast6_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/scarlet_monastery/boss_houndmaster_loksey.cpp
===================================================================
--- scripts/zone/scarlet_monastery/boss_houndmaster_loksey.cpp	(revision 85)
+++ scripts/zone/scarlet_monastery/boss_houndmaster_loksey.cpp	(working copy)
@@ -99,7 +99,7 @@
         if( m_creature->getVictim() && m_creature->isAlive())
         {
             //If we are <10% hp cast healing spells at self and Mograine
-            if ( m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 10 && !m_creature->m_currentSpell && Enrage_Timer < diff)
+            if ( m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 10 && !m_creature->m_currentSpells[CURRENT_GENERIC_SPELL] && Enrage_Timer < diff)
             {
                 DoCast(m_creature,SPELL_ENRAGE);
 
@@ -108,16 +108,7 @@
 
             }else Enrage_Timer -= diff;
             
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/scarlet_monastery/boss_interrogator_vishas.cpp
===================================================================
--- scripts/zone/scarlet_monastery/boss_interrogator_vishas.cpp	(revision 85)
+++ scripts/zone/scarlet_monastery/boss_interrogator_vishas.cpp	(working copy)
@@ -104,7 +104,7 @@
             }
 
             //If we are low on hp Do sayings
-            if ( m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 60 && !m_creature->m_currentSpell)
+            if ( m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 60 && !m_creature->m_currentSpells[CURRENT_GENERIC_SPELL])
             {
                 //Yell_Timer
                 if (Yell_Timer < diff)
@@ -119,7 +119,7 @@
                 }else Yell_Timer -= diff;
             }
             
-            if ( m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 30 && !m_creature->m_currentSpell)
+            if ( m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 30 && !m_creature->m_currentSpells[CURRENT_GENERIC_SPELL])
             {
                 //Yell_Timer
                 if (Yell_Timer < diff)
@@ -144,16 +144,7 @@
                 PowerWordShield_Timer = 60000;
             }else PowerWordShield_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/scarlet_monastery/boss_scarlet_commander_mograine.cpp
===================================================================
--- scripts/zone/scarlet_monastery/boss_scarlet_commander_mograine.cpp	(revision 85)
+++ scripts/zone/scarlet_monastery/boss_scarlet_commander_mograine.cpp	(working copy)
@@ -115,7 +115,7 @@
         if( m_creature->getVictim() && m_creature->isAlive())
         {
             //If we are <50% hp cast Arcane Bubble and start casting SPECIAL Arcane Explosion
-            if ( m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 50 && !m_creature->m_currentSpell)
+            if ( m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 50 && !m_creature->m_currentSpells[CURRENT_GENERIC_SPELL])
             {
                 
                 //heal_Timer
@@ -201,16 +201,7 @@
                 BlessingOfProtection3_Timer = 50000;
             }else BlessingOfProtection3_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 };
Index: scripts/zone/scarlet_monastery/boss_scorn.cpp
===================================================================
--- scripts/zone/scarlet_monastery/boss_scorn.cpp	(revision 85)
+++ scripts/zone/scarlet_monastery/boss_scorn.cpp	(working copy)
@@ -128,16 +128,7 @@
                 FrostNova_Timer = 15000;
             }else FrostNova_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/scarlet_monastery/mob_scarlet_torturer.cpp
===================================================================
--- scripts/zone/scarlet_monastery/mob_scarlet_torturer.cpp	(revision 85)
+++ scripts/zone/scarlet_monastery/mob_scarlet_torturer.cpp	(working copy)
@@ -126,16 +126,7 @@
                 Immolate_Timer = 45000;
             }else Immolate_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/scholomance/boss_doctor_theolen_krastinov.cpp
===================================================================
--- scripts/zone/scholomance/boss_doctor_theolen_krastinov.cpp	(revision 85)
+++ scripts/zone/scholomance/boss_doctor_theolen_krastinov.cpp	(working copy)
@@ -120,18 +120,7 @@
                 }else Frenzy_Timer -= diff;
             }
 
-
-
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/scholomance/boss_illucia_barov.cpp
===================================================================
--- scripts/zone/scholomance/boss_illucia_barov.cpp	(revision 85)
+++ scripts/zone/scholomance/boss_illucia_barov.cpp	(working copy)
@@ -133,17 +133,7 @@
                 Fear_Timer = 30000;
             }else Fear_Timer -= diff;
 
-
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/scholomance/boss_instructor_malicia.cpp
===================================================================
--- scripts/zone/scholomance/boss_instructor_malicia.cpp	(revision 85)
+++ scripts/zone/scholomance/boss_instructor_malicia.cpp	(working copy)
@@ -173,17 +173,7 @@
                   
             }else HealingTouch_Timer -= diff;
 
-
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/scholomance/boss_jandice_barov.cpp
===================================================================
--- scripts/zone/scholomance/boss_jandice_barov.cpp	(revision 85)
+++ scripts/zone/scholomance/boss_jandice_barov.cpp	(working copy)
@@ -110,7 +110,6 @@
             m_creature->setFaction(14);
             m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
             m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID,11073);     //Jandice Model
-            m_creature->m_canMove = true; 
             Invisible = false;
         } else if (Invisible)
                {
@@ -142,8 +141,7 @@
             {
 
                 //Inturrupt any spell casting
-                m_creature->InterruptSpell();
-                m_creature->m_canMove = false;
+                m_creature->InterruptSpell(CURRENT_GENERIC_SPELL);
                 m_creature->setFaction(35);
                 m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
                 m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID,11686);  // Invisible Model
@@ -186,18 +184,7 @@
 //                  
 //            }else Illusion_Timer -= diff;
 
-
-
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/scholomance/boss_kormok.cpp
===================================================================
--- scripts/zone/scholomance/boss_kormok.cpp	(revision 85)
+++ scripts/zone/scholomance/boss_kormok.cpp	(working copy)
@@ -185,16 +185,7 @@
                 Mages = true;
             }
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/scholomance/boss_lord_alexei_barov.cpp
===================================================================
--- scripts/zone/scholomance/boss_lord_alexei_barov.cpp	(revision 85)
+++ scripts/zone/scholomance/boss_lord_alexei_barov.cpp	(working copy)
@@ -121,16 +121,7 @@
                 VeilofShadow_Timer = 25000;
             }else VeilofShadow_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/scholomance/boss_lorekeeper_polkelt.cpp
===================================================================
--- scripts/zone/scholomance/boss_lorekeeper_polkelt.cpp	(revision 85)
+++ scripts/zone/scholomance/boss_lorekeeper_polkelt.cpp	(working copy)
@@ -125,16 +125,7 @@
                 NoxiousCatalyst_Timer = 38000;
             }else NoxiousCatalyst_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/scholomance/boss_ras_frostwhisper.cpp
===================================================================
--- scripts/zone/scholomance/boss_ras_frostwhisper.cpp	(revision 85)
+++ scripts/zone/scholomance/boss_ras_frostwhisper.cpp	(working copy)
@@ -161,16 +161,7 @@
                 FrostVolley_Timer = 15000;
             }else FrostVolley_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/scholomance/boss_the_ravenian.cpp
===================================================================
--- scripts/zone/scholomance/boss_the_ravenian.cpp	(revision 85)
+++ scripts/zone/scholomance/boss_the_ravenian.cpp	(working copy)
@@ -139,16 +139,7 @@
                 KnockAway_Timer = 12000;
             }else KnockAway_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/scholomance/boss_vectus.cpp
===================================================================
--- scripts/zone/scholomance/boss_vectus.cpp	(revision 85)
+++ scripts/zone/scholomance/boss_vectus.cpp	(working copy)
@@ -120,17 +120,7 @@
                 }else Frenzy_Timer -= diff;
             }
 
-
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/stratholme/boss_archivist_galford.cpp
===================================================================
--- scripts/zone/stratholme/boss_archivist_galford.cpp	(revision 85)
+++ scripts/zone/stratholme/boss_archivist_galford.cpp	(working copy)
@@ -122,16 +122,7 @@
                 Pyroblast_Timer = 21000;
             }else Pyroblast_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/stratholme/boss_baron_rivendare.cpp
===================================================================
--- scripts/zone/stratholme/boss_baron_rivendare.cpp	(revision 85)
+++ scripts/zone/stratholme/boss_baron_rivendare.cpp	(working copy)
@@ -256,17 +256,7 @@
                 SummonSkeletons_Timer = 40000;
             }else SummonSkeletons_Timer -= diff;
 
-
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 };
Index: scripts/zone/stratholme/boss_baroness_anastari.cpp
===================================================================
--- scripts/zone/stratholme/boss_baroness_anastari.cpp	(revision 85)
+++ scripts/zone/stratholme/boss_baroness_anastari.cpp	(working copy)
@@ -140,16 +140,8 @@
             Possess_Timer = 50000;
             }else Possess_Timer -= diff;
             */
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/stratholme/boss_black_guard_swordsmith.cpp
===================================================================
--- scripts/zone/stratholme/boss_black_guard_swordsmith.cpp	(revision 85)
+++ scripts/zone/stratholme/boss_black_guard_swordsmith.cpp	(working copy)
@@ -112,16 +112,7 @@
                 BansheeCurse_Timer = 15000;
             }else BansheeCurse_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/stratholme/boss_cannon_master_willey.cpp
===================================================================
--- scripts/zone/stratholme/boss_cannon_master_willey.cpp	(revision 85)
+++ scripts/zone/stratholme/boss_cannon_master_willey.cpp	(working copy)
@@ -234,17 +234,7 @@
                 SummonRifleman_Timer = 30000;
             }else SummonRifleman_Timer -= diff;
 
-
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/stratholme/boss_crimson_hammersmith.cpp
===================================================================
--- scripts/zone/stratholme/boss_crimson_hammersmith.cpp	(revision 85)
+++ scripts/zone/stratholme/boss_crimson_hammersmith.cpp	(working copy)
@@ -125,16 +125,7 @@
                 HammerOfJustice_Timer = 16000;
             }else HammerOfJustice_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/stratholme/boss_dathrohan_balnazzar.cpp
===================================================================
--- scripts/zone/stratholme/boss_dathrohan_balnazzar.cpp	(revision 85)
+++ scripts/zone/stratholme/boss_dathrohan_balnazzar.cpp	(working copy)
@@ -159,7 +159,7 @@
             if (!Transformed)
             {
                 //CrusadersHammer
-                if (CrusadersHammer_Timer < diff && !m_creature->m_currentSpell)
+                if (CrusadersHammer_Timer < diff && !m_creature->m_currentSpells[CURRENT_GENERIC_SPELL])
                 {
                     //Cast
                     if (rand()%100 < 50) //50% chance to cast
@@ -171,7 +171,7 @@
                 }else CrusadersHammer_Timer -= diff;
 
                 //CrusaderStrike
-                if (CrusaderStrike_Timer < diff && !m_creature->m_currentSpell)
+                if (CrusaderStrike_Timer < diff && !m_creature->m_currentSpells[CURRENT_GENERIC_SPELL])
                 {
                     //Cast
                     if (rand()%100 < 50) //50% chance to cast
@@ -183,7 +183,7 @@
                 }else CrusaderStrike_Timer -= diff;
 
                 //MindBlast
-                if (MindBlast_Timer < diff && !m_creature->m_currentSpell)
+                if (MindBlast_Timer < diff && !m_creature->m_currentSpells[CURRENT_GENERIC_SPELL])
                 {
                     //Cast
                     if (rand()%100 < 50) //50% chance to cast
@@ -195,7 +195,7 @@
                 }else MindBlast_Timer -= diff;
 
                 //HolyStrike
-                if (HolyStrike_Timer < diff && !m_creature->m_currentSpell)
+                if (HolyStrike_Timer < diff && !m_creature->m_currentSpells[CURRENT_GENERIC_SPELL])
                 {
                     //Cast
                     if (rand()%100 < 50) //50% chance to cast
@@ -207,7 +207,7 @@
                 }else HolyStrike_Timer -= diff;
 
                 //Dazed
-                if (Dazed_Timer < diff && !m_creature->m_currentSpell)
+                if (Dazed_Timer < diff && !m_creature->m_currentSpells[CURRENT_GENERIC_SPELL])
                 {
                     //Cast
                     if (rand()%100 < 50) //50% chance to cast
@@ -232,7 +232,7 @@
             } else {
 
                 //ShadowShock
-                if (ShadowShock_Timer < diff && !m_creature->m_currentSpell)
+                if (ShadowShock_Timer < diff && !m_creature->m_currentSpells[CURRENT_GENERIC_SPELL])
                 {
                     //Cast
                     if (rand()%100 < 50) //50% chance to cast
@@ -244,7 +244,7 @@
                 }else ShadowShock_Timer -= diff;
 
                 //PsychicScream
-                if (PsychicScream_Timer < diff && !m_creature->m_currentSpell)
+                if (PsychicScream_Timer < diff && !m_creature->m_currentSpells[CURRENT_GENERIC_SPELL])
                 {
                     //Cast
                     if (rand()%100 < 50) //50% chance to cast
@@ -256,7 +256,7 @@
                 }else PsychicScream_Timer -= diff;
 
                 //DeepSleep
-                if (DeepSleep_Timer < diff && !m_creature->m_currentSpell)
+                if (DeepSleep_Timer < diff && !m_creature->m_currentSpells[CURRENT_GENERIC_SPELL])
                 {
                     //Cast
                     if (rand()%100 < 50) //50% chance to cast
@@ -268,7 +268,7 @@
                 }else DeepSleep_Timer -= diff;
 
                 //ShadowBoltVolley
-                if (ShadowBoltVolley_Timer < diff && !m_creature->m_currentSpell)
+                if (ShadowBoltVolley_Timer < diff && !m_creature->m_currentSpells[CURRENT_GENERIC_SPELL])
                 {
                     //Cast
                     if (rand()%100 < 50) //50% chance to cast
@@ -294,16 +294,7 @@
                 //END ELSE TRANSFORMED			
             }
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/stratholme/boss_fras_siabi.cpp
===================================================================
--- scripts/zone/stratholme/boss_fras_siabi.cpp	(revision 85)
+++ scripts/zone/stratholme/boss_fras_siabi.cpp	(working copy)
@@ -139,16 +139,7 @@
                 DemoralizingShout_Timer = 20000;
             }else DemoralizingShout_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/stratholme/boss_hearthsinger_forresten.cpp
===================================================================
--- scripts/zone/stratholme/boss_hearthsinger_forresten.cpp	(revision 85)
+++ scripts/zone/stratholme/boss_hearthsinger_forresten.cpp	(working copy)
@@ -108,16 +108,7 @@
                 Shoot_Timer = 3000;
             }else Shoot_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/stratholme/boss_magistrate_barthilas.cpp
===================================================================
--- scripts/zone/stratholme/boss_magistrate_barthilas.cpp	(revision 85)
+++ scripts/zone/stratholme/boss_magistrate_barthilas.cpp	(working copy)
@@ -130,16 +130,7 @@
                 Dazed_Timer = 20000;
             }else Dazed_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/stratholme/boss_maleki_the_pallid.cpp
===================================================================
--- scripts/zone/stratholme/boss_maleki_the_pallid.cpp	(revision 85)
+++ scripts/zone/stratholme/boss_maleki_the_pallid.cpp	(working copy)
@@ -135,16 +135,7 @@
                 DrainLife_Timer = 31000;
             }else DrainLife_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/stratholme/boss_malor_the_zealous.cpp
===================================================================
--- scripts/zone/stratholme/boss_malor_the_zealous.cpp	(revision 85)
+++ scripts/zone/stratholme/boss_malor_the_zealous.cpp	(working copy)
@@ -105,16 +105,7 @@
                 }
             }
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/stratholme/boss_nerubenkan.cpp
===================================================================
--- scripts/zone/stratholme/boss_nerubenkan.cpp	(revision 85)
+++ scripts/zone/stratholme/boss_nerubenkan.cpp	(working copy)
@@ -152,16 +152,7 @@
                 RaiseUndeadScarab_Timer = 16000;
             }else RaiseUndeadScarab_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/stratholme/boss_postmaster_malown.cpp
===================================================================
--- scripts/zone/stratholme/boss_postmaster_malown.cpp	(revision 85)
+++ scripts/zone/stratholme/boss_postmaster_malown.cpp	(working copy)
@@ -167,16 +167,7 @@
                 CallOfTheGrave_Timer = 25000;
             }else CallOfTheGrave_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/stratholme/boss_ramstein_the_gorger.cpp
===================================================================
--- scripts/zone/stratholme/boss_ramstein_the_gorger.cpp	(revision 85)
+++ scripts/zone/stratholme/boss_ramstein_the_gorger.cpp	(working copy)
@@ -108,16 +108,7 @@
                 Knockout_Timer = 10000;
             }else Knockout_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/stratholme/boss_skul.cpp
===================================================================
--- scripts/zone/stratholme/boss_skul.cpp	(revision 85)
+++ scripts/zone/stratholme/boss_skul.cpp	(working copy)
@@ -136,16 +136,7 @@
                 ArcaneBolt_Timer = 11000;
             }else ArcaneBolt_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/stratholme/boss_stonespine.cpp
===================================================================
--- scripts/zone/stratholme/boss_stonespine.cpp	(revision 85)
+++ scripts/zone/stratholme/boss_stonespine.cpp	(working copy)
@@ -121,16 +121,7 @@
                 DeafeningScreech_Timer = 18000;
             }else DeafeningScreech_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/stratholme/boss_the_unforgiven.cpp
===================================================================
--- scripts/zone/stratholme/boss_the_unforgiven.cpp	(revision 85)
+++ scripts/zone/stratholme/boss_the_unforgiven.cpp	(working copy)
@@ -108,16 +108,7 @@
                 Chilled_Timer = 14000;
             }else Chilled_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/stratholme/boss_timmy_the_cruel.cpp
===================================================================
--- scripts/zone/stratholme/boss_timmy_the_cruel.cpp	(revision 85)
+++ scripts/zone/stratholme/boss_timmy_the_cruel.cpp	(working copy)
@@ -101,16 +101,7 @@
                 RavenousClaw_Timer = 15000;
             }else RavenousClaw_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/stratholme/mob_bile_slime.cpp
===================================================================
--- scripts/zone/stratholme/mob_bile_slime.cpp	(revision 85)
+++ scripts/zone/stratholme/mob_bile_slime.cpp	(working copy)
@@ -122,16 +122,7 @@
                 SlowingPoison_Timer = 15000;
             }else SlowingPoison_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/stratholme/mob_bile_spewer.cpp
===================================================================
--- scripts/zone/stratholme/mob_bile_spewer.cpp	(revision 85)
+++ scripts/zone/stratholme/mob_bile_spewer.cpp	(working copy)
@@ -141,16 +141,7 @@
                 SpawnBileSlime_Timer = 15000;
             }else SpawnBileSlime_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/stratholme/mob_black_guard_sentry.cpp
===================================================================
--- scripts/zone/stratholme/mob_black_guard_sentry.cpp	(revision 85)
+++ scripts/zone/stratholme/mob_black_guard_sentry.cpp	(working copy)
@@ -124,16 +124,7 @@
                 Dazed_Timer = 19000;
             }else Dazed_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/stratholme/mob_broken_cadaver.cpp
===================================================================
--- scripts/zone/stratholme/mob_broken_cadaver.cpp	(revision 85)
+++ scripts/zone/stratholme/mob_broken_cadaver.cpp	(working copy)
@@ -104,16 +104,7 @@
                 DoCast(m_creature,SPELL_EXPLODINGCADAVER);
             }else ExplodingCadaver_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/stratholme/mob_crimson_battle_mage.cpp
===================================================================
--- scripts/zone/stratholme/mob_crimson_battle_mage.cpp	(revision 85)
+++ scripts/zone/stratholme/mob_crimson_battle_mage.cpp	(working copy)
@@ -118,16 +118,7 @@
                 Immolate_Timer = 23000;
             }else Immolate_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/stratholme/mob_crimson_conjuror.cpp
===================================================================
--- scripts/zone/stratholme/mob_crimson_conjuror.cpp	(revision 85)
+++ scripts/zone/stratholme/mob_crimson_conjuror.cpp	(working copy)
@@ -131,16 +131,7 @@
                 SummonWaterElemental_Timer = 70000;
             }else SummonWaterElemental_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/stratholme/mob_crimson_defender.cpp
===================================================================
--- scripts/zone/stratholme/mob_crimson_defender.cpp	(revision 85)
+++ scripts/zone/stratholme/mob_crimson_defender.cpp	(working copy)
@@ -125,16 +125,7 @@
                 BubbleBoy = true;
             }
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/stratholme/mob_crimson_gallant.cpp
===================================================================
--- scripts/zone/stratholme/mob_crimson_gallant.cpp	(revision 85)
+++ scripts/zone/stratholme/mob_crimson_gallant.cpp	(working copy)
@@ -118,16 +118,7 @@
                 CrusaderStrike_Timer = 8000;
             }else CrusaderStrike_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/stratholme/mob_crimson_guardsman.cpp
===================================================================
--- scripts/zone/stratholme/mob_crimson_guardsman.cpp	(revision 85)
+++ scripts/zone/stratholme/mob_crimson_guardsman.cpp	(working copy)
@@ -130,16 +130,7 @@
                 KnockAway_Timer = 19000;
             }else KnockAway_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/stratholme/mob_crimson_initiate.cpp
===================================================================
--- scripts/zone/stratholme/mob_crimson_initiate.cpp	(revision 85)
+++ scripts/zone/stratholme/mob_crimson_initiate.cpp	(working copy)
@@ -124,16 +124,7 @@
                 Renew_Timer = 12000;
             }else Renew_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/stratholme/mob_crimson_inquisitor.cpp
===================================================================
--- scripts/zone/stratholme/mob_crimson_inquisitor.cpp	(revision 85)
+++ scripts/zone/stratholme/mob_crimson_inquisitor.cpp	(working copy)
@@ -122,16 +122,7 @@
                 ManaBurn_Timer = 29000;
             }else ManaBurn_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/stratholme/mob_crimson_monk.cpp
===================================================================
--- scripts/zone/stratholme/mob_crimson_monk.cpp	(revision 85)
+++ scripts/zone/stratholme/mob_crimson_monk.cpp	(working copy)
@@ -100,16 +100,7 @@
                 SnapKick_Timer = 9000;
             }else SnapKick_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/stratholme/mob_crimson_priest.cpp
===================================================================
--- scripts/zone/stratholme/mob_crimson_priest.cpp	(revision 85)
+++ scripts/zone/stratholme/mob_crimson_priest.cpp	(working copy)
@@ -124,16 +124,7 @@
                 HolyLight_Timer = 15000;
             } else HolyLight_Timer-=diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/stratholme/mob_crimson_rifleman.cpp
===================================================================
--- scripts/zone/stratholme/mob_crimson_rifleman.cpp	(revision 85)
+++ scripts/zone/stratholme/mob_crimson_rifleman.cpp	(working copy)
@@ -94,7 +94,6 @@
                 //Lock our position
                 if (!Rooted)
                 {
-                    m_creature->m_canMove = false;
                     Rooted = true;
                 }
                 DoCast(m_creature->getVictim(),SPELL_SHOOT);
@@ -103,22 +102,12 @@
             else 
                 if (Rooted && !CanCast(m_creature->getVictim(),Shoot_S))
                 {
-                    m_creature->m_canMove = true;    
                     Rooted = false;
                 }
-                Shoot_Timer -= diff;
 
+            Shoot_Timer -= diff;
 
-                //If we are within range melee the target
-                if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-                {
-                    //Make sure our attack is ready and we arn't currently casting
-                    if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                    {
-                        m_creature->AttackerStateUpdate(m_creature->getVictim());
-                        m_creature->resetAttackTimer();
-                    }
-                }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/stratholme/mob_crimson_sorcerer.cpp
===================================================================
--- scripts/zone/stratholme/mob_crimson_sorcerer.cpp	(revision 85)
+++ scripts/zone/stratholme/mob_crimson_sorcerer.cpp	(working copy)
@@ -139,16 +139,7 @@
                 FireBlast_Timer = 19000;
             }else FireBlast_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/stratholme/mob_crypt_beast.cpp
===================================================================
--- scripts/zone/stratholme/mob_crypt_beast.cpp	(revision 85)
+++ scripts/zone/stratholme/mob_crypt_beast.cpp	(working copy)
@@ -132,16 +132,7 @@
                 DeafeningScreech_Timer = 32000;
             }else DeafeningScreech_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/stratholme/mob_crypt_crawler.cpp
===================================================================
--- scripts/zone/stratholme/mob_crypt_crawler.cpp	(revision 85)
+++ scripts/zone/stratholme/mob_crypt_crawler.cpp	(working copy)
@@ -120,16 +120,7 @@
                 DeafeningScreech_Timer = 32000;
             }else DeafeningScreech_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/stratholme/mob_eye_of_naxxramas.cpp
===================================================================
--- scripts/zone/stratholme/mob_eye_of_naxxramas.cpp	(revision 85)
+++ scripts/zone/stratholme/mob_eye_of_naxxramas.cpp	(working copy)
@@ -153,16 +153,7 @@
                 }
             }else SummonRockwingGargoyles_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/stratholme/mob_fleshflayer_ghoul.cpp
===================================================================
--- scripts/zone/stratholme/mob_fleshflayer_ghoul.cpp	(revision 85)
+++ scripts/zone/stratholme/mob_fleshflayer_ghoul.cpp	(working copy)
@@ -136,16 +136,7 @@
                 GhoulPlague_Timer = 11000;
             }else GhoulPlague_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/stratholme/mob_freed_soul.cpp
===================================================================
--- scripts/zone/stratholme/mob_freed_soul.cpp	(revision 85)
+++ scripts/zone/stratholme/mob_freed_soul.cpp	(working copy)
@@ -80,17 +80,7 @@
         //Check if we have a current target
         if( m_creature->getVictim() && m_creature->isAlive())
         {
-
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/stratholme/mob_ghostly_citizen.cpp
===================================================================
--- scripts/zone/stratholme/mob_ghostly_citizen.cpp	(revision 85)
+++ scripts/zone/stratholme/mob_ghostly_citizen.cpp	(working copy)
@@ -136,16 +136,7 @@
                 Dazed_Timer = 15000;
             }else Dazed_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/stratholme/mob_ghoul_ravener.cpp
===================================================================
--- scripts/zone/stratholme/mob_ghoul_ravener.cpp	(revision 85)
+++ scripts/zone/stratholme/mob_ghoul_ravener.cpp	(working copy)
@@ -152,16 +152,7 @@
                 GhoulPlague_Timer = 14000;
             }else GhoulPlague_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/stratholme/mob_mangled_cadaver.cpp
===================================================================
--- scripts/zone/stratholme/mob_mangled_cadaver.cpp	(revision 85)
+++ scripts/zone/stratholme/mob_mangled_cadaver.cpp	(working copy)
@@ -125,16 +125,7 @@
                 CadaverWorms_Timer = 21000;
             }else CadaverWorms_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/stratholme/mob_mindless_skeleton.cpp
===================================================================
--- scripts/zone/stratholme/mob_mindless_skeleton.cpp	(revision 85)
+++ scripts/zone/stratholme/mob_mindless_skeleton.cpp	(working copy)
@@ -94,16 +94,7 @@
                 Dazed_Timer = 10000;
             }else Dazed_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/stratholme/mob_patchwork_horror.cpp
===================================================================
--- scripts/zone/stratholme/mob_patchwork_horror.cpp	(revision 85)
+++ scripts/zone/stratholme/mob_patchwork_horror.cpp	(working copy)
@@ -138,16 +138,7 @@
                 WeakenedSoul_Timer = 18000;
             }else WeakenedSoul_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/stratholme/mob_plague_ghoul.cpp
===================================================================
--- scripts/zone/stratholme/mob_plague_ghoul.cpp	(revision 85)
+++ scripts/zone/stratholme/mob_plague_ghoul.cpp	(working copy)
@@ -156,16 +156,7 @@
                 GhoulPlague_Timer = 15000;
             }else GhoulPlague_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/stratholme/mob_ravaged_cadaver.cpp
===================================================================
--- scripts/zone/stratholme/mob_ravaged_cadaver.cpp	(revision 85)
+++ scripts/zone/stratholme/mob_ravaged_cadaver.cpp	(working copy)
@@ -173,16 +173,7 @@
                 SummonBrokenCadaver_Timer = 35000;
             }else SummonBrokenCadaver_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/stratholme/mob_restless_soul.cpp
===================================================================
--- scripts/zone/stratholme/mob_restless_soul.cpp	(revision 85)
+++ scripts/zone/stratholme/mob_restless_soul.cpp	(working copy)
@@ -105,18 +105,7 @@
         //Check if we have a current target
         if( m_creature->getVictim() && m_creature->isAlive())
         {
-
-
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/stratholme/mob_rockwing_gargoyle.cpp
===================================================================
--- scripts/zone/stratholme/mob_rockwing_gargoyle.cpp	(revision 85)
+++ scripts/zone/stratholme/mob_rockwing_gargoyle.cpp	(working copy)
@@ -139,16 +139,7 @@
                 DeafeningScreech_Timer = 21000;
             }else DeafeningScreech_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/stratholme/mob_rockwing_screecher.cpp
===================================================================
--- scripts/zone/stratholme/mob_rockwing_screecher.cpp	(revision 85)
+++ scripts/zone/stratholme/mob_rockwing_screecher.cpp	(working copy)
@@ -169,16 +169,7 @@
                 DemoralizingShout_Timer = 20000;
             }else DemoralizingShout_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/stratholme/mob_shrieking_banshee.cpp
===================================================================
--- scripts/zone/stratholme/mob_shrieking_banshee.cpp	(revision 85)
+++ scripts/zone/stratholme/mob_shrieking_banshee.cpp	(working copy)
@@ -120,16 +120,7 @@
                 DeafeningScreech_Timer = 23000;
             }else DeafeningScreech_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/stratholme/mob_skeletal_berserker.cpp
===================================================================
--- scripts/zone/stratholme/mob_skeletal_berserker.cpp	(revision 85)
+++ scripts/zone/stratholme/mob_skeletal_berserker.cpp	(working copy)
@@ -169,16 +169,7 @@
                 Hamstring_Timer = 23000;
             }else Hamstring_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/stratholme/mob_skeletal_guardian.cpp
===================================================================
--- scripts/zone/stratholme/mob_skeletal_guardian.cpp	(revision 85)
+++ scripts/zone/stratholme/mob_skeletal_guardian.cpp	(working copy)
@@ -148,16 +148,7 @@
                 ArcaneExplosion_Timer = 16000;
             }else ArcaneExplosion_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/stratholme/mob_spectral_citizen.cpp
===================================================================
--- scripts/zone/stratholme/mob_spectral_citizen.cpp	(revision 85)
+++ scripts/zone/stratholme/mob_spectral_citizen.cpp	(working copy)
@@ -151,16 +151,7 @@
                 DemoralizingShout_Timer = 20000;
             }else DemoralizingShout_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/stratholme/mob_spiteful_phantom.cpp
===================================================================
--- scripts/zone/stratholme/mob_spiteful_phantom.cpp	(revision 85)
+++ scripts/zone/stratholme/mob_spiteful_phantom.cpp	(working copy)
@@ -139,16 +139,7 @@
                 HauntingPhantoms_Timer = 24000;
             }else HauntingPhantoms_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/stratholme/mob_thuzadin_acolyte.cpp
===================================================================
--- scripts/zone/stratholme/mob_thuzadin_acolyte.cpp	(revision 85)
+++ scripts/zone/stratholme/mob_thuzadin_acolyte.cpp	(working copy)
@@ -94,16 +94,7 @@
                 Dazed_Timer = 17000;
             }else Dazed_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/stratholme/mob_thuzadin_necromancer.cpp
===================================================================
--- scripts/zone/stratholme/mob_thuzadin_necromancer.cpp	(revision 85)
+++ scripts/zone/stratholme/mob_thuzadin_necromancer.cpp	(working copy)
@@ -115,16 +115,7 @@
                 BoneArmor_Timer = 120000;
             }else BoneArmor_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/stratholme/mob_thuzadin_shadowcaster.cpp
===================================================================
--- scripts/zone/stratholme/mob_thuzadin_shadowcaster.cpp	(revision 85)
+++ scripts/zone/stratholme/mob_thuzadin_shadowcaster.cpp	(working copy)
@@ -121,16 +121,7 @@
                 PiercingShadow_Timer = 45000;
             }else PiercingShadow_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/stratholme/mob_undead_scarab.cpp
===================================================================
--- scripts/zone/stratholme/mob_undead_scarab.cpp	(revision 85)
+++ scripts/zone/stratholme/mob_undead_scarab.cpp	(working copy)
@@ -104,16 +104,7 @@
                 Dazed_Timer = 16000;
             }else Dazed_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/stratholme/mob_vengeful_phantom.cpp
===================================================================
--- scripts/zone/stratholme/mob_vengeful_phantom.cpp	(revision 85)
+++ scripts/zone/stratholme/mob_vengeful_phantom.cpp	(working copy)
@@ -124,16 +124,7 @@
                 FrostShock_Timer = 15000;
             }else FrostShock_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/stratholme/mob_venom_belcher.cpp
===================================================================
--- scripts/zone/stratholme/mob_venom_belcher.cpp	(revision 85)
+++ scripts/zone/stratholme/mob_venom_belcher.cpp	(working copy)
@@ -122,16 +122,7 @@
                 SlowingPoison_Timer = 35000;
             }else SlowingPoison_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/stratholme/mob_wailing_banshee.cpp
===================================================================
--- scripts/zone/stratholme/mob_wailing_banshee.cpp	(revision 85)
+++ scripts/zone/stratholme/mob_wailing_banshee.cpp	(working copy)
@@ -151,16 +151,7 @@
                 SoulTap_Timer = 19000;
             }else SoulTap_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/stratholme/mob_wrath_phantom.cpp
===================================================================
--- scripts/zone/stratholme/mob_wrath_phantom.cpp	(revision 85)
+++ scripts/zone/stratholme/mob_wrath_phantom.cpp	(working copy)
@@ -124,16 +124,7 @@
                 HauntingPhantoms_Timer = 13000;
             }else HauntingPhantoms_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 }; 
Index: scripts/zone/temple_of_ahnqiraj/boss_cthun.cpp
===================================================================
--- scripts/zone/temple_of_ahnqiraj/boss_cthun.cpp	(revision 85)
+++ scripts/zone/temple_of_ahnqiraj/boss_cthun.cpp	(working copy)
@@ -192,7 +192,7 @@
                     target = SelectUnit(SELECT_TARGET_RANDOM,0);
                     if (target)
                     {
-                        m_creature->InterruptSpell();
+                        m_creature->InterruptSpell(CURRENT_GENERIC_SPELL);
                         DoCast(target,SPELL_GREEN_BEAM);
                         //Correctly update our target
                         m_creature->SetUInt64Value(UNIT_FIELD_TARGET, target->GetGUID());
@@ -249,7 +249,7 @@
                     //Switch to Dark Beam
                     Phase = 1;
 
-                    m_creature->InterruptSpell();
+                    m_creature->InterruptSpell(CURRENT_GENERIC_SPELL);
 
                     //Select random target for dark beam to start on
                     Unit* target = NULL;
@@ -294,7 +294,7 @@
                     EyeTentacleTimer = 45000;   //Always spawns 5 seconds before Dark Beam
                     ClawTentacleTimer = 12500;  //4 per Eye beam phase (unsure if they spawn durring Dark beam)
 
-                    m_creature->InterruptSpell();
+                    m_creature->InterruptSpell(CURRENT_GENERIC_SPELL);
 
                     //Remove Red coloration from c'thun
                     m_creature->RemoveAurasDueToSpell(SPELL_RED_COLORATION);
@@ -446,16 +446,7 @@
                 HamstringTimer = 5000;
             }else HamstringTimer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 };
Index: scripts/zone/temple_of_ahnqiraj/boss_huhuran.cpp
===================================================================
--- scripts/zone/temple_of_ahnqiraj/boss_huhuran.cpp	(revision 85)
+++ scripts/zone/temple_of_ahnqiraj/boss_huhuran.cpp	(working copy)
@@ -124,21 +124,12 @@
                 phase = 2;
             }else Poison_Timer -= diff;
 
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
 
             if ( (phase == 2 || phase == 1) && (m_creature->GetHealth()*100) / m_creature->GetMaxHealth() < 30)
             {
                 phase = 3;
-                m_creature->InterruptSpell();
+                m_creature->InterruptSpell(CURRENT_GENERIC_SPELL);
                 DoTextEmote("is going berserk", NULL);
                 DoCast(m_creature, SPELL_BERSERK);
             }
Index: scripts/zone/temple_of_ahnqiraj/boss_sartura.cpp
===================================================================
--- scripts/zone/temple_of_ahnqiraj/boss_sartura.cpp	(revision 85)
+++ scripts/zone/temple_of_ahnqiraj/boss_sartura.cpp	(working copy)
@@ -83,7 +83,7 @@
             }
 
             //If he is 20% enrage
-            if (m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 20 && !m_creature->m_currentSpell)
+            if (m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 20 && !m_creature->m_currentSpells[CURRENT_GENERIC_SPELL])
             {
                 DoCast(m_creature->getVictim(),SPELL_ENRAGE);     
             }
@@ -97,17 +97,7 @@
                 WHIRLWIND_Timer = 30000;
             }else WHIRLWIND_Timer -= diff;
 
-
-            //If we are within range melee the target
-            if( m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
-            {
-                //Make sure our attack is ready and we arn't currently casting
-                if( m_creature->isAttackReady() && !m_creature->m_currentSpell)
-                {
-                    m_creature->AttackerStateUpdate(m_creature->getVictim());
-                    m_creature->resetAttackTimer();
-                }
-            }
+            DoMeleeAttackIfReady();
         }
     }
 };