diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/bindings/scripts/scripts/zone/naxxramas/boss_kelthuzad.cpp | 147 |
1 files changed, 37 insertions, 110 deletions
diff --git a/src/bindings/scripts/scripts/zone/naxxramas/boss_kelthuzad.cpp b/src/bindings/scripts/scripts/zone/naxxramas/boss_kelthuzad.cpp index 218ebf6619e..71141a9d4a7 100644 --- a/src/bindings/scripts/scripts/zone/naxxramas/boss_kelthuzad.cpp +++ b/src/bindings/scripts/scripts/zone/naxxramas/boss_kelthuzad.cpp @@ -22,6 +22,7 @@ SDCategory: Naxxramas EndScriptData */ #include "precompiled.h" +#include "def_naxxramas.h" //when shappiron dies. dialog between kel and lich king (in this order) #define SAY_SAPP_DIALOG1 -1533084 @@ -41,17 +42,12 @@ EndScriptData */ #define SAY_SUMMON_MINIONS -1533105 //start of phase 1 -#define SAY_AGGRO1 -1533094 //start of phase 2 -#define SAY_AGGRO2 -1533095 -#define SAY_AGGRO3 -1533096 - -#define SAY_SLAY1 -1533097 -#define SAY_SLAY2 -1533098 +#define SAY_AGGRO RAND(-1533094,-1533095,-1533096) //start of phase 2 +#define SAY_SLAY RAND(-1533097,-1533098) #define SAY_DEATH -1533099 -#define SAY_CHAIN1 -1533100 -#define SAY_CHAIN2 -1533101 +#define SAY_CHAIN RAND(-1533100,-1533101) #define SAY_FROST_BLAST -1533102 #define SAY_REQUEST_AID -1533103 //start of phase 3 @@ -110,19 +106,13 @@ float Pos[12][4] = {3739.500000,-5141.883989,142.0141130, 2.121412}//RIGHT_NEAR }; -struct TRINITY_DLL_DECL boss_kelthuzadAI : public ScriptedAI +struct TRINITY_DLL_DECL boss_kelthuzadAI : public BossAI { - boss_kelthuzadAI(Creature* c) : ScriptedAI(c) + boss_kelthuzadAI(Creature* c) : BossAI(c, BOSS_KELTHUZAD) { - GuardiansOfIcecrown[0] = 0; - GuardiansOfIcecrown[1] = 0; - GuardiansOfIcecrown[2] = 0; - GuardiansOfIcecrown[3] = 0; - GuardiansOfIcecrown[4] = 0; GuardiansOfIcecrown_Count = 0; } - uint64 GuardiansOfIcecrown[5]; uint32 GuardiansOfIcecrown_Count; uint32 GuardiansOfIcecrown_Timer; @@ -144,6 +134,8 @@ struct TRINITY_DLL_DECL boss_kelthuzadAI : public ScriptedAI void Reset() { + _Reset(); + SummonWasters_Timer=3000; // 3s summon waster SummonAbominations_Timer=25000; //25s summon abomination SummonAWeavers_Timer=20000; //20s summon Weavers @@ -156,49 +148,25 @@ struct TRINITY_DLL_DECL boss_kelthuzadAI : public ScriptedAI FrostBlast_Timer = (rand()%30+30)*1000; //Random time between 30-60 seconds GuardiansOfIcecrown_Timer = 5000; //5 seconds for summoning each Guardian of Icecrown in phase 3 - for(int i=0; i<5; i++) - { - if(GuardiansOfIcecrown[i]) - { - //delete creature - Unit* pUnit = Unit::GetUnit((*m_creature), GuardiansOfIcecrown[i]); - if (pUnit && pUnit->isAlive()) - pUnit->DealDamage(pUnit, pUnit->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); - GuardiansOfIcecrown[i] = 0; - } - } - Phase1_Timer = 228000; //Phase 1 lasts 3 minutes and 48 seconds Phase=0; } void KilledUnit() { - if (rand()%2) - DoScriptText(SAY_SLAY1, m_creature); - else - DoScriptText(SAY_SLAY2, m_creature); + DoScriptText(SAY_SLAY, m_creature); } void JustDied(Unit* Killer) { + _JustDied(); DoScriptText(SAY_DEATH, m_creature); } - void SummonedCreatureDespawn(Creature *summon) - { - if(summon->GetEntry() == MOB_FISSURE) - summon->CastSpell(summon, SPELL_VOID_BLAST, true); - } - void EnterCombat(Unit* who) { - switch(rand()%3) - { - case 0: DoScriptText(SAY_AGGRO1, m_creature); break; - case 1: DoScriptText(SAY_AGGRO2, m_creature); break; - case 2: DoScriptText(SAY_AGGRO3, m_creature); break; - } + _EnterCombat(); + DoScriptText(SAY_AGGRO, me); Phase=1; } @@ -227,14 +195,6 @@ struct TRINITY_DLL_DECL boss_kelthuzadAI : public ScriptedAI case 2: Waster = m_creature->SummonCreature(MOB_WASTE,Pos[6][0], Pos[6][1], Pos[6][2], Pos[6][3], TEMPSUMMON_CORPSE_DESPAWN, 0); break; case 3: Waster = m_creature->SummonCreature(MOB_WASTE,Pos[9][0], Pos[9][1], Pos[9][2], Pos[9][3], TEMPSUMMON_CORPSE_DESPAWN, 0); break; } - - if(Waster) - { - Unit *target = NULL; - target = SelectUnit(SELECT_TARGET_RANDOM, 0); - if(target) - Waster->AI()->AttackStart(target); - } SummonWasters_Timer=3000; }else SummonWasters_Timer-=diff; @@ -250,14 +210,6 @@ struct TRINITY_DLL_DECL boss_kelthuzadAI : public ScriptedAI case 2: Abominations = m_creature->SummonCreature(MOB_ABOMINATION,Pos[7][0], Pos[7][1], Pos[7][2], Pos[7][3], TEMPSUMMON_CORPSE_DESPAWN, 0); break; case 3: Abominations = m_creature->SummonCreature(MOB_ABOMINATION,Pos[10][0], Pos[10][1], Pos[10][2], Pos[10][3], TEMPSUMMON_CORPSE_DESPAWN, 0); break; } - - if(Abominations) - { - Unit *target = NULL; - target = SelectUnit(SELECT_TARGET_RANDOM, 0); - if(target) - Abominations->AI()->AttackStart(target); - } SummonAbominations_Timer=25000; }else SummonAbominations_Timer-=diff; @@ -274,58 +226,45 @@ struct TRINITY_DLL_DECL boss_kelthuzadAI : public ScriptedAI case 3: Weavers = m_creature->SummonCreature(MOB_WEAVER,Pos[9][0], Pos[9][1], Pos[9][2], Pos[9][3], TEMPSUMMON_CORPSE_DESPAWN, 0); break; } - if(Weavers) - { - Unit *target = NULL; - target = SelectUnit(SELECT_TARGET_RANDOM, 0); - if(target) - Weavers->AI()->AttackStart(target); - } SummonAWeavers_Timer=30000; }else SummonAWeavers_Timer-=diff; } - if( Phase!=1 && m_creature->getVictim() && m_creature->isAlive()) + else if(m_creature->getVictim() && m_creature->isAlive()) { m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - //Check for Frost Bolt if(FrostBolt_Timer < diff) { DoCast(m_creature->getVictim(),SPELL_FROST_BOLT); - //Cast again on time FrostBolt_Timer = 2000; }else FrostBolt_Timer -= diff; - //Check for Frost Bolt Nova if(FrostBoltNova_Timer < diff) { - DoCast(m_creature->getVictim(),SPELL_FROST_BOLT_AOE); + DoCastAOE(SPELL_FROST_BOLT_AOE); FrostBoltNova_Timer = 15000; }else FrostBoltNova_Timer -= diff; - //Cast Chains Of Kelthuzad only on the Heroic instance - /* + if(HeroicMode) + { if(ChainsOfKelthuzad_Timer < diff) { - //DoCast(m_creature->getVictim(),SPELL_CHAINS_OF_KELTHUZAD); + if(Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0, true)) + DoCast(target, SPELL_CHAINS_OF_KELTHUZAD); - //if(rand()%2 == 0) - //DoScriptText(SAY_CHAIN1, m_creature); - //else - //DoScriptText(SAY_CHAIN2, m_creature); - ChainsOfKelthuzad_Timer = (rand()%30+30)*1000; + DoScriptText(SAY_CHAIN, me); + ChainsOfKelthuzad_Timer = (rand()%30+30)*1000; }else ChainsOfKelthuzad_Timer -= diff; - */ + } //Check for Mana Detonation if(ManaDetonation_Timer < diff) { - std::list<HostilReference*> *threatList = &me->getThreatManager().getThreatList(); - std::list<HostilReference*>::iterator itr = threatList->begin(); std::vector<Unit*> unitList; - for(;itr != threatList->end(); ++itr) + std::list<HostilReference*> *threatList = &me->getThreatManager().getThreatList(); + for(std::list<HostilReference*>::const_iterator itr = threatList->begin(); itr != threatList->end(); ++itr) { if((*itr)->getTarget()->GetTypeId() == TYPEID_PLAYER && (*itr)->getTarget()->getPowerType() == POWER_MANA @@ -362,28 +301,27 @@ struct TRINITY_DLL_DECL boss_kelthuzadAI : public ScriptedAI //cast Frost Blast to a random player if(FrostBlast_Timer < diff) { - if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0)) - { + if(Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0)) DoCast(target,SPELL_FROST_BLAST); - //obviously the spell doesn't work like the description - //So, we need script this spell? - } if(rand()%2 == 0) DoScriptText(SAY_FROST_BLAST, m_creature); FrostBlast_Timer = (rand()%30+30)*1000; }else FrostBlast_Timer -= diff; //start phase 3 when we are 40% health - if( Phase!=3 && (m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) < 40) + if(Phase != 3) { - Phase = 3 ; - DoScriptText(SAY_REQUEST_AID, m_creature); - //here Lich King should respond to KelThuzad but I don't know which creature to make talk - //so for now just make Kelthuzad says it. - DoScriptText(SAY_ANSWER_REQUEST, m_creature); + if(HealthBelowPct(40)) + { + Phase = 3 ; + DoScriptText(SAY_REQUEST_AID, m_creature); + //here Lich King should respond to KelThuzad but I don't know which creature to make talk + //so for now just make Kelthuzad says it. + DoScriptText(SAY_ANSWER_REQUEST, m_creature); + } } - - if(Phase==3 && (GuardiansOfIcecrown_Count < 2)) //in normal raid ,only two Icecrown + else if(GuardiansOfIcecrown_Count < 2) //in normal raid ,only two Icecrown + { if(GuardiansOfIcecrown_Timer < diff) { //Summon a Guardian of Icecrown in a random alcove @@ -401,26 +339,15 @@ struct TRINITY_DLL_DECL boss_kelthuzadAI : public ScriptedAI break; } - if (pUnit) - { - - if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0)) - { - pUnit->AI()->AttackStart(target); - } - //Safe storing of creatures - GuardiansOfIcecrown[GuardiansOfIcecrown_Count] = pUnit->GetGUID(); - //Update guardian count GuardiansOfIcecrown_Count++; - - } //5 seconds until summoning next guardian GuardiansOfIcecrown_Timer = 5000; } else GuardiansOfIcecrown_Timer -= diff; + } - DoMeleeAttackIfReady(); + DoMeleeAttackIfReady(); } } }; |