aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_kaelthas.cpp298
1 files changed, 183 insertions, 115 deletions
diff --git a/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_kaelthas.cpp b/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_kaelthas.cpp
index 7f649b30495..40a97c548bc 100644
--- a/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_kaelthas.cpp
+++ b/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_kaelthas.cpp
@@ -17,7 +17,7 @@
/* ScriptData
SDName: boss_Kaelthas
SD%Complete: 60
-SDComment: SQL, phase 2, phase 3, Mind Control, taunt immunity
+SDComment: Mind Control, Reset Event if Weapons despawn/reset
SDCategory: Tempest Keep, The Eye
EndScriptData */
@@ -76,14 +76,14 @@ EndScriptData */
#define SPELL_WEAPON_SPAWN 41236
//Phase 4 spells
-#define SPELL_FIREBALL 22088 //wrong but works with CastCustomSpell
+#define SPELL_FIREBALL 36805
#define SPELL_PYROBLAST 36819
#define SPELL_FLAME_STRIKE 36735
#define SPELL_FLAME_STRIKE_VIS 36730
#define SPELL_FLAME_STRIKE_DMG 36731
#define SPELL_ARCANE_DISRUPTION 36834
#define SPELL_SHOCK_BARRIER 36815
-#define SPELL_PHOENIX_ANIMATION 36723
+#define SPELL_SUMMON_PHOENIX 36723
#define SPELL_MIND_CONTROL 32830
//Phase 5 spells
@@ -270,7 +270,7 @@ struct TRINITY_DLL_DECL advisorbase_ai : public ScriptedAI
//Kael'thas AI
struct TRINITY_DLL_DECL boss_kaelthasAI : public ScriptedAI
{
- boss_kaelthasAI(Creature *c) : ScriptedAI(c)
+ boss_kaelthasAI(Creature *c) : ScriptedAI(c), Summons(m_creature)
{
pInstance = ((ScriptedInstance*)c->GetInstanceData());
AdvisorGuid[0] = 0;
@@ -281,6 +281,7 @@ struct TRINITY_DLL_DECL boss_kaelthasAI : public ScriptedAI
}
ScriptedInstance* pInstance;
+ SummonList Summons;
uint32 Fireball_Timer;
uint32 ArcaneDisruption_Timer;
@@ -292,6 +293,7 @@ struct TRINITY_DLL_DECL boss_kaelthasAI : public ScriptedAI
uint32 NetherVapor_Timer;
uint32 FlameStrike_Timer;
uint32 MindControl_Timer;
+ uint32 Check_Timer;
uint32 Phase;
uint32 PhaseSubphase; //generic
uint32 Phase_Timer; //generic timer
@@ -302,6 +304,34 @@ struct TRINITY_DLL_DECL boss_kaelthasAI : public ScriptedAI
bool ChainPyros;
uint64 AdvisorGuid[4];
+ uint64 WeaponGuid[7];
+
+ void DeleteLegs()
+ {
+ InstanceMap::PlayerList const &playerliste = ((InstanceMap*)m_creature->GetMap())->GetPlayers();
+ InstanceMap::PlayerList::const_iterator it;
+
+ Map::PlayerList const &PlayerList = ((InstanceMap*)m_creature->GetMap())->GetPlayers();
+ for(Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
+ {
+ Player* i_pl = i->getSource();
+ i_pl->DestroyItemCount(30312, 1, true);
+ i_pl->DestroyItemCount(30311, 1, true);
+ i_pl->DestroyItemCount(30317, 1, true);
+ i_pl->DestroyItemCount(30316, 1, true);
+ i_pl->DestroyItemCount(30313, 1, true);
+ i_pl->DestroyItemCount(30314, 1, true);
+ i_pl->DestroyItemCount(30318, 1, true);
+ i_pl->DestroyItemCount(30319, 1, true);
+ i_pl->DestroyItemCount(30320, 1, true);
+ }
+ if(pInstance) {
+ for(uint32 i = 0; i < 7; i++) {
+ Creature* weapon = (Creature*)(Unit::GetUnit((*m_creature), WeaponGuid[i]));;
+ delete weapon;
+ }
+ }
+ }
void Reset()
{
@@ -315,6 +345,7 @@ struct TRINITY_DLL_DECL boss_kaelthasAI : public ScriptedAI
GravityLapse_Phase = 0;
NetherBeam_Timer = 8000;
NetherVapor_Timer = 10000;
+ Check_Timer = 4000;
PyrosCasted = 0;
Phase = 0;
InGravityLapse = false;
@@ -323,12 +354,18 @@ struct TRINITY_DLL_DECL boss_kaelthasAI : public ScriptedAI
if(InCombat)
PrepareAdvisors();
+ DeleteLegs();
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ m_creature->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, true);
+ m_creature->ApplySpellImmune(0, IMMUNITY_EFFECT,SPELL_EFFECT_ATTACK_ME, true);
+
if(pInstance)
pInstance->SetData(DATA_KAELTHASEVENT, NOT_STARTED);
+
+ Summons.DespawnEntry(PHOENIX);
}
void PrepareAdvisors()
@@ -356,6 +393,7 @@ struct TRINITY_DLL_DECL boss_kaelthasAI : public ScriptedAI
AdvisorGuid[1] = pInstance->GetData64(DATA_LORDSANGUINAR);
AdvisorGuid[2] = pInstance->GetData64(DATA_GRANDASTROMANCERCAPERNIAN);
AdvisorGuid[3] = pInstance->GetData64(DATA_MASTERENGINEERTELONICUS);
+ m_creature->addUnitState(UNIT_STAT_STUNNED);
if(!AdvisorGuid[0] || !AdvisorGuid[1] || !AdvisorGuid[2] || !AdvisorGuid[3])
{
@@ -400,6 +438,17 @@ struct TRINITY_DLL_DECL boss_kaelthasAI : public ScriptedAI
}
}
+ void JustSummoned(Creature* summoned)
+ {
+ if(summoned->GetEntry() == PHOENIX)
+ {
+ summoned->setFaction(m_creature->getFaction());
+ Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0);
+ summoned->AI()->AttackStart(target);
+ Summons.Summon(summoned);
+ }
+ }
+
void JustDied(Unit* Killer)
{
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
@@ -407,6 +456,8 @@ struct TRINITY_DLL_DECL boss_kaelthasAI : public ScriptedAI
DoScriptText(SAY_DEATH, m_creature);
+ DeleteLegs();
+
if(pInstance)
pInstance->SetData(DATA_KAELTHASEVENT, DONE);
@@ -631,11 +682,10 @@ struct TRINITY_DLL_DECL boss_kaelthasAI : public ScriptedAI
//Spawn weapons
if (PhaseSubphase == 1)
{
- Unit* Target = SelectUnit(SELECT_TARGET_RANDOM, 0);
-
Creature* Weapon;
for (uint32 i = 0; i < 7; i++)
{
+ Unit* Target = SelectUnit(SELECT_TARGET_RANDOM, 0);
Weapon = m_creature->SummonCreature(((uint32)KaelthasWeapons[i][0]),KaelthasWeapons[i][1],KaelthasWeapons[i][2],KaelthasWeapons[i][3],0,TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000);
if (!Weapon)
@@ -645,6 +695,7 @@ struct TRINITY_DLL_DECL boss_kaelthasAI : public ScriptedAI
Weapon->setFaction(m_creature->getFaction());
Weapon->AI()->AttackStart(Target);
Weapon->CastSpell(Weapon, SPELL_WEAPON_SPAWN, false);
+ WeaponGuid[i] = Weapon->GetGUID();
}
}
@@ -660,6 +711,7 @@ struct TRINITY_DLL_DECL boss_kaelthasAI : public ScriptedAI
Phase = 3;
PhaseSubphase = 0;
}else Phase_Timer -= diff;
+ //missing Resetcheck
}break;
case 3:
@@ -694,6 +746,7 @@ struct TRINITY_DLL_DECL boss_kaelthasAI : public ScriptedAI
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0))
{
+ m_creature->clearUnitState(UNIT_STAT_STUNNED);
AttackStart(target);
}
Phase_Timer = 30000;
@@ -720,8 +773,7 @@ struct TRINITY_DLL_DECL boss_kaelthasAI : public ScriptedAI
{
//interruptable
m_creature->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_INTERRUPT_CAST, false);
- int32 dmg = 20000+rand()%5000;
- m_creature->CastCustomSpell(m_creature->getVictim(), SPELL_FIREBALL, &dmg, 0, 0, false);
+ m_creature->CastSpell(m_creature->getVictim(), SPELL_FIREBALL, false);
IsCastingFireball = true;
Fireball_Timer = 2500;
}
@@ -745,7 +797,7 @@ struct TRINITY_DLL_DECL boss_kaelthasAI : public ScriptedAI
if (FlameStrike_Timer < diff)
{
- if (Unit* pUnit = SelectUnit(SELECT_TARGET_RANDOM, 0))
+ if (Unit* pUnit = SelectUnit(SELECT_TARGET_RANDOM, 0, 70, true))
DoCast(pUnit, SPELL_FLAME_STRIKE);
FlameStrike_Timer = 30000;
@@ -754,10 +806,13 @@ struct TRINITY_DLL_DECL boss_kaelthasAI : public ScriptedAI
if (MindControl_Timer < diff)
{
if (m_creature->getThreatManager().getThreatList().size() >= 2)
- for (uint32 i = 0; i < 3; i++)
+ for (uint32 i = 0; i < 3; i++)
{
- debug_log("SD2: Kael'Thas mind control not supported.");
- //DoCast(pUnit, SPELL_MIND_CONTROL);
+
+ Unit* target =SelectUnit(SELECT_TARGET_RANDOM, 1, 70, true);
+ if(!target) target = m_creature->getVictim();
+ debug_log("SD2: Kael'Thas mind control not supported.");
+ DoCast(target, SPELL_MIND_CONTROL);
}
MindControl_Timer = 60000;
@@ -767,18 +822,9 @@ struct TRINITY_DLL_DECL boss_kaelthasAI : public ScriptedAI
//Phoenix_Timer
if(Phoenix_Timer < diff)
{
- DoCast(m_creature, SPELL_PHOENIX_ANIMATION);
- Creature *Phoenix = DoSpawnCreature(PHOENIX, 0, 0, 0, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 45000);
-
- if(Phoenix)
- {
- Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0);
- if (target)
- Phoenix->AI()->AttackStart(target);
- }else error_log("SD2: Kael'Thas Phoenix could not be spawned");
-
- switch(rand()%2)
- {
+ DoCast(m_creature, SPELL_SUMMON_PHOENIX);
+ switch(rand()%2)
+ {
case 0: DoScriptText(SAY_SUMMON_PHOENIX1, m_creature); break;
case 1: DoScriptText(SAY_SUMMON_PHOENIX2, m_creature); break;
}
@@ -814,26 +860,28 @@ struct TRINITY_DLL_DECL boss_kaelthasAI : public ScriptedAI
DoCast(m_creature, SPELL_SHOCK_BARRIER);
ChainPyros = true;
PyrosCasted = 0;
+ Check_Timer = 0;
ShockBarrier_Timer = 60000;
}else ShockBarrier_Timer -= diff;
//Chain Pyros (3 of them max)
- if (ChainPyros && !m_creature->IsNonMeleeSpellCasted(false))
- {
- if (PyrosCasted < 3)
+ if (ChainPyros){
+ if (PyrosCasted < 3 && Check_Timer < diff)
{
DoCast(m_creature->getVictim(), SPELL_PYROBLAST);
PyrosCasted++;
- }else
- {
+ Check_Timer = 4400;
+ }else Check_Timer -= diff;
+ if(PyrosCasted > 3)
+ {
ChainPyros = false;
Fireball_Timer = 2500;
ArcaneDisruption_Timer = 60000;
}
}
- }
+ }else Check_Timer -= 4100;
if (Phase == 5)
{
@@ -844,6 +892,7 @@ struct TRINITY_DLL_DECL boss_kaelthasAI : public ScriptedAI
DoCast(m_creature, SPELL_EXPLODE);
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
Phase = 6;
+ DoStartMovement(m_creature->getVictim());
AttackStart(m_creature->getVictim());
}else Phase_Timer -= diff;
}
@@ -940,6 +989,7 @@ struct TRINITY_DLL_DECL boss_kaelthasAI : public ScriptedAI
InGravityLapse = false;
GravityLapse_Timer = 60000;
GravityLapse_Phase = 0;
+ DoStartMovement(m_creature->getVictim());
AttackStart(m_creature->getVictim());
DoResetThreat();
break;
@@ -952,7 +1002,6 @@ struct TRINITY_DLL_DECL boss_kaelthasAI : public ScriptedAI
if(ShockBarrier_Timer < diff)
{
DoCast(m_creature, SPELL_SHOCK_BARRIER);
-
ShockBarrier_Timer = 20000;
}else ShockBarrier_Timer -= diff;
@@ -1024,7 +1073,7 @@ struct TRINITY_DLL_DECL boss_thaladred_the_darkenerAI : public advisorbase_ai
//Gaze_Timer
if(Gaze_Timer < diff)
{
- if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0))
+ if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0, 100, true))
{
DoResetThreat();
m_creature->AddThreat(target, 5000000.0f);
@@ -1349,93 +1398,112 @@ struct TRINITY_DLL_DECL mob_kael_flamestrikeAI : public ScriptedAI
//Phoenix AI
struct TRINITY_DLL_DECL mob_phoenix_tkAI : public ScriptedAI
{
- mob_phoenix_tkAI(Creature *c) : ScriptedAI(c) {Reset();}
-
- uint32 Cycle_Timer;
-
- void Reset()
- {
- Cycle_Timer = 2000;
- m_creature->CastSpell(m_creature,SPELL_BURN,true);
- }
-
- void Aggro(Unit *who) { }
-
- void JustDied(Unit* killer)
- {
- //is this spell in use anylonger?
- //m_creature->CastSpell(m_creature,SPELL_EMBER_BLAST,true);
- m_creature->SummonCreature(PHOENIX_EGG,m_creature->GetPositionX(),m_creature->GetPositionY(),m_creature->GetPositionZ(),m_creature->GetOrientation(),TEMPSUMMON_TIMED_DESPAWN,16000);
- }
-
- void UpdateAI(const uint32 diff)
- {
- if (!m_creature->SelectHostilTarget() || !m_creature->getVictim())
- return;
-
- if (Cycle_Timer < diff)
- {
- //spell Burn should possible do this, but it doesn't, so do this for now.
- uint32 dmg = urand(4500,5500);
- if (m_creature->GetHealth() > dmg)
- m_creature->SetHealth(uint32(m_creature->GetHealth()-dmg));
- Cycle_Timer = 2000;
- }else Cycle_Timer -= diff;
-
- DoMeleeAttackIfReady();
- }
+ mob_phoenix_tkAI(Creature *c) : ScriptedAI(c) {Reset();}
+
+ uint32 Cycle_Timer;
+ uint8 SummonEgg;
+
+ void Reset()
+ {
+ Cycle_Timer = 2000;
+ SummonEgg = 0;
+ m_creature->CastSpell(m_creature,SPELL_BURN,true);
+ }
+
+ void Aggro(Unit *who) { }
+
+ void DamageTaken(Unit* pKiller, uint32 &damage)
+ {
+ if(m_creature->GetHealth() < damage && SummonEgg < 2){
+ damage = 0;
+ SummonEgg = 1;
+ }
+ }
+
+ void UpdateAI(const uint32 diff)
+ {
+ if (!m_creature->SelectHostilTarget() || !m_creature->getVictim())
+ return;
+
+ if(SummonEgg < 2){
+ if (Cycle_Timer < diff)
+ {
+ //spell Burn should possible do this, but it doesn't, so do this for now.
+ uint32 dmg = urand(4500,5500);
+ if (m_creature->GetHealth() > dmg)
+ m_creature->SetHealth(uint32(m_creature->GetHealth()-dmg));
+ Cycle_Timer = 2000;
+ }else Cycle_Timer -= diff;
+ }else {
+ if(Cycle_Timer < diff){
+ m_creature->SummonCreature(PHOENIX_EGG,m_creature->GetPositionX(),m_creature->GetPositionY(),m_creature->GetPositionZ(),m_creature->GetOrientation(),TEMPSUMMON_TIMED_DESPAWN,16000);
+ m_creature->DealDamage(m_creature, m_creature->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
+ m_creature->RemoveCorpse();
+ }else Cycle_Timer -= diff;
+ }
+
+ if(SummonEgg == 1){ //hack die animation
+ m_creature->RemoveAllAuras();
+ DoStartNoMovement(m_creature->getVictim());
+ m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1, PLAYER_STATE_DEAD);
+ SummonEgg = 2;
+ Cycle_Timer = 1000;
+ }
+ if(SummonEgg < 2)DoMeleeAttackIfReady();
+ }
};
-
+
//Phoenix Egg AI
struct TRINITY_DLL_DECL mob_phoenix_egg_tkAI : public ScriptedAI
{
- mob_phoenix_egg_tkAI(Creature *c) : ScriptedAI(c) {Reset();}
-
- uint32 Rebirth_Timer;
-
- void Reset()
- {
- Rebirth_Timer = 15000;
- }
-
- //ignore any
- void MoveInLineOfSight(Unit* who) { return; }
-
- void AttackStart(Unit* who)
- {
- if (m_creature->Attack(who, false))
- {
- m_creature->SetInCombatWith(who);
- who->SetInCombatWith(m_creature);
-
- if (!InCombat)
- {
- InCombat = true;
- Aggro(who);
- }
- DoStartNoMovement(who);
- }
- }
-
- void Aggro(Unit *who) { }
-
- void JustSummoned(Creature* summoned)
- {
- summoned->AddThreat(m_creature->getVictim(), 0.0f);
- summoned->CastSpell(summoned,SPELL_REBIRTH,false);
- }
-
- void UpdateAI(const uint32 diff)
- {
- if (!Rebirth_Timer)
- return;
-
- if (Rebirth_Timer <= diff)
- {
- m_creature->SummonCreature(PHOENIX,m_creature->GetPositionX(),m_creature->GetPositionY(),m_creature->GetPositionZ(),m_creature->GetOrientation(),TEMPSUMMON_CORPSE_DESPAWN,5000);
- Rebirth_Timer = 0;
- }else Rebirth_Timer -= diff;
- }
+ mob_phoenix_egg_tkAI(Creature *c) : ScriptedAI(c) {Reset();}
+
+ uint32 Rebirth_Timer;
+ bool summoned;
+
+ void Reset(){
+ Rebirth_Timer = 15000;
+ summoned = false;
+ }
+
+ //ignore any
+ void MoveInLineOfSight(Unit* who) { return; }
+
+ void AttackStart(Unit* who)
+ {
+ if (m_creature->Attack(who, false))
+ {
+ m_creature->SetInCombatWith(who);
+ who->SetInCombatWith(m_creature);
+
+ if (!InCombat)
+ {
+ InCombat = true;
+ Aggro(who);
+ }
+ DoStartNoMovement(who);
+ }
+ }
+
+ void Aggro(Unit *who) { }
+
+ void JustSummoned(Creature* summoned)
+ {
+ summoned->AddThreat(m_creature->getVictim(), 0.0f);
+ summoned->CastSpell(summoned,SPELL_REBIRTH,false);
+ }
+
+ void UpdateAI(const uint32 diff)
+ {
+ if (Rebirth_Timer < diff)
+ {
+ if(!summoned){
+ Creature* Phoenix = m_creature->SummonCreature(PHOENIX,m_creature->GetPositionX(),m_creature->GetPositionY(),m_creature->GetPositionZ(),m_creature->GetOrientation(),TEMPSUMMON_CORPSE_DESPAWN,5000);
+ summoned = true;
+ }
+ m_creature->DealDamage(m_creature, m_creature->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
+ }else Rebirth_Timer -= diff;
+ }
};
CreatureAI* GetAI_boss_kaelthas(Creature *_Creature)