All pastes #1038685 Raw Edit

Stuff

public diff v1 · immutable
#1038685 ·published 2008-06-04 15:17 UTC
rendered paste body
Index: scripts/zone/black_temple/boss_warlord_najentus.cpp===================================================================--- scripts/zone/black_temple/boss_warlord_najentus.cpp	(Revision 424)+++ scripts/zone/black_temple/boss_warlord_najentus.cpp	(Arbeitskopie)@@ -17,7 +17,7 @@ /* ScriptData SDName: Boss_Warlord_Najentus SD%Complete: 90-SDComment: Using a creature workaround instead of a GO for Impaling Spine.+SDComment: Needle Spine Correct Timer has to be found SDCategory: Black Temple EndScriptData */ @@ -59,58 +59,17 @@ #define SOUND_DEATH     11459  //Spells-#define SPELL_CRASHINGWAVE             40100 #define SPELL_NEEDLE_SPINE             39835 #define SPELL_NEEDLE_AOE               39968 #define SPELL_TIDAL_BURST              39878-#define SPELL_TIDAL_SHIELD             39872 // Not going to use this since Hurl Spine doesn't dispel it.-#define SPELL_IMPALING_SPINE           39837+#define SPELL_TIDAL_SHIELD             39872 +#define SPELL_IMPALING_SPINE           39837  #define SPELL_CREATE_NAJENTUS_SPINE    39956 #define SPELL_HURL_SPINE               39948-#define SPELL_SHIELD_VISUAL            37136 #define SPELL_BERSERK                  45078  #define DISPLAYID_SPINE         7362 -struct MANGOS_DLL_DECL mob_najentus_spineAI : public ScriptedAI-{-    mob_najentus_spineAI(Creature *c) : ScriptedAI(c)-    {-        Reset();-    }-    -    uint64 SpineVictimGUID;--    void Reset() {  SpineVictimGUID = 0; }--    void SetSpineVictimGUID(uint64 guid){ SpineVictimGUID = guid; }--    void JustDied(Unit *killer)-    {-        // Make the killer have the Najentus Spine item to pierce Tidal Shield-        if(killer)-            killer->CastSpell(killer, SPELL_CREATE_NAJENTUS_SPINE, true);-    }--    void DamageTaken(Unit *done_by, uint32 &damage)-    {-        if(damage < m_creature->GetHealth()) return;-        -        // Remove the Impaling Spine DoT from whoever was affected-        if(SpineVictimGUID)-        {-            Unit* victim = Unit::GetUnit((*m_creature), SpineVictimGUID);-            if(victim && ((victim->HasAura(SPELL_IMPALING_SPINE, 0)) || (victim->HasAura(SPELL_IMPALING_SPINE, 1)) || (victim->HasAura(SPELL_IMPALING_SPINE, 2))))-                victim->RemoveAurasDueToSpell(SPELL_IMPALING_SPINE);-        }-    }--    void Aggro(Unit* who) {}-    void AttackStart(Unit* who) {}-    void MoveInLineOfSight(Unit* who) {}-    void UpdateAI(const uint32 diff) {}-};- struct MANGOS_DLL_DECL boss_najentusAI : public ScriptedAI {     boss_najentusAI(Creature *c) : ScriptedAI(c) @@ -120,14 +79,11 @@     }      ScriptedInstance* pInstance;-    uint32 CrashingWaveTimer;     uint32 NeedleSpineTimer;     uint32 EnrageTimer;     uint32 SpecialYellTimer;     uint32 TidalShieldTimer;-    uint32 ImpalingSpineTimer;-    uint32 CheckTimer; // This timer checks if Najentus is Tidal Shielded and if so, regens health. If not, sets IsShielded to false-    uint32 DispelShieldTimer; // This shield is only supposed to last 30 seconds, but the SPELL_SHIELD_VISUAL lasts forever+    uint32 ImpalingSpineTimer; // Used @ 20 and 40 sec.      uint64 SpineTargetGUID;     uint64 SpineGUID;@@ -138,14 +94,11 @@     {         IsShielded = false; -        CrashingWaveTimer = 28000;         NeedleSpineTimer = 10000;         EnrageTimer = 480000;         SpecialYellTimer = 45000 + (rand()%76)*1000;         TidalShieldTimer = 60000;-        ImpalingSpineTimer = 45000;-        CheckTimer = 2000;-        DispelShieldTimer = 30000;+        ImpalingSpineTimer = 20000;          SpineTargetGUID = 0;         SpineGUID = 0;@@ -180,26 +133,16 @@      void SpellHit(Unit *caster, const SpellEntry *spell)     {-        if(IsShielded)+	if(IsShielded && spell->Id == SPELL_HURL_SPINE)         {-            if(spell->Id == SPELL_HURL_SPINE)-            {-                if(m_creature->HasAura(SPELL_SHIELD_VISUAL, 0))-                    m_creature->RemoveAurasDueToSpell(SPELL_SHIELD_VISUAL);-                if(m_creature->HasAura(SPELL_TIDAL_SHIELD, 0))-                    m_creature->RemoveAurasDueToSpell(SPELL_TIDAL_SHIELD);-                DoCast(m_creature->getVictim(), SPELL_TIDAL_BURST);-                IsShielded = false;-            }+            m_creature->RemoveAurasDueToSpell(SPELL_TIDAL_SHIELD);+            DoCast(m_creature->getVictim(), SPELL_TIDAL_BURST);+	    //needle spine not used for 15 seconds after shield destroyed+	    NeedleSpineTimer=15000;	+            IsShielded = false;         }     } -    void DamageTaken(Unit *done_by, uint32 &damage)-    {-        if(IsShielded)-            damage = 0;-    }-     void Aggro(Unit *who)     {         if(pInstance)@@ -211,50 +154,14 @@         DoZoneInCombat();     } -    // This is a workaround since we cannot summon GameObjects at will.-    // Instead, we create a custom creature on top of the player.-    // When someone kills the creature, the killer gets the "Naj'entus Spine" item.-    // This item is the only item that should be able to pierce Tidal Shield-    void DoImpalingSpineWorkaround(Unit* target)-    {-        Creature* Spine = NULL;-        Spine = m_creature->SummonCreature(500000, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_DEAD_DESPAWN, 10000);-        if(Spine)-        {-            Spine->setFaction(m_creature->getFaction());-            ((mob_najentus_spineAI*)Spine->AI())->SetSpineVictimGUID(target->GetGUID());-            SpineTargetGUID = target->GetGUID();-        }-    }--    void SummonImpalingSpine(Unit* target)-    {-        if(!pInstance || !target)-            return;--        SpineGUID = pInstance->GetData64(DATA_NAJENTUS_SPINE);-        if(!SpineGUID)-            return;--        GameObject* Spine = GameObject::GetGameObject((*m_creature), SpineGUID);-        if(!Spine)-            return;--        float x = target->GetPositionX();-        float y = target->GetPositionY();-        float z = target->GetPositionZ();-        Spine->Relocate(x, y, z, Spine->GetOrientation());-        Spine->SetFloatValue(GAMEOBJECT_POS_X, x);-        Spine->SetFloatValue(GAMEOBJECT_POS_Y, y);-        Spine->SetFloatValue(GAMEOBJECT_POS_Z, z);-        Spine->SetUInt32Value(GAMEOBJECT_DISPLAYID, DISPLAYID_SPINE);--        Spine->SendUpdateObjectToAllExcept(NULL);-    }-     bool RemoveImpalingSpine(uint64 guid)     {-        if(!IsShielded || guid == SpineTargetGUID) return false;+	//should not happen, gamobject is unusable while stuned+        if(guid == SpineTargetGUID) +	{+	    error_log("ERROR: Na'entus Spine GameObject used by affected Player");+	    return false;+	}          if(SpineTargetGUID)         {@@ -275,41 +182,14 @@         if (!m_creature->SelectHostilTarget() || !m_creature->getVictim())             return; -        if(CheckTimer < diff)+        if (m_creature->HasAura(SPELL_TIDAL_SHIELD, 0))         {-            // if(m_creature->HasAura(SPELL_TIDAL_SHIELD, 0))-            if(m_creature->HasAura(SPELL_SHIELD_VISUAL, 0))-                m_creature->SetHealth(m_creature->GetHealth() + (m_creature->GetMaxHealth()/100));-            else-                IsShielded = false;--            CheckTimer = 2000;-        }else CheckTimer -= diff;--        if(IsShielded)-        {             m_creature->GetMotionMaster()->Clear(false);             m_creature->GetMotionMaster()->Idle();-            if(!m_creature->HasAura(SPELL_SHIELD_VISUAL, 0))-                DoCast(m_creature, SPELL_SHIELD_VISUAL);-            if(DispelShieldTimer < diff)-            {-                m_creature->GetMotionMaster()->Mutate(new TargetedMovementGenerator<Creature>(*m_creature->getVictim()));-                if(m_creature->HasAura(SPELL_SHIELD_VISUAL, 0))-                    m_creature->RemoveAurasDueToSpell(SPELL_SHIELD_VISUAL);-                IsShielded = false;-            }else DispelShieldTimer -= diff;-            -            return; // Don't cast or do anything while Shielded-        }+//	    DoMeleeAttackIfReady();	// Do only melee attack while shielded+            return;	+        } else IsShielded = false;             -        // Crashing Wave-        if(CrashingWaveTimer < diff)-        {-            DoCast(m_creature->getVictim(), SPELL_CRASHINGWAVE);-            CrashingWaveTimer = 28500;-        }else CrashingWaveTimer -= diff;-         if(!m_creature->HasAura(SPELL_BERSERK, 0))             if(EnrageTimer < diff)             {@@ -321,17 +201,22 @@         // Needle         if(NeedleSpineTimer < diff)         {-            for(uint8 i = 0; i < 3; i++)-            {+	    //Select 3 random player for needel spine (raid guides tell it should be 1-3 players)+	    // Some routine that ensures different targets are selected is needed here+	    for(uint8 i = 0; i < 3; i++)	+            {	                 Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 1);                 if(!target)                     target = m_creature->getVictim();--                DoCast(target, SPELL_NEEDLE_AOE, true);+		+		+		target->CastSpell(target,SPELL_NEEDLE_AOE,false,NULL,NULL,m_creature->GetGUID());+//		DoCast(target, SPELL_NEEDLE_AOE, true);                 DoCast(target, SPELL_NEEDLE_SPINE);+		             }-            -            NeedleSpineTimer = 60000;+            // Correct Value is needed here+            NeedleSpineTimer = 10000;	         }else NeedleSpineTimer -= diff;          if(SpecialYellTimer < diff)@@ -349,47 +234,47 @@             SpecialYellTimer = 25000 + (rand()%76)*1000;         }else SpecialYellTimer -= diff; -        if(ImpalingSpineTimer < diff)-        {-            Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 1);-            if(!target)-                target = m_creature->getVictim();--            if(target && (target->GetTypeId() == TYPEID_PLAYER))-            {-                DoCast(target, SPELL_IMPALING_SPINE);-                //DoImpalingSpineWorkaround(target);-                SpineTargetGUID = target->GetGUID();-                SummonImpalingSpine(target);-                ImpalingSpineTimer = 45000;-            -                switch(rand()%2)-                {-                    case 0:-                        DoYell(SAY_NEEDLE1, LANG_UNIVERSAL, NULL);-                        DoPlaySoundToSet(m_creature, SOUND_NEEDLE1);-                        break;-                    case 1:-                        DoYell(SAY_NEEDLE2, LANG_UNIVERSAL, NULL);-                        DoPlaySoundToSet(m_creature, SOUND_NEEDLE2);-                        break;-                }-            }-        }else ImpalingSpineTimer -= diff;-         if(TidalShieldTimer < diff)         {             m_creature->InterruptNonMeleeSpells(false);-            DoCast(m_creature, SPELL_SHIELD_VISUAL, true);-            // DoCast(m_creature, SPELL_TIDAL_SHIELD);+            DoCast(m_creature, SPELL_TIDAL_SHIELD);             m_creature->GetMotionMaster()->Clear(false);             m_creature->GetMotionMaster()->Idle();             IsShielded = true;             TidalShieldTimer = 60000;-            CheckTimer = 2000;-            DispelShieldTimer = 30000;-        }else TidalShieldTimer -= diff;+	    //ensure Impaling spine only used @ 20 and 40 seconds+	    ImpalingSpineTimer=20000;+        }else +	{+	    TidalShieldTimer -= diff;+	    //use Impaing Spine in else part to not loose the the first diff interval when shield activated+    	    if(ImpalingSpineTimer < diff) +    	    {+		Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 1);+        	if(!target)+            	    target = m_creature->getVictim(); +        	if(target && (target->GetTypeId() == TYPEID_PLAYER))+        	{+            	    DoCast(target, SPELL_IMPALING_SPINE);+            	    SpineTargetGUID = target->GetGUID();+            	    ImpalingSpineTimer = 20000;+            +            	    switch(rand()%2)+            	    {+                	case 0:+                    	    DoYell(SAY_NEEDLE1, LANG_UNIVERSAL, NULL);+                    	    DoPlaySoundToSet(m_creature, SOUND_NEEDLE1);+                    	    break;+                	case 1:+                    	    DoYell(SAY_NEEDLE2, LANG_UNIVERSAL, NULL);+                    	    DoPlaySoundToSet(m_creature, SOUND_NEEDLE2);+                    	    break;+            	    }+        	}+    	    }else ImpalingSpineTimer -= diff;+	}+         DoMeleeAttackIfReady();     } };@@ -405,8 +290,11 @@             Creature* Najentus = ((Creature*)Unit::GetUnit((*_GO), NajentusGUID));             if(Najentus)             {+		((boss_najentusAI*)Najentus->AI())->DoYell("Removing Spine!", LANG_UNIVERSAL, NULL);                 if(((boss_najentusAI*)Najentus->AI())->RemoveImpalingSpine(player->GetGUID()))                     _GO->SendObjectDeSpawnAnim(player->GetGUID());+		else ((boss_najentusAI*)Najentus->AI())->DoYell("Removing Failed!", LANG_UNIVERSAL, NULL);+		             }else error_log("ERROR: Na'entus Spine GameObject unable to find Naj'entus");         }else error_log("ERROR: Invalid GUID acquired for Naj'entus by Naj'entus Spine GameObject");     }@@ -415,10 +303,6 @@     return true; } -CreatureAI* GetAI_mob_najentus_spine(Creature *_Creature)-{-    return new mob_najentus_spineAI (_Creature);-}  CreatureAI* GetAI_boss_najentus(Creature *_Creature) {@@ -434,11 +318,6 @@     m_scripts[nrscripts++] = newscript;      newscript = new Script;-    newscript->Name = "mob_najentus_spine";-    newscript->GetAI = GetAI_mob_najentus_spine;-    m_scripts[nrscripts++] = newscript;--    newscript = new Script;     newscript->Name = "go_najentus_spine";     newscript->pGOHello = &GOHello_go_najentus_spine;     m_scripts[nrscripts++] = newscript;