Index: trunk/src/game/SpellEffects.cpp
===================================================================
--- trunk/src/game/SpellEffects.cpp (revision 128)
+++ trunk/src/game/SpellEffects.cpp (revision 130)
@@ -616,4 +616,101 @@
             switch(m_spellInfo->Id )
             {
+                // Mingo's Fortune Giblets
+                case 40802:
+                {
+                    if (m_caster->GetTypeId() != TYPEID_PLAYER) return;
+
+                    Player *player = (Player*)m_caster;
+                    uint32 newitemid;
+
+                    switch(urand(1,20))
+                    {
+                        case 1: newitemid = 32688; break;
+                        case 2: newitemid = 32689; break;
+                        case 3: newitemid = 32690; break;
+                        case 4: newitemid = 32691; break;
+                        case 5: newitemid = 32692; break;
+                        case 6: newitemid = 32693; break;
+                        case 7: newitemid = 32700; break;
+                        case 8: newitemid = 32701; break;
+                        case 9: newitemid = 32702; break;
+                        case 10: newitemid = 32703; break;
+                        case 11: newitemid = 32704; break;
+                        case 12: newitemid = 32705; break;
+                        case 13: newitemid = 32706; break;
+                        case 14: newitemid = 32707; break;
+                        case 15: newitemid = 32708; break;
+                        case 16: newitemid = 32709; break;
+                        case 17: newitemid = 32710; break;
+                        case 18: newitemid = 32711; break;
+                        case 19: newitemid = 32712; break;
+                        case 20: newitemid = 32713; break;
+                    }
+                    ItemPosCountVec dest;
+                    uint8 msg = player->CanStoreNewItem( NULL_BAG, NULL_SLOT, dest, newitemid, 1, false);
+                    if (msg != EQUIP_ERR_OK)
+                    {
+                        player->SendEquipError(msg, NULL, NULL);
+                        return;
+                    }
+                    Item *pItem = player->StoreNewItem(dest, newitemid, true, Item::GenerateItemRandomPropertyId(newitemid));
+
+                    if (!pItem)
+                    {
+                        player->SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, NULL, NULL);
+                        return;
+                    }
+                    player->SendNewItem(pItem, 1, true, true);
+                    
+                    return;
+                }
+                // Encapsulate Voidwalker
+                case 29364:
+                {
+                    if (!unitTarget || unitTarget->GetTypeId() != TYPEID_UNIT || ((Creature*)unitTarget)->isPet()) return;
+
+                    Creature* creatureTarget = (Creature*)unitTarget;
+                    GameObject* pGameObj = new GameObject;
+
+                    if (!creatureTarget || !pGameObj) return;
+
+                    if (!pGameObj->Create(objmgr.GenerateLowGuid(HIGHGUID_GAMEOBJECT), 181574, creatureTarget->GetMap(),
+                        creatureTarget->GetPositionX(), creatureTarget->GetPositionY(), creatureTarget->GetPositionZ(), 
+                        creatureTarget->GetOrientation(), 0, 0, 0, 0, 100, 1))
+                    {
+                        delete pGameObj;
+                        return;
+                    }
+
+                    pGameObj->SetRespawnTime(0);
+                    pGameObj->SetOwnerGUID(m_caster->GetGUID());
+                    pGameObj->SetUInt32Value(GAMEOBJECT_LEVEL, m_caster->getLevel());
+                    pGameObj->SetSpellId(m_spellInfo->Id);
+
+                    MapManager::Instance().GetMap(creatureTarget->GetMapId(), pGameObj)->Add(pGameObj);
+
+                    WorldPacket data(SMSG_GAMEOBJECT_SPAWN_ANIM_OBSOLETE, 8);
+                    data << uint64(pGameObj->GetGUID());
+                    m_caster->SendMessageToSet(&data,true);
+
+                    return;
+                }
+                // Demon Broiled Surprise
+                case 43723:
+                {
+                    if (!unitTarget || unitTarget->isAlive() || unitTarget->GetTypeId() != TYPEID_UNIT ||
+                        ((Creature*)unitTarget)->isPet()) return;
+
+                    Player *player = (Player*)m_caster;
+
+                    if (!player) return;
+
+                    player->CastSpell(unitTarget, 43753, true);
+
+                    if (player->GetQuestStatus(11379) == QUEST_STATUS_INCOMPLETE && unitTarget->GetEntry() == 19973)
+                        player->CastedCreatureOrGO(19973, unitTarget->GetGUID(), 43723);
+
+                    return;
+                }
                 case 8063:                                  // Deviate Fish
                 {
@@ -4789,4 +4886,30 @@
         // Flame Crash
         case 41126: unitTarget->CastSpell(unitTarget, 41131, true); break;
+        case 41931:
+        {
+            int bag=19;
+            int slot=0;
+            Item* item = NULL;
+            
+            while (bag < 256)
+            {
+                item = ((Player*)m_caster)->GetItemByPos(bag,slot);
+                if (item && item->GetEntry() == 38587) break;
+                slot++;
+                if (slot == 39)
+                {
+                    slot = 0;
+                    bag++;
+                }
+            }
+            if (bag < 256)
+            {
+                if (((Player*)m_caster)->GetItemByPos(bag,slot)->GetCount() == 1) ((Player*)m_caster)->RemoveItem(bag,slot,true);
+                else ((Player*)m_caster)->GetItemByPos(bag,slot)->SetCount(((Player*)m_caster)->GetItemByPos(bag,slot)->GetCount()-1);
+                // Spell 42518 (Braufest - Gratisprobe des Braufest herstellen)
+                m_caster->CastSpell(m_caster,42518,true);
+                return;
+            }
+        }
         // Force Cast - Portal Effect: Sunwell Isle
         case 44876: unitTarget->CastSpell(unitTarget, 44870, true); break;
Index: trunk/src/game/CreatureAI.h
===================================================================
--- trunk/src/game/CreatureAI.h (revision 102)
+++ trunk/src/game/CreatureAI.h (revision 130)
@@ -66,4 +66,6 @@
     SELECT_TARGET_TOPAGGRO,                                 //Selects targes from top aggro to bottom
     SELECT_TARGET_BOTTOMAGGRO,                              //Selects targets from bottom aggro to top
+    SELECT_TARGET_NEAREST,
+    SELECT_TARGET_FARTHEST,
 };
 
Index: trunk/src/bindings/scripts/include/sc_creature.cpp
===================================================================
--- trunk/src/bindings/scripts/include/sc_creature.cpp (revision 118)
+++ trunk/src/bindings/scripts/include/sc_creature.cpp (revision 130)
@@ -260,4 +260,143 @@
 
     return NULL;
+}
+
+struct TargetDistanceOrder : public std::binary_function<const Unit, const Unit, bool>
+{
+    const Unit* me;
+    TargetDistanceOrder(const Unit* Target) : me(Target) {};
+    // functor for operator ">"
+    bool operator()(const Unit* _Left, const Unit* _Right) const
+    {
+        return (me->GetDistance(_Left) < me->GetDistance(_Right));
+    }
+};
+
+Unit* ScriptedAI::SelectUnit(SelectAggroTarget targetType, uint32 position, float dist, bool playerOnly)
+{
+    if(targetType == SELECT_TARGET_NEAREST || targetType == SELECT_TARGET_FARTHEST)
+    {
+        std::list<HostilReference*> &m_threatlist = m_creature->getThreatManager().getThreatList();
+        if(m_threatlist.empty()) return NULL;
+        std::list<Unit*> targetList;
+        std::list<HostilReference*>::iterator itr = m_threatlist.begin();
+        for(; itr!= m_threatlist.end(); ++itr)
+        {
+            Unit *target = Unit::GetUnit(*m_creature, (*itr)->getUnitGuid());
+            if(!target
+                || playerOnly && target->GetTypeId() != TYPEID_PLAYER
+                || dist && !m_creature->IsWithinDistInMap(target, dist))
+            {
+                continue;
+            }
+            targetList.push_back(target);
+        }
+        if(position >= targetList.size())
+            return NULL;
+        targetList.sort(TargetDistanceOrder(m_creature));
+        if(targetType == SELECT_TARGET_NEAREST)
+        {
+            std::list<Unit*>::iterator i = targetList.begin();
+            advance(i, position);
+            return *i;
+        }
+        else
+        {
+            std::list<Unit*>::reverse_iterator i = targetList.rbegin();
+            advance(i, position);
+            return *i;
+        }
+    }
+    else
+    {
+        std::list<HostilReference*> m_threatlist = m_creature->getThreatManager().getThreatList();
+        std::list<HostilReference*>::iterator i;
+        Unit *target;
+        while(position < m_threatlist.size())
+        {
+            if(targetType == SELECT_TARGET_BOTTOMAGGRO)
+            {
+                i = m_threatlist.end();
+                advance(i, - (int32)position - 1);
+            }
+            else
+            {
+                i = m_threatlist.begin();
+                if(targetType == SELECT_TARGET_TOPAGGRO)
+                    advance(i, position);
+                else // random
+                    advance(i, position + rand()%(m_threatlist.size() - position));
+            }
+
+            target = Unit::GetUnit(*m_creature,(*i)->getUnitGuid());
+            if(!target
+                || playerOnly && target->GetTypeId() != TYPEID_PLAYER
+                || dist && !m_creature->IsWithinDistInMap(target, dist))
+            {
+                m_threatlist.erase(i);
+            }
+            else
+            {
+                return target;
+            }
+        }
+    }
+
+    return NULL;
+}
+
+void ScriptedAI::SelectUnitList(std::list<Unit*> &targetList, uint32 num, SelectAggroTarget targetType, float dist, bool playerOnly)
+{
+    if(targetType == SELECT_TARGET_NEAREST || targetType == SELECT_TARGET_FARTHEST)
+    {
+        std::list<HostilReference*> &m_threatlist = m_creature->getThreatManager().getThreatList();
+        if(m_threatlist.empty()) return;
+        std::list<HostilReference*>::iterator itr = m_threatlist.begin();
+        for(; itr!= m_threatlist.end(); ++itr)
+        {
+            Unit *target = Unit::GetUnit(*m_creature, (*itr)->getUnitGuid());
+            if(!target
+                || playerOnly && target->GetTypeId() != TYPEID_PLAYER
+                || dist && !m_creature->IsWithinDistInMap(target, dist))
+            {
+                continue;
+            }
+            targetList.push_back(target);
+        }
+        targetList.sort(TargetDistanceOrder(m_creature));
+        targetList.resize(num);
+        if(targetType == SELECT_TARGET_FARTHEST)
+            targetList.reverse();
+    }
+    else
+    {
+        std::list<HostilReference*> m_threatlist = m_creature->getThreatManager().getThreatList();
+        std::list<HostilReference*>::iterator i;
+        Unit *target;
+        while(m_threatlist.size())
+        {
+            if(targetType == SELECT_TARGET_BOTTOMAGGRO)
+            {
+                i = m_threatlist.end();
+                --i;
+            }
+            else
+            {
+                i = m_threatlist.begin();
+                if(targetType == SELECT_TARGET_RANDOM)
+                    advance(i, rand()%m_threatlist.size());
+            }
+
+            target = Unit::GetUnit(*m_creature,(*i)->getUnitGuid());
+            m_threatlist.erase(i);
+            if(!target
+                || playerOnly && target->GetTypeId() != TYPEID_PLAYER
+                || dist && !m_creature->IsWithinDistInMap(target, dist))
+            {
+                continue;                
+            }
+            targetList.push_back(target);
+        }
+    }
 }
 
Index: trunk/src/bindings/scripts/include/sc_creature.h
===================================================================
--- trunk/src/bindings/scripts/include/sc_creature.h (revision 109)
+++ trunk/src/bindings/scripts/include/sc_creature.h (revision 130)
@@ -147,4 +147,6 @@
     //Selects a unit from the creature's current aggro list
     Unit* SelectUnit(SelectAggroTarget target, uint32 position);
+    Unit* SelectUnit(SelectAggroTarget target, uint32 position, float dist, bool playerOnly);
+    void SelectUnitList(std::list<Unit*> &targetList, uint32 num, SelectAggroTarget target, float dist, bool playerOnly);
 
     //Returns spells that meet the specified criteria from the creatures spell list
Index: trunk/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_fathomlord_karathress.cpp
===================================================================
--- trunk/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_fathomlord_karathress.cpp (revision 109)
+++ trunk/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_fathomlord_karathress.cpp (revision 130)
@@ -17,6 +17,6 @@
 /* ScriptData
 SDName: Boss_Fathomlord_Karathress
-SD%Complete: 50
-SDComment: Missing Multishot, pet, Totems, Windfury, Whirlwind
+SD%Complete: 70%
+SDComment: Cyclone workaround
 SDCategory: Coilfang Resevoir, Serpent Shrine Cavern
 EndScriptData */
@@ -24,37 +24,69 @@
 #include "precompiled.h"
 #include "def_serpent_shrine.h"
+#include "../../../npc/npc_escortAI.h"
 
 //Karathress spells
-#define SPELL_CATACLYSMIC_BOLT     38441
-#define SPELL_POWER_OF_SHARKKIS    38455
-#define SPELL_POWER_OF_TIDALVESS   38452
-#define SPELL_POWER_OF_CARIBDIS    38451
-#define SPELL_ENRAGE               24318
+#define SPELL_CATACLYSMIC_BOLT			38441
+#define SPELL_POWER_OF_SHARKKIS			38455
+#define SPELL_POWER_OF_TIDALVESS		38452
+#define SPELL_POWER_OF_CARIBDIS			38451
+#define SPELL_ENRAGE					45078
+#define SPELL_SEAR_NOVA					38445
+#define SPELL_BLESSING_OF_THE_TIDES		38449
+
 //Sharkkis spells
-#define SPELL_LEECHING_THROW       29436
-#define SPELL_THE_BEAST_WITHIN     38373
+#define SPELL_LEECHING_THROW			29436
+#define SPELL_THE_BEAST_WITHIN			38373
+#define SPELL_LEECHING_THROW			29436
+#define SPELL_MULTISHOT					38366
+#define SPELL_THE_BEAST_WITHIN			38373
+#define SPELL_SUMMON_FATHOM_LURKER		38433
+#define SPELL_SUMMON_FATHOM_SPOREBAT	38431
+#define SPELL_PET_ENRAGE                19574
+
 //Tidalvess spells
-#define SPELL_FROST_SHOCK          38234
+#define SPELL_FROST_SHOCK				38234
+#define SPELL_SPITFIRE_TOTEM			38236
+#define SPELL_POISON_CLEANSING_TOTEM	38306
+#define SPELL_POISON_CLEANSING_EFFECT	8167
+#define SPELL_EARTHBIND_TOTEM			38304
+#define SPELL_EARTHBIND_TOTEM_EFFECT	6474
+#define SPELL_WINDFURY_WEAPON			32911
+
 //Caribdis Spells
-#define SPELL_WATER_BOLT_VOLLEY    38335
-#define SPELL_TIDAL_SURGE          38353
-#define SPELL_HEAL                 41386
-
-#define SAY_AGGRO                  "Guards, attention! We have visitors..."
-#define SAY_SLAY1                  "I am rid of you."
-#define SAY_GAIN_ABILITY1          "I am more powerful than ever!"
-#define SAY_GAIN_ABILITY2          "Go on, kill them! I'll be the better for it!"
-#define SAY_GAIN_ABILITY3          "More knowledge, more power!"
-#define SAY_DEATH                  "Her ... excellency ... awaits!"
-
-#define SOUND_AGGRO                11277
-#define SOUND_PLYR_ATTACK          11278
-#define SOUND_GAIN_ABILITY1        11279
-#define SOUND_GAIN_ABILITY2        11280
-#define SOUND_GAIN_ABILITY3        11281
-#define SOUND_SLAY1                11282
-#define SOUND_SLAY2                11283
-#define SOUND_SLAY3                11284
-#define SOUND_DEATH                11285
+#define SPELL_WATER_BOLT_VOLLEY			38335
+#define SPELL_TIDAL_SURGE				38358
+#define SPELL_TIDAL_SURGE_FREEZE		38357
+#define SPELL_HEAL						41386
+#define SPELL_SUMMON_CYCLONE			38337
+#define SPELL_CYCLONE_CYCLONE			29538
+
+//Yells and Quotes
+#define SAY_AGGRO						"Guards, attention! We have visitors..."
+#define SOUND_AGGRO						11277
+#define SAY_SLAY1						"I am rid of you."
+#define SOUND_SLAY1						11282
+#define SAY_SLAY2						"Land-dwelling scum!"
+#define SOUND_SLAY2						11284
+#define SAY_GAIN_ABILITY1				"I am more powerful than ever!"
+#define SOUND_GAIN_ABILITY1				11279
+#define SAY_GAIN_ABILITY2				"Go on, kill them! I'll be the better for it!"
+#define SOUND_GAIN_ABILITY2				11280
+#define SAY_GAIN_ABILITY3				"More knowledge, more power!"
+#define SOUND_GAIN_ABILITY3				11281
+#define SAY_DEATH						"Her ... excellency ... awaits!"
+#define SOUND_DEATH						11285
+#define SAY_GAIN_BLESSING_OF_TIDES		"Your overconfidence will be your undoing! Guards, lend me your strength!"
+#define SOUND_GAIN_BLESSING_OF_TIDES	11278
+#define SAY_MISC						"Alana be'lendor!" //don't know what use this
+#define SOUND_MISC						11283
+
+//Summoned Unit GUIDs
+#define CREATURE_CYCLONE                22104
+#define CREATURE_FATHOM_SPOREBAT        22120
+#define CREATURE_FATHOM_LURKER          22119
+#define CREATURE_SPITFIRE_TOTEM         22091
+#define CREATURE_EARTHBIND_TOTEM        22486
+#define CREATURE_POISON_CLEANSING_TOTEM 22487
 
 //entry and position for Seer Olum
@@ -81,4 +113,7 @@
     uint32 CataclysmicBolt_Timer;
     uint32 Enrage_Timer;
+	uint32 SearNova_Timer;
+
+	bool BlessingOfTides;
 
     uint64 Advisors[3];
@@ -88,25 +123,36 @@
         CataclysmicBolt_Timer = 10000;
         Enrage_Timer = 600000;                              //10 minutes
-
-        Creature* Advisor;
-        for(uint8 i = 0; i < 3; ++i)
-            if(Advisors[i])
-        {
-            Advisor = ((Creature*)Unit::GetUnit(*m_creature, Advisors[i]));
-            if(Advisor)
-            {
-                if(Advisor->isAlive())
-                {
-                    Advisor->DealDamage(Advisor, Advisor->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
-                    Advisor->RemoveCorpse();
-                    Advisor->Respawn();
-                }
-                Advisor->AI()->EnterEvadeMode();
-            }
-        }
-
-        if( pInstance )
-            pInstance->SetData(DATA_KARATHRESSEVENT, NOT_STARTED);
-    }
+		SearNova_Timer = 20000+rand()%40000; // 20 - 60 seconds
+
+		BlessingOfTides = false;
+
+
+
+		if(pInstance)
+		{
+			uint64 RAdvisors[3];
+			RAdvisors[0] = pInstance->GetData64(DATA_SHARKKIS);
+			RAdvisors[1] = pInstance->GetData64(DATA_TIDALVESS);
+			RAdvisors[2] = pInstance->GetData64(DATA_CARIBDIS);
+			//Respawn of the 3 Advisors
+			Creature* pAdvisor = NULL;
+			for( int i=0; i<3; i++ )
+
+		
+		if(RAdvisors[i])
+		{
+			pAdvisor = ((Creature*)Unit::GetUnit((*m_creature), RAdvisors[i]));
+			if(pAdvisor && !pAdvisor->isAlive())
+			{
+			pAdvisor->Respawn();
+			pAdvisor->AI()->EnterEvadeMode();
+			pAdvisor->GetMotionMaster()->MoveTargetedHome();
+			}
+		}
+		pInstance->SetData(DATA_KARATHRESSEVENT, NOT_STARTED);
+		}
+			
+		
+	}
 
     void EventSharkkisDeath()
@@ -150,4 +196,5 @@
         DoPlaySoundToSet(m_creature, SOUND_AGGRO);
         DoYell(SAY_AGGRO, LANG_UNIVERSAL, NULL);
+		DoZoneInCombat();
 
         pInstance->SetData64(DATA_KARATHRESSEVENT_STARTER, who->GetGUID());
@@ -165,7 +212,5 @@
             case 1:
                 DoPlaySoundToSet(m_creature, SOUND_SLAY2);
-                break;
-            case 2:
-                DoPlaySoundToSet(m_creature, SOUND_SLAY3);
+				DoYell(SAY_SLAY2, LANG_UNIVERSAL, NULL);
                 break;
         }
@@ -178,5 +223,5 @@
 
         if( pInstance )
-            pInstance->SetData(DATA_FATHOMLORDKARATHRESSEVENT, NOT_STARTED);
+            pInstance->SetData(DATA_FATHOMLORDKARATHRESSEVENT, DONE);
 
         //support for quest 10944
@@ -209,5 +254,8 @@
         //someone evaded!
         if(pInstance && !pInstance->GetData(DATA_KARATHRESSEVENT))
+		{
             EnterEvadeMode();
+			return;
+		}
 
         //CataclysmicBolt_Timer
@@ -227,4 +275,11 @@
         }else CataclysmicBolt_Timer -= diff;
 
+		//SearNova_Timer
+		if(SearNova_Timer < diff)
+		{
+			DoCast(m_creature->getVictim(), SPELL_SEAR_NOVA);
+			SearNova_Timer = 20000+rand()%40000;
+		}else SearNova_Timer -= diff;
+
         //Enrage_Timer
         if(Enrage_Timer < diff)
@@ -234,4 +289,31 @@
         }else Enrage_Timer -= diff;
 
+		//Blessing of Tides Trigger
+		if ((m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) <= 75 && !BlessingOfTides)
+   		{
+			BlessingOfTides = true;
+			bool continueTriggering;
+			Creature* Advisor;
+			for(uint8 i = 0; i < 4; ++i)
+				if(Advisors[i])
+				{
+					Advisor = ((Creature*)Unit::GetUnit(*m_creature, Advisors[i]));
+					if(Advisor)
+					{
+						if(Advisor->isAlive())
+						{
+							continueTriggering = true;
+							break;
+						}
+					}
+				}               
+				if( continueTriggering )
+				{
+					DoCast(m_creature, SPELL_BLESSING_OF_THE_TIDES);
+					DoYell(SAY_GAIN_BLESSING_OF_TIDES, LANG_UNIVERSAL, NULL);
+					DoPlaySoundToSet(m_creature, SOUND_GAIN_BLESSING_OF_TIDES);
+				}
+		}
+
         DoMeleeAttackIfReady();
     }
@@ -251,4 +333,11 @@
     uint32 LeechingThrow_Timer;
     uint32 TheBeastWithin_Timer;
+	uint32 Multishot_Timer;
+	uint32 Pet_Timer;
+
+	bool pet;
+
+	uint64 SummonedPet;
+
 
     void Reset()
@@ -256,4 +345,16 @@
         LeechingThrow_Timer = 20000;
         TheBeastWithin_Timer = 30000;
+		Multishot_Timer = 15000;
+		Pet_Timer = 10000;
+
+		pet = false;
+
+		Creature *Pet = (Creature*) Unit::GetUnit(*m_creature, SummonedPet);
+		if( Pet && Pet->isAlive() )
+		{
+			Pet->DealDamage( Pet, Pet->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false );
+		}
+		
+		SummonedPet = 0;
 
         if( pInstance )
@@ -269,5 +370,6 @@
 
             if(Karathress)
-                ((boss_fathomlord_karathressAI*)Karathress->AI())->EventSharkkisDeath();
+				if(!m_creature->isAlive() && Karathress)
+					((boss_fathomlord_karathressAI*)Karathress->AI())->EventSharkkisDeath();
         }
     }
@@ -301,5 +403,8 @@
         //someone evaded!
         if(pInstance && !pInstance->GetData(DATA_KARATHRESSEVENT))
-            EnterEvadeMode();
+		{
+			EnterEvadeMode();
+			return;
+		}
 
         //LeechingThrow_Timer
@@ -310,10 +415,49 @@
         }else LeechingThrow_Timer -= diff;
 
-        //TheBeastWithin_Timer
-        if(TheBeastWithin_Timer < diff)
-        {
-            DoCast(m_creature, SPELL_THE_BEAST_WITHIN);
-            TheBeastWithin_Timer = 30000;
-        }else TheBeastWithin_Timer -= diff;
+		//Multishot_Timer
+		if(Multishot_Timer < diff)
+		{
+			DoCast(m_creature->getVictim(), SPELL_MULTISHOT);
+			Multishot_Timer = 20000;
+		}else Multishot_Timer -= diff;
+ 
+		//TheBeastWithin_Timer
+		if(TheBeastWithin_Timer < diff)
+		{
+			DoCast(m_creature, SPELL_THE_BEAST_WITHIN);
+			Creature *Pet = (Creature*) Unit::GetUnit(*m_creature, SummonedPet);
+			if( Pet && Pet->isAlive() )
+			{
+				Pet->CastSpell( Pet, SPELL_PET_ENRAGE, true );
+			}
+			TheBeastWithin_Timer = 30000;
+		}else TheBeastWithin_Timer -= diff;
+ 
+		//Pet_Timer
+		if(Pet_Timer < diff && pet == false)
+		{
+			pet = true;
+			//uint32 spell_id;
+			uint32 pet_id;
+			switch( rand()%2 )
+			{
+			case 0:
+				//spell_id = SPELL_SUMMON_FATHOM_LURKER;
+				pet_id = CREATURE_FATHOM_LURKER;
+				break;
+			case 1:
+				//spell_id = SPELL_SUMMON_FATHOM_SPOREBAT;
+				pet_id = CREATURE_FATHOM_SPOREBAT;
+				break;
+			}
+			//DoCast( m_creature, spell_id, true );
+			Creature *Pet = DoSpawnCreature(pet_id,0,0,0,0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000 );
+			Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0);
+			if (Pet && target)
+			{
+				Pet->AI()->AttackStart(target);
+				SummonedPet = Pet->GetGUID();
+			}
+		}else Pet_Timer -= diff;
 
         DoMeleeAttackIfReady();
@@ -333,8 +477,14 @@
 
     uint32 FrostShock_Timer;
+	uint32 Spitfire_Timer;
+	uint32 PoisonCleansing_Timer;
+	uint32 Earthbind_Timer;
 
     void Reset()
     {
         FrostShock_Timer = 25000;
+		Spitfire_Timer = 60000;
+		PoisonCleansing_Timer = 30000;
+		Earthbind_Timer = 45000;
 
         if( pInstance )
@@ -350,5 +500,6 @@
 
             if(Karathress)
-                ((boss_fathomlord_karathressAI*)Karathress->AI())->EventTidalvessDeath();
+				if(!m_creature->isAlive() && Karathress)
+					((boss_fathomlord_karathressAI*)Karathress->AI())->EventTidalvessDeath();
         }
     }
@@ -361,4 +512,5 @@
             pInstance->SetData(DATA_KARATHRESSEVENT, IN_PROGRESS);
         }
+		DoCast(m_creature, SPELL_WINDFURY_WEAPON);
     }
 
@@ -382,5 +534,13 @@
         //someone evaded!
         if(pInstance && !pInstance->GetData(DATA_KARATHRESSEVENT))
+		{
             EnterEvadeMode();
+			return;
+		}
+
+		if( !m_creature->HasAura(SPELL_WINDFURY_WEAPON, 0) )
+		{
+			DoCast(m_creature, SPELL_WINDFURY_WEAPON);
+		}
 
         //FrostShock_Timer
@@ -391,4 +551,30 @@
         }else FrostShock_Timer -= diff;
 
+		//Spitfire_Timer
+		if(Spitfire_Timer < diff)
+		{
+			DoCast(m_creature, SPELL_SPITFIRE_TOTEM);
+			Unit *SpitfireTotem = Unit::GetUnit( *m_creature, CREATURE_SPITFIRE_TOTEM );
+			if( SpitfireTotem )
+			{
+				((Creature*)SpitfireTotem)->AI()->AttackStart( m_creature->getVictim() );
+			}
+			Spitfire_Timer = 60000;
+		}else Spitfire_Timer -= diff;
+
+		//PoisonCleansing_Timer
+		if(PoisonCleansing_Timer < diff)
+		{
+			DoCast(m_creature, SPELL_POISON_CLEANSING_TOTEM);
+			PoisonCleansing_Timer = 30000;
+		}else PoisonCleansing_Timer -= diff;
+
+		//Earthbind_Timer
+		if(Earthbind_Timer < diff)
+		{
+			DoCast(m_creature, SPELL_EARTHBIND_TOTEM);
+			Earthbind_Timer = 45000;
+		}else Earthbind_Timer -= diff;
+
         DoMeleeAttackIfReady();
     }
@@ -409,4 +595,5 @@
     uint32 TidalSurge_Timer;
     uint32 Heal_Timer;
+	uint32 Cyclone_Timer;
 
     void Reset()
@@ -415,4 +602,5 @@
         TidalSurge_Timer = 15000+rand()%5000;
         Heal_Timer = 55000;
+		Cyclone_Timer = 30000+rand()%10000;
 
         if(pInstance)
@@ -428,5 +616,6 @@
 
             if(Karathress)
-                ((boss_fathomlord_karathressAI*)Karathress->AI())->EventCaribdisDeath();
+				if(!m_creature->isAlive() && Karathress)
+					((boss_fathomlord_karathressAI*)Karathress->AI())->EventCaribdisDeath();
         }
     }
@@ -460,5 +649,8 @@
         //someone evaded!
         if(pInstance && !pInstance->GetData(DATA_KARATHRESSEVENT))
+		{
             EnterEvadeMode();
+			return;
+		}
 
         //WaterBoltVolley_Timer
@@ -473,40 +665,72 @@
         {
             DoCast(m_creature->getVictim(), SPELL_TIDAL_SURGE);
+			// Hacky way to do it - won't trigger elseways
+			m_creature->getVictim()->CastSpell( m_creature->getVictim(), SPELL_TIDAL_SURGE_FREEZE, true );
             TidalSurge_Timer = 15000+rand()%5000;
         }else TidalSurge_Timer -= diff;
 
-        //Heal_Timer
-        if(Heal_Timer < diff)
-        {
-            // It can be cast on any of the mobs
-            Unit *pUnit = NULL;
-
-            if(pInstance)
-            {
-                switch(rand()%4)
-                {
-                    case 0:
-                        pUnit = Unit::GetUnit((*m_creature), pInstance->GetData64(DATA_KARATHRESS));
-                        break;
-                    case 1:
-                        pUnit = Unit::GetUnit((*m_creature), pInstance->GetData64(DATA_SHARKKIS));
-                        break;
-                    case 2:
-                        pUnit = Unit::GetUnit((*m_creature), pInstance->GetData64(DATA_TIDALVESS));
-                        break;
-                    case 3:
-                        pUnit = m_creature;
-                        break;
-                }
-            }else pUnit = m_creature;
-
-            if(pUnit && pUnit->isAlive())
-                DoCast(pUnit, SPELL_HEAL);
-
-            Heal_Timer = 60000;
-        }else Heal_Timer -= diff;
-
-        DoMeleeAttackIfReady();
-    }
+		//Cyclone_Timer
+		if(Cyclone_Timer < diff)
+		{
+			//DoCast(m_creature, SPELL_SUMMON_CYCLONE); // Doesn't work
+			Cyclone_Timer = 30000+rand()%10000;
+			Creature *Cyclone = m_creature->SummonCreature(CREATURE_CYCLONE, m_creature->GetPositionX(), m_creature->GetPositionY(), m_creature->GetPositionZ(), (rand()%5), TEMPSUMMON_TIMED_DESPAWN, 15000);
+			if( Cyclone )
+			{
+				((Creature*)Cyclone)->SetFloatValue(OBJECT_FIELD_SCALE_X, 3.0f);
+				Cyclone->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+				Cyclone->setFaction(m_creature->getFaction());
+				Cyclone->CastSpell(Cyclone, SPELL_CYCLONE_CYCLONE, true);
+				Unit *target = SelectUnit(SELECT_TARGET_RANDOM, 0);
+				if( target )
+				{
+					Cyclone->AI()->AttackStart(target);
+				}
+			}
+		}else Cyclone_Timer -= diff;
+
+		//Heal_Timer
+		if(Heal_Timer < diff)
+		{
+			// It can be cast on any of the mobs
+			Unit *pUnit = NULL;
+
+			while( pUnit == NULL || !pUnit->isAlive() )
+			{
+				pUnit = selectAdvisorUnit();
+			}
+
+			if(pUnit && pUnit->isAlive())
+				DoCast(pUnit, SPELL_HEAL);
+			Heal_Timer = 60000;
+		}else Heal_Timer -= diff;
+
+		DoMeleeAttackIfReady();
+	}
+
+	Unit* selectAdvisorUnit()
+	{
+		Unit* pUnit;
+		if(pInstance)
+		{
+			switch(rand()%4)
+			{
+			case 0:
+				pUnit = Unit::GetUnit((*m_creature), pInstance->GetData64(DATA_KARATHRESS));
+				break;
+			case 1:
+				pUnit = Unit::GetUnit((*m_creature), pInstance->GetData64(DATA_SHARKKIS));
+				break; 
+			case 2:
+				pUnit = Unit::GetUnit((*m_creature), pInstance->GetData64(DATA_TIDALVESS));
+				break;
+			case 3:
+				pUnit = m_creature;
+				break;
+            }
+        }else pUnit = m_creature;
+ 
+                return pUnit;
+        }
 };
 
