*Update sapphiron and kelthuzad scripts. By cryingcloud.

--HG--
branch : trunk
This commit is contained in:
megamage
2009-04-30 22:10:09 -05:00
parent 31065850ed
commit 82b03c856f
2 changed files with 334 additions and 292 deletions

View File

@@ -77,66 +77,7 @@ I also don't know the emotes
//common needed defines
#define NAXXRAMAS_MAP 533
//Positional defines
#define ADDX_LEFT_FAR 3783.272705
#define ADDY_LEFT_FAR -5062.697266
#define ADDZ_LEFT_FAR 143.711203
#define ADDO_LEFT_FAR 3.617599
#define ADDX_LEFT_MIDDLE 3730.291260
#define ADDY_LEFT_MIDDLE -5027.239258
#define ADDZ_LEFT_MIDDLE 143.956909
#define ADDO_LEFT_MIDDLE 4.461900
#define ADDX_LEFT_NEAR 3683.868652
#define ADDY_LEFT_NEAR -5057.281250
#define ADDZ_LEFT_NEAR 143.183884
#define ADDO_LEFT_NEAR 5.237086
#define ADDX_RIGHT_FAR 3759.355225
#define ADDY_RIGHT_FAR -5174.128418
#define ADDZ_RIGHT_FAR 143.802383
#define ADDO_RIGHT_FAR 2.170104
#define ADDX_RIGHT_MIDDLE 370.724365
#define ADDY_RIGHT_MIDDLE -5185.123047
#define ADDZ_RIGHT_MIDDLE 143.928024
#define ADDO_RIGHT_MIDDLE 1.309310
#define ADDX_RIGHT_NEAR 3665.121094
#define ADDY_RIGHT_NEAR -5138.679199
#define ADDZ_RIGHT_NEAR 143.183212
#define ADDO_RIGHT_NEAR 0.604023
#define WALKX_LEFT_FAR 3754.431396
#define WALKY_LEFT_FAR -5080.727734
#define WALKZ_LEFT_FAR 142.036316
#define WALKO_LEFT_FAR 3.736189
#define WALKX_LEFT_MIDDLE 3724.396484
#define WALKY_LEFT_MIDDLE -5061.330566
#define WALKZ_LEFT_MIDDLE 142.032700
#define WALKO_LEFT_MIDDLE 4.564785
#define WALKX_LEFT_NEAR 3687.158424
#define WALKY_LEFT_NEAR -5076.834473
#define WALKZ_LEFT_NEAR 142.017319
#define WALKO_LEFT_NEAR 5.237086
#define WALKX_RIGHT_FAR 3687.571777
#define WALKY_RIGHT_FAR -5126.831055
#define WALKZ_RIGHT_FAR 142.017807
#define WALKO_RIGHT_FAR 0.604023
#define WALKX_RIGHT_MIDDLE 3707.990733
#define WALKY_RIGHT_MIDDLE -5151.450195
#define WALKZ_RIGHT_MIDDLE 142.032562
#define WALKO_RIGHT_MIDDLE 1.376855
#define WALKX_RIGHT_NEAR 3739.500000
#define WALKY_RIGHT_NEAR -5141.883989
#define WALKZ_RIGHT_NEAR 142.0141130
#define WALKO_RIGHT_NEAR 2.121412
//Positional defines
//spells to be casted
#define SPELL_FROST_BOLT 28478
@@ -149,6 +90,32 @@ I also don't know the emotes
#define SPELL_SHADOW_FISURE 27810
#define SPELL_FROST_BLAST 27808
#define NORMAL_RAID 10
//creature needed summoned
#define MOB_SUMMON_WASTE 16427 //Soldiers of the Frozen Wastes
#define MOB_SUMMON_ABOMINATION 16428 //Unstoppable Abominations
#define MOB_SUMMON_WEAVER 16429//Soul Weavers
#define MOB_SUMMON_FISSURE 16129 // Shadow Fissure
#define MOB_SUMMON_ICECROWN 16441// Guardians of Icecrown
float Pos[12][4] =
{
{3783.272705, -5062.697266, 143.711203,3.617599},//LEFT_FAR
{3730.291260, -5027.239258,143.956909,4.461900},//LEFT_MIDDLE
{3683.868652,-5057.281250,143.183884,5.237086},//LEFT_NEAR
{3759.355225,-5174.128418,143.802383,2.170104},//RIGHT_FAR
{370.724365,-5185.123047,143.928024,1.309310},//RIGHT_MIDDLE
{3665.121094,-5138.679199,143.183212,0.604023},//RIGHT_NEAR
{3754.431396,-5080.727734,142.036316,3.736189},//LEFT_FAR
{3724.396484, -5061.330566,142.032700, 4.564785},//LEFT_MIDDLE
{3687.158424,-5076.834473,142.017319,5.237086},//LEFT_NEAR
{3687.571777,-5126.831055,142.017807,0.604023},//RIGHT_FAR
{3707.990733,-5151.450195,142.032562,1.376855},//RIGHT_MIDDLE
{3739.500000,-5141.883989,142.0141130, 2.121412}//RIGHT_NEAR
};
struct TRINITY_DLL_DECL boss_kelthuzadAI : public ScriptedAI
{
boss_kelthuzadAI(Creature* c) : ScriptedAI(c)
@@ -164,20 +131,30 @@ struct TRINITY_DLL_DECL boss_kelthuzadAI : public ScriptedAI
uint64 GuardiansOfIcecrown[5];
uint32 GuardiansOfIcecrown_Count;
uint32 GuardiansOfIcecrown_Timer;
//phase==1 summon_timer
uint32 SummonWasters_Timer;
uint32 SummonAbominations_Timer;
uint32 SummonAWeavers_Timer;
//phase==2,spell_timer
uint32 FrostBolt_Timer;
uint32 FrostBoltNova_Timer;
uint32 ChainsOfKelthuzad_Timer;
uint32 ManaDetonation_Timer;
uint32 ShadowFisure_Timer;
uint32 FrostBlast_Timer;
uint32 ChainsOfKelthuzad_Targets;
uint32 Phase1_Timer;
bool Phase2;
bool Phase3;
uint32 FrostBlast_Timer;
uint32 Phase1_Timer;
unit32 Phase;
void Reset()
{
FrostBolt_Timer = (rand()%60)*1000; //It won't be more than a minute without cast it
SummonWasters_Timer=3000 // 3s summon waster
SummonAbominations_Timer=25000; //25s summon abomination
SummonAWeavers_Timer=20000; //20s summon Weavers
FrostBolt_Timer = 2000; //2s CD
FrostBoltNova_Timer = 15000; //Cast every 15 seconds
ChainsOfKelthuzad_Timer = (rand()%30+30)*1000; //Cast no sooner than once every 30 seconds
ManaDetonation_Timer = 20000; //Seems to cast about every 20 seconds
@@ -188,18 +165,17 @@ struct TRINITY_DLL_DECL boss_kelthuzadAI : public ScriptedAI
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;
}
{
//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 = 310000; //Phase 1 lasts 5 minutes and 10 seconds
Phase2 = false;
Phase3 = false;
Phase1_Timer = 228000; //Phase 1 lasts 3 minutes and 48 seconds
Phase=0;
}
void KilledUnit()
@@ -213,52 +189,7 @@ struct TRINITY_DLL_DECL boss_kelthuzadAI : public ScriptedAI
void JustDied(Unit* Killer)
{
DoScriptText(SAY_DEATH, m_creature);
for(int i=0; i<5; i++)
if(GuardiansOfIcecrown[i])
{
Unit* pUnit = Unit::GetUnit((*m_creature), GuardiansOfIcecrown[i]);
if (!pUnit || !pUnit->isAlive())
continue;
pUnit->CombatStop();
float Walk_Pos_X;
float Walk_Pos_Y;
float Walk_Pos_Z;
switch(rand()%6)
{
case 0:
Walk_Pos_X = ADDX_LEFT_FAR;
Walk_Pos_Y = ADDY_LEFT_FAR;
Walk_Pos_Z = ADDZ_LEFT_FAR;
break;
case 1:
Walk_Pos_X = ADDX_LEFT_MIDDLE;
Walk_Pos_Y = ADDY_LEFT_MIDDLE;
Walk_Pos_Z = ADDZ_LEFT_MIDDLE;
break;
case 2:
Walk_Pos_X = ADDX_LEFT_NEAR;
Walk_Pos_Y = ADDY_LEFT_NEAR;
Walk_Pos_Z = ADDZ_LEFT_NEAR;
break;
case 3:
Walk_Pos_X = ADDX_RIGHT_FAR;
Walk_Pos_Y = ADDY_RIGHT_FAR;
Walk_Pos_Z = ADDZ_RIGHT_FAR;
break;
case 4:
Walk_Pos_X = ADDX_RIGHT_MIDDLE;
Walk_Pos_Y = ADDY_RIGHT_MIDDLE;
Walk_Pos_Z = ADDZ_RIGHT_MIDDLE;
break;
case 5:
Walk_Pos_X = ADDX_RIGHT_NEAR;
Walk_Pos_Y = ADDY_RIGHT_NEAR;
Walk_Pos_Z = ADDZ_RIGHT_NEAR;
break;
}
pUnit->SendMonsterMoveWithSpeed(Walk_Pos_X, Walk_Pos_Y, Walk_Pos_Z);
}
}
void EnterCombat(Unit* who)
@@ -269,21 +200,103 @@ struct TRINITY_DLL_DECL boss_kelthuzadAI : public ScriptedAI
case 1: DoScriptText(SAY_AGGRO2, m_creature); break;
case 2: DoScriptText(SAY_AGGRO3, m_creature); break;
}
Phase=1;
}
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim())
if (!UpdateVictim())
return;
if(m_creature->getVictim() && m_creature->isAlive())
if (Phase1_Timer<diff && Phase==1)
{
Phase=2;
}else Phase1_Timer-=diff;
if(phase == 1)
{
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
EnterEvadeMode();
//SummonWasters_Timer at far positon
if ( SummonWasters_Timer< diff)
{
Creature *Waster = NULL;
switch(rand()%4)
{
case 0: Waster = m_creature->SummonCreature(MOB_SUMMON_WASTE,Pos[0][0], Pos[0][1], Pos[0][2], Pos[0][3], TEMPSUMMON_CORPSE_DESPAWN, 0); break;
case 1: Waster = m_creature->SummonCreature(MOB_SUMMON_WASTE,Pos[3][0], Pos[3][1], Pos[3][2], Pos[3][3], TEMPSUMMON_CORPSE_DESPAWN, 0); break;
case 2: Waster = m_creature->SummonCreature(MOB_SUMMON_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_SUMMON_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;
//MOB_SUMMON_ABOMINATION at middle positon
if ( SummonAbominations_Timer< diff)
{
Creature *Abominations = NULL;
switch(rand()%4)
{
case 0: Abominations = m_creature->SummonCreature(MOB_SUMMON_ABOMINATION,Pos[1][0], Pos[1][1], Pos[1][2], Pos[1][3], TEMPSUMMON_CORPSE_DESPAWN, 0); break;
case 1: Abominations = m_creature->SummonCreature(MOB_SUMMON_ABOMINATION,Pos[4][0], Pos[4][1], Pos[4][2], Pos[4][3], TEMPSUMMON_CORPSE_DESPAWN, 0); break;
case 2: Abominations = m_creature->SummonCreature(MOB_SUMMON_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_SUMMON_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;
//SummonAWeavers_Timer at far positon
if ( SummonAWeavers_Timer< diff)
{
Creature *Weavers = NULL;
switch(rand()%4)
{
case 0: Weavers = m_creature->SummonCreature(MOB_SUMMON_WEAVER,Pos[0][0], Pos[0][1], Pos[0][2], Pos[0][3], TEMPSUMMON_CORPSE_DESPAWN, 0); break;
case 1: Weavers = m_creature->SummonCreature(MOB_SUMMON_WEAVER,Pos[3][0], Pos[3][1], Pos[3][2], Pos[3][3], TEMPSUMMON_CORPSE_DESPAWN, 0); break;
case 2: Weavers = m_creature->SummonCreature(MOB_SUMMON_WEAVER,Pos[6][0], Pos[6][1], Pos[6][2], Pos[6][3], TEMPSUMMON_CORPSE_DESPAWN, 0); break;
case 3: Weavers = m_creature->SummonCreature(MOB_SUMMON_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())
{
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 = (rand()%60)*1000;
FrostBolt_Timer = 2000;
}else FrostBolt_Timer -= diff;
//Check for Frost Bolt Nova
@@ -293,135 +306,139 @@ struct TRINITY_DLL_DECL boss_kelthuzadAI : public ScriptedAI
FrostBoltNova_Timer = 15000;
}else FrostBoltNova_Timer -= diff;
//Check for Chains Of Kelthuzad
//Cast Chains Of Kelthuzad only on the Heroic instance
/*
if(ChainsOfKelthuzad_Timer < diff)
{
//DoCast(m_creature->getVictim(),SPELL_CHAINS_OF_KELTHUZAD);
//DoCast(m_creature->getVictim(),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;
//if(rand()%2 == 0)
//DoScriptText(SAY_CHAIN1, m_creature);
//else
//DoScriptText(SAY_CHAIN2, m_creature);
ChainsOfKelthuzad_Timer = (rand()%30+30)*1000;
}else ChainsOfKelthuzad_Timer -= diff;
*/
//Check for Mana Detonation
if(ManaDetonation_Timer < diff)
{
//time to cast
DoCast(m_creature->getVictim(),SPELL_MANA_DETONATION);
if (rand()%2)
DoScriptText(SAY_SPECIAL1_MANA_DET, m_creature);
Unit* target;
//select a manaplayer during 10 raid ,how to make sure we can succed in finding a manaplayer or it's safty if there is no manaplayer in raid
for(uint8 i = 0; i <NORMAL_RAID; i++)
{
if (target = SelectUnit(SELECT_TARGET_RANDOM,0))
{
//check if the target is a manaplayer
if ( (Player*)target->getPowerType()==POWER_MANA )
{
// if yes cast the SPELL_MANA_DETONATION
DoCast(m_creature->getVictim(),SPELL_MANA_DETONATION);
//Obviously the damage of this spell would be invalidation
break;
//exit the circle
}
else //debug
{
m_creature->Yell("A, no mana,you are cheat?",LANG_COMMON,target);
}
}
}
if (rand()%2)
DoScriptText(SAY_SPECIAL1_MANA_DET, m_creature);
ManaDetonation_Timer = 20000;
}else ManaDetonation_Timer -= diff;
//Check for Shadow Fissure
//Summons a Shadow Fissure underneath a random player.
//The fissure will stay inactive for about 3 seconds, after which it will become a beam of purple energy,
//instantly killing the player if they remain in it.
if(ShadowFisure_Timer < diff)
{
DoCast(m_creature->getVictim(),SPELL_SHADOW_FISURE);
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0))
{
//get the position of the target x,y,z,ang.
float x,y,z,ang;
x=(Player*)target->GetPositionX;
y=(Player*)target->GetPositionY;
z=(Player*)target->GetPositionZ;
ang=(Player*)target->GetOrientation;
//summon the MOB_SUMMON_FISSURE at this positon
Creature *Fissure= m_creature->SummonCreature(MOB_SUMMON_FISSURE,x,y,z,ang, TEMPSUMMON_CORPSE_DESPAWN, 0);
if(Fissure)
{
DoCast(target,SPELL_SHADOW_FISURE);
Fissure->AI()->AttackStart(target);
}
}
if (rand()%2)
DoScriptText(SAY_SPECIAL3_MANA_DET, m_creature);
if (rand()%2)
DoScriptText(SAY_SPECIAL3_MANA_DET, m_creature);
ShadowFisure_Timer = 25000;
}else ShadowFisure_Timer -= diff;
//Check for Frost Blast
//cast Frost Blast to a random player
if(FrostBlast_Timer < diff)
{
//time to cast
DoCast(m_creature->getVictim(),SPELL_FROST_BLAST);
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(!Phase3 && (m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) < 40)
if( Phase!=3 && (m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) < 40)
{
Phase3 = true;
DoScriptText(SAY_REQUEST_AID, m_creature);
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(Phase3 && (GuardiansOfIcecrown_Count < 5))
if(Phase==3 && (GuardiansOfIcecrown_Count < 2)) //in normal raid ,only two Icecrown
if(GuardiansOfIcecrown_Timer < diff)
{
//Summon a Guardian of Icecrown in a random alcove (Creature # 16441)
//uint32 TimeToWalk;
Unit* pUnit = NULL;
float Walk_Pos_X;
float Walk_Pos_Y;
float Walk_Pos_Z;
switch(rand()%6)
{
//Summon a Guardian of Icecrown in a random alcove
Unit* pUnit = NULL;
switch(rand()%3)
{
case 0:
pUnit = m_creature->SummonCreature(16441,ADDX_LEFT_FAR,ADDY_LEFT_FAR,ADDZ_LEFT_FAR,ADDO_LEFT_FAR,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,1000);
//Setting walk position
Walk_Pos_X = WALKX_LEFT_FAR;
Walk_Pos_Y = WALKY_LEFT_FAR;
Walk_Pos_Z = WALKZ_LEFT_FAR;
pUnit = m_creature->SummonCreature(MOB_SUMMON_ICECROWN,Pos[2][0],Pos[2][1],Pos[2][2],Pos[2][3],TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,1000);
break;
case 1:
pUnit = m_creature->SummonCreature(16441,ADDX_LEFT_MIDDLE,ADDY_LEFT_MIDDLE,ADDZ_LEFT_MIDDLE,ADDO_LEFT_MIDDLE,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,1000);
//Start moving guardian towards the center of the room
Walk_Pos_X = WALKX_LEFT_MIDDLE;
Walk_Pos_Y = WALKY_LEFT_MIDDLE;
Walk_Pos_Z = WALKZ_LEFT_MIDDLE;
pUnit = m_creature->SummonCreature(MOB_SUMMON_ICECROWN,Pos[5][0],Pos[5][1],Pos[5][2],Pos[5][3],TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,1000);
break;
case 2:
pUnit = m_creature->SummonCreature(16441,ADDX_LEFT_NEAR,ADDY_LEFT_NEAR,ADDZ_LEFT_NEAR,ADDO_LEFT_NEAR,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,1000);
//Start moving guardian towards the center of the room
Walk_Pos_X = WALKX_LEFT_NEAR;
Walk_Pos_Y = WALKY_LEFT_NEAR;
Walk_Pos_Z = WALKZ_LEFT_NEAR;
break;
case 3:
pUnit = m_creature->SummonCreature(MOB_SUMMON_ICECROWN,Pos[8][0],Pos[8][1],Pos[8][2],Pos[8][3],TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,1000);
break;
}
pUnit = m_creature->SummonCreature(16441,ADDX_RIGHT_FAR,ADDY_RIGHT_FAR,ADDZ_RIGHT_FAR,ADDO_RIGHT_FAR,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,1000);
//Start moving guardian towards the center of the room
Walk_Pos_X = WALKX_RIGHT_FAR;
Walk_Pos_Y = WALKY_RIGHT_FAR;
Walk_Pos_Z = WALKZ_RIGHT_FAR;
break;
case 4:
pUnit = m_creature->SummonCreature(16441,ADDX_RIGHT_MIDDLE,ADDY_RIGHT_MIDDLE,ADDZ_RIGHT_MIDDLE,ADDO_RIGHT_MIDDLE,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,1000);
//Start moving guardian towards the center of the room
Walk_Pos_X = WALKX_RIGHT_MIDDLE;
Walk_Pos_Y = WALKY_RIGHT_MIDDLE;
Walk_Pos_Z = WALKZ_RIGHT_MIDDLE;
break;
case 5:
pUnit = m_creature->SummonCreature(16441,ADDX_RIGHT_NEAR,ADDY_RIGHT_NEAR,ADDZ_RIGHT_NEAR,ADDO_RIGHT_NEAR,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,1000);
//Start moving guardian towards the center of the room
Walk_Pos_X = WALKX_RIGHT_NEAR;
Walk_Pos_Y = WALKY_RIGHT_NEAR;
Walk_Pos_Z = WALKZ_RIGHT_NEAR;
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;
if (pUnit)
{
//if we find no one to figth walk to the center
if(!pUnit->isInCombat())
pUnit->SendMonsterMoveWithSpeed(Walk_Pos_X,Walk_Pos_Y,Walk_Pos_Z);
//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();
}
}
};
@@ -433,11 +450,9 @@ CreatureAI* GetAI_boss_kelthuzadAI(Creature *_Creature)
void AddSC_boss_kelthuzad()
{
Script *newscript;
newscript = new Script;
newscript->Name="boss_kelthuzad";
newscript->GetAI = &GetAI_boss_kelthuzadAI;
newscript->RegisterSelf();
}

View File

@@ -30,8 +30,12 @@ EndScriptData */
#define SPELL_FROST_BREATH 29318
#define SPELL_FROST_AURA 28531
#define SPELL_LIFE_DRAIN 28542
//#define SPELL_CHILL 28560
#define SPELL_BLIZZARD 28547
#define SPELL_BESERK 26662
#define SPELL_CLEAVE 19983
#define SPELL_TAIL_SWEEP 55697
struct TRINITY_DLL_DECL boss_sapphironAI : public ScriptedAI
{
@@ -43,6 +47,8 @@ struct TRINITY_DLL_DECL boss_sapphironAI : public ScriptedAI
uint32 FrostAura_Timer;
uint32 LifeDrain_Timer;
uint32 Blizzard_Timer;
uint32 Tail_Sweep_Timer;
uint32 Cleave_Timer;
uint32 Fly_Timer;
uint32 Fly2_Timer;
uint32 Beserk_Timer;
@@ -55,6 +61,8 @@ struct TRINITY_DLL_DECL boss_sapphironAI : public ScriptedAI
FrostAura_Timer = 2000;
LifeDrain_Timer = 24000;
Blizzard_Timer = 20000;
Tail_Sweep_Timer=(rand()%2+9)*1000;
Cleave_Timer=10000;
Fly_Timer = 45000;
Icebolt_Timer = 4000;
land_Timer = 0;
@@ -75,93 +83,113 @@ struct TRINITY_DLL_DECL boss_sapphironAI : public ScriptedAI
if (!UpdateVictim())
return;
if(phase == 1)
if(phase == 1)
{
if(FrostAura_Timer < diff)
{
if(FrostAura_Timer < diff)
{
DoCast(m_creature->getVictim(),SPELL_FROST_AURA);
FrostAura_Timer = 5000;
}else FrostAura_Timer -= diff;
DoCast(m_creature->getVictim(),SPELL_FROST_AURA);
FrostAura_Timer = 5000;
}else FrostAura_Timer -= diff;
if(LifeDrain_Timer < diff)
{
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0))
DoCast(target,SPELL_LIFE_DRAIN);
LifeDrain_Timer = 24000;
}else LifeDrain_Timer -= diff;
if(LifeDrain_Timer < diff)
{
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0))
DoCast(target,SPELL_LIFE_DRAIN);
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0))
DoCast(target,SPELL_LIFE_DRAIN);
if(Blizzard_Timer < diff)
{
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0))
DoCast(target,SPELL_BLIZZARD);
Blizzard_Timer = 20000;
}else Blizzard_Timer -= diff;
LifeDrain_Timer = 24000;
}else LifeDrain_Timer -= diff;
if (m_creature->GetHealth()*100 / m_creature->GetMaxHealth() > 10)
{
if(Fly_Timer < diff)
{
phase = 2;
m_creature->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
m_creature->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING);
m_creature->GetMotionMaster()->Clear(false);
m_creature->GetMotionMaster()->MoveIdle();
m_creature->SetHover(true);
Icebolt_Timer = 4000;
Icebolt_Count = 0;
IsInFly = true;
}else Fly_Timer -= diff;
if(Blizzard_Timer < diff)
{
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0))
{
DoCast(target,SPELL_BLIZZARD);
//It seems NO damage?
}
Blizzard_Timer = 20000;
}else Blizzard_Timer -= diff;
//SPELL_CLEAVE
if(Cleave_Timer < diff)
{
DoCast(m_creature->getVictim(),SPELL_CLEAVE);
Cleave_Timer = 10000;
}else Cleave_Timer -= diff;
//Tail Sweep_Timer,
if(Tail_Sweep_Timer < diff)
{
DoCast(m_creature,SPELL_TAIL_SWEEP);
Tail_Sweep_Timer=(rand()%2+9)*1000;
}else Tail_Sweep_Timer -= diff;
if (m_creature->GetHealth()*100 / m_creature->GetMaxHealth() > 10)
{
if(Fly_Timer < diff)
{
phase = 2;
m_creature->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
m_creature->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING);
m_creature->GetMotionMaster()->Clear(false);
m_creature->GetMotionMaster()->MoveIdle();
m_creature->SetHover(true);
Icebolt_Timer = 4000;
Icebolt_Count = 0;
IsInFly = true;
}else Fly_Timer -= diff;
}
}
if (phase == 2)
if (phase == 2)
{
if(Icebolt_Timer < diff && Icebolt_Count < 5)
{
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0))
{
if(Icebolt_Timer < diff && Icebolt_Count < 5)
{
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0))
{
DoCast(target,SPELL_ICEBOLT);
++Icebolt_Count;
error_log("Count incremented");
}
FrostBreath_Timer = 6000;
Icebolt_Timer = 4000;
}else Icebolt_Timer -= diff;
if(Icebolt_Count == 5 && IsInFly && FrostBreath_Timer < diff )
{
DoScriptText(EMOTE_BREATH, m_creature);
DoCast(m_creature->getVictim(),SPELL_FROST_BREATH);
land_Timer = 2000;
IsInFly = false;
FrostBreath_Timer = 6000;
}else FrostBreath_Timer -= diff;
if(!IsInFly && land_Timer < diff)
{
phase = 1;
m_creature->HandleEmoteCommand(EMOTE_ONESHOT_LAND);
m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING);
m_creature->GetMotionMaster()->Clear(false);
m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim());
m_creature->SetHover(true);
land_Timer = 0;
Fly_Timer = 67000;
}else land_Timer -= diff;
DoCast(target,SPELL_ICEBOLT);
++Icebolt_Count;
error_log("Count incremented");
}
FrostBreath_Timer = 6000;
Icebolt_Timer = 4000;
}else Icebolt_Timer -= diff;
if ((m_creature->GetHealth()*100) / m_creature->GetMaxHealth() <= 10)
{
if (Beserk_Timer < diff)
{
DoScriptText(EMOTE_ENRAGE, m_creature);
DoCast(m_creature,SPELL_BESERK);
Beserk_Timer = 300000;
}else Beserk_Timer -= diff;
}
if(Icebolt_Count == 5 && IsInFly && FrostBreath_Timer < diff )
{
DoScriptText(EMOTE_BREATH, m_creature);
DoCast(m_creature->getVictim(),SPELL_FROST_BREATH);
land_Timer = 2000;
IsInFly = false;
FrostBreath_Timer = 6000;
}else FrostBreath_Timer -= diff;
if (phase!=2)
DoMeleeAttackIfReady();
if(!IsInFly && land_Timer < diff)
{
phase = 1;
m_creature->HandleEmoteCommand(EMOTE_ONESHOT_LAND);
m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING);
m_creature->GetMotionMaster()->Clear(false);
m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim());
m_creature->SetHover(true);
land_Timer = 0;
Fly_Timer = 67000;
}else land_Timer -= diff;
}
if ((m_creature->GetHealth()*100) / m_creature->GetMaxHealth() <= 10)
{
if (Beserk_Timer < diff)
{
DoScriptText(EMOTE_ENRAGE, m_creature);
DoCast(m_creature,SPELL_BESERK);
Beserk_Timer = 300000;
}else Beserk_Timer -= diff;
}
if (phase!=2)
DoMeleeAttackIfReady();
}
};
@@ -178,4 +206,3 @@ void AddSC_boss_sapphiron()
newscript->GetAI = &GetAI_boss_sapphiron;
newscript->RegisterSelf();
}