Merge [SD2]

r1192 Adding and correct spell used for hard enrage after 15 minutes, and also correct initial ability if any of dragons are alive at initial aggro. Added placeholder for soft enrage at 10%HP left.
r1193 Fixed typo in EnterEvadeIfOutOfCombatArea()
r1194 Implement basic parts of tomb of seven event in BRD. - skip (already scripted)
r1195 Some cleanup to parts of the seven event script.
r1196 Reset event for triage-quests in better way and also clear lists.
r1197 Clean up and add long time incomplete script for first boss in SWP. - skip
r1198 Correct typo in filename in previous commit, sorry :) - skip
r1199 Added script for areatrigger 4853, to be used to start pre-event, second boss in SWP. - skip
r2000 Check alive-state before hatching all eggs. Patch by kolomati2
      Correct typo in variable. - skip
r2001 Correct one spellId and remove non-existing. By Tassader. - skip
r2002 Added support for quest 12739(and 12742 to 12750). Patch by ckegg - skip (already scripted)
r2003 Corrected copyright notices in misc makefile.am - skip
r2004 Added: Missing heroic spells for Vexallus. Heroic version is complete now.
      Added: Missing heroic spells for Murmur. Heroic version is also complete.
      Fixed: As always some timers.

--HG--
branch : trunk
This commit is contained in:
Kudlaty
2009-08-12 23:34:19 +02:00
parent 15c61715e2
commit c2b2611a42
10 changed files with 134 additions and 76 deletions
+1 -1
View File
@@ -611,7 +611,7 @@ bool ScriptedAI::EnterEvadeIfOutOfCombatArea(const uint32 uiDiff)
return false; return false;
break; break;
case 28860: // sartharion (calculate box) case 28860: // sartharion (calculate box)
if (fX > 3218.86f && fX < 3275.69f && fY > 572.40f && fY < 484.68f) if (fX > 3218.86f && fX < 3275.69f && fY < 572.40f && fY > 484.68f)
return false; return false;
break; break;
default: default:
@@ -503,7 +503,12 @@ struct TRINITY_DLL_DECL npc_doctorAI : public ScriptedAI
PatientDiedCount = 0; PatientDiedCount = 0;
PatientSavedCount = 0; PatientSavedCount = 0;
Patients.clear();
Coordinates.clear();
Event = false; Event = false;
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
} }
void BeginEvent(Player* player); void BeginEvent(Player* player);
@@ -606,7 +611,6 @@ struct TRINITY_DLL_DECL npc_injured_patientAI : public ScriptedAI
break; break;
} }
} }
return;
} }
void UpdateAI(const uint32 diff) void UpdateAI(const uint32 diff)
@@ -672,7 +676,8 @@ void npc_doctorAI::PatientDied(Location* Point)
Player* player = Unit::GetPlayer(Playerguid); Player* player = Unit::GetPlayer(Playerguid);
if(player && ((player->GetQuestStatus(6624) == QUEST_STATUS_INCOMPLETE) || (player->GetQuestStatus(6622) == QUEST_STATUS_INCOMPLETE))) if(player && ((player->GetQuestStatus(6624) == QUEST_STATUS_INCOMPLETE) || (player->GetQuestStatus(6622) == QUEST_STATUS_INCOMPLETE)))
{ {
PatientDiedCount++; ++PatientDiedCount;
if (PatientDiedCount > 5 && Event) if (PatientDiedCount > 5 && Event)
{ {
if(player->GetQuestStatus(6624) == QUEST_STATUS_INCOMPLETE) if(player->GetQuestStatus(6624) == QUEST_STATUS_INCOMPLETE)
@@ -680,13 +685,15 @@ void npc_doctorAI::PatientDied(Location* Point)
else if(player->GetQuestStatus(6622) == QUEST_STATUS_INCOMPLETE) else if(player->GetQuestStatus(6622) == QUEST_STATUS_INCOMPLETE)
player->FailQuest(6622); player->FailQuest(6622);
Event = false;
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
Reset(); Reset();
return;
} }
Coordinates.push_back(Point); Coordinates.push_back(Point);
} }
else
// If no player or player abandon quest in progress
Reset();
} }
void npc_doctorAI::PatientSaved(Creature* soldier, Player* player, Location* Point) void npc_doctorAI::PatientSaved(Creature* soldier, Player* player, Location* Point)
@@ -695,7 +702,8 @@ void npc_doctorAI::PatientSaved(Creature* soldier, Player* player, Location* Poi
{ {
if ((player->GetQuestStatus(6624) == QUEST_STATUS_INCOMPLETE) || (player->GetQuestStatus(6622) == QUEST_STATUS_INCOMPLETE)) if ((player->GetQuestStatus(6624) == QUEST_STATUS_INCOMPLETE) || (player->GetQuestStatus(6622) == QUEST_STATUS_INCOMPLETE))
{ {
PatientSavedCount++; ++PatientSavedCount;
if (PatientSavedCount == 15) if (PatientSavedCount == 15)
{ {
if (!Patients.empty()) if (!Patients.empty())
@@ -713,9 +721,8 @@ void npc_doctorAI::PatientSaved(Creature* soldier, Player* player, Location* Poi
else if (player->GetQuestStatus(6622) == QUEST_STATUS_INCOMPLETE) else if (player->GetQuestStatus(6622) == QUEST_STATUS_INCOMPLETE)
player->AreaExploredOrEventHappens(6622); player->AreaExploredOrEventHappens(6622);
Event = false;
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
Reset(); Reset();
return;
} }
Coordinates.push_back(Point); Coordinates.push_back(Point);
@@ -727,9 +734,8 @@ void npc_doctorAI::UpdateAI(const uint32 diff)
{ {
if (Event && SummonPatientCount >= 20) if (Event && SummonPatientCount >= 20)
{ {
Event = false;
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
Reset(); Reset();
return;
} }
if (Event) if (Event)
@@ -53,7 +53,7 @@ struct TRINITY_DLL_DECL boss_pandemoniusAI : public ScriptedAI
void Reset() void Reset()
{ {
VoidBlast_Timer = 30000; VoidBlast_Timer = 8000+rand()%15000;
DarkShell_Timer = 20000; DarkShell_Timer = 20000;
VoidBlast_Counter = 0; VoidBlast_Counter = 0;
} }
@@ -99,7 +99,7 @@ struct TRINITY_DLL_DECL boss_pandemoniusAI : public ScriptedAI
if( VoidBlast_Counter == 5 ) if( VoidBlast_Counter == 5 )
{ {
VoidBlast_Timer = 25000+rand()%10000; VoidBlast_Timer = 15000+rand()%10000;
VoidBlast_Counter = 0; VoidBlast_Counter = 0;
} }
}else VoidBlast_Timer -= diff; }else VoidBlast_Timer -= diff;
@@ -40,7 +40,7 @@ EndScriptData */
#define SPELL_BANISH 30231 #define SPELL_BANISH 30231
#define SPELL_CORROSIVE_ACID 33551 #define SPELL_CORROSIVE_ACID 33551
#define SPELL_FEAR 33547 #define SPELL_FEAR 33547
#define SPELL_ENRAGE 0 //need to find proper spell #define SPELL_ENRAGE 34970
struct TRINITY_DLL_DECL boss_ambassador_hellmawAI : public ScriptedAI struct TRINITY_DLL_DECL boss_ambassador_hellmawAI : public ScriptedAI
{ {
@@ -59,15 +59,17 @@ struct TRINITY_DLL_DECL boss_ambassador_hellmawAI : public ScriptedAI
uint32 Enrage_Timer; uint32 Enrage_Timer;
bool Intro; bool Intro;
bool IsBanished; bool IsBanished;
bool Enraged;
void Reset() void Reset()
{ {
EventCheck_Timer = 5000; EventCheck_Timer = 5000;
CorrosiveAcid_Timer = 25000; CorrosiveAcid_Timer = 5000 + rand()%5000;
Fear_Timer = 40000; Fear_Timer = 25000 + rand()%5000;
Enrage_Timer = 180000; Enrage_Timer = 180000;
Intro = false; Intro = false;
IsBanished = false; IsBanished = false;
Enraged = false;
if (pInstance) if (pInstance)
{ {
@@ -183,13 +185,14 @@ struct TRINITY_DLL_DECL boss_ambassador_hellmawAI : public ScriptedAI
Fear_Timer = 20000 + rand()%15000; Fear_Timer = 20000 + rand()%15000;
}else Fear_Timer -= diff; }else Fear_Timer -= diff;
/*if (HeroicMode) if (HeroicMode)
{ {
if (Enrage_Timer < diff) if (!Enraged && Enrage_Timer < diff)
{ {
DoCast(m_creature,SPELL_ENRAGE); DoCast(m_creature,SPELL_ENRAGE);
Enraged = true;
}else Enrage_Timer -= diff; }else Enrage_Timer -= diff;
}*/ }
DoMeleeAttackIfReady(); DoMeleeAttackIfReady();
} }
@@ -22,6 +22,7 @@ SDCategory: Auchindoun, Shadow Labyrinth
EndScriptData */ EndScriptData */
#include "precompiled.h" #include "precompiled.h"
#include "def_shadow_labyrinth.h"
#define EMOTE_SONIC_BOOM -1555036 #define EMOTE_SONIC_BOOM -1555036
@@ -16,7 +16,7 @@
/* ScriptData /* ScriptData
SDName: Boss_Tomb_Of_Seven SDName: Boss_Tomb_Of_Seven
SD%Complete: 50 SD%Complete: 90
SDComment: Learning Smelt Dark Iron if tribute quest rewarded. Missing event. SDComment: Learning Smelt Dark Iron if tribute quest rewarded. Missing event.
SDCategory: Blackrock Depths SDCategory: Blackrock Depths
EndScriptData */ EndScriptData */
@@ -26,14 +26,17 @@ EndScriptData */
enum enum
{ {
SPELL_SUNDERARMOR = 24317, SPELL_SUNDERARMOR = 11971,
SPELL_SHIELDBLOCK = 12169, SPELL_SHIELDBLOCK = 12169,
SPELL_STRIKE = 15580 SPELL_STRIKE = 15580
}; };
struct TRINITY_DLL_DECL boss_angerrelAI : public ScriptedAI struct TRINITY_DLL_DECL boss_angerrelAI : public ScriptedAI
{ {
boss_angerrelAI(Creature *c) : ScriptedAI(c) {pInstance = c->GetInstanceData();} boss_angerrelAI(Creature *c) : ScriptedAI(c)
{
pInstance = c->GetInstanceData();
}
ScriptedInstance* pInstance; ScriptedInstance* pInstance;
uint32 SunderArmor_Timer; uint32 SunderArmor_Timer;
@@ -109,12 +112,15 @@ enum
{ {
SPELL_SINISTERSTRIKE = 15581, SPELL_SINISTERSTRIKE = 15581,
SPELL_BACKSTAB = 15582, SPELL_BACKSTAB = 15582,
SPELL_GOUGE = 13579 SPELL_GOUGE = 12540
}; };
struct TRINITY_DLL_DECL boss_doperelAI : public ScriptedAI struct TRINITY_DLL_DECL boss_doperelAI : public ScriptedAI
{ {
boss_doperelAI(Creature *c) : ScriptedAI(c) {pInstance = c->GetInstanceData();} boss_doperelAI(Creature *c) : ScriptedAI(c)
{
pInstance = c->GetInstanceData();
}
ScriptedInstance* pInstance; ScriptedInstance* pInstance;
uint32 SinisterStrike_Timer; uint32 SinisterStrike_Timer;
@@ -188,14 +194,17 @@ CreatureAI* GetAI_boss_doperel(Creature *_Creature)
enum enum
{ {
SPELL_SHADOWBOLT = 17483, //Not sure if right ID SPELL_SHADOWBOLT = 15232,
SPELL_MANABURN = 10876, SPELL_MANABURN = 14033,
SPELL_SHADOWSHIELD = 22417 SPELL_SHADOWSHIELD = 12040
}; };
struct TRINITY_DLL_DECL boss_haterelAI : public ScriptedAI struct TRINITY_DLL_DECL boss_haterelAI : public ScriptedAI
{ {
boss_haterelAI(Creature *c) : ScriptedAI(c) {pInstance = c->GetInstanceData();} boss_haterelAI(Creature *c) : ScriptedAI(c)
{
pInstance = c->GetInstanceData();
}
ScriptedInstance* pInstance; ScriptedInstance* pInstance;
uint32 ShadowBolt_Timer; uint32 ShadowBolt_Timer;
@@ -242,9 +251,8 @@ struct TRINITY_DLL_DECL boss_haterelAI : public ScriptedAI
//ShadowBolt_Timer //ShadowBolt_Timer
if (ShadowBolt_Timer < diff) if (ShadowBolt_Timer < diff)
{ {
Unit* target = NULL; if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0))
target = SelectUnit(SELECT_TARGET_RANDOM,0); DoCast(target,SPELL_SHADOWBOLT);
if (target) DoCast(target,SPELL_SHADOWBOLT);
ShadowBolt_Timer = 7000; ShadowBolt_Timer = 7000;
}else ShadowBolt_Timer -= diff; }else ShadowBolt_Timer -= diff;
@@ -285,12 +293,15 @@ enum
SPELL_MINDBLAST = 15587, SPELL_MINDBLAST = 15587,
SPELL_HEAL = 15586, SPELL_HEAL = 15586,
SPELL_PRAYEROFHEALING = 15585, SPELL_PRAYEROFHEALING = 15585,
SPELL_SHIELD = 10901 SPELL_SHIELD = 11974
}; };
struct TRINITY_DLL_DECL boss_vilerelAI : public ScriptedAI struct TRINITY_DLL_DECL boss_vilerelAI : public ScriptedAI
{ {
boss_vilerelAI(Creature *c) : ScriptedAI(c) {pInstance = c->GetInstanceData();} boss_vilerelAI(Creature *c) : ScriptedAI(c)
{
pInstance = c->GetInstanceData();
}
ScriptedInstance* pInstance; ScriptedInstance* pInstance;
uint32 MindBlast_Timer; uint32 MindBlast_Timer;
@@ -373,21 +384,24 @@ CreatureAI* GetAI_boss_vilerel(Creature *_Creature)
enum enum
{ {
SPELL_FROSTBOLT = 16799, SPELL_FROSTBOLT = 12675,
SPELL_FROSTARMOR = 15784, //This is actually a buff he gives himself SPELL_FROSTARMOR = 12544, //This is actually a buff he gives himself
SPELL_BLIZZARD = 19099, SPELL_CONEOFCOLD = 15244,
SPELL_FROSTNOVA = 15063, SPELL_FROSTNOVA = 12674,
SPELL_FROSTWARD = 15004 SPELL_FROSTWARD = 15044
}; };
struct TRINITY_DLL_DECL boss_seethrelAI : public ScriptedAI struct TRINITY_DLL_DECL boss_seethrelAI : public ScriptedAI
{ {
boss_seethrelAI(Creature *c) : ScriptedAI(c) {pInstance = c->GetInstanceData();} boss_seethrelAI(Creature *c) : ScriptedAI(c)
{
pInstance = c->GetInstanceData();
}
ScriptedInstance* pInstance; ScriptedInstance* pInstance;
uint32 FrostArmor_Timer; uint32 FrostArmor_Timer;
uint32 Frostbolt_Timer; uint32 Frostbolt_Timer;
uint32 Blizzard_Timer; uint32 ConeofCold_Timer;
uint32 FrostNova_Timer; uint32 FrostNova_Timer;
uint32 FrostWard_Timer; uint32 FrostWard_Timer;
@@ -395,7 +409,7 @@ struct TRINITY_DLL_DECL boss_seethrelAI : public ScriptedAI
{ {
FrostArmor_Timer = 2000; FrostArmor_Timer = 2000;
Frostbolt_Timer = 6000; Frostbolt_Timer = 6000;
Blizzard_Timer = 18000; ConeofCold_Timer = 18000;
FrostNova_Timer = 12000; FrostNova_Timer = 12000;
FrostWard_Timer = 25000; FrostWard_Timer = 25000;
@@ -444,14 +458,14 @@ struct TRINITY_DLL_DECL boss_seethrelAI : public ScriptedAI
Frostbolt_Timer = 15000; Frostbolt_Timer = 15000;
}else Frostbolt_Timer -= diff; }else Frostbolt_Timer -= diff;
//Blizzard_Timer //ConeofCold_Timer
if (Blizzard_Timer < diff) if (ConeofCold_Timer < diff)
{ {
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0)) if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0))
DoCast(target,SPELL_BLIZZARD); DoCast(target,SPELL_CONEOFCOLD);
Blizzard_Timer = 22000; ConeofCold_Timer = 22000;
}else Blizzard_Timer -= diff; }else ConeofCold_Timer -= diff;
//FrostNova_Timer //FrostNova_Timer
if (FrostNova_Timer < diff) if (FrostNova_Timer < diff)
@@ -479,13 +493,16 @@ CreatureAI* GetAI_boss_seethrel(Creature *_Creature)
enum enum
{ {
SPELL_HAMSTRING = 9080, SPELL_HAMSTRING = 9080,
SPELL_CLEAVE = 15579, SPELL_CLEAVE = 40504,
SPELL_MORTALSTRIKE = 15708 SPELL_MORTALSTRIKE = 13737
}; };
struct TRINITY_DLL_DECL boss_gloomrelAI : public ScriptedAI struct TRINITY_DLL_DECL boss_gloomrelAI : public ScriptedAI
{ {
boss_gloomrelAI(Creature *c) : ScriptedAI(c) {pInstance = c->GetInstanceData();} boss_gloomrelAI(Creature *c) : ScriptedAI(c)
{
pInstance = c->GetInstanceData();
}
ScriptedInstance* pInstance; ScriptedInstance* pInstance;
uint32 Hamstring_Timer; uint32 Hamstring_Timer;
@@ -605,16 +622,19 @@ bool GossipSelect_boss_gloomrel(Player *player, Creature *_Creature, uint32 send
enum enum
{ {
SPELL_SHADOWBOLTVOLLEY = 17228, SPELL_SHADOWBOLTVOLLEY = 15245,
SPELL_IMMOLATE = 15505, SPELL_IMMOLATE = 12742,
SPELL_CURSEOFWEAKNESS = 17227, SPELL_CURSEOFWEAKNESS = 12493,
SPELL_DEMONARMOR = 11735, SPELL_DEMONARMOR = 13787,
SPELL_SUMMON_VOIDWALKERS = 15092 SPELL_SUMMON_VOIDWALKERS = 15092
}; };
struct TRINITY_DLL_DECL boss_doomrelAI : public ScriptedAI struct TRINITY_DLL_DECL boss_doomrelAI : public ScriptedAI
{ {
boss_doomrelAI(Creature *c) : ScriptedAI(c) {pInstance = c->GetInstanceData();} boss_doomrelAI(Creature *c) : ScriptedAI(c)
{
pInstance = c->GetInstanceData();
}
ScriptedInstance* pInstance; ScriptedInstance* pInstance;
uint32 ShadowVolley_Timer; uint32 ShadowVolley_Timer;
@@ -274,6 +274,8 @@ struct TRINITY_DLL_DECL boss_felblood_kaelthasAI : public ScriptedAI
{ {
if (PyroblastTimer < diff) if (PyroblastTimer < diff)
{ {
m_creature->InterruptSpell(CURRENT_CHANNELED_SPELL);
m_creature->InterruptSpell(CURRENT_GENERIC_SPELL);
DoCast(m_creature, SPELL_SHOCK_BARRIER, true); DoCast(m_creature, SPELL_SHOCK_BARRIER, true);
DoCast(m_creature->getVictim(), SPELL_PYROBLAST); DoCast(m_creature->getVictim(), SPELL_PYROBLAST);
PyroblastTimer = 60000; PyroblastTimer = 60000;
@@ -289,8 +291,7 @@ struct TRINITY_DLL_DECL boss_felblood_kaelthasAI : public ScriptedAI
if (PhoenixTimer < diff) if (PhoenixTimer < diff)
{ {
Unit* target = NULL; Unit* target = SelectUnit(SELECT_TARGET_RANDOM,1);
target = SelectUnit(SELECT_TARGET_RANDOM,1);
uint32 random = rand()%2 + 1; uint32 random = rand()%2 + 1;
float x = KaelLocations[random][0]; float x = KaelLocations[random][0];
@@ -313,6 +314,8 @@ struct TRINITY_DLL_DECL boss_felblood_kaelthasAI : public ScriptedAI
{ {
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0)) if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0))
{ {
m_creature->InterruptSpell(CURRENT_CHANNELED_SPELL);
m_creature->InterruptSpell(CURRENT_GENERIC_SPELL);
DoCast(target, SPELL_FLAMESTRIKE3, true); DoCast(target, SPELL_FLAMESTRIKE3, true);
DoScriptText(SAY_FLAMESTRIKE, m_creature); DoScriptText(SAY_FLAMESTRIKE, m_creature);
} }
@@ -465,7 +468,7 @@ struct TRINITY_DLL_DECL mob_felkael_phoenixAI : public ScriptedAI
m_creature->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); m_creature->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING);
m_creature->CastSpell(m_creature,SPELL_PHOENIX_BURN,true); m_creature->CastSpell(m_creature,SPELL_PHOENIX_BURN,true);
BurnTimer = 2000; BurnTimer = 2000;
Death_Timer = 2700; Death_Timer = 3000;
Rebirth = false; Rebirth = false;
FakeDeath = false; FakeDeath = false;
} }
@@ -552,7 +555,6 @@ struct TRINITY_DLL_DECL mob_felkael_phoenixAI : public ScriptedAI
BurnTimer += 2000; BurnTimer += 2000;
} BurnTimer -= diff; } BurnTimer -= diff;
DoMeleeAttackIfReady(); DoMeleeAttackIfReady();
} }
}; };
@@ -617,13 +619,12 @@ struct TRINITY_DLL_DECL mob_arcane_sphereAI : public ScriptedAI
if (ChangeTargetTimer < diff) if (ChangeTargetTimer < diff)
{ {
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0))
Unit* target = NULL; {
target = SelectUnit(SELECT_TARGET_RANDOM,0);
if (target)
m_creature->AddThreat(target, 1.0f); m_creature->AddThreat(target, 1.0f);
m_creature->TauntApply(target); m_creature->TauntApply(target);
AttackStart(target); AttackStart(target);
}
ChangeTargetTimer = 5000 + rand()%10000; ChangeTargetTimer = 5000 + rand()%10000;
}else ChangeTargetTimer -= diff; }else ChangeTargetTimer -= diff;
@@ -254,7 +254,7 @@ struct TRINITY_DLL_DECL boss_selin_fireheartAI : public ScriptedAI
{ {
if (DrainManaTimer < diff) if (DrainManaTimer < diff)
{ {
DoCast(SelectUnit(SELECT_TARGET_RANDOM, 0), SPELL_DRAIN_MANA); DoCast(SelectUnit(SELECT_TARGET_RANDOM, 1), SPELL_DRAIN_MANA);
DrainManaTimer = 10000; DrainManaTimer = 10000;
}else DrainManaTimer -= diff; }else DrainManaTimer -= diff;
} }
@@ -41,8 +41,10 @@ enum
//Vexallus spell info //Vexallus spell info
SPELL_CHAIN_LIGHTNING = 44318, SPELL_CHAIN_LIGHTNING = 44318,
SPELL_H_CHAIN_LIGHTNING = 46380, //heroic spell
SPELL_OVERLOAD = 44353, SPELL_OVERLOAD = 44353,
SPELL_ARCANE_SHOCK = 44319, SPELL_ARCANE_SHOCK = 44319,
SPELL_H_ARCANE_SHOCK = 46381, //heroic spell
SPELL_SUMMON_PURE_ENERGY = 44322, //mod scale -10 SPELL_SUMMON_PURE_ENERGY = 44322, //mod scale -10
H_SPELL_SUMMON_PURE_ENERGY1 = 46154, //mod scale -5 H_SPELL_SUMMON_PURE_ENERGY1 = 46154, //mod scale -5
@@ -74,9 +76,9 @@ struct TRINITY_DLL_DECL boss_vexallusAI : public ScriptedAI
void Reset() void Reset()
{ {
ChainLightningTimer = 10000; ChainLightningTimer = 8000;
ArcaneShockTimer = 8000; ArcaneShockTimer = 5000;
OverloadTimer = 2200; OverloadTimer = 1200;
IntervalHealthAmount = 1; IntervalHealthAmount = 1;
Enraged = false; Enraged = false;
@@ -152,16 +154,16 @@ struct TRINITY_DLL_DECL boss_vexallusAI : public ScriptedAI
if (ChainLightningTimer < diff) if (ChainLightningTimer < diff)
{ {
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0)) if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0))
DoCast(target, SPELL_CHAIN_LIGHTNING); DoCast(target, Heroic ? SPELL_H_CHAIN_LIGHTNING : SPELL_CHAIN_LIGHTNING);
ChainLightningTimer = 10000; ChainLightningTimer = 8000;
}else ChainLightningTimer -= diff; }else ChainLightningTimer -= diff;
if (ArcaneShockTimer < diff) if (ArcaneShockTimer < diff)
{ {
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0)) if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0))
if(target) if(target)
DoCast(target, SPELL_ARCANE_SHOCK); DoCast(target, Heroic ? SPELL_H_ARCANE_SHOCK : SPELL_ARCANE_SHOCK);
ArcaneShockTimer = 8000; ArcaneShockTimer = 8000;
}else ArcaneShockTimer -= diff; }else ArcaneShockTimer -= diff;
@@ -170,10 +172,9 @@ struct TRINITY_DLL_DECL boss_vexallusAI : public ScriptedAI
{ {
if (OverloadTimer < diff) if (OverloadTimer < diff)
{ {
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0)) DoCast(m_creature->getVictim(), SPELL_OVERLOAD);
DoCast(target, SPELL_OVERLOAD);
OverloadTimer = 2200; OverloadTimer = 2000;
}else OverloadTimer -= diff; }else OverloadTimer -= diff;
} }
@@ -60,6 +60,9 @@ enum
SPELL_LAVA_STRIKE = 57571, // (Real spell casted should be 57578) 57571 then trigger visual missile, then summon Lava Blaze on impact(spell 57572) SPELL_LAVA_STRIKE = 57571, // (Real spell casted should be 57578) 57571 then trigger visual missile, then summon Lava Blaze on impact(spell 57572)
SPELL_TWILIGHT_REVENGE = 60639, SPELL_TWILIGHT_REVENGE = 60639,
SPELL_PYROBUFFET = 56916, // currently used for hard enrage after 15 minutes
SPELL_PYROBUFFET_RANGE = 58907, // possibly used when player get too far away from dummy creatures (2x creature entry 30494)
SPELL_TWILIGHT_SHIFT_ENTER = 57620, // enter phase. Player get this when click GO SPELL_TWILIGHT_SHIFT_ENTER = 57620, // enter phase. Player get this when click GO
SPELL_TWILIGHT_SHIFT_REMOVAL = 61187, // leave phase SPELL_TWILIGHT_SHIFT_REMOVAL = 61187, // leave phase
SPELL_TWILIGHT_SHIFT_REMOVAL_ALL = 61190, // leave phase (probably version to make all leave) SPELL_TWILIGHT_SHIFT_REMOVAL_ALL = 61190, // leave phase (probably version to make all leave)
@@ -169,7 +172,10 @@ struct TRINITY_DLL_DECL boss_sartharionAI : public ScriptedAI
bool m_bIsHeroic; bool m_bIsHeroic;
bool m_bIsBerserk; bool m_bIsBerserk;
bool m_bIsSoftEnraged;
uint32 m_uiEnrageTimer; uint32 m_uiEnrageTimer;
bool m_bIsHardEnraged;
uint32 m_uiTenebronTimer; uint32 m_uiTenebronTimer;
uint32 m_uiShadronTimer; uint32 m_uiShadronTimer;
@@ -188,7 +194,10 @@ struct TRINITY_DLL_DECL boss_sartharionAI : public ScriptedAI
void Reset() void Reset()
{ {
m_bIsBerserk = false; m_bIsBerserk = false;
m_bIsSoftEnraged = false;
m_uiEnrageTimer = MINUTE*15*IN_MILISECONDS; m_uiEnrageTimer = MINUTE*15*IN_MILISECONDS;
m_bIsHardEnraged = false;
m_uiTenebronTimer = 30000; m_uiTenebronTimer = 30000;
m_uiShadronTimer = 75000; m_uiShadronTimer = 75000;
@@ -250,8 +259,12 @@ struct TRINITY_DLL_DECL boss_sartharionAI : public ScriptedAI
Unit* pShad = Unit::GetUnit(*m_creature,m_pInstance->GetData64(DATA_SHADRON)); Unit* pShad = Unit::GetUnit(*m_creature,m_pInstance->GetData64(DATA_SHADRON));
Unit* pVesp = Unit::GetUnit(*m_creature,m_pInstance->GetData64(DATA_VESPERON)); Unit* pVesp = Unit::GetUnit(*m_creature,m_pInstance->GetData64(DATA_VESPERON));
//if at least one of the dragons are alive and are being called
bool bCanUseWill = false;
if (pTene && pTene->isAlive() && !pTene->getVictim()) if (pTene && pTene->isAlive() && !pTene->getVictim())
{ {
bCanUseWill = true;
pTene->GetMotionMaster()->MovePoint(POINT_ID_INIT, m_aTene[0].m_fX, m_aTene[0].m_fY, m_aTene[0].m_fZ); pTene->GetMotionMaster()->MovePoint(POINT_ID_INIT, m_aTene[0].m_fX, m_aTene[0].m_fY, m_aTene[0].m_fZ);
if (!pTene->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE)) if (!pTene->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE))
@@ -260,6 +273,7 @@ struct TRINITY_DLL_DECL boss_sartharionAI : public ScriptedAI
if (pShad && pShad->isAlive() && !pShad->getVictim()) if (pShad && pShad->isAlive() && !pShad->getVictim())
{ {
bCanUseWill = true;
pShad->GetMotionMaster()->MovePoint(POINT_ID_INIT, m_aShad[0].m_fX, m_aShad[0].m_fY, m_aShad[0].m_fZ); pShad->GetMotionMaster()->MovePoint(POINT_ID_INIT, m_aShad[0].m_fX, m_aShad[0].m_fY, m_aShad[0].m_fZ);
if (!pShad->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE)) if (!pShad->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE))
@@ -268,11 +282,15 @@ struct TRINITY_DLL_DECL boss_sartharionAI : public ScriptedAI
if (pVesp && pVesp->isAlive() && !pVesp->getVictim()) if (pVesp && pVesp->isAlive() && !pVesp->getVictim())
{ {
bCanUseWill = true;
pVesp->GetMotionMaster()->MovePoint(POINT_ID_INIT, m_aVesp[0].m_fX, m_aVesp[0].m_fY, m_aVesp[0].m_fZ); pVesp->GetMotionMaster()->MovePoint(POINT_ID_INIT, m_aVesp[0].m_fX, m_aVesp[0].m_fY, m_aVesp[0].m_fZ);
if (!pVesp->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE)) if (!pVesp->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE))
pVesp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); pVesp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
} }
if (bCanUseWill)
DoCast(m_creature, SPELL_WILL_OF_SARTHARION);
} }
void CallDragon(uint32 uiDataId) void CallDragon(uint32 uiDataId)
@@ -337,20 +355,28 @@ struct TRINITY_DLL_DECL boss_sartharionAI : public ScriptedAI
if (!UpdateVictim()) if (!UpdateVictim())
return; return;
if (!m_bIsBerserk && (m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) <= 10) //spell will target dragons, if they are still alive at 35%
if (!m_bIsBerserk && (m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) <= 35)
{ {
DoScriptText(SAY_SARTHARION_BERSERK,m_creature); DoScriptText(SAY_SARTHARION_BERSERK,m_creature);
DoCast(m_creature,SPELL_BERSERK); DoCast(m_creature,SPELL_BERSERK);
m_bIsBerserk = true; m_bIsBerserk = true;
} }
// enrage //soft enrage
if (m_uiEnrageTimer) if (!m_bIsSoftEnraged && (m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) <= 10)
{
// TODO
m_bIsSoftEnraged = true;
}
// hard enrage
if (!m_bIsHardEnraged)
{ {
if (m_uiEnrageTimer < uiDiff) if (m_uiEnrageTimer < uiDiff)
{ {
DoCast(m_creature, SPELL_WILL_OF_SARTHARION); DoCast(m_creature, SPELL_PYROBUFFET, true);
m_uiEnrageTimer = 0; m_bIsHardEnraged = true;
} }
else else
m_uiEnrageTimer -= uiDiff; m_uiEnrageTimer -= uiDiff;