Index: trunk/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_kaelthas.cpp
===================================================================
--- trunk/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_kaelthas.cpp (revision 109)
+++ trunk/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_kaelthas.cpp (revision 204)
@@ -386,5 +386,5 @@
 
         if(pInstance)
-            pInstance->SetData(DATA_KAELTHASEVENT, 0);
+            pInstance->SetData(DATA_KAELTHASEVENT, NOT_STARTED);
     }
 
@@ -442,5 +442,5 @@
             DoPlaySoundToSet(m_creature, SOUND_INTRO);
 
-            pInstance->SetData(DATA_KAELTHASEVENT, 1);
+            pInstance->SetData(DATA_KAELTHASEVENT, IN_PROGRESS);
             m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
 
@@ -475,5 +475,5 @@
 
         if(pInstance)
-            pInstance->SetData(DATA_KAELTHASEVENT, 0);
+            pInstance->SetData(DATA_KAELTHASEVENT, DONE);
 
         Creature *pCreature;
Index: trunk/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_astromancer.cpp
===================================================================
--- trunk/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_astromancer.cpp (revision 90)
+++ trunk/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_astromancer.cpp (revision 204)
@@ -174,5 +174,5 @@
 
         if(pInstance)
-            pInstance->SetData(DATA_HIGHASTROMANCERSOLARIANEVENT, NOT_STARTED);
+            pInstance->SetData(DATA_HIGHASTROMANCERSOLARIANEVENT, DONE);
     }
 
Index: trunk/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/def_the_eye.h
===================================================================
--- trunk/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/def_the_eye.h (revision 90)
+++ trunk/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/def_the_eye.h (revision 204)
@@ -10,12 +10,10 @@
 #define DATA_GRANDASTROMANCERCAPERNIAN      3
 #define DATA_HIGHASTROMANCERSOLARIANEVENT   4
-#define DATA_FATHOMLORDKARATHRESSEVENT      5
-#define DATA_KAELTHAS                       6
-#define DATA_KAELTHASEVENT                  7
-#define DATA_LORDSANGUINAR                  8
-#define DATA_MASTERENGINEERTELONICUS        9
-#define DATA_SOLARIANEVENT                  10
-#define DATA_THALADREDTHEDARKENER           11
-#define DATA_VOIDREAVEREVENT                12
-#define DATA_ALAR 13
+#define DATA_KAELTHAS                       5
+#define DATA_KAELTHASEVENT                  6
+#define DATA_LORDSANGUINAR                  7
+#define DATA_MASTERENGINEERTELONICUS        8
+#define DATA_THALADREDTHEDARKENER           10
+#define DATA_VOIDREAVEREVENT                11
+#define DATA_ALAR							12
 #endif
Index: trunk/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/instance_the_eye.cpp
===================================================================
--- trunk/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/instance_the_eye.cpp (revision 90)
+++ trunk/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/instance_the_eye.cpp (revision 204)
@@ -86,8 +86,5 @@
             case 19622: Kaelthas = creature->GetGUID(); break;
             case 18805: Astromancer = creature->GetGUID(); break;
-
-            case 19514:
-                Alar = creature->GetGUID();
-                break;
+            case 19514:	Alar = creature->GetGUID(); break;
         }
     }
@@ -97,26 +94,12 @@
         switch(identifier)
         {
-            case DATA_THALADREDTHEDARKENER:
-                return ThaladredTheDarkener;
-
-            case DATA_LORDSANGUINAR:
-                return LordSanguinar;
-
-            case DATA_GRANDASTROMANCERCAPERNIAN:
-                return GrandAstromancerCapernian;
-
-            case DATA_MASTERENGINEERTELONICUS:
-                return MasterEngineerTelonicus;
-
-            case DATA_KAELTHAS:
-                return Kaelthas;
-
-            case DATA_ASTROMANCER:
-                return Astromancer;
-
-            case DATA_ALAR:
-                return Alar;
+            case DATA_THALADREDTHEDARKENER:			return ThaladredTheDarkener;
+            case DATA_LORDSANGUINAR:				return LordSanguinar;
+            case DATA_GRANDASTROMANCERCAPERNIAN:	return GrandAstromancerCapernian;
+            case DATA_MASTERENGINEERTELONICUS:		return MasterEngineerTelonicus;
+            case DATA_KAELTHAS:						return Kaelthas;
+            case DATA_ASTROMANCER:					return Astromancer;
+            case DATA_ALAR:							return Alar;
         }
-
         return 0;
     }
@@ -126,27 +109,11 @@
         switch(type)
         {
-            case DATA_ALAREVENT:
-                AlarEventPhase = data;
-                Encounters[0] = (data) ? true : false;
-                break;
-
-            case DATA_SOLARIANEVENT:
-                Encounters[1] = (data) ? true : false;
-                break;
-
-            case DATA_VOIDREAVEREVENT:
-                Encounters[2] = (data) ? true : false;
-                break;
-
-                //Kael'thas
-            case DATA_KAELTHASEVENT:
-                KaelthasEventPhase = data;
-                Encounters[3] = (data) ? true : false;
-                break;
-
-            case DATA_HIGHASTROMANCERSOLARIANEVENT:
-                Encounters[4] = (data) ? true : false;
-                break;
+            case DATA_ALAREVENT:	AlarEventPhase = data;	Encounters[0] = data;			break;
+            case DATA_HIGHASTROMANCERSOLARIANEVENT:	Encounters[1] = data;					break;
+            case DATA_VOIDREAVEREVENT:	Encounters[2] = data;								break; 
+            case DATA_KAELTHASEVENT:	KaelthasEventPhase = data;	Encounters[3] = data;	break;
         }
+		if(data == DONE)
+			SaveToDB();
     }
 
@@ -155,22 +122,41 @@
         switch(type)
         {
-            case DATA_ALAREVENT:
-                return AlarEventPhase;
+            case DATA_ALAREVENT:	return AlarEventPhase;
+            case DATA_HIGHASTROMANCERSOLARIANEVENT:	return Encounters[1];
+            case DATA_VOIDREAVEREVENT:	return Encounters[2];
+            case DATA_KAELTHASEVENT:	return KaelthasEventPhase;
+        }
+        return 0;
+    }
 
-            case DATA_SOLARIANEVENT:
-                return Encounters[1];
+	const char* Save()
+	{
+		OUT_SAVE_INST_DATA;
+        std::ostringstream stream;
+        stream << Encounters[0] << " " << Encounters[1] << " " << Encounters[2] << " " << Encounters[3];
+        char* out = new char[stream.str().length() + 1];
+        strcpy(out, stream.str().c_str());
+        if(out)
+        {
+            OUT_SAVE_INST_DATA_COMPLETE;
+            return out;
+        }
+        return NULL;
+    }
 
-            case DATA_VOIDREAVEREVENT:
-                return Encounters[2];
-
-            case DATA_HIGHASTROMANCERSOLARIANEVENT:
-                return Encounters[4];
-
-                //Kael'thas
-            case DATA_KAELTHASEVENT:
-                return KaelthasEventPhase;
+    void Load(const char* in)
+    {
+        if(!in)
+        {
+            OUT_LOAD_INST_DATA_FAIL;
+            return;
         }
-
-        return 0;
+        OUT_LOAD_INST_DATA(in);
+        std::istringstream stream(in);
+        stream >> Encounters[0] >> Encounters[1] >> Encounters[2] >> Encounters[3];
+		for(uint8 i = 0; i < ENCOUNTERS; ++i)
+			if(Encounters[i] == IN_PROGRESS)                // Do not load an encounter as "In Progress" - reset it instead.
+				Encounters[i] = NOT_STARTED;
+		OUT_LOAD_INST_DATA_COMPLETE;
     }
 };
Index: trunk/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_void_reaver.cpp
===================================================================
--- trunk/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_void_reaver.cpp (revision 117)
+++ trunk/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_void_reaver.cpp (revision 204)
@@ -100,5 +100,5 @@
 
         if(pInstance)
-            pInstance->SetData(DATA_VOIDREAVEREVENT, NOT_STARTED);
+            pInstance->SetData(DATA_VOIDREAVEREVENT, DONE);
     }
 
Index: trunk/src/bindings/scripts/scripts/zone/moonglade/moonglade.cpp
===================================================================
--- trunk/src/bindings/scripts/scripts/zone/moonglade/moonglade.cpp (revision 90)
+++ trunk/src/bindings/scripts/scripts/zone/moonglade/moonglade.cpp (revision 204)
@@ -18,5 +18,5 @@
 SDName: Moonglade
 SD%Complete: 100
-SDComment: Quest support: 30, 272, 5929, 5930. Special Flight Paths for Druid class.
+SDComment: Quest support: 30, 272, 5929, 5930, 10965. Special Flight Paths for Druid class.
 SDCategory: Moonglade
 EndScriptData */
@@ -26,7 +26,10 @@
 npc_great_bear_spirit
 npc_silva_filnaveth
+npc_clintar_spirit
+npc_clintar_dreamwalker
 EndContentData */
 
 #include "precompiled.h"
+#include "../../npc/npc_escortAI.h"
 
 /*######
@@ -191,6 +194,347 @@
 
 /*######
-##
+## npc_clintar_spirit
 ######*/
+
+float Clintar_spirit_WP[41][5] = 
+{
+ //pos_x   pos_y    pos_z    orien waitTime
+{7465.28, -3115.46, 439.327, 0.83, 4000},
+{7476.49, -3101,    443.457, 0.89, 0},
+{7486.57, -3085.59, 439.478, 1.07, 0},
+{7472.19, -3085.06, 443.142, 3.07, 0},
+{7456.92, -3085.91, 438.862, 3.24, 0},
+{7446.68, -3083.43, 438.245, 2.40, 0},
+{7446.17, -3080.21, 439.826, 1.10, 6000},
+{7452.41, -3085.8,  438.984, 5.78, 0},
+{7469.11, -3084.94, 443.048, 6.25, 0},
+{7483.79, -3085.44, 439.607, 6.25, 0},
+{7491.14, -3090.96, 439.983, 5.44, 0},
+{7497.62, -3098.22, 436.854, 5.44, 0},
+{7498.72, -3113.41, 434.596, 4.84, 0},
+{7500.06, -3122.51, 434.749, 5.17, 0},
+{7504.96, -3131.53, 434.475, 4.74, 0},
+{7504.31, -3133.53, 435.693, 3.84, 6000},
+{7504.55, -3133.27, 435.476, 0.68, 15000},
+{7501.99, -3126.01, 434.93,  1.83, 0},
+{7490.76, -3114.97, 434.431, 2.51, 0},
+{7479.64, -3105.51, 431.123, 1.83, 0},
+{7474.63, -3086.59, 428.994, 1.83, 2000},
+{7472.96, -3074.18, 427.566, 1.57, 0},
+{7472.25, -3063,    428.268, 1.55, 0},
+{7473.46, -3054.22, 427.588, 0.36, 0},
+{7475.08, -3053.6,  428.653, 0.36, 6000},
+{7474.66, -3053.56, 428.433, 3.19, 4000},
+{7471.81, -3058.84, 427.073, 4.29, 0},
+{7472.16, -3064.91, 427.772, 4.95, 0},
+{7471.56, -3085.36, 428.924, 4.72, 0},
+{7473.56, -3093.48, 429.294, 5.04, 0},
+{7478.94, -3104.29, 430.638, 5.23, 0},
+{7484.46, -3109.61, 432.769, 5.79, 0},
+{7490.23, -3111.08, 434.431, 0.02, 0},
+{7496.29, -3108,    434.783, 1.15, 0},
+{7497.46, -3100.66, 436.191, 1.50, 0},
+{7495.64, -3093.39, 438.349, 2.10, 0},
+{7492.44, -3086.01, 440.267, 1.38, 0},
+{7498.26, -3076.44, 440.808, 0.71, 0},
+{7506.4,  -3067.35, 443.64,  0.77, 0},
+{7518.37, -3057.42, 445.584, 0.74, 0},
+{7517.51, -3056.3,  444.568, 2.49, 4500}
+};
+
+#define ASPECT_RAVEN 22915
+#define ASPECT_RAVEN_SUMMON_X 7472.96
+#define ASPECT_RAVEN_SUMMON_Y -3074.18
+#define ASPECT_RAVEN_SUMMON_Z 427.566
+#define CLINTAR_SPIRIT_SUMMON_X 7459.2275
+#define CLINTAR_SPIRIT_SUMMON_Y -3122.5632
+#define CLINTAR_SPIRIT_SUMMON_Z 438.9842
+#define CLINTAR_SPIRIT_SUMMON_O 0.8594
+#define CLINTAR_SPIRIT_SAY_START "A shadowy, sinister presence has invader the Emerald Dream. Its power is poised to spill over into our world, $N. We must oppose it! That's why I cannot accompany you in person."
+#define CLINTAR_SPIRIT_SAY_UNDER_ATTACK_1 "The Emerald Dream will never be yours!"
+#define CLINTAR_SPIRIT_SAY_UNDER_ATTACK_2 "Begone from this place!"
+#define CLINTAR_SPIRIT_SAY_GET_ONE "That's the first relic, but there are still two more. Follow me, $N."
+#define CLINTAR_SPIRIT_SAY_GET_TWO "I've recovered the second relic. Take a moment to rest, and then we'll continue to the last reliquary."
+#define CLINTAR_SPIRIT_SAY_GET_THREE "We have all three of the relics, but my energy is rapidly fading. We must make our way back to Dreamwarden Lurosa! He will let you know what to do next."
+#define CLINTAR_SPIRIT_SAY_GET_FINAL "Lurosa, I am entrusting the Relics of Aviana to $N, who will take them to Morthis Whisperwing. I must return completely to the Emerald Dream now. Do not let $N fail!"
+
+struct TRINITY_DLL_DECL npc_clintar_spiritAI : public npc_escortAI
+{
+public:
+    npc_clintar_spiritAI(Creature *c) : npc_escortAI(c) {Reset(); }
+
+    uint32 Step;
+    uint32 CurrWP;
+    uint32 Event_Timer;
+    uint32 checkPlayer_Timer;
+
+	uint64 PlayerGUID;
+
+	bool Event_onWait;
+
+    void Reset()
+    {
+        if(!PlayerGUID)
+        {
+            Step = 0;
+            CurrWP = 0;
+            Event_Timer = 0;
+            PlayerGUID = 0;
+            checkPlayer_Timer = 1000;
+            Event_onWait = false;
+        }
+    }
+
+    void JustDied(Unit *killer)
+    {
+        if(!PlayerGUID)
+            return;
+        Player *player = (Player *)Unit::GetUnit((*m_creature), PlayerGUID);
+        if(player && player->GetQuestStatus(10965) == QUEST_STATUS_INCOMPLETE)
+        {
+            player->FailQuest(10965);
+            PlayerGUID = 0;
+            Reset();
+        }
+    }
+
+    void EnterEvadeMode()
+    {
+        Player *player = (Player *)Unit::GetUnit((*m_creature), PlayerGUID);
+        if(player && player->isInCombat() && player->getAttackerForHelper())
+        {
+            AttackStart(player->getAttackerForHelper());
+            return;
+        }
+        npc_escortAI::EnterEvadeMode();
+    }
+
+    void Aggro(Unit* who)
+    {
+        uint32 rnd = rand()%2;
+        switch(rnd)
+        {
+            case 0:
+                m_creature->Say(CLINTAR_SPIRIT_SAY_UNDER_ATTACK_1, 0, who->GetGUID());
+                break;
+            case 1:
+                m_creature->Say(CLINTAR_SPIRIT_SAY_UNDER_ATTACK_2, 0,who->GetGUID());
+                break;
+        }
+    }
+
+    void StartEvent(Player *player)
+    {
+        if(!player)
+            return;
+        if(player->GetQuestStatus(10965) == QUEST_STATUS_INCOMPLETE)
+        {
+            for(uint8 i = 0; i < 41; i++)
+            {
+                AddWaypoint(i, Clintar_spirit_WP[i][0], Clintar_spirit_WP[i][1], Clintar_spirit_WP[i][2], (uint32)Clintar_spirit_WP[i][4]);
+            }
+            PlayerGUID = player->GetGUID();
+            Start(true,true,false,PlayerGUID);
+        }
+        return;
+    }
+
+    void UpdateAI(const uint32 diff)
+    {
+        npc_escortAI::UpdateAI(diff);
+
+        if(!PlayerGUID)
+        {
+            m_creature->setDeathState(JUST_DIED);
+            return;
+        }
+
+        if(!InCombat && !Event_onWait && checkPlayer_Timer < diff)
+        {
+            Player *player = (Player *)Unit::GetUnit((*m_creature), PlayerGUID);
+            if(player && player->isInCombat() && player->getAttackerForHelper())
+                AttackStart(player->getAttackerForHelper());
+            checkPlayer_Timer = 1000;
+        } else if(!InCombat && !Event_onWait) checkPlayer_Timer -= diff;
+
+        if(Event_onWait && Event_Timer < diff)
+        {
+
+            Player *player = (Player *)Unit::GetUnit((*m_creature), PlayerGUID);
+            if(!player || (player && player->GetQuestStatus(10965) == QUEST_STATUS_NONE))
+            {
+                m_creature->setDeathState(JUST_DIED);
+                return;
+            }
+
+            switch(CurrWP)
+            {
+                case 0:
+                    switch(Step)
+                    {
+                        case 0:
+                            m_creature->Say(CLINTAR_SPIRIT_SAY_START,0,PlayerGUID);
+                            Event_Timer = 8000;
+                            Step = 1;
+                            break;
+                        case 1:
+                            Event_onWait = false;
+                            break;
+                    }
+                    break;
+                case 6:
+                    switch(Step)
+                    {
+                        case 0:
+                            m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, 133);
+                            Event_Timer = 5000;
+                            Step = 1;
+                            break;
+                        case 1:
+                            m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0);
+                            m_creature->Say(CLINTAR_SPIRIT_SAY_GET_ONE,0,PlayerGUID);
+                            Event_onWait = false;
+                            break;
+                    }
+                    break;
+                case 15:
+                    switch(Step)
+                    {
+                        case 0:
+                            m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, 133);
+                            Event_Timer = 5000;
+                            Step = 1;
+                            break;
+                        case 1:
+                            m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0);
+                            Event_onWait = false;
+                            break;
+                    }
+                    break;
+                case 16:
+                    switch(Step)
+                    {
+                        case 0:
+                            m_creature->Say(CLINTAR_SPIRIT_SAY_GET_TWO,0,PlayerGUID);
+                            Event_Timer = 15000;
+                            Step = 1;
+                            break;
+                        case 1:
+                            Event_onWait = false;
+                            break;
+                    }
+                    break;
+                case 20:
+                    switch(Step)
+                    {
+                        case 0:
+                            {
+                            Creature *mob = m_creature->SummonCreature(ASPECT_RAVEN, ASPECT_RAVEN_SUMMON_X, ASPECT_RAVEN_SUMMON_Y, ASPECT_RAVEN_SUMMON_Z, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 2000);
+                            if(mob)
+                            {
+                                mob->AddThreat(m_creature,10000.0f);
+                                mob->AI()->AttackStart(m_creature);
+                            }
+                            Event_Timer = 2000;
+                            Step = 1;
+                            break;
+                            }
+                        case 1:
+                            Event_onWait = false;
+                            break;
+                    }
+                    break;
+                case 24:
+                    switch(Step)
+                    {
+                        case 0:
+                            m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, 133);
+                            Event_Timer = 5000;
+                            Step = 1;
+                            break;
+                        case 1:
+                            m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0);
+                            Event_onWait = false;
+                            break;
+                    }
+                    break;
+                case 25:
+                    switch(Step)
+                    {
+                        case 0:
+                            m_creature->Say(CLINTAR_SPIRIT_SAY_GET_THREE, 0, PlayerGUID);
+                            Event_Timer = 4000;
+                            Step = 1;
+                            break;
+                        case 1:
+                            Event_onWait = false;
+                            break;
+                    }
+                    break;
+                case 40:
+                    switch(Step)
+                    {
+                        case 0:
+                            m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, 2);
+                            m_creature->Say(CLINTAR_SPIRIT_SAY_GET_FINAL, 0, PlayerGUID);
+							player->CompleteQuest(10965);
+                            Event_Timer = 1500;
+                            Step = 1;
+                            break;
+                        case 1:
+                            m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0);
+                            Event_Timer = 3000;
+                            Step = 2;
+                            break;
+                        case 2:
+                            player->TalkedToCreature(m_creature->GetEntry(), m_creature->GetGUID());
+                            PlayerGUID = 0;
+                            Reset();
+                            m_creature->setDeathState(JUST_DIED);
+                            break;
+                    }
+                    break;
+                default:
+                    Event_onWait = false;
+                    break;
+            }
+
+        } else if(Event_onWait) Event_Timer -= diff;
+    }
+
+    void WaypointReached(uint32 id)
+    {
+        CurrWP = id;
+        Event_Timer = 0;
+        Step = 0;
+        Event_onWait = true;
+    }
+};
+
+CreatureAI* GetAI_npc_clintar_spirit(Creature *_Creature)
+{
+    return new npc_clintar_spiritAI (_Creature);
+}
+
+/*####
+# npc_clintar_dreamwalker
+####*/
+
+#define CLINTAR_SPIRIT 22916 
+
+bool QuestAccept_npc_clintar_dreamwalker(Player *player, Creature *creature, Quest const *quest )
+{
+    if(quest->GetQuestId() == 10965)
+    {
+        Creature *clintar_spirit = creature->SummonCreature(CLINTAR_SPIRIT, CLINTAR_SPIRIT_SUMMON_X, CLINTAR_SPIRIT_SUMMON_Y, CLINTAR_SPIRIT_SUMMON_Z, CLINTAR_SPIRIT_SUMMON_O, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 100000);
+        if(clintar_spirit)
+            ((npc_clintar_spiritAI*)clintar_spirit->AI())->StartEvent(player);
+    }
+    return true;
+}
+
+/*####
+# 
+####*/
 
 void AddSC_moonglade()
@@ -215,3 +559,13 @@
     newscript->pGossipSelect = &GossipSelect_npc_silva_filnaveth;
     m_scripts[nrscripts++] = newscript;
-}
+
+	newscript = new Script;
+    newscript->Name="npc_clintar_dreamwalker";
+    newscript->pQuestAccept = &QuestAccept_npc_clintar_dreamwalker;
+    m_scripts[nrscripts++] = newscript;
+
+    newscript = new Script;
+    newscript->Name="npc_clintar_spirit";
+    newscript->GetAI = GetAI_npc_clintar_spirit;
+    m_scripts[nrscripts++] = newscript;
+}
Index: trunk/src/bindings/scripts/scripts/zone/nagrand/nagrand.cpp
===================================================================
--- trunk/src/bindings/scripts/scripts/zone/nagrand/nagrand.cpp (revision 90)
+++ trunk/src/bindings/scripts/scripts/zone/nagrand/nagrand.cpp (revision 204)
@@ -18,5 +18,5 @@
 SDName: Nagrand
 SD%Complete: 90
-SDComment: Quest support: 9849, 9918, 9874, 9991, 10107, 10108, 10044, 10172, 10646, 10085. TextId's unknown for altruis_the_sufferer and greatmother_geyah (npc_text)
+SDComment: Quest support: 9849, 9918, 9874, 9991, 10107, 10108, 10044, 10172, 10646, 10085, 10987. TextId's unknown for altruis_the_sufferer and greatmother_geyah (npc_text)
 SDCategory: Nagrand
 EndScriptData */
@@ -30,4 +30,5 @@
 npc_lantresor_of_the_blade
 npc_creditmarker_visit_with_ancestors
+mob_sparrowhawk
 EndContentData */
 
@@ -519,6 +520,108 @@
 
 /*######
-## AddSC
+## mob_sparrowhawk
 ######*/
+
+#define SPELL_SPARROWHAWK_NET 39810
+#define SPELL_ITEM_CAPTIVE_SPARROWHAWK 39812
+
+struct TRINITY_DLL_DECL mob_sparrowhawkAI : public ScriptedAI
+{
+
+    mob_sparrowhawkAI(Creature *c) : ScriptedAI(c) {Reset();}
+
+    uint32 Check_Timer;
+    uint64 PlayerGUID;
+    bool fleeing;
+
+    void Reset()
+    {
+        m_creature->RemoveAurasDueToSpell(SPELL_SPARROWHAWK_NET);
+        Check_Timer = 1000;
+        PlayerGUID = 0;
+        fleeing = false;
+    }
+    void AttackStart(Unit *who)
+    {
+        if(PlayerGUID)
+            return;
+
+        ScriptedAI::AttackStart(who);
+    }
+
+    void Aggro(Unit* who) {}
+
+    void MoveInLineOfSight(Unit *who)
+    {
+        if(!who || PlayerGUID)
+            return;
+
+        if(!PlayerGUID && who->GetTypeId() == TYPEID_PLAYER && m_creature->IsWithinDistInMap(((Player *)who), 30) && ((Player *)who)->GetQuestStatus(10987) == QUEST_STATUS_INCOMPLETE)
+        {
+            PlayerGUID = who->GetGUID();
+            return;
+        }
+
+        ScriptedAI::MoveInLineOfSight(who);
+    }
+
+    void UpdateAI(const uint32 diff)
+    {
+        if(Check_Timer < diff)
+        {
+            if(PlayerGUID)
+            {
+                if(fleeing && m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType() != FLEEING_MOTION_TYPE)
+                    fleeing = false;
+
+                Player *player = (Player *)Unit::GetUnit((*m_creature), PlayerGUID);
+                if(player && m_creature->IsWithinDistInMap(player, 30)/* && m_creature->CanFreeMove()*/)
+                {
+                    if(!fleeing)
+                    {
+                        m_creature->DeleteThreatList();
+                        m_creature->GetMotionMaster()->MoveFleeing(player);
+                        fleeing = true;
+                    }
+                }
+                else if(fleeing)
+                {
+                    m_creature->GetMotionMaster()->MovementExpired(false);
+                    PlayerGUID = 0;
+                    fleeing = false;
+                }
+            }
+            Check_Timer = 1000;
+        } else Check_Timer -= diff;
+
+        if (PlayerGUID)
+            return;
+
+        ScriptedAI::UpdateAI(diff);
+    }
+
+    void SpellHit(Unit *caster, const SpellEntry *spell)
+    {
+        if (caster->GetTypeId() == TYPEID_PLAYER)
+        {
+            if(spell->Id == SPELL_SPARROWHAWK_NET && ((Player*)caster)->GetQuestStatus(10987) == QUEST_STATUS_INCOMPLETE)
+            {
+                m_creature->CastSpell(caster, SPELL_ITEM_CAPTIVE_SPARROWHAWK, true);
+                m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
+                m_creature->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE);
+            }
+        }
+        return;
+    }
+};
+
+CreatureAI* GetAI_mob_sparrowhawk(Creature *_Creature)
+{
+    return new mob_sparrowhawkAI (_Creature);
+}
+
+/*####
+#
+####*/
 
 void AddSC_nagrand()
@@ -566,3 +669,8 @@
     newscript->GetAI = GetAI_npc_creditmarker_visit_with_ancestors;
     m_scripts[nrscripts++] = newscript;
-}
+
+    newscript = new Script;
+    newscript->Name="mob_sparrowhawk";
+    newscript->GetAI = GetAI_mob_sparrowhawk;
+    m_scripts[nrscripts++] = newscript;
+}
Index: trunk/src/bindings/scripts/scripts/zone/azshara/azshara.cpp
===================================================================
--- trunk/src/bindings/scripts/scripts/zone/azshara/azshara.cpp (revision 90)
+++ trunk/src/bindings/scripts/scripts/zone/azshara/azshara.cpp (revision 204)
@@ -18,5 +18,5 @@
 SDName: Azshara
 SD%Complete: 90
-SDComment: Quest support: 2744, 3141, 9364
+SDComment: Quest support: 2744, 3141, 9364, 10994
 SDCategory: Azshara
 EndScriptData */
@@ -25,7 +25,11 @@
 mobs_spitelashes
 npc_loramus_thalipedes
+mob_rizzle_sprysprocket
+mob_depth_charge
 EndContentData */
 
 #include "precompiled.h"
+#include "World.h"
+#include "WorldPacket.h"
 
 /*######
@@ -146,4 +150,338 @@
     }
     return true;
+}
+
+/*####
+# mob_rizzle_sprysprocket
+####*/
+#define MOB_DEPTH_CHARGE 23025
+#define SPELL_RIZZLE_BLACKJACK 39865
+#define SPELL_RIZZLE_ESCAPE 39871
+#define SPELL_RIZZLE_FROST_GRENADE 40525
+#define SPELL_DEPTH_CHARGE_TRAP 38576
+#define SPELL_PERIODIC_DEPTH_CHARGE 39912
+#define SPELL_GIVE_SOUTHFURY_MOONSTONE 39886
+
+#define SAY_RIZZLE_START "You, there! Hand over that moonstone and nobody gets hurt!"
+#define SAY_RIZZLE_GRENADE "Just chill!"
+#define SAY_RIZZLE_FINAL "All right, you win! I surrender! Just don't hurt me!"
+//next message must be send to player when Rizzle jump into river, not implemented
+#define MSG_ESCAPE_NOTICE "Rizzle Sprysprocket takes the Southfury moonstone and escapes into the river. Follow her!"
+
+float WPs[58][4] =
+{
+//pos_x   pos_y     pos_z    orien
+{3691.97, -3962.41, 35.9118, 3.67},
+{3675.02, -3960.49, 35.9118, 3.67},
+{3653.19, -3958.33, 33.9118, 3.59},
+{3621.12, -3958.51, 29.9118, 3.48},
+{3604.86, -3963,    29.9118, 3.48},
+{3569.94, -3970.25, 29.9118, 3.44},
+{3541.03, -3975.64, 29.9118, 3.41},
+{3510.84, -3978.71, 29.9118, 3.41},
+{3472.7,  -3997.07, 29.9118, 3.35},
+{3439.15, -4014.55, 29.9118, 3.29},
+{3412.8,  -4025.87, 29.9118, 3.25},
+{3384.95, -4038.04, 29.9118, 3.24},
+{3346.77, -4052.93, 29.9118, 3.22},
+{3299.56, -4071.59, 29.9118, 3.20},
+{3261.22, -4080.38, 30.9118, 3.19},
+{3220.68, -4083.09, 31.9118, 3.18},
+{3187.11, -4070.45, 33.9118, 3.16},
+{3162.78, -4062.75, 33.9118, 3.15},
+{3136.09, -4050.32, 33.9118, 3.07},
+{3119.47, -4044.51, 36.0363, 3.07},
+{3098.95, -4019.8,  33.9118, 3.07},
+{3073.07, -4011.42, 33.9118, 3.07},
+{3051.71, -3993.37, 33.9118, 3.02},
+{3027.52, -3978.6,  33.9118, 3.00},
+{3003.78, -3960.14, 33.9118, 2.98},
+{2977.99, -3941.98, 31.9118, 2.96},
+{2964.57, -3932.07, 30.9118, 2.96},
+{2947.9,  -3921.31, 29.9118, 2.96},
+{2924.91, -3910.8,  29.9118, 2.94},
+{2903.04, -3896.42, 29.9118, 2.93},
+{2884.75, -3874.03, 29.9118, 2.90},
+{2868.19, -3851.48, 29.9118, 2.82},
+{2854.62, -3819.72, 29.9118, 2.80},
+{2825.53, -3790.4,  29.9118, 2.744},
+{2804.31, -3773.05, 29.9118, 2.71},
+{2769.78, -3763.57, 29.9118, 2.70},
+{2727.23, -3745.92, 30.9118, 2.69},
+{2680.12, -3737.49, 30.9118, 2.67},
+{2647.62, -3739.94, 30.9118, 2.66},
+{2616.6,  -3745.75, 30.9118, 2.64},
+{2589.38, -3731.97, 30.9118, 2.61},
+{2562.94, -3722.35, 31.9118, 2.56},
+{2521.05, -3716.6,  31.9118, 2.55},
+{2485.26, -3706.67, 31.9118, 2.51},
+{2458.93, -3696.67, 31.9118, 2.51},
+{2432,    -3692.03, 31.9118, 2.46},
+{2399.59, -3681.97, 31.9118, 2.45},
+{2357.75, -3666.6,  31.9118, 2.44},
+{2311.99, -3656.88, 31.9118, 2.94},
+{2263.41, -3649.55, 31.9118, 3.02},
+{2209.05, -3641.76, 31.9118, 2.99},
+{2164.83, -3637.64, 31.9118, 3.15},
+{2122.42, -3639,    31.9118, 3.21},
+{2075.73, -3643.59, 31.9118, 3.22},
+{2033.59, -3649.52, 31.9118, 3.42},
+{1985.22, -3662.99, 31.9118, 3.42},
+{1927.09, -3679.56, 33.9118, 3.42},
+{1873.57, -3695.32, 33.9118, 3.44}
+};
+
+
+struct TRINITY_DLL_DECL mob_rizzle_sprysprocketAI : public ScriptedAI
+{
+    mob_rizzle_sprysprocketAI(Creature *c) : ScriptedAI(c) {Reset();}
+
+    uint32 spellEscape_Timer;
+    uint32 Teleport_Timer;
+    uint32 Check_Timer;
+    uint32 Grenade_Timer;
+    uint32 Must_Die_Timer;
+    uint32 CurrWP;
+
+    uint64 PlayerGUID;
+
+    bool Must_Die;
+    bool Escape;
+    bool ContinueWP;
+	bool Reached;
+
+    void Reset()
+    {
+        spellEscape_Timer = 1300;
+        Teleport_Timer = 3500;
+        Check_Timer = 10000;
+        Grenade_Timer = 30000;
+        Must_Die_Timer = 3000;
+        CurrWP = 0;
+
+        PlayerGUID = 0;
+
+        Must_Die = false;
+        Escape = false;
+        ContinueWP = false;
+		Reached = false;
+    }
+
+    void Despawn()
+    {
+        m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
+        m_creature->RemoveCorpse();
+    }
+
+    void UpdateAI(const uint32 diff)
+    {
+        if(Must_Die)
+            if(Must_Die_Timer < diff)
+            {
+                Despawn();
+                return;
+            } else Must_Die_Timer -= diff;
+
+        if(!Escape)
+        {
+            if(!PlayerGUID)
+                return;
+
+            if(spellEscape_Timer < diff)
+            {
+                DoCast(m_creature, SPELL_RIZZLE_ESCAPE, false);
+                spellEscape_Timer = 10000;
+            } else spellEscape_Timer -= diff;
+
+            if(Teleport_Timer < diff)
+            {
+                //temp solution - unit can't be teleported by core using spelleffect 5, only players
+                Map *map = m_creature->GetMap();
+                if(map)
+                {
+                    map->CreatureRelocation(m_creature, 3706.39, -3969.15, 35.9118, 0);
+                    m_creature->AI_SendMoveToPacket(3706.39, -3969.15, 35.9118, 0, 0, 0);
+                }
+                //begin swimming and summon depth charges
+				Player* player = ((Player*)Unit::GetUnit((*m_creature), PlayerGUID));
+				SendText(MSG_ESCAPE_NOTICE, player);
+                DoCast(m_creature, SPELL_PERIODIC_DEPTH_CHARGE);
+                m_creature->SetUnitMovementFlags(MOVEMENTFLAG_FLYING2 | MOVEMENTFLAG_SWIMMING);
+                m_creature->SetSpeed(MOVE_RUN, 0.85f, true);
+                m_creature->GetMotionMaster()->MovementExpired();
+                m_creature->GetMotionMaster()->MovePoint(CurrWP, WPs[CurrWP][0], WPs[CurrWP][1], WPs[CurrWP][2]);
+                Escape = true;
+            } else Teleport_Timer -= diff;
+
+            return;
+        }
+
+        if(ContinueWP)
+        {
+            m_creature->GetMotionMaster()->MovePoint(CurrWP, WPs[CurrWP][0], WPs[CurrWP][1], WPs[CurrWP][2]);
+            ContinueWP = false;
+        }
+
+        if(Grenade_Timer < diff)
+        {
+            Player *player = (Player *)Unit::GetUnit((*m_creature), PlayerGUID);
+            if(player)
+            {
+               DoWhisper(SAY_RIZZLE_GRENADE, player);
+               DoCast(player, SPELL_RIZZLE_FROST_GRENADE, true);
+            }
+            Grenade_Timer = 30000;
+        } else Grenade_Timer -= diff;
+
+		if(Check_Timer < diff)
+        {
+            Player *player = (Player *)Unit::GetUnit((*m_creature), PlayerGUID);
+            if(!player)
+            {
+                Despawn();
+                return;
+            }
+            float dist = m_creature->GetDistance(player);
+			if(dist < 10 && m_creature->GetPositionX() > player->GetPositionX() && !Reached)
+            {
+                DoYell(SAY_RIZZLE_FINAL, LANG_UNIVERSAL, NULL);
+                m_creature->SetUInt32Value(UNIT_NPC_FLAGS, 1);
+				m_creature->setFaction(35);
+                m_creature->StopMoving();
+                m_creature->GetMotionMaster()->MovementExpired();
+				m_creature->GetMotionMaster()->Clear(true);
+                m_creature->RemoveAurasDueToSpell(SPELL_PERIODIC_DEPTH_CHARGE);
+				Reached = true;
+            }
+
+            Check_Timer = 1000;
+        } else Check_Timer -= diff;
+
+    }
+
+	void SendText(const char *text, Player* player)
+	{
+		WorldPacket data(SMSG_SERVER_MESSAGE, 0);              // guess size
+		data << text;
+		if(player)
+			player->GetSession()->SendPacket(&data);
+	}
+
+    void AttackStart(Unit *who)
+    {        
+        if (!who || PlayerGUID)
+            return;
+
+        if(who->GetTypeId() == TYPEID_PLAYER && ((Player *)who)->GetQuestStatus(10994) == QUEST_STATUS_INCOMPLETE)
+        {
+            PlayerGUID = who->GetGUID();
+            DoYell(SAY_RIZZLE_START, LANG_UNIVERSAL, NULL);
+            DoCast(who, SPELL_RIZZLE_BLACKJACK, false);
+            return;
+        }
+    }
+
+    void Aggro(Unit* who) {}
+
+    void MovementInform(uint32 type, uint32 id)
+    {
+        if (type != POINT_MOTION_TYPE)
+            return;
+
+        if(id == 57)
+        {
+            Despawn();
+            return;
+        }
+
+        CurrWP++;
+        ContinueWP = true;
+    }
+
+};
+
+bool GossipHello_mob_rizzle_sprysprocket(Player *player, Creature *_Creature)
+{
+    if(player->GetQuestStatus(10994) != QUEST_STATUS_INCOMPLETE)
+        return true;
+    player->ADD_GOSSIP_ITEM( 0, "Hand over the Southfury moonstone and I'll let you go.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
+    player->SEND_GOSSIP_MENU(10811,_Creature->GetGUID());
+    return true;
+}
+
+bool GossipSelect_mob_rizzle_sprysprocket(Player *player, Creature *_Creature, uint32 sender, uint32 action )
+{
+    if (action == GOSSIP_ACTION_INFO_DEF + 1 && player->GetQuestStatus(10994) == QUEST_STATUS_INCOMPLETE)
+    {
+        player->CLOSE_GOSSIP_MENU();
+        _Creature->CastSpell(player, SPELL_GIVE_SOUTHFURY_MOONSTONE, true);
+        ((mob_rizzle_sprysprocketAI*)_Creature->AI())->Must_Die_Timer = 3000;
+        ((mob_rizzle_sprysprocketAI*)_Creature->AI())->Must_Die = true;
+    }
+    return true;
+}
+
+CreatureAI* GetAI_mob_rizzle_sprysprocket(Creature *_Creature)
+{
+    return new mob_rizzle_sprysprocketAI (_Creature);
+}
+
+/*####
+# mob_depth_charge
+####*/
+
+struct TRINITY_DLL_DECL mob_depth_chargeAI : public ScriptedAI
+{
+    mob_depth_chargeAI(Creature *c) : ScriptedAI(c) {Reset();}
+
+    bool we_must_die;
+    uint32 must_die_timer;
+
+    void Reset()
+    {
+        m_creature->SetUnitMovementFlags(MOVEMENTFLAG_FLYING2 | MOVEMENTFLAG_SWIMMING);
+		m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+        we_must_die = false;
+        must_die_timer = 1000;
+    }
+ 
+    void UpdateAI(const uint32 diff)
+    {
+        if(we_must_die)
+            if(must_die_timer < diff)
+            {
+                m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
+                m_creature->RemoveCorpse();
+            } else must_die_timer -= diff;
+        return;
+    }
+
+    void MoveInLineOfSight(Unit *who)
+    {
+        if (!who)
+            return;
+
+        if(who->GetTypeId() == TYPEID_PLAYER && m_creature->IsWithinDistInMap(who, 5))
+        {
+            DoCast(who, SPELL_DEPTH_CHARGE_TRAP);
+            we_must_die = true;
+            return;
+        }
+    }
+ 
+    void AttackStart(Unit *who)
+    {        
+        return;
+    }
+
+    void Aggro(Unit* who)
+	{
+        return;
+	}
+};
+
+CreatureAI* GetAI_mob_depth_charge(Creature *_Creature)
+{
+    return new mob_depth_chargeAI (_Creature);
 }
 
@@ -162,3 +500,15 @@
     newscript->pGossipSelect = &GossipSelect_npc_loramus_thalipedes;
     m_scripts[nrscripts++] = newscript;
-}
+
+	newscript = new Script;
+    newscript->Name="mob_rizzle_sprysprocket";
+    newscript->GetAI = GetAI_mob_rizzle_sprysprocket;
+    newscript->pGossipHello =  &GossipHello_mob_rizzle_sprysprocket;
+    newscript->pGossipSelect = &GossipSelect_mob_rizzle_sprysprocket;
+    m_scripts[nrscripts++] = newscript;
+
+    newscript = new Script;
+    newscript->Name="mob_depth_charge";
+    newscript->GetAI = GetAI_mob_depth_charge;
+    m_scripts[nrscripts++] = newscript;
+}
