Index: /trunk/src/game/Unit.h
===================================================================
--- /trunk/src/game/Unit.h (revision 186)
+++ /trunk/src/game/Unit.h (revision 203)
@@ -943,4 +943,5 @@
         void DeMorph();
 
+        void SendAttackStart(Unit* pVictim); 
         void SendAttackStateUpdate(uint32 HitInfo, Unit *target, uint8 SwingType, SpellSchoolMask damageSchoolMask, uint32 Damage, uint32 AbsorbDamage, uint32 Resist, VictimState TargetState, uint32 BlockedAmount);
         void SendSpellNonMeleeDamageLog(Unit *target,uint32 SpellID,uint32 Damage, SpellSchoolMask damageSchoolMask,uint32 AbsorbedDamage, uint32 Resist,bool PhysicalDamage, uint32 Blocked, bool CriticalHit = false);
@@ -1353,5 +1354,5 @@
     private:
         void SendAttackStop(Unit* victim);                  // only from AttackStop(Unit*)
-        void SendAttackStart(Unit* pVictim);                // only from Unit::AttackStart(Unit*)
+        //void SendAttackStart(Unit* pVictim);                // only from Unit::AttackStart(Unit*)
 
         void ProcDamageAndSpellFor( bool isVictim, Unit * pTarget, uint32 procFlag, AuraTypeSet const& procAuraTypes, WeaponAttackType attType, SpellEntry const * procSpell, uint32 damage, SpellSchoolMask damageSchoolMask );
Index: /trunk/src/game/Object.cpp
===================================================================
--- /trunk/src/game/Object.cpp (revision 178)
+++ /trunk/src/game/Object.cpp (revision 203)
@@ -602,7 +602,17 @@
                     {
                         if(target->isGameMaster())
-                            *data << cinfo->Modelid1;
+                        {
+                            if(cinfo->Modelid2)
+                                *data << cinfo->Modelid1;
+                            else
+                                *data << 17519; // world invisible trigger's model
+                        }
                         else
-                            *data << cinfo->Modelid3;
+                        {
+                            if(cinfo->Modelid2)
+                                *data << cinfo->Modelid2;
+                            else
+                                *data << 11686; // world invisible trigger's model
+                        }
                     }
                     else
Index: /trunk/src/game/GameObject.cpp
===================================================================
--- /trunk/src/game/GameObject.cpp (revision 146)
+++ /trunk/src/game/GameObject.cpp (revision 203)
@@ -1283,3 +1283,5 @@
         trigger->CastSpell(target, spell, true);
     }
-}
+    //trigger->setDeathState(JUST_DIED);
+    //trigger->RemoveCorpse();
+}
Index: /trunk/src/game/Player.cpp
===================================================================
--- /trunk/src/game/Player.cpp (revision 200)
+++ /trunk/src/game/Player.cpp (revision 203)
@@ -16407,5 +16407,14 @@
             // send data at target visibility change (adding to client)
             if((*i)!=this && (*i)->isType(TYPEMASK_UNIT))
+            {
                 SendAuraDurationsForTarget(*i);
+                //if(((Unit*)(*i))->isAlive()) //should be always alive
+                {
+                    if((*i)->GetTypeId()==TYPEID_UNIT)
+                        ((Creature*)(*i))->SendMonsterMoveWithSpeedToCurrentDestination(this);
+                    if(((Unit*)(*i))->getVictim())
+                        ((Unit*)(*i))->SendAttackStart(((Unit*)(*i))->getVictim());
+                }
+            }
 
             i = stealthedUnits.erase(i);
@@ -17387,8 +17396,14 @@
             // send data at target visibility change (adding to client)
             if(target!=this && target->isType(TYPEMASK_UNIT))
+            {
                 SendAuraDurationsForTarget((Unit*)target);
-
-            if(target->GetTypeId()==TYPEID_UNIT && ((Creature*)target)->isAlive())
-                ((Creature*)target)->SendMonsterMoveWithSpeedToCurrentDestination(this);
+                if(((Unit*)target)->isAlive())
+                {
+                    if(target->GetTypeId()==TYPEID_UNIT)
+                        ((Creature*)target)->SendMonsterMoveWithSpeedToCurrentDestination(this);
+                    if(((Unit*)target)->getVictim())
+                        ((Unit*)target)->SendAttackStart(((Unit*)target)->getVictim());
+                }
+            }
         }
     }
Index: /trunk/src/game/Spell.cpp
===================================================================
--- /trunk/src/game/Spell.cpp (revision 197)
+++ /trunk/src/game/Spell.cpp (revision 203)
@@ -1013,5 +1013,5 @@
             // for delayed spells ignore negative spells (after duel end) for friendly targets
             // TODO: this cause soul transfer bugged
-            if(m_spellInfo->speed > 0.0f && !IsPositiveSpell(m_spellInfo->Id))
+            if(m_spellInfo->speed > 0.0f && unit->GetTypeId() == TYPEID_PLAYER && !IsPositiveSpell(m_spellInfo->Id))
             {
                 m_caster->SendSpellMiss(unit, m_spellInfo->Id, SPELL_MISS_EVADE);
Index: /trunk/src/bindings/scripts/include/sc_creature.cpp
===================================================================
--- /trunk/src/bindings/scripts/include/sc_creature.cpp (revision 186)
+++ /trunk/src/bindings/scripts/include/sc_creature.cpp (revision 203)
@@ -201,4 +201,13 @@
             m_creature->AttackerStateUpdate(m_creature->getVictim());
             m_creature->resetAttackTimer();
+        }
+    }
+    if (m_creature->haveOffhandWeapon() && m_creature->isAttackReady(OFF_ATTACK) && !m_creature->IsNonMeleeSpellCasted(false))
+    {
+        //If we are within range melee the target
+        if (m_creature->IsWithinCombatDist(m_creature->getVictim(), ATTACK_DISTANCE))
+        {
+            m_creature->AttackerStateUpdate(m_creature->getVictim(), OFF_ATTACK);
+            m_creature->resetAttackTimer(OFF_ATTACK);
         }
     }
Index: /trunk/src/bindings/scripts/include/sc_creature.h
===================================================================
--- /trunk/src/bindings/scripts/include/sc_creature.h (revision 202)
+++ /trunk/src/bindings/scripts/include/sc_creature.h (revision 203)
@@ -182,3 +182,19 @@
     void AttackStart(Unit *);
 };
+
+struct TRINITY_DLL_DECL NullCreatureAI : public CreatureAI
+{
+    NullCreatureAI(Creature* c) : m_creature(c) {}
+    ~NullCreatureAI() {}
+
+    Creature *m_creature;
+
+    void MoveInLineOfSight(Unit *) {}
+    void AttackStart(Unit *) {}
+    void EnterEvadeMode() {}
+    bool IsVisible(Unit *) const { return false; }
+
+    void UpdateAI(const uint32) {}
+};
+
 #endif
Index: /trunk/src/bindings/scripts/scripts/zone/hellfire_citadel/magtheridons_lair/boss_magtheridon.cpp
===================================================================
--- /trunk/src/bindings/scripts/scripts/zone/hellfire_citadel/magtheridons_lair/boss_magtheridon.cpp (revision 166)
+++ /trunk/src/bindings/scripts/scripts/zone/hellfire_citadel/magtheridons_lair/boss_magtheridon.cpp (revision 203)
@@ -228,4 +228,5 @@
         m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
         m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+        m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNKNOWN2);
         m_creature->addUnitState(UNIT_STAT_STUNNED);
         m_creature->CastSpell(m_creature, SPELL_SHADOW_CAGE_C, true);
Index: /trunk/src/bindings/scripts/scripts/zone/black_temple/boss_illidan.cpp
===================================================================
--- /trunk/src/bindings/scripts/scripts/zone/black_temple/boss_illidan.cpp (revision 186)
+++ /trunk/src/bindings/scripts/scripts/zone/black_temple/boss_illidan.cpp (revision 203)
@@ -72,4 +72,5 @@
 #define SPELL_DRAW_SOUL                 40904 // 5k Shadow Damage in front of him. Heals Illidan for 100k health (script effect)
 #define SPELL_PARASITIC_SHADOWFIEND     41917 // DoT of 3k Shadow every 2 seconds. Lasts 10 seconds. (Script effect: Summon 2 parasites once the debuff has ticked off)
+#define SPELL_PARASITIC_SHADOWFIEND2    41914 // Used by Parasitic
 #define SPELL_SUMMON_PARASITICS         41915 // Summons 2 Parasitic Shadowfiends on the target. It's supposed to be cast as soon as the Parasitic Shadowfiend debuff is gone, but the spells aren't linked :(
 #define SPELL_AGONIZING_FLAMES          40932 // 4k fire damage initial to target and anyone w/i 5 yards. PHASE 3 ONLY
@@ -554,5 +555,5 @@
                 {
                     GlaiveGUID[i] = Glaive->GetGUID();
-                    Glaive->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+                    Glaive->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
                     Glaive->SetUInt32Value(UNIT_FIELD_DISPLAYID, 11686);
                     Glaive->setFaction(m_creature->getFaction());
@@ -571,5 +572,5 @@
                 {
                     GlaiveGUID[i] = Glaive->GetGUID();
-                    Glaive->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+                    Glaive->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
                     Glaive->SetUInt32Value(UNIT_FIELD_DISPLAYID, 11686);
                     Glaive->setFaction(m_creature->getFaction());
@@ -1338,4 +1339,5 @@
                         Elite->AddThreat(m_creature, 1000000.0f);
                         AttackStart(Elite);
+                        m_creature->AddThreat(Elite, 1000000.0f);
                     }
                     Timer = 10000 + rand()%6000;
@@ -1350,5 +1352,5 @@
         }
 
-        if(!m_creature->SelectHostilTarget() || !m_creature->getVictim())
+        if(!m_creature->SelectHostilTarget() && !m_creature->getVictim())
             return;
 
@@ -1742,7 +1744,7 @@
         if( m_creature->isAttackReady() && m_creature->IsWithinCombatDist(m_creature->getVictim(), ATTACK_DISTANCE))
         {
-            if(!m_creature->getVictim()->HasAura(SPELL_PARASITIC_SHADOWFIEND, 0))
-            {
-                m_creature->getVictim()->CastSpell(m_creature->getVictim(), SPELL_PARASITIC_SHADOWFIEND, true, 0, 0, IllidanGUID); //do not stack
+            if(!m_creature->getVictim()->HasAura(SPELL_PARASITIC_SHADOWFIEND, 0) && !m_creature->getVictim()->HasAura(SPELL_PARASITIC_SHADOWFIEND2, 0))
+            {
+                m_creature->CastSpell(m_creature->getVictim(), SPELL_PARASITIC_SHADOWFIEND2, true, 0, 0, IllidanGUID); //do not stack
             }
             m_creature->AttackerStateUpdate(m_creature->getVictim());
@@ -1913,4 +1915,5 @@
 
     m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID, 21135);
+    m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNKNOWN2);
     m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
     m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
@@ -1927,4 +1930,5 @@
     switch(summon->GetEntry())
     {
+    case PARASITIC_SHADOWFIEND:
     case SHADOW_DEMON:
         {
@@ -2159,5 +2163,5 @@
             m_creature->RemoveAllAuras();
             m_creature->InterruptNonMeleeSpells(false);
-            m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE + UNIT_FLAG_NOT_SELECTABLE);
+            m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
             m_creature->GetMotionMaster()->Clear(false);
             m_creature->AttackStop();
Index: /trunk/src/bindings/scripts/scripts/zone/black_temple/boss_supremus.cpp
===================================================================
--- /trunk/src/bindings/scripts/scripts/zone/black_temple/boss_supremus.cpp (revision 160)
+++ /trunk/src/bindings/scripts/scripts/zone/black_temple/boss_supremus.cpp (revision 203)
@@ -28,5 +28,5 @@
 #define SPELL_MOLTEN_PUNCH          40126
 #define SPELL_HURTFUL_STRIKE        41926
-#define SPELL_MOLTEN_FLAME          40253
+#define SPELL_MOLTEN_FLAME          40980
 #define SPELL_VOLCANIC_ERUPTION     40117
 #define SPELL_VOLCANIC_SUMMON       40276
@@ -36,45 +36,12 @@
 #define CREATURE_STALKER            23095
 
-struct TRINITY_DLL_DECL molten_flameAI : public ScriptedAI
-{
-    molten_flameAI(Creature *c) : ScriptedAI(c)
-    {
-        FlameTimer = 0;
+struct TRINITY_DLL_DECL molten_flameAI : public NullCreatureAI
+{
+    molten_flameAI(Creature *c) : NullCreatureAI(c)
+    {
         float x, y, z;
-        m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
         m_creature->GetNearPoint(m_creature, x, y, z, 1, 50, M_PI*2*rand_norm());
         m_creature->GetMotionMaster()->MovePoint(0, x, y, z);
     }
-
-    uint32 FlameTimer;
-
-    void Reset() {}
-    void Aggro(Unit *who) {}
-    void AttackStart(Unit* who) {}
-    void MoveInLineOfSight(Unit *who) {}
-    void UpdateAI(const uint32 diff)
-    {
-        if(FlameTimer < diff)
-        {
-            m_creature->CastSpell(m_creature, SPELL_MOLTEN_FLAME, true);
-            FlameTimer = 1000;
-        }else FlameTimer -= diff;
-    }
-};
-
-struct TRINITY_DLL_DECL npc_volcanoAI : public ScriptedAI
-{
-    npc_volcanoAI(Creature *c) : ScriptedAI(c)
-    {
-        m_creature->CastSpell(m_creature, SPELL_VOLCANIC_ERUPTION, false);
-        m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
-        m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
-    }
-
-    void Reset() {}
-    void Aggro(Unit *who) {}
-    void AttackStart(Unit* who) {}
-    void MoveInLineOfSight(Unit* who) {}
-    void UpdateAI(const uint32 diff) {}
 };
 
@@ -264,9 +231,4 @@
 }
 
-CreatureAI* GetAI_npc_volcano(Creature *_Creature)
-{
-    return new npc_volcanoAI (_Creature);
-}
-
 void AddSC_boss_supremus()
 {
@@ -281,8 +243,3 @@
     newscript->GetAI = GetAI_molten_flame;
     m_scripts[nrscripts++] = newscript;
-
-    newscript = new Script;
-    newscript->Name="npc_volcano";
-    newscript->GetAI = GetAI_npc_volcano;
-    m_scripts[nrscripts++] = newscript;
 }
Index: /trunk/sql/updates/211_world_blacktemple.sql
===================================================================
--- /trunk/sql/updates/211_world_blacktemple.sql (revision 203)
+++ /trunk/sql/updates/211_world_blacktemple.sql (revision 203)
@@ -0,0 +1,24 @@
+DELETE FROM spell_linked_spell WHERE `spell_trigger` IN (39992, 39835, 42052, -41914, -41917, 41126, -41376);
+-- INSERT INTO spell_linked_spell (`spell_trigger`, `spell_effect`, `type`, `comment`) VALUES (39992, 39835, 1, 'Needle Spine');
+INSERT INTO spell_linked_spell (`spell_trigger`, `spell_effect`, `type`, `comment`) VALUES (39835, 39968, 1, 'Needle Spine');
+INSERT INTO spell_linked_spell (`spell_trigger`, `spell_effect`, `type`, `comment`) VALUES (-41376, 41377, 0, 'Spite');
+INSERT INTO spell_linked_spell (`spell_trigger`, `spell_effect`, `type`, `comment`) VALUES (41126, 41131, 1, 'Flame Crash');
+INSERT INTO spell_linked_spell (`spell_trigger`, `spell_effect`, `type`, `comment`) VALUES (-41914, 41915, 0, 'Summon Parasitic Shadowfiend');
+INSERT INTO spell_linked_spell (`spell_trigger`, `spell_effect`, `type`, `comment`) VALUES (-41917, 41915, 0, 'Summon Parasitic Shadowfiend');
+INSERT INTO spell_linked_spell (`spell_trigger`, `spell_effect`, `type`, `comment`) VALUES (39908, 40017, 1, 'Eye Blast');
+
+
+-- molten_flame
+UPDATE creature_template SET spell1 = 40980, flags_extra = 128, speed = 1.0, scriptname = 'molten_flame' WHERE entry = 23095;
+-- volcano
+UPDATE creature_template SET spell1 = 40117, flags_extra = 128, scriptname = '' WHERE entry = 23085;
+-- flame crash
+update creature_template set spell1 = 40836, flags_extra = 128, scriptname = '' where entry = 23336;
+-- blaze
+update creature_template set spell1 = 40610, flags_extra = 128, scriptname = '' where entry = 23259;
+-- glaive
+update creature_template set scriptname = 'mob_blade_of_azzinoth' where entry = 22996;
+-- parasitic shadowfiend
+update creature_template set scriptname = 'mob_parasitic_shadowfiend' where entry = 23498;
+-- Maiev
+update creature_template set minlevel = 73, maxlevel = 73, minhealth = 500000, maxhealth = 500000, mindmg = 3000, maxdmg = 4000 where entry = 23197;
Index: /unk/sql/updates/194_world_blacktemple.sql
===================================================================
--- /trunk/sql/updates/194_world_blacktemple.sql (revision 201)
+++  (revision )
@@ -1,19 +1,0 @@
-DELETE FROM spell_linked_spell WHERE `spell_trigger` IN (39992, 39835, 42052, -41914, 41126, -41376);
--- INSERT INTO spell_linked_spell (`spell_trigger`, `spell_effect`, `type`, `comment`) VALUES (39992, 39835, 1, 'Needle Spine');
-INSERT INTO spell_linked_spell (`spell_trigger`, `spell_effect`, `type`, `comment`) VALUES (39835, 39968, 1, 'Needle Spine');
-INSERT INTO spell_linked_spell (`spell_trigger`, `spell_effect`, `type`, `comment`) VALUES (-41376, 41377, 0, 'Spite');
-INSERT INTO spell_linked_spell (`spell_trigger`, `spell_effect`, `type`, `comment`) VALUES (41126, 41131, 1, 'Flame Crash');
-INSERT INTO spell_linked_spell (`spell_trigger`, `spell_effect`, `type`, `comment`) VALUES (-41914, 41915, 0, 'Summon Parasitic Shadowfiend');
-INSERT INTO spell_linked_spell (`spell_trigger`, `spell_effect`, `type`, `comment`) VALUES (39908, 40017, 1, 'Eye Blast');
-
-
--- molten_flame
-UPDATE creature_template SET flags_extra = 128, speed = 1.0 WHERE entry = 23095;
--- volcano
-UPDATE creature_template SET spell1 = 40117, flags_extra = 128, scriptname = '' WHERE entry = 23085;
--- flame crash
-update creature_template set spell1 = 40836, flags_extra = 128, scriptname = '' where entry = 23336;
--- blaze
-update creature_template set spell1 = 40610, flags_extra = 128, scriptname = '' where entry = 23259;
--- glaive
-update creature_template set scriptname = 'mob_blade_of_azzinoth' where entry = 22996;
