Update Script Ulduar/XT-002. Thanks Dakeyras. Fixes issue 1074.
Add script texts for all ulduar bosses and adds. Mainly from wowwiki, Thanks. Some code style cleanup. Still WiP. --HG-- branch : trunk
This commit is contained in:
@@ -58,28 +58,28 @@ enum Creatures
|
||||
#define NORDRASSIL_Y -324.609222
|
||||
#define NORDRASSIL_Z 417.322174
|
||||
|
||||
enum Texts
|
||||
enum Yells
|
||||
{
|
||||
SAY_AGGRO = -1620000,
|
||||
SAY_KILL_1 = -1620005,
|
||||
SAY_KILL_2 = -1620006,
|
||||
SAY_BIG_BANG_1 = -1620002,
|
||||
SAY_BIG_BANG_2 = -1620003,
|
||||
SAY_PHASE_2 = -1620003,
|
||||
SAY_BLACK_HOLE = -1620004,
|
||||
SAY_BERSERK = -1620007,
|
||||
SAY_SUMMON_COLLAPSING_STAR = -1620008,
|
||||
SAY_ENGADED_FOR_FIRTS_TIME = -1620001,
|
||||
SAY_SUMMON1 = -1620010,
|
||||
SAY_SUMMON2 = -1620011,
|
||||
SAY_SUMMON3 = -1620012,
|
||||
SAY_DEATH_1 = -1620013,
|
||||
SAY_DEATH_2 = -1620014,
|
||||
SAY_DEATH_3 = -1620015,
|
||||
SAY_DEATH_4 = -1620009,
|
||||
SAY_DEFEAT_1 = -1620016,
|
||||
SAY_DEFEAT_2 = -1620017,
|
||||
SAY_DEFEAT_3 = -1620018
|
||||
SAY_AGGRO = -1603000,
|
||||
SAY_SLAY_1 = -1603001,
|
||||
SAY_SLAY_2 = -1603002,
|
||||
SAY_ENGADED_FOR_FIRTS_TIME = -1603003,
|
||||
SAY_PHASE_2 = -1603004,
|
||||
SAY_SUMMON_COLLAPSING_STAR = -1603005,
|
||||
SAY_DEATH_1 = -1603006,
|
||||
SAY_DEATH_2 = -1603007,
|
||||
SAY_DEATH_3 = -1603008,
|
||||
SAY_DEATH_4 = -1603009,
|
||||
SAY_DEATH_5 = -1603010,
|
||||
SAY_BERSERK = -1603011,
|
||||
SAY_BIG_BANG_1 = -1603012,
|
||||
SAY_BIG_BANG_2 = -1603013,
|
||||
SAY_TIMER_1 = -1603014,
|
||||
SAY_TIMER_2 = -1603015,
|
||||
SAY_TIMER_3 = -1603016,
|
||||
SAY_SUMMON_1 = -1603017,
|
||||
SAY_SUMMON_2 = -1603018,
|
||||
SAY_SUMMON_3 = -1603019,
|
||||
};
|
||||
|
||||
struct boss_algalonAI : public ScriptedAI
|
||||
@@ -87,6 +87,7 @@ struct boss_algalonAI : public ScriptedAI
|
||||
boss_algalonAI(Creature *c) : ScriptedAI(c)
|
||||
{
|
||||
pInstance = c->GetInstanceData();
|
||||
Summon = false; // not in reset. intro speech done only once.
|
||||
}
|
||||
|
||||
ScriptedInstance* pInstance;
|
||||
@@ -107,33 +108,43 @@ struct boss_algalonAI : public ScriptedAI
|
||||
uint64 BlackHoleGUID;
|
||||
|
||||
bool Enrage;
|
||||
bool m_bIsHeroicMode;
|
||||
bool Summon;
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
if (Summon)
|
||||
{
|
||||
DoScriptText(SAY_AGGRO, m_creature);
|
||||
m_creature->InterruptSpell(CURRENT_CHANNELED_SPELL);
|
||||
DoZoneInCombat(who->ToCreature());
|
||||
}
|
||||
else
|
||||
{
|
||||
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
m_creature->SetReactState(REACT_PASSIVE);
|
||||
uiStep = 1;
|
||||
}
|
||||
|
||||
if (pInstance)
|
||||
pInstance->SetData(TYPE_ALGALON, IN_PROGRESS);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit *victim)
|
||||
{
|
||||
DoScriptText(RAND(SAY_KILL_1,SAY_KILL_2), me);
|
||||
DoScriptText(RAND(SAY_SLAY_1,SAY_SLAY_2), m_creature);
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
Phase = 1;
|
||||
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
DoScriptText(SAY_DEFEAT_1, me);
|
||||
DoScriptText(SAY_DEFEAT_2, me);
|
||||
DoScriptText(SAY_DEFEAT_3, me);
|
||||
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
if (pInstance)
|
||||
pInstance->SetData(TYPE_ALGALON, NOT_STARTED);
|
||||
|
||||
BlackHoleGUID = 0;
|
||||
|
||||
uiPhase_timer = 0;
|
||||
Ascend_Timer = 480000; //8 minutes
|
||||
QuantumStrike_Timer = 4000 + rand()%10000;
|
||||
Berserk_Timer = 360000; //6 minutes
|
||||
@@ -141,6 +152,7 @@ struct boss_algalonAI : public ScriptedAI
|
||||
BigBang_Timer = 90000;
|
||||
PhasePunch_Timer = 8000;
|
||||
CosmicSmash_Timer = urand(30000, 60000);
|
||||
Enrage = false;
|
||||
}
|
||||
|
||||
void JumpToNextStep(uint32 uiTimer)
|
||||
@@ -149,21 +161,14 @@ struct boss_algalonAI : public ScriptedAI
|
||||
++uiStep;
|
||||
}
|
||||
|
||||
void Aggro(Unit* pWho)
|
||||
{
|
||||
me->InterruptSpell(CURRENT_CHANNELED_SPELL);
|
||||
me->SetInCombatWithZone();
|
||||
if (pInstance)
|
||||
pInstance->SetData(TYPE_ALGALON, IN_PROGRESS);
|
||||
}
|
||||
|
||||
void DespawnCollapsingStar()
|
||||
{
|
||||
if (m_lCollapsingStarGUIDList.empty())
|
||||
return;
|
||||
|
||||
for(std::list<uint64>::iterator itr = m_lCollapsingStarGUIDList.begin(); itr != m_lCollapsingStarGUIDList.end(); ++itr)
|
||||
{
|
||||
if (Creature* pTemp = (Creature*)Unit::GetUnit(*me, *itr))
|
||||
if (Creature* pTemp = Unit::GetCreature(*m_creature, *itr))
|
||||
{
|
||||
if (pTemp->isAlive())
|
||||
pTemp->ForcedDespawn();
|
||||
@@ -177,18 +182,17 @@ struct boss_algalonAI : public ScriptedAI
|
||||
if (pSummoned->GetEntry() == CREATURE_COLLAPSING_STAR)
|
||||
{
|
||||
Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0);
|
||||
if (me->getVictim())
|
||||
pSummoned->AI()->AttackStart(pTarget ? pTarget : me->getVictim());
|
||||
if (m_creature->getVictim())
|
||||
pSummoned->AI()->AttackStart(pTarget ? pTarget : m_creature->getVictim());
|
||||
m_lCollapsingStarGUIDList.push_back(pSummoned->GetGUID());
|
||||
}
|
||||
}
|
||||
|
||||
void SummonCollapsingStar(Unit* target)
|
||||
{
|
||||
DoScriptText(SAY_SUMMON_COLLAPSING_STAR, me);
|
||||
me->SummonCreature(CREATURE_COLLAPSING_STAR,target->GetPositionX()+15.0,target->GetPositionY()+15.0,target->GetPositionZ(),0, TEMPSUMMON_TIMED_DESPAWN, 100000);
|
||||
DoScriptText(SAY_BLACK_HOLE, me);
|
||||
me->SummonCreature(CREATURE_BLACK_HOLE,target->GetPositionX()+15.0,target->GetPositionY()+15.0,target->GetPositionZ(),0, TEMPSUMMON_TIMED_DESPAWN, 27000);
|
||||
DoScriptText(SAY_SUMMON_COLLAPSING_STAR, m_creature);
|
||||
m_creature->SummonCreature(CREATURE_COLLAPSING_STAR,target->GetPositionX()+15.0,target->GetPositionY()+15.0,target->GetPositionZ(),0, TEMPSUMMON_TIMED_DESPAWN, 100000);
|
||||
m_creature->SummonCreature(CREATURE_BLACK_HOLE,target->GetPositionX()+15.0,target->GetPositionY()+15.0,target->GetPositionZ(),0, TEMPSUMMON_TIMED_DESPAWN, 27000);
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
@@ -197,25 +201,29 @@ struct boss_algalonAI : public ScriptedAI
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
if ((me->GetHealth()*100 / me->GetMaxHealth()) < 20 && Phase == 1)
|
||||
if (Phase == 1 && HealthBelowPct(20))
|
||||
{
|
||||
Phase = 2;
|
||||
DoScriptText(SAY_PHASE_2, me);
|
||||
DoScriptText(SAY_PHASE_2, m_creature);
|
||||
}
|
||||
|
||||
if ((me->GetHealth()*100 / me->GetMaxHealth()) < 2)
|
||||
if (HealthBelowPct(2))
|
||||
{
|
||||
me->SummonGameObject(GAMEOBJECT_GIVE_OF_THE_OBSERVER, 1634.258667, -295.101166,417.321381,0,0,0,0,0,-10);
|
||||
m_creature->SummonGameObject(GAMEOBJECT_GIVE_OF_THE_OBSERVER, 1634.258667, -295.101166,417.321381,0,0,0,0,0,-10);
|
||||
|
||||
DoScriptText(SAY_DEATH_1, me);
|
||||
DoScriptText(SAY_DEATH_2, me);
|
||||
DoScriptText(SAY_DEATH_3, me);
|
||||
DoScriptText(SAY_DEATH_4, me);
|
||||
// All of them. or random?
|
||||
DoScriptText(SAY_DEATH_1, m_creature);
|
||||
DoScriptText(SAY_DEATH_2, m_creature);
|
||||
DoScriptText(SAY_DEATH_3, m_creature);
|
||||
DoScriptText(SAY_DEATH_4, m_creature);
|
||||
DoScriptText(SAY_DEATH_5, m_creature);
|
||||
|
||||
me->DisappearAndDie();
|
||||
m_creature->DisappearAndDie();
|
||||
|
||||
if (pInstance)
|
||||
pInstance->SetData(TYPE_ALGALON, DONE);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (Phase == 1)
|
||||
@@ -226,60 +234,76 @@ struct boss_algalonAI : public ScriptedAI
|
||||
{
|
||||
switch(uiStep)
|
||||
{
|
||||
case 1: DoScriptText(SAY_SUMMON1, m_creature); break; JumpToNextStep(3000);
|
||||
case 2: DoScriptText(SAY_SUMMON2, m_creature); break; JumpToNextStep(3000);
|
||||
case 3: DoScriptText(SAY_SUMMON3, m_creature); break; JumpToNextStep(3000);
|
||||
case 4: DoScriptText(SAY_ENGADED_FOR_FIRTS_TIME, m_creature); break; JumpToNextStep(3000);
|
||||
case 5: DoScriptText(SAY_AGGRO, m_creature); break;
|
||||
case 6: m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); break;
|
||||
case 7: m_creature->SetReactState(REACT_AGGRESSIVE); break;
|
||||
case 1:
|
||||
DoScriptText(SAY_SUMMON_1, m_creature);
|
||||
JumpToNextStep(3000);
|
||||
break;
|
||||
case 2:
|
||||
DoScriptText(SAY_SUMMON_2, m_creature);
|
||||
JumpToNextStep(3000);
|
||||
break;
|
||||
case 3:
|
||||
DoScriptText(SAY_SUMMON_3, m_creature);
|
||||
JumpToNextStep(3000);
|
||||
break;
|
||||
case 4:
|
||||
DoScriptText(SAY_ENGADED_FOR_FIRTS_TIME, m_creature);
|
||||
JumpToNextStep(3000);
|
||||
break;
|
||||
case 5:
|
||||
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
m_creature->SetReactState(REACT_AGGRESSIVE);
|
||||
Summon = true;
|
||||
break;
|
||||
}
|
||||
}else uiPhase_timer -= diff;
|
||||
} else uiPhase_timer -= diff;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if(QuantumStrike_Timer <= diff)
|
||||
if (QuantumStrike_Timer <= diff)
|
||||
{
|
||||
DoCast(me->getVictim(), m_bIsHeroicMode ? H_SPELL_QUANTUM_STRIKE : SPELL_QUANTUM_STRIKE, true);
|
||||
DoCast(m_creature->getVictim(), RAID_MODE(SPELL_QUANTUM_STRIKE,H_SPELL_QUANTUM_STRIKE), true);
|
||||
|
||||
QuantumStrike_Timer = 4000 + rand()%10000;
|
||||
}else QuantumStrike_Timer -= diff;
|
||||
QuantumStrike_Timer = urand(4000, 14000);
|
||||
} else QuantumStrike_Timer -= diff;
|
||||
|
||||
if(BigBang_Timer <= diff)
|
||||
if (BigBang_Timer <= diff)
|
||||
{
|
||||
DoScriptText(RAND(SAY_BIG_BANG_1,SAY_BIG_BANG_2), me);
|
||||
DoCast(me->getVictim(), m_bIsHeroicMode ? H_SPELL_BIG_BANG : SPELL_BIG_BANG, true);
|
||||
DoScriptText(RAND(SAY_BIG_BANG_1,SAY_BIG_BANG_2), m_creature);
|
||||
DoCast(m_creature->getVictim(), RAID_MODE(SPELL_BIG_BANG,H_SPELL_BIG_BANG), true);
|
||||
|
||||
BigBang_Timer = 90000;
|
||||
}else BigBang_Timer -= diff;
|
||||
} else BigBang_Timer -= diff;
|
||||
|
||||
if(Ascend_Timer <= diff)
|
||||
if (Ascend_Timer <= diff)
|
||||
{
|
||||
DoCast(me->getVictim(),SPELL_ASCEND, true);
|
||||
DoCast(m_creature->getVictim(),SPELL_ASCEND, true);
|
||||
|
||||
Ascend_Timer = 480000;
|
||||
}else Ascend_Timer -= diff;
|
||||
} else Ascend_Timer -= diff;
|
||||
|
||||
if(PhasePunch_Timer <= diff)
|
||||
if (PhasePunch_Timer <= diff)
|
||||
{
|
||||
DoCast(me->getVictim(),SPELL_PHASE_PUNCH, true);
|
||||
DoCast(m_creature->getVictim(),SPELL_PHASE_PUNCH, true);
|
||||
|
||||
PhasePunch_Timer = 8000;
|
||||
}else PhasePunch_Timer -= diff;
|
||||
} else PhasePunch_Timer -= diff;
|
||||
|
||||
if(CosmicSmash_Timer <= diff)
|
||||
if (CosmicSmash_Timer <= diff)
|
||||
{
|
||||
DoCast(SelectUnit(SELECT_TARGET_RANDOM, 0), m_bIsHeroicMode ? H_SPELL_COSMIC_SMASH : SPELL_COSMIC_SMASH, true);
|
||||
DoCast(SelectUnit(SELECT_TARGET_RANDOM, 0), RAID_MODE(SPELL_COSMIC_SMASH,H_SPELL_COSMIC_SMASH), true);
|
||||
|
||||
CosmicSmash_Timer = urand(30000, 60000);
|
||||
}else CosmicSmash_Timer -= diff;
|
||||
} else CosmicSmash_Timer -= diff;
|
||||
|
||||
if(Berserk_Timer <= diff)
|
||||
if (Berserk_Timer <= diff)
|
||||
{
|
||||
DoScriptText(SAY_BERSERK, me);
|
||||
DoCast(me->getVictim(),SPELL_BERSERK, true);
|
||||
DoScriptText(SAY_BERSERK, m_creature);
|
||||
DoCast(m_creature->getVictim(),SPELL_BERSERK, true);
|
||||
|
||||
Berserk_Timer = 360000;
|
||||
}else Berserk_Timer -= diff;
|
||||
} else Berserk_Timer -= diff;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
|
||||
@@ -292,9 +316,9 @@ struct boss_algalonAI : public ScriptedAI
|
||||
{
|
||||
if (Ascend_Timer <= diff)
|
||||
{
|
||||
DoCast(me, SPELL_ASCEND);
|
||||
DoScriptText(SAY_BERSERK, me);
|
||||
Ascend_Timer = 360000 + rand()%5000;
|
||||
DoCast(m_creature, SPELL_ASCEND);
|
||||
DoScriptText(SAY_BERSERK, m_creature);
|
||||
Ascend_Timer = urand(360000,365000);
|
||||
Enrage = false;
|
||||
} else Ascend_Timer -= diff;
|
||||
}
|
||||
@@ -303,13 +327,13 @@ struct boss_algalonAI : public ScriptedAI
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
//Collapsing Star
|
||||
struct mob_collapsing_starAI : public ScriptedAI
|
||||
{
|
||||
mob_collapsing_starAI(Creature *pCreature) : ScriptedAI(pCreature)
|
||||
{
|
||||
pInstance = (ScriptedInstance*)pCreature->GetInstanceData();
|
||||
Reset();
|
||||
}
|
||||
|
||||
ScriptedInstance* pInstance;
|
||||
@@ -326,11 +350,11 @@ struct mob_collapsing_starAI : public ScriptedAI
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
if(BlackHoleExplosion_Timer <= diff)
|
||||
if (BlackHoleExplosion_Timer <= diff)
|
||||
{
|
||||
me->CastSpell(me, SPELL_BLACK_HOLE_EXPLOSION, false);
|
||||
m_creature->CastSpell(m_creature, SPELL_BLACK_HOLE_EXPLOSION, false);
|
||||
BlackHoleExplosion_Timer = 0;
|
||||
}else BlackHoleExplosion_Timer -= diff;
|
||||
} else BlackHoleExplosion_Timer -= diff;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -62,8 +62,9 @@ EndScriptData */
|
||||
#define SPELL_LIGHTNING_TENDRILS_H 63486
|
||||
#define SPELL_STORMSHIELD 64187
|
||||
|
||||
enum eEnums
|
||||
enum Events
|
||||
{
|
||||
EVENT_NONE,
|
||||
EVENT_ENRAGE,
|
||||
// Steelbreaker
|
||||
EVENT_FUSION_PUNCH,
|
||||
@@ -81,8 +82,35 @@ enum eEnums
|
||||
EVENT_LIGHTNING_WHIRL,
|
||||
EVENT_LIGHTNING_TENDRILS,
|
||||
EVENT_STORMSHIELD,
|
||||
MAX_EVENT
|
||||
};
|
||||
|
||||
enum Yells
|
||||
{
|
||||
SAY_STEELBREAKER_AGGRO = -1603020,
|
||||
SAY_STEELBREAKER_SLAY_1 = -1603021,
|
||||
SAY_STEELBREAKER_SLAY_2 = -1603022,
|
||||
SAY_STEELBREAKER_POWER = -1603023,
|
||||
SAY_STEELBREAKER_DEATH_1 = -1603024,
|
||||
SAY_STEELBREAKER_DEATH_2 = -1603025,
|
||||
SAY_STEELBREAKER_BERSERK = -1603026,
|
||||
|
||||
SAY_MOLGEIM_AGGRO = -1603030,
|
||||
SAY_MOLGEIM_SLAY_1 = -1603031,
|
||||
SAY_MOLGEIM_SLAY_2 = -1603032,
|
||||
SAY_MOLGEIM_RUNE_DEATH = -1603033,
|
||||
SAY_MOLGEIM_SUMMON = -1603034,
|
||||
SAY_MOLGEIM_DEATH_1 = -1603035,
|
||||
SAY_MOLGEIM_DEATH_2 = -1603036,
|
||||
SAY_MOLGEIM_BERSERK = -1603037,
|
||||
|
||||
SAY_BRUNDIR_AGGRO = -1603040,
|
||||
SAY_BRUNDIR_SLAY_1 = -1603041,
|
||||
SAY_BRUNDIR_SLAY_2 = -1603042,
|
||||
SAY_BRUNDIR_SPECIAL = -1603043,
|
||||
SAY_BRUNDIR_FLIGHT = -1603044,
|
||||
SAY_BRUNDIR_DEATH_1 = -1603045,
|
||||
SAY_BRUNDIR_DEATH_2 = -1603046,
|
||||
SAY_BRUNDIR_BERSERK = -1603047,
|
||||
};
|
||||
|
||||
bool IsEncounterComplete(ScriptedInstance* pInstance, Creature* m_creature)
|
||||
@@ -93,15 +121,13 @@ bool IsEncounterComplete(ScriptedInstance* pInstance, Creature* m_creature)
|
||||
for (uint8 i = 0; i < 3; ++i)
|
||||
{
|
||||
uint64 guid = pInstance->GetData64(DATA_STEELBREAKER+i);
|
||||
if(!guid)
|
||||
if (!guid)
|
||||
return false;
|
||||
|
||||
if(Creature *boss = (Unit::GetCreature((*m_creature), guid)))
|
||||
if (Creature *boss = Unit::GetCreature(*m_creature, guid))
|
||||
{
|
||||
if(boss->isAlive())
|
||||
if (boss->isAlive())
|
||||
return false;
|
||||
|
||||
continue;
|
||||
}
|
||||
else
|
||||
return false;
|
||||
@@ -121,7 +147,7 @@ struct boss_steelbreakerAI : public ScriptedAI
|
||||
events.Reset();
|
||||
phase = 0;
|
||||
m_creature->RemoveAllAuras();
|
||||
if(pInstance)
|
||||
if (pInstance)
|
||||
pInstance->SetData(TYPE_ASSEMBLY, NOT_STARTED);
|
||||
}
|
||||
|
||||
@@ -131,6 +157,7 @@ struct boss_steelbreakerAI : public ScriptedAI
|
||||
|
||||
void EnterCombat(Unit *who)
|
||||
{
|
||||
DoScriptText(SAY_STEELBREAKER_AGGRO, m_creature);
|
||||
DoZoneInCombat();
|
||||
DoCast(m_creature, RAID_MODE(SPELL_HIGH_VOLTAGE, SPELL_HIGH_VOLTAGE_H));
|
||||
events.ScheduleEvent(EVENT_ENRAGE, 900000);
|
||||
@@ -142,46 +169,46 @@ struct boss_steelbreakerAI : public ScriptedAI
|
||||
++phase;
|
||||
events.SetPhase(phase);
|
||||
events.RescheduleEvent(EVENT_FUSION_PUNCH, 15000);
|
||||
if(phase >= 2)
|
||||
if (phase >= 2)
|
||||
events.RescheduleEvent(EVENT_STATIC_DISRUPTION, 30000);
|
||||
if(phase >= 3)
|
||||
if (phase >= 3)
|
||||
events.RescheduleEvent(EVENT_OVERWHELMING_POWER, rand()%5000);
|
||||
}
|
||||
|
||||
void DamageTaken(Unit* pKiller, uint32 &damage)
|
||||
{
|
||||
if(damage >= m_creature->GetHealth())
|
||||
if (damage >= m_creature->GetHealth())
|
||||
{
|
||||
if(Creature* Brundir = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_STORMCALLER_BRUNDIR) : 0))
|
||||
if(Brundir->isAlive())
|
||||
{
|
||||
if (Creature* Brundir = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_STORMCALLER_BRUNDIR) : 0))
|
||||
if (Brundir->isAlive())
|
||||
Brundir->SetHealth(Brundir->GetMaxHealth());
|
||||
}
|
||||
|
||||
if(Creature* Molgeim = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_RUNEMASTER_MOLGEIM) : 0))
|
||||
if(Molgeim->isAlive())
|
||||
{
|
||||
if (Creature* Molgeim = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_RUNEMASTER_MOLGEIM) : 0))
|
||||
if (Molgeim->isAlive())
|
||||
Molgeim->SetHealth(Molgeim->GetMaxHealth());
|
||||
}
|
||||
DoCast(SPELL_SUPERCHARGE);
|
||||
|
||||
DoCast(SPELL_SUPERCHARGE);
|
||||
}
|
||||
}
|
||||
|
||||
void JustDied(Unit* Killer)
|
||||
{
|
||||
if(IsEncounterComplete(pInstance, m_creature) && pInstance)
|
||||
DoScriptText(RAND(SAY_STEELBREAKER_DEATH_1,SAY_STEELBREAKER_DEATH_2), m_creature);
|
||||
if (IsEncounterComplete(pInstance, m_creature) && pInstance)
|
||||
pInstance->SetData(TYPE_ASSEMBLY, DONE);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit *who)
|
||||
{
|
||||
if(phase == 3)
|
||||
DoScriptText(RAND(SAY_STEELBREAKER_SLAY_1,SAY_STEELBREAKER_SLAY_2), m_creature);
|
||||
|
||||
if (phase == 3)
|
||||
DoCast(m_creature, SPELL_ELECTRICAL_CHARGE);
|
||||
}
|
||||
|
||||
void SpellHit(Unit *from, const SpellEntry *spell)
|
||||
{
|
||||
if(spell->Id == SPELL_SUPERCHARGE)
|
||||
if (spell->Id == SPELL_SUPERCHARGE)
|
||||
UpdatePhase();
|
||||
}
|
||||
|
||||
@@ -197,23 +224,23 @@ struct boss_steelbreakerAI : public ScriptedAI
|
||||
switch(eventId)
|
||||
{
|
||||
case EVENT_ENRAGE:
|
||||
DoScriptText(SAY_STEELBREAKER_BERSERK, m_creature);
|
||||
DoCast(SPELL_BERSERK);
|
||||
break;
|
||||
break;
|
||||
case EVENT_FUSION_PUNCH:
|
||||
DoCast(me->getVictim(), RAID_MODE(SPELL_FUSION_PUNCH_H, SPELL_FUSION_PUNCH));
|
||||
events.ScheduleEvent(EVENT_FUSION_PUNCH, 13000 + (rand()%9)*1000);
|
||||
break;
|
||||
DoCast(me->getVictim(), RAID_MODE(SPELL_FUSION_PUNCH, SPELL_FUSION_PUNCH_H));
|
||||
events.ScheduleEvent(EVENT_FUSION_PUNCH, urand(13000, 22000));
|
||||
break;
|
||||
case EVENT_STATIC_DISRUPTION:
|
||||
{
|
||||
Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM);
|
||||
DoCast(pTarget, RAID_MODE(SPELL_STATIC_DISRUPTION_H, SPELL_STATIC_DISRUPTION));
|
||||
events.ScheduleEvent(EVENT_STATIC_DISRUPTION, 20000 + (rand()%20)*1000);
|
||||
}
|
||||
break;
|
||||
if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM))
|
||||
DoCast(pTarget, RAID_MODE(SPELL_STATIC_DISRUPTION, SPELL_STATIC_DISRUPTION_H));
|
||||
events.ScheduleEvent(EVENT_STATIC_DISRUPTION, urand(20000, 40000));
|
||||
break;
|
||||
case EVENT_OVERWHELMING_POWER:
|
||||
DoScriptText(SAY_STEELBREAKER_POWER, m_creature);
|
||||
DoCast(me->getVictim(), RAID_MODE(SPELL_OVERWHELMING_POWER, SPELL_OVERWHELMING_POWER_H));
|
||||
events.ScheduleEvent(EVENT_OVERWHELMING_POWER, RAID_MODE(60000, 35000));
|
||||
break;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -230,7 +257,7 @@ struct boss_runemaster_molgeimAI : public ScriptedAI
|
||||
|
||||
void Reset()
|
||||
{
|
||||
if(pInstance)
|
||||
if (pInstance)
|
||||
pInstance->SetData(TYPE_ASSEMBLY, NOT_STARTED);
|
||||
events.Reset();
|
||||
m_creature->RemoveAllAuras();
|
||||
@@ -243,6 +270,7 @@ struct boss_runemaster_molgeimAI : public ScriptedAI
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
DoScriptText(SAY_MOLGEIM_AGGRO, m_creature);
|
||||
DoZoneInCombat();
|
||||
events.ScheduleEvent(EVENT_ENRAGE, 900000);
|
||||
UpdatePhase();
|
||||
@@ -254,40 +282,43 @@ struct boss_runemaster_molgeimAI : public ScriptedAI
|
||||
events.SetPhase(phase);
|
||||
events.RescheduleEvent(EVENT_SHIELD_OF_RUNES, 27000);
|
||||
events.RescheduleEvent(EVENT_RUNE_OF_POWER, 60000);
|
||||
if(phase >= 2)
|
||||
if (phase >= 2)
|
||||
events.RescheduleEvent(EVENT_RUNE_OF_DEATH, 30000);
|
||||
if(phase >= 3)
|
||||
events.RescheduleEvent(EVENT_RUNE_OF_SUMMONING, 20000+(rand()%10)*1000);
|
||||
if (phase >= 3)
|
||||
events.RescheduleEvent(EVENT_RUNE_OF_SUMMONING, urand(20000,30000));
|
||||
}
|
||||
|
||||
void DamageTaken(Unit* pKiller, uint32 &damage)
|
||||
{
|
||||
if(damage >= m_creature->GetHealth())
|
||||
if (damage >= m_creature->GetHealth())
|
||||
{
|
||||
if(Creature* Steelbreaker = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_STEELBREAKER) : 0))
|
||||
if(Steelbreaker->isAlive())
|
||||
{
|
||||
if (Creature* Steelbreaker = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_STEELBREAKER) : 0))
|
||||
if (Steelbreaker->isAlive())
|
||||
Steelbreaker->SetHealth(Steelbreaker->GetMaxHealth());
|
||||
}
|
||||
|
||||
if(Creature* Brundir = Unit::GetCreature((*m_creature), pInstance ? pInstance->GetData64(DATA_STORMCALLER_BRUNDIR) : 0))
|
||||
if(Brundir->isAlive())
|
||||
{
|
||||
if (Creature* Brundir = Unit::GetCreature((*m_creature), pInstance ? pInstance->GetData64(DATA_STORMCALLER_BRUNDIR) : 0))
|
||||
if (Brundir->isAlive())
|
||||
Brundir->SetHealth(Brundir->GetMaxHealth());
|
||||
}
|
||||
|
||||
DoCast(m_creature, SPELL_SUPERCHARGE);
|
||||
}
|
||||
}
|
||||
|
||||
void JustDied(Unit* Killer)
|
||||
{
|
||||
if(IsEncounterComplete(pInstance, m_creature) && pInstance)
|
||||
DoScriptText(RAND(SAY_MOLGEIM_DEATH_1,SAY_MOLGEIM_DEATH_2), m_creature);
|
||||
if (IsEncounterComplete(pInstance, m_creature) && pInstance)
|
||||
pInstance->SetData(TYPE_ASSEMBLY, DONE);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit *who)
|
||||
{
|
||||
DoScriptText(RAND(SAY_MOLGEIM_SLAY_1,SAY_MOLGEIM_SLAY_2), m_creature);
|
||||
}
|
||||
|
||||
void SpellHit(Unit *from, const SpellEntry *spell)
|
||||
{
|
||||
if(spell->Id == SPELL_SUPERCHARGE)
|
||||
if (spell->Id == SPELL_SUPERCHARGE)
|
||||
UpdatePhase();
|
||||
}
|
||||
|
||||
@@ -303,35 +334,34 @@ struct boss_runemaster_molgeimAI : public ScriptedAI
|
||||
switch(eventId)
|
||||
{
|
||||
case EVENT_ENRAGE:
|
||||
DoScriptText(SAY_MOLGEIM_BERSERK, m_creature);
|
||||
DoCast(SPELL_BERSERK);
|
||||
break;
|
||||
break;
|
||||
case EVENT_RUNE_OF_POWER: // Improve target selection; random alive friendly
|
||||
{
|
||||
Unit *Target = DoSelectLowestHpFriendly(60);
|
||||
if(!Target || (Target && !Target->isAlive()))
|
||||
Target = m_creature;
|
||||
DoCast(Target, SPELL_RUNE_OF_POWER);
|
||||
Unit *pTarget = DoSelectLowestHpFriendly(60);
|
||||
if (!pTarget || (pTarget && !pTarget->isAlive()))
|
||||
pTarget = m_creature;
|
||||
DoCast(pTarget, SPELL_RUNE_OF_POWER);
|
||||
events.ScheduleEvent(EVENT_RUNE_OF_POWER, 60000);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case EVENT_SHIELD_OF_RUNES:
|
||||
DoCast(m_creature, RAID_MODE(SPELL_SHIELD_OF_RUNES, SPELL_SHIELD_OF_RUNES_H));
|
||||
events.ScheduleEvent(EVENT_SHIELD_OF_RUNES, 27000+ (rand()%7)*1000);
|
||||
break;
|
||||
events.ScheduleEvent(EVENT_SHIELD_OF_RUNES, urand(27000,34000));
|
||||
break;
|
||||
case EVENT_RUNE_OF_DEATH:
|
||||
{
|
||||
Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM);
|
||||
DoCast(pTarget, SPELL_RUNE_OF_DEATH);
|
||||
events.ScheduleEvent(EVENT_RUNE_OF_DEATH, 30000+ (rand()%10)*1000);
|
||||
}
|
||||
break;
|
||||
DoScriptText(SAY_MOLGEIM_RUNE_DEATH, m_creature);
|
||||
if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM))
|
||||
DoCast(pTarget, SPELL_RUNE_OF_DEATH);
|
||||
events.ScheduleEvent(EVENT_RUNE_OF_DEATH, urand(30000,40000));
|
||||
break;
|
||||
case EVENT_RUNE_OF_SUMMONING:
|
||||
{
|
||||
Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM);
|
||||
DoCast(pTarget, SPELL_RUNE_OF_SUMMONING);
|
||||
events.ScheduleEvent(EVENT_RUNE_OF_SUMMONING, 20000+(rand()%10)*1000);
|
||||
}
|
||||
break;
|
||||
DoScriptText(SAY_MOLGEIM_SUMMON, m_creature);
|
||||
if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM))
|
||||
DoCast(pTarget, SPELL_RUNE_OF_SUMMONING);
|
||||
events.ScheduleEvent(EVENT_RUNE_OF_SUMMONING, urand(20000,30000));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -346,29 +376,29 @@ struct mob_lightning_elementalAI : public ScriptedAI
|
||||
Charge();
|
||||
}
|
||||
|
||||
Unit* Target;
|
||||
|
||||
void Charge()
|
||||
{
|
||||
Target = m_creature->SelectNearestTarget();
|
||||
m_creature->AddThreat(Target, 5000000.0f);
|
||||
AttackStart(Target);
|
||||
Unit* pTarget = m_creature->SelectNearestTarget();
|
||||
m_creature->AddThreat(pTarget, 5000000.0f);
|
||||
AttackStart(pTarget);
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if(!m_creature->isInCombat())
|
||||
if (!m_creature->isInCombat())
|
||||
return;
|
||||
|
||||
if(m_creature->IsWithinMeleeRange(Target))
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
if (m_creature->IsWithinMeleeRange(m_creature->getVictim()))
|
||||
{
|
||||
DoCast(Target, RAID_MODE(SPELL_LIGHTNING_BLAST, SPELL_LIGHTNING_BLAST_H));
|
||||
DoCast(m_creature->getVictim(), RAID_MODE(SPELL_LIGHTNING_BLAST, SPELL_LIGHTNING_BLAST_H));
|
||||
m_creature->Kill(m_creature); // hack until spell works
|
||||
}
|
||||
|
||||
m_creature->GetMotionMaster()->MoveChase(Target); // needed at every update?
|
||||
m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim()); // needed at every update?
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
struct mob_rune_of_summoningAI : public ScriptedAI
|
||||
@@ -394,7 +424,7 @@ struct boss_stormcaller_brundirAI : public ScriptedAI
|
||||
|
||||
void Reset()
|
||||
{
|
||||
if(pInstance)
|
||||
if (pInstance)
|
||||
pInstance->SetData(TYPE_ASSEMBLY, NOT_STARTED);
|
||||
m_creature->RemoveAllAuras();
|
||||
events.Reset();
|
||||
@@ -407,6 +437,7 @@ struct boss_stormcaller_brundirAI : public ScriptedAI
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
DoScriptText(SAY_BRUNDIR_AGGRO, m_creature);
|
||||
DoZoneInCombat();
|
||||
events.ScheduleEvent(EVENT_ENRAGE, 900000);
|
||||
UpdatePhase();
|
||||
@@ -416,33 +447,28 @@ struct boss_stormcaller_brundirAI : public ScriptedAI
|
||||
{
|
||||
++phase;
|
||||
events.SetPhase(phase);
|
||||
events.RescheduleEvent(EVENT_CHAIN_LIGHTNING, 9000+ (rand()%8)*1000);
|
||||
events.RescheduleEvent(EVENT_OVERLOAD, 60000+ (rand()%65)*1000);
|
||||
if(phase >= 2)
|
||||
events.RescheduleEvent(EVENT_LIGHTNING_WHIRL, 20000+ (rand()%20)*1000);
|
||||
if(phase >= 3)
|
||||
events.RescheduleEvent(EVENT_CHAIN_LIGHTNING, urand(9000,17000));
|
||||
events.RescheduleEvent(EVENT_OVERLOAD, urand(60000,125000));
|
||||
if (phase >= 2)
|
||||
events.RescheduleEvent(EVENT_LIGHTNING_WHIRL, urand(20000,40000));
|
||||
if (phase >= 3)
|
||||
{
|
||||
DoCast(m_creature, SPELL_STORMSHIELD);
|
||||
events.RescheduleEvent(EVENT_LIGHTNING_TENDRILS, 40000+ (rand()%40)*1000);
|
||||
events.RescheduleEvent(EVENT_LIGHTNING_TENDRILS, urand(40000,80000));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void DamageTaken(Unit* pKiller, uint32 &damage)
|
||||
{
|
||||
if(damage >= m_creature->GetHealth())
|
||||
if (damage >= m_creature->GetHealth())
|
||||
{
|
||||
if(Creature* Steelbreaker = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_STEELBREAKER) : 0))
|
||||
if(Steelbreaker->isAlive())
|
||||
{
|
||||
if (Creature* Steelbreaker = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_STEELBREAKER) : 0))
|
||||
if (Steelbreaker->isAlive())
|
||||
Steelbreaker->SetHealth(Steelbreaker->GetMaxHealth());
|
||||
}
|
||||
|
||||
if(Creature* Molgeim = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_RUNEMASTER_MOLGEIM) : 0))
|
||||
if(Molgeim->isAlive())
|
||||
{
|
||||
if (Creature* Molgeim = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_RUNEMASTER_MOLGEIM) : 0))
|
||||
if (Molgeim->isAlive())
|
||||
Molgeim->SetHealth(Molgeim->GetMaxHealth());
|
||||
}
|
||||
|
||||
DoCast(SPELL_SUPERCHARGE);
|
||||
}
|
||||
@@ -450,16 +476,20 @@ struct boss_stormcaller_brundirAI : public ScriptedAI
|
||||
|
||||
void JustDied(Unit* Killer)
|
||||
{
|
||||
if(IsEncounterComplete(pInstance, m_creature) && pInstance)
|
||||
DoScriptText(RAND(SAY_BRUNDIR_DEATH_1,SAY_BRUNDIR_DEATH_2), m_creature);
|
||||
if (IsEncounterComplete(pInstance, m_creature) && pInstance)
|
||||
pInstance->SetData(TYPE_ASSEMBLY, DONE);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit *who)
|
||||
{
|
||||
DoScriptText(RAND(SAY_BRUNDIR_SLAY_1,SAY_BRUNDIR_SLAY_2), m_creature);
|
||||
}
|
||||
|
||||
void SpellHit(Unit *from, const SpellEntry *spell)
|
||||
{
|
||||
if(spell->Id == SPELL_SUPERCHARGE)
|
||||
{
|
||||
if (spell->Id == SPELL_SUPERCHARGE)
|
||||
UpdatePhase();
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
@@ -474,28 +504,27 @@ struct boss_stormcaller_brundirAI : public ScriptedAI
|
||||
switch(eventId)
|
||||
{
|
||||
case EVENT_ENRAGE:
|
||||
DoScriptText(SAY_BRUNDIR_BERSERK, m_creature);
|
||||
DoCast(SPELL_BERSERK);
|
||||
break;
|
||||
break;
|
||||
case EVENT_CHAIN_LIGHTNING:
|
||||
{
|
||||
Unit* Target = SelectUnit(SELECT_TARGET_RANDOM,0);
|
||||
DoCast(Target, RAID_MODE(SPELL_CHAIN_LIGHTNING_N , SPELL_CHAIN_LIGHTNING_H));
|
||||
events.ScheduleEvent(EVENT_CHAIN_LIGHTNING, 9000+ (rand()%8)*1000);
|
||||
}
|
||||
break;
|
||||
if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM,0))
|
||||
DoCast(pTarget, RAID_MODE(SPELL_CHAIN_LIGHTNING_N , SPELL_CHAIN_LIGHTNING_H));
|
||||
events.ScheduleEvent(EVENT_CHAIN_LIGHTNING, urand(9000,17000));
|
||||
break;
|
||||
case EVENT_OVERLOAD:
|
||||
DoCast(RAID_MODE(SPELL_OVERLOAD , SPELL_OVERLOAD_H));
|
||||
events.ScheduleEvent(EVENT_OVERLOAD, 60000+ (rand()%65)*1000);
|
||||
break;
|
||||
events.ScheduleEvent(EVENT_OVERLOAD, urand(60000,125000));
|
||||
break;
|
||||
case EVENT_LIGHTNING_WHIRL:
|
||||
DoCast(RAID_MODE(SPELL_LIGHTNING_WHIRL , SPELL_LIGHTNING_WHIRL_H));
|
||||
events.ScheduleEvent(EVENT_LIGHTNING_WHIRL, 20000+ (rand()%20)*1000);
|
||||
break;
|
||||
events.ScheduleEvent(EVENT_LIGHTNING_WHIRL, urand(20000,40000));
|
||||
break;
|
||||
case EVENT_LIGHTNING_TENDRILS:
|
||||
DoCast(RAID_MODE(SPELL_LIGHTNING_TENDRILS, SPELL_LIGHTNING_TENDRILS_H));
|
||||
events.DelayEvents(15000, 5000);
|
||||
DoResetThreat();
|
||||
break;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -24,44 +24,47 @@
|
||||
#define SPELL_SETINEL_BLAST 64679
|
||||
#define SPELL_SONIC_SCREECH 64422
|
||||
#define SPELL_SUMMON_SWARMING_GUARDIAN 64397
|
||||
//wrong text ids. correct are beetwen -1000000 AND -1999999
|
||||
//beetwen -2000000 and -2999999 are custom texts so wtf?
|
||||
#define SAY_AGGRO -2615016
|
||||
#define SAY_SLAY_1 -2615017
|
||||
|
||||
enum Yells
|
||||
{
|
||||
SAY_AGGRO = -1603050,
|
||||
SAY_SLAY_1 = -1603051,
|
||||
SAY_SLAY_2 = -1603052,
|
||||
SAY_DEATH = -1603053,
|
||||
SAY_BERSERK = -1603054,
|
||||
};
|
||||
|
||||
struct boss_auriaya_AI : public BossAI
|
||||
{
|
||||
boss_auriaya_AI(Creature *pCreature) : BossAI(pCreature, TYPE_AURIAYA)
|
||||
{
|
||||
m_pInstance = pCreature->GetInstanceData();
|
||||
}
|
||||
|
||||
ScriptedInstance* m_pInstance;
|
||||
|
||||
uint32 TERRIFYING_SCREECH_Timer;
|
||||
uint32 SONIC_SCREECH_Timer;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
_Reset();
|
||||
TERRIFYING_SCREECH_Timer = 180000;
|
||||
SONIC_SCREECH_Timer = 30000;
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
_EnterCombat();
|
||||
DoScriptText(SAY_AGGRO,m_creature);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim)
|
||||
{
|
||||
DoScriptText(SAY_SLAY_1, m_creature);
|
||||
DoScriptText(RAND(SAY_SLAY_1,SAY_SLAY_2), m_creature);
|
||||
}
|
||||
|
||||
void JustDied(Unit *victim)
|
||||
{
|
||||
DoScriptText(SAY_SLAY_1, m_creature);
|
||||
|
||||
if (m_pInstance)
|
||||
m_pInstance->SetData(TYPE_AURIAYA, DONE);
|
||||
DoScriptText(SAY_DEATH, m_creature);
|
||||
_JustDied();
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* who) {}
|
||||
@@ -74,7 +77,6 @@ struct boss_auriaya_AI : public BossAI
|
||||
if (TERRIFYING_SCREECH_Timer <= diff)
|
||||
{
|
||||
DoCast(SPELL_TERRIFYING_SCREECH);
|
||||
DoScriptText(SAY_SLAY_1, m_creature);
|
||||
TERRIFYING_SCREECH_Timer = 180000;
|
||||
} else TERRIFYING_SCREECH_Timer -= diff;
|
||||
|
||||
@@ -92,6 +94,7 @@ CreatureAI* GetAI_boss_auriaya(Creature* pCreature)
|
||||
{
|
||||
return new boss_auriaya_AI (pCreature);
|
||||
}
|
||||
|
||||
void AddSC_boss_auriaya()
|
||||
{
|
||||
Script *newscript;
|
||||
|
||||
@@ -20,40 +20,38 @@
|
||||
#include "ulduar.h"
|
||||
#include "Vehicle.h"
|
||||
|
||||
#define SPELL_PURSUED 62374
|
||||
#define SPELL_GATHERING_SPEED 62375
|
||||
#define SPELL_BATTERING_RAM 62376
|
||||
#define SPELL_FLAME_VENTS 62396
|
||||
#define SPELL_MISSILE_BARRAGE 62400
|
||||
#define SPELL_SYSTEMS_SHUTDOWN 62475
|
||||
|
||||
#define SPELL_FLAME_CANNON 62395
|
||||
//#define SPELL_FLAME_CANNON 64692 trigger the same spell
|
||||
|
||||
#define SPELL_OVERLOAD_CIRCUIT 62399
|
||||
|
||||
#define SPELL_SEARING_FLAME 62402
|
||||
|
||||
#define SPELL_BLAZE 62292
|
||||
|
||||
#define SPELL_SMOKE_TRAIL 63575
|
||||
|
||||
#define SPELL_MIMIRON_INFERNO 62910
|
||||
|
||||
#define SPELL_HODIR_FURY 62297
|
||||
|
||||
#define SPELL_ELECTROSHOCK 62522
|
||||
|
||||
enum Mobs
|
||||
enum Spells
|
||||
{
|
||||
MOB_MECHANOLIFT = 33214,
|
||||
MOB_LIQUID = 33189,
|
||||
MOB_CONTAINER = 33218,
|
||||
SPELL_PURSUED = 62374,
|
||||
SPELL_GATHERING_SPEED = 62375,
|
||||
SPELL_BATTERING_RAM = 62376,
|
||||
SPELL_FLAME_VENTS = 62396,
|
||||
SPELL_MISSILE_BARRAGE = 62400,
|
||||
SPELL_SYSTEMS_SHUTDOWN = 62475,
|
||||
|
||||
SPELL_FLAME_CANNON = 62395,
|
||||
// SPELL_FLAME_CANNON = 64692, trigger the same spell
|
||||
|
||||
SPELL_OVERLOAD_CIRCUIT = 62399,
|
||||
SPELL_SEARING_FLAME = 62402,
|
||||
SPELL_BLAZE = 62292,
|
||||
SPELL_SMOKE_TRAIL = 63575,
|
||||
SPELL_MIMIRON_INFERNO = 62910,
|
||||
SPELL_HODIR_FURY = 62297,
|
||||
SPELL_ELECTROSHOCK = 62522,
|
||||
};
|
||||
|
||||
enum Creatures
|
||||
{
|
||||
MOB_MECHANOLIFT = 33214,
|
||||
MOB_LIQUID = 33189,
|
||||
MOB_CONTAINER = 33218,
|
||||
};
|
||||
|
||||
enum Events
|
||||
{
|
||||
EVENT_PURSUE = 1,
|
||||
EVENT_NONE,
|
||||
EVENT_PURSUE,
|
||||
EVENT_MISSILE,
|
||||
EVENT_VENT,
|
||||
EVENT_SPEED,
|
||||
@@ -64,41 +62,59 @@ enum Events
|
||||
|
||||
enum Seats
|
||||
{
|
||||
SEAT_PLAYER = 0,
|
||||
SEAT_TURRET = 1,
|
||||
SEAT_DEVICE = 2,
|
||||
SEAT_PLAYER = 0,
|
||||
SEAT_TURRET = 1,
|
||||
SEAT_DEVICE = 2,
|
||||
};
|
||||
|
||||
enum Yells
|
||||
{
|
||||
SAY_AGGRO = -1603060,
|
||||
SAY_SLAY = -1603061,
|
||||
SAY_DEATH = -1603062,
|
||||
SAY_TARGET_1 = -1603063,
|
||||
SAY_TARGET_2 = -1603064,
|
||||
SAY_TARGET_3 = -1603065,
|
||||
SAY_HARDMODE = -1603066,
|
||||
SAY_TOWER_NONE = -1603067,
|
||||
SAY_TOWER_FROST = -1603068,
|
||||
SAY_TOWER_FLAME = -1603069,
|
||||
SAY_TOWER_NATURE = -1603070,
|
||||
SAY_TOWER_STORM = -1603071,
|
||||
SAY_PLAYER_RIDING = -1603072,
|
||||
SAY_OVERLOAD_1 = -1603073,
|
||||
SAY_OVERLOAD_2 = -1603074,
|
||||
SAY_OVERLOAD_3 = -1603075,
|
||||
};
|
||||
|
||||
struct boss_flame_leviathanAI : public BossAI
|
||||
{
|
||||
boss_flame_leviathanAI(Creature *pCreature) : BossAI(pCreature, TYPE_LEVIATHAN), vehicle(me->GetVehicleKit())
|
||||
boss_flame_leviathanAI(Creature *pCreature) : BossAI(pCreature, TYPE_LEVIATHAN), vehicle(pCreature->GetVehicleKit())
|
||||
{
|
||||
m_pInstance = pCreature->GetInstanceData();
|
||||
assert(vehicle);
|
||||
}
|
||||
|
||||
ScriptedInstance* m_pInstance;
|
||||
|
||||
Vehicle *vehicle;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
_Reset();
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
m_creature->SetReactState(REACT_AGGRESSIVE);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit *who)
|
||||
{
|
||||
_EnterCombat();
|
||||
me->SetReactState(REACT_DEFENSIVE);
|
||||
DoScriptText(SAY_AGGRO, m_creature);
|
||||
m_creature->SetReactState(REACT_DEFENSIVE);
|
||||
events.ScheduleEvent(EVENT_PURSUE, 0);
|
||||
events.ScheduleEvent(EVENT_MISSILE, 1500);
|
||||
events.ScheduleEvent(EVENT_VENT, 20000);
|
||||
events.ScheduleEvent(EVENT_SPEED, 15000);
|
||||
events.ScheduleEvent(EVENT_SUMMON, 0);
|
||||
//events.ScheduleEvent(EVENT_MIMIRON_INFERNO, 60000 + (rand()%60000)); // Not Blizzlike
|
||||
//events.ScheduleEvent(EVENT_HODIR_FURY, 60000 + (rand()%60000)); // Not Blizzlike
|
||||
if (Creature *turret = CAST_CRE(vehicle->GetPassenger(7)))
|
||||
//events.ScheduleEvent(EVENT_MIMIRON_INFERNO, urand(60000, 120000)); // Not Blizzlike
|
||||
//events.ScheduleEvent(EVENT_HODIR_FURY, urand(60000, 120000)); // Not Blizzlike
|
||||
if (Creature *turret = CAST_CRE(vehicle->GetPassenger(SEAT_TURRET)))
|
||||
turret->AI()->DoZoneInCombat();
|
||||
}
|
||||
|
||||
@@ -111,8 +127,8 @@ struct boss_flame_leviathanAI : public BossAI
|
||||
|
||||
void JustDied(Unit *victim)
|
||||
{
|
||||
if (m_pInstance)
|
||||
m_pInstance->SetData(TYPE_LEVIATHAN, DONE);
|
||||
DoScriptText(SAY_DEATH, m_creature);
|
||||
_JustDied();
|
||||
}
|
||||
|
||||
void SpellHit(Unit *caster, const SpellEntry *spell)
|
||||
@@ -120,15 +136,15 @@ struct boss_flame_leviathanAI : public BossAI
|
||||
if(spell->Id == 62472)
|
||||
vehicle->InstallAllAccessories();
|
||||
else if(spell->Id == SPELL_ELECTROSHOCK)
|
||||
me->InterruptSpell(CURRENT_CHANNELED_SPELL);
|
||||
m_creature->InterruptSpell(CURRENT_CHANNELED_SPELL);
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (!me->isInCombat())
|
||||
if (!m_creature->isInCombat())
|
||||
return;
|
||||
|
||||
if (me->getThreatManager().isThreatListEmpty())
|
||||
if (m_creature->getThreatManager().isThreatListEmpty())
|
||||
{
|
||||
EnterEvadeMode();
|
||||
return;
|
||||
@@ -136,11 +152,11 @@ struct boss_flame_leviathanAI : public BossAI
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
if (me->hasUnitState(UNIT_STAT_CASTING))
|
||||
if (m_creature->hasUnitState(UNIT_STAT_CASTING))
|
||||
return;
|
||||
|
||||
uint32 eventId = events.GetEvent();
|
||||
if (!me->getVictim())
|
||||
if (!m_creature->getVictim())
|
||||
eventId = EVENT_PURSUE;
|
||||
|
||||
switch(eventId)
|
||||
@@ -150,13 +166,12 @@ struct boss_flame_leviathanAI : public BossAI
|
||||
DoCastAOE(SPELL_PURSUED, true);
|
||||
//events.RepeatEvent(35000); // this should not be used because eventId may be overriden
|
||||
events.RescheduleEvent(EVENT_PURSUE, 35000);
|
||||
if(!me->getVictim()) // all siege engines and demolishers are dead
|
||||
if(!m_creature->getVictim()) // all siege engines and demolishers are dead
|
||||
UpdateVictim(); // begin to kill other things
|
||||
return;
|
||||
case EVENT_MISSILE:
|
||||
//TODO: without target no visual effect
|
||||
//DoCastAOE(SPELL_MISSILE_BARRAGE);
|
||||
DoCast(me->getVictim(), SPELL_MISSILE_BARRAGE);
|
||||
if (Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM))
|
||||
DoCast(pTarget, SPELL_MISSILE_BARRAGE);
|
||||
events.RepeatEvent(1500);
|
||||
return;
|
||||
case EVENT_VENT:
|
||||
@@ -169,17 +184,18 @@ struct boss_flame_leviathanAI : public BossAI
|
||||
return;
|
||||
case EVENT_SUMMON:
|
||||
if(summons.size() < 15) // 4seat+1turret+10lift
|
||||
if(Creature *lift = DoSummonFlyer(MOB_MECHANOLIFT, me, rand()%20 + 20, 50, 0))
|
||||
if(Creature *lift = DoSummonFlyer(MOB_MECHANOLIFT, me, urand(20,40), 50, 0))
|
||||
lift->GetMotionMaster()->MoveRandom(100);
|
||||
events.RepeatEvent(2000);
|
||||
return;
|
||||
case EVENT_MIMIRON_INFERNO: // Not Blizzlike
|
||||
DoCast(me->getVictim(), SPELL_MIMIRON_INFERNO);
|
||||
events.RepeatEvent(60000 + (rand()%60000));
|
||||
DoCast(m_creature->getVictim(), SPELL_MIMIRON_INFERNO);
|
||||
events.RepeatEvent(urand(60000, 120000));
|
||||
return;
|
||||
case EVENT_HODIR_FURY: // Not Blizzlike
|
||||
DoCast(me->getVictim(), SPELL_HODIR_FURY);
|
||||
events.RepeatEvent(60000 + (rand()%60000));
|
||||
DoCast(m_creature->getVictim(), SPELL_HODIR_FURY);
|
||||
events.RepeatEvent(urand(60000, 120000));
|
||||
return;
|
||||
default:
|
||||
events.PopEvent();
|
||||
break;
|
||||
@@ -197,7 +213,7 @@ struct boss_flame_leviathan_seatAI : public PassiveAI
|
||||
{
|
||||
assert(vehicle);
|
||||
#ifdef BOSS_DEBUG
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
m_creature->SetReactState(REACT_AGGRESSIVE);
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -214,17 +230,17 @@ struct boss_flame_leviathan_seatAI : public PassiveAI
|
||||
|
||||
void PassengerBoarded(Unit *who, int8 seatId, bool apply)
|
||||
{
|
||||
if(!me->GetVehicle())
|
||||
if (!m_creature->GetVehicle())
|
||||
return;
|
||||
|
||||
if(seatId == SEAT_PLAYER)
|
||||
if (seatId == SEAT_PLAYER)
|
||||
{
|
||||
if(!apply)
|
||||
return;
|
||||
|
||||
if(Creature *turret = CAST_CRE(vehicle->GetPassenger(SEAT_TURRET)))
|
||||
{
|
||||
turret->setFaction(me->GetVehicleBase()->getFaction());
|
||||
turret->setFaction(m_creature->GetVehicleBase()->getFaction());
|
||||
turret->SetUInt32Value(UNIT_FIELD_FLAGS, 0); // unselectable
|
||||
turret->AI()->AttackStart(who);
|
||||
}
|
||||
@@ -234,12 +250,12 @@ struct boss_flame_leviathan_seatAI : public PassiveAI
|
||||
device->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
}
|
||||
}
|
||||
else if(seatId == SEAT_TURRET)
|
||||
else if (seatId == SEAT_TURRET)
|
||||
{
|
||||
if(apply)
|
||||
if (apply)
|
||||
return;
|
||||
|
||||
if(Unit *device = vehicle->GetPassenger(SEAT_DEVICE))
|
||||
if (Unit *device = vehicle->GetPassenger(SEAT_DEVICE))
|
||||
{
|
||||
device->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK);
|
||||
device->SetUInt32Value(UNIT_FIELD_FLAGS, 0); // unselectable
|
||||
@@ -254,7 +270,7 @@ struct boss_flame_leviathan_defense_turretAI : public TurretAI
|
||||
|
||||
void DamageTaken(Unit *who, uint32 &damage)
|
||||
{
|
||||
if(!CanAIAttack(who))
|
||||
if (!CanAIAttack(who))
|
||||
damage = 0;
|
||||
}
|
||||
|
||||
@@ -274,15 +290,15 @@ struct boss_flame_leviathan_overload_deviceAI : public PassiveAI
|
||||
{
|
||||
if(param == EVENT_SPELLCLICK)
|
||||
{
|
||||
me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
if(me->GetVehicle())
|
||||
m_creature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK);
|
||||
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
if(m_creature->GetVehicle())
|
||||
{
|
||||
if(Unit *player = me->GetVehicle()->GetPassenger(SEAT_PLAYER))
|
||||
if(Unit *player = m_creature->GetVehicle()->GetPassenger(SEAT_PLAYER))
|
||||
{
|
||||
player->ExitVehicle();
|
||||
me->GetVehicleBase()->CastSpell(player, SPELL_SMOKE_TRAIL, true);
|
||||
if(Unit *leviathan = me->GetVehicleBase()->GetVehicleBase())
|
||||
m_creature->GetVehicleBase()->CastSpell(player, SPELL_SMOKE_TRAIL, true);
|
||||
if(Unit *leviathan = m_creature->GetVehicleBase()->GetVehicleBase())
|
||||
player->GetMotionMaster()->MoveKnockbackFrom(leviathan->GetPositionX(), leviathan->GetPositionY(), 30, 30);
|
||||
}
|
||||
}
|
||||
@@ -296,18 +312,18 @@ struct boss_flame_leviathan_safety_containerAI : public PassiveAI
|
||||
|
||||
void MovementInform(uint32 type, uint32 id)
|
||||
{
|
||||
if(id == me->GetEntry())
|
||||
if(id == m_creature->GetEntry())
|
||||
{
|
||||
if(Creature *liquid = DoSummon(MOB_LIQUID, me, 0))
|
||||
liquid->CastSpell(liquid, 62494, true);
|
||||
me->DisappearAndDie(); // this will relocate creature to sky
|
||||
m_creature->DisappearAndDie(); // this will relocate creature to sky
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if(!me->GetVehicle() && me->isSummon() && me->GetMotionMaster()->GetCurrentMovementGeneratorType() != POINT_MOTION_TYPE)
|
||||
me->GetMotionMaster()->MoveFall(409.8f, me->GetEntry());
|
||||
if(!m_creature->GetVehicle() && m_creature->isSummon() && m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType() != POINT_MOTION_TYPE)
|
||||
m_creature->GetMotionMaster()->MoveFall(409.8f, m_creature->GetEntry());
|
||||
}
|
||||
};
|
||||
|
||||
@@ -315,7 +331,7 @@ struct spell_pool_of_tarAI : public TriggerAI
|
||||
{
|
||||
spell_pool_of_tarAI(Creature *c) : TriggerAI(c)
|
||||
{
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
}
|
||||
|
||||
void DamageTaken(Unit *who, uint32 &damage)
|
||||
@@ -325,8 +341,8 @@ struct spell_pool_of_tarAI : public TriggerAI
|
||||
|
||||
void SpellHit(Unit* caster, const SpellEntry *spell)
|
||||
{
|
||||
if(spell->SchoolMask & SPELL_SCHOOL_MASK_FIRE && !me->HasAura(SPELL_BLAZE))
|
||||
me->CastSpell(me, SPELL_BLAZE, true);
|
||||
if(spell->SchoolMask & SPELL_SCHOOL_MASK_FIRE && !m_creature->HasAura(SPELL_BLAZE))
|
||||
m_creature->CastSpell(me, SPELL_BLAZE, true);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -19,42 +19,64 @@
|
||||
#include "ScriptedPch.h"
|
||||
#include "ulduar.h"
|
||||
|
||||
/*
|
||||
#define SAY_AGGRO -1
|
||||
#define SAY_SLAY -1
|
||||
*/
|
||||
enum Yells
|
||||
{
|
||||
SAY_AGGRO = -1603180,
|
||||
SAY_AGGRO_WITH_ELDER = -1603181,
|
||||
SAY_SLAY_1 = -1603182,
|
||||
SAY_SLAY_2 = -1603183,
|
||||
SAY_DEATH = -1603184,
|
||||
SAY_BERSERK = -1603185,
|
||||
SAY_SUMMON_CONSERVATOR = -1603186,
|
||||
SAY_SUMMON_TRIO = -1603187,
|
||||
SAY_SUMMON_LASHERS = -1603188,
|
||||
SAY_YS_HELP = -1603189,
|
||||
|
||||
// Elder Brightleaf
|
||||
SAY_BRIGHTLEAF_AGGRO = -1603190,
|
||||
SAY_BRIGHTLEAF_SLAY_1 = -1603191,
|
||||
SAY_BRIGHTLEAF_SLAY_2 = -1603192,
|
||||
SAY_BRIGHTLEAF_DEATH = -1603193,
|
||||
|
||||
// Elder Ironbranch
|
||||
SAY_IRONBRANCH_AGGRO = -1603194,
|
||||
SAY_IRONBRANCH_SLAY_1 = -1603195,
|
||||
SAY_IRONBRANCH_SLAY_2 = -1603196,
|
||||
SAY_IRONBRANCH_DEATH = -1603197,
|
||||
|
||||
// Elder Stonebark
|
||||
SAY_STONEBARK_AGGRO = -1603198,
|
||||
SAY_STONEBARK_SLAY_1 = -1603199,
|
||||
SAY_STONEBARK_SLAY_2 = -1603200,
|
||||
SAY_STONEBARK_DEATH = -1603201,
|
||||
};
|
||||
|
||||
struct boss_freyaAI : public BossAI
|
||||
{
|
||||
boss_freyaAI(Creature* pCreature) : BossAI(pCreature, TYPE_FREYA)
|
||||
{
|
||||
m_pInstance = pCreature->GetInstanceData();
|
||||
Reset();
|
||||
}
|
||||
|
||||
ScriptedInstance* m_pInstance;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
_Reset();
|
||||
}
|
||||
|
||||
void KilledUnit(Unit *victim)
|
||||
{
|
||||
DoScriptText(RAND(SAY_SLAY_1,SAY_SLAY_2), m_creature);
|
||||
}
|
||||
|
||||
void JustDied(Unit *victim)
|
||||
{
|
||||
if (m_pInstance)
|
||||
m_pInstance->SetData(TYPE_FREYA, DONE);
|
||||
DoScriptText(SAY_DEATH, m_creature);
|
||||
_JustDied();
|
||||
}
|
||||
|
||||
void Aggro(Unit* pWho)
|
||||
void EnterCombat(Unit* pWho)
|
||||
{
|
||||
// DoScriptText(SAY_AGGRO, m_creature);
|
||||
m_creature->SetInCombatWithZone();
|
||||
|
||||
if (m_pInstance)
|
||||
m_pInstance->SetData(TYPE_FREYA, IN_PROGRESS);
|
||||
DoScriptText(SAY_AGGRO, m_creature);
|
||||
_EnterCombat();
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
|
||||
@@ -18,3 +18,14 @@
|
||||
|
||||
#include "ScriptedPch.h"
|
||||
#include "ulduar.h"
|
||||
|
||||
enum Yells
|
||||
{
|
||||
SAY_AGGRO = -1603290,
|
||||
SAY_SLAY_1 = -1603291,
|
||||
SAY_SLAY_2 = -1603292,
|
||||
SAY_KITE = -1603293,
|
||||
SAY_DEATH = -1603294,
|
||||
SAY_BERSERK = -1603295,
|
||||
SAY_HARDMODE_ON = -1603296,
|
||||
};
|
||||
|
||||
@@ -19,42 +19,45 @@
|
||||
#include "ScriptedPch.h"
|
||||
#include "ulduar.h"
|
||||
|
||||
/*
|
||||
#define SAY_AGGRO -1
|
||||
#define SAY_SLAY -1
|
||||
*/
|
||||
enum Yells
|
||||
{
|
||||
SAY_AGGRO = -1603210,
|
||||
SAY_SLAY_1 = -1603211,
|
||||
SAY_SLAY_2 = -1603212,
|
||||
SAY_FLASH_FREEZE = -1603213,
|
||||
SAY_STALACTITE = -1603214,
|
||||
SAY_DEATH = -1603215,
|
||||
SAY_BERSERK = -1603216,
|
||||
SAY_YS_HELP = -1603217,
|
||||
SAY_HARD_MODE_MISSED = -1603218,
|
||||
};
|
||||
|
||||
struct boss_hodirAI : public BossAI
|
||||
{
|
||||
boss_hodirAI(Creature *pCreature) : BossAI(pCreature, TYPE_HODIR)
|
||||
{
|
||||
m_pInstance = pCreature->GetInstanceData();
|
||||
Reset();
|
||||
}
|
||||
|
||||
ScriptedInstance* m_pInstance;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
_Reset();
|
||||
}
|
||||
|
||||
void KilledUnit(Unit *victim)
|
||||
{
|
||||
DoScriptText(RAND(SAY_SLAY_1,SAY_SLAY_2), m_creature);
|
||||
}
|
||||
|
||||
void JustDied(Unit *victim)
|
||||
{
|
||||
if (m_pInstance)
|
||||
m_pInstance->SetData(TYPE_HODIR, DONE);
|
||||
DoScriptText(SAY_DEATH, m_creature);
|
||||
_JustDied();
|
||||
}
|
||||
|
||||
void Aggro(Unit* pWho)
|
||||
void EnterCombat(Unit* pWho)
|
||||
{
|
||||
// DoScriptText(SAY_AGGRO, m_creature);
|
||||
m_creature->SetInCombatWithZone();
|
||||
|
||||
if (m_pInstance)
|
||||
m_pInstance->SetData(TYPE_HODIR, IN_PROGRESS);
|
||||
DoScriptText(SAY_AGGRO, m_creature);
|
||||
_EnterCombat();
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
@@ -67,9 +70,7 @@ struct boss_hodirAI : public BossAI
|
||||
DoMeleeAttackIfReady();
|
||||
|
||||
EnterEvadeIfOutOfCombatArea(diff);
|
||||
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
CreatureAI* GetAI_boss_hodir(Creature* pCreature)
|
||||
@@ -86,4 +87,3 @@ void AddSC_boss_hodir()
|
||||
newscript->RegisterSelf();
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -23,37 +23,50 @@
|
||||
#define SPELL_SCORCH 62546
|
||||
#define SPELL_SLAG_POT 62717
|
||||
|
||||
//wrong ids. not in db
|
||||
#define SAY_AGGRO -10000002
|
||||
#define SAY_SLAY -1000003
|
||||
enum Yells
|
||||
{
|
||||
SAY_AGGRO = -1603220,
|
||||
SAY_SLAY_1 = -1603221,
|
||||
SAY_SLAY_2 = -1603222,
|
||||
SAY_DEATH = -1603223,
|
||||
SAY_SUMMON = -1603224,
|
||||
SAY_SLAG_POT = -1603225,
|
||||
SAY_SCORCH_1 = -1603226,
|
||||
SAY_SCORCH_2 = -1603227,
|
||||
SAY_BERSERK = -1603228,
|
||||
};
|
||||
|
||||
struct boss_ignis_AI : public BossAI
|
||||
{
|
||||
boss_ignis_AI(Creature *pCreature) : BossAI(pCreature, TYPE_IGNIS) {}
|
||||
|
||||
uint32 FLAME_JETS_Timer;
|
||||
uint32 SCORCH_Timer;
|
||||
uint32 SLAG_POT_Timer;
|
||||
uint32 uiFlameJetsTimer;
|
||||
uint32 uiScorchTimer;
|
||||
uint32 uiSlagPotTimer;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
FLAME_JETS_Timer = 32000;
|
||||
SCORCH_Timer = 100;
|
||||
SLAG_POT_Timer = 100;
|
||||
_Reset();
|
||||
uiFlameJetsTimer = 32000;
|
||||
uiScorchTimer = 100;
|
||||
uiSlagPotTimer = 100;
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
DoScriptText(SAY_AGGRO,m_creature);
|
||||
_EnterCombat();
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim)
|
||||
{
|
||||
DoScriptText(SAY_SLAY, m_creature);
|
||||
DoScriptText(RAND(SAY_SLAY_1,SAY_SLAY_2), m_creature);
|
||||
}
|
||||
|
||||
void JustDied(Unit *victim)
|
||||
{
|
||||
DoScriptText(SAY_SLAY, m_creature);
|
||||
DoScriptText(SAY_DEATH, m_creature);
|
||||
_JustDied();
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* who) {}
|
||||
@@ -63,7 +76,7 @@ struct boss_ignis_AI : public BossAI
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
if(m_creature->GetPositionY() < 150 || m_creature->GetPositionX() < 450) // Not Blizzlike, anti-exploit to prevent players from pulling bosses to vehicles.
|
||||
if (m_creature->GetPositionY() < 150 || m_creature->GetPositionX() < 450) // Not Blizzlike, anti-exploit to prevent players from pulling bosses to vehicles.
|
||||
{
|
||||
m_creature->RemoveAllAuras();
|
||||
m_creature->DeleteThreatList();
|
||||
@@ -71,26 +84,28 @@ struct boss_ignis_AI : public BossAI
|
||||
m_creature->GetMotionMaster()->MoveTargetedHome();
|
||||
}
|
||||
|
||||
if (FLAME_JETS_Timer <= diff)
|
||||
if (uiFlameJetsTimer <= diff)
|
||||
{
|
||||
DoCast(SPELL_FLAME_JETS);
|
||||
DoScriptText(SAY_SLAY, m_creature);
|
||||
FLAME_JETS_Timer = 25000;
|
||||
} else FLAME_JETS_Timer -= diff;
|
||||
uiFlameJetsTimer = 25000;
|
||||
} else uiFlameJetsTimer -= diff;
|
||||
|
||||
if (SCORCH_Timer <= diff)
|
||||
if (uiScorchTimer <= diff)
|
||||
{
|
||||
DoScriptText(RAND(SAY_SCORCH_1,SAY_SCORCH_2), m_creature);
|
||||
DoCast(SPELL_SCORCH);
|
||||
SCORCH_Timer = 20000;
|
||||
} else SCORCH_Timer -= diff;
|
||||
uiScorchTimer = 20000;
|
||||
} else uiScorchTimer -= diff;
|
||||
|
||||
if (SLAG_POT_Timer <= diff)
|
||||
if (uiSlagPotTimer <= diff)
|
||||
{
|
||||
if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
|
||||
{
|
||||
DoScriptText(SAY_SLAG_POT, m_creature);
|
||||
DoCast(pTarget, SPELL_SLAG_POT);
|
||||
DoScriptText(SAY_SLAY, m_creature);
|
||||
SLAG_POT_Timer = 30000;
|
||||
} else SLAG_POT_Timer -= diff;
|
||||
}
|
||||
uiSlagPotTimer = 30000;
|
||||
} else uiSlagPotTimer -= diff;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
@@ -37,19 +37,29 @@ enum Events
|
||||
EVENT_SWEEP,
|
||||
};
|
||||
|
||||
enum Yells
|
||||
{
|
||||
SAY_AGGRO = -1603230,
|
||||
SAY_SLAY_1 = -1603231,
|
||||
SAY_SLAY_2 = -1603232,
|
||||
SAY_LEFT_ARM_GONE = -1603233,
|
||||
SAY_RIGHT_ARM_GONE = -1603234,
|
||||
SAY_SHOCKWAVE = -1603235,
|
||||
SAY_GRAB_PLAYER = -1603236,
|
||||
SAY_DEATH = -1603237,
|
||||
SAY_BERSERK = -1603238,
|
||||
};
|
||||
|
||||
struct boss_kologarnAI : public BossAI
|
||||
{
|
||||
boss_kologarnAI(Creature *pCreature) : BossAI(pCreature, TYPE_KOLOGARN), vehicle(me->GetVehicleKit()),
|
||||
boss_kologarnAI(Creature *pCreature) : BossAI(pCreature, TYPE_KOLOGARN), vehicle(pCreature->GetVehicleKit()),
|
||||
left(false), right(false)
|
||||
{
|
||||
m_pInstance = me->GetInstanceData();
|
||||
assert(vehicle);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED); // i think this is a hack, but there is no other way to disable his rotation
|
||||
}
|
||||
|
||||
ScriptedInstance* m_pInstance;
|
||||
|
||||
Vehicle *vehicle;
|
||||
bool left, right;
|
||||
|
||||
@@ -60,17 +70,22 @@ struct boss_kologarnAI : public BossAI
|
||||
|
||||
void JustDied(Unit *victim)
|
||||
{
|
||||
if (m_pInstance)
|
||||
m_pInstance->SetData(TYPE_KOLOGARN, DONE);
|
||||
DoScriptText(SAY_DEATH, m_creature);
|
||||
_JustDied();
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* who)
|
||||
{
|
||||
DoScriptText(RAND(SAY_SLAY_2,SAY_SLAY_2), m_creature);
|
||||
}
|
||||
|
||||
void PassengerBoarded(Unit *who, int8 seatId, bool apply)
|
||||
{
|
||||
if(who->GetTypeId() == TYPEID_UNIT)
|
||||
if (who->GetTypeId() == TYPEID_UNIT)
|
||||
{
|
||||
if(who->GetEntry() == 32933)
|
||||
if (who->GetEntry() == 32933)
|
||||
left = apply;
|
||||
else if(who->GetEntry() == 32934)
|
||||
else if (who->GetEntry() == 32934)
|
||||
right = apply;
|
||||
who->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED);
|
||||
CAST_CRE(who)->SetReactState(REACT_PASSIVE);
|
||||
@@ -79,6 +94,7 @@ struct boss_kologarnAI : public BossAI
|
||||
|
||||
void EnterCombat(Unit *who)
|
||||
{
|
||||
DoScriptText(SAY_AGGRO, m_creature);
|
||||
_EnterCombat();
|
||||
events.ScheduleEvent(EVENT_SMASH, 5000);
|
||||
events.ScheduleEvent(EVENT_SWEEP, 10000);
|
||||
@@ -87,18 +103,19 @@ struct boss_kologarnAI : public BossAI
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if(!UpdateVictim())
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
if(me->hasUnitState(UNIT_STAT_CASTING))
|
||||
if (me->hasUnitState(UNIT_STAT_CASTING))
|
||||
return;
|
||||
|
||||
// TODO: because we are using hack, he is stunned and cannot cast, so we use triggered for every spell
|
||||
switch(events.GetEvent())
|
||||
{
|
||||
case EVENT_NONE: break;
|
||||
case EVENT_NONE:
|
||||
break;
|
||||
case EVENT_SMASH:
|
||||
if(left && right)
|
||||
DoCastVictim(SPELL_TWO_ARM_SMASH, true);
|
||||
|
||||
@@ -18,3 +18,27 @@
|
||||
|
||||
#include "ScriptedPch.h"
|
||||
#include "ulduar.h"
|
||||
|
||||
enum Yells
|
||||
{
|
||||
SAY_AGGRO = -1603240,
|
||||
SAY_HARDMODE_ON = -1603241,
|
||||
SAY_MKII_ACTIVATE = -1603242,
|
||||
SAY_MKII_SLAY_1 = -1603243,
|
||||
SAY_MKII_SLAY_2 = -1603244,
|
||||
SAY_MKII_DEATH = -1603245,
|
||||
SAY_VX001_ACTIVATE = -1603246,
|
||||
SAY_VX001_SLAY_1 = -1603247,
|
||||
SAY_VX001_SLAY_2 = -1603248,
|
||||
SAY_VX001_DEATH = -1603249,
|
||||
SAY_AERIAL_ACTIVATE = -1603250,
|
||||
SAY_AERIAL_SLAY_1 = -1603251,
|
||||
SAY_AERIAL_SLAY_2 = -1603252,
|
||||
SAY_AERIAL_DEATH = -1603253,
|
||||
SAY_V07TRON_ACTIVATE = -1603254,
|
||||
SAY_V07TRON_SLAY_1 = -1603255,
|
||||
SAY_V07TRON_SLAY_2 = -1603256,
|
||||
SAY_V07TRON_DEATH = -1603257,
|
||||
SAY_BERSERK = -1603258,
|
||||
SAY_YS_HELP = -1603259,
|
||||
};
|
||||
|
||||
@@ -19,42 +19,60 @@
|
||||
#include "ScriptedPch.h"
|
||||
#include "ulduar.h"
|
||||
|
||||
/*
|
||||
#define SAY_AGGRO -1
|
||||
#define SAY_SLAY -1
|
||||
*/
|
||||
enum Yells
|
||||
{
|
||||
SAY_AGGRO_1 = -1603270,
|
||||
SAY_AGGRO_2 = -1603271,
|
||||
SAY_SPECIAL_1 = -1603272,
|
||||
SAY_SPECIAL_2 = -1603273,
|
||||
SAY_SPECIAL_3 = -1603274,
|
||||
SAY_JUMPDOWN = -1603275,
|
||||
SAY_SLAY_1 = -1603276,
|
||||
SAY_SLAY_2 = -1603277,
|
||||
SAY_BERSERK = -1603278,
|
||||
SAY_WIPE = -1603279,
|
||||
SAY_DEATH = -1603280,
|
||||
SAY_END_NORMAL_1 = -1603281,
|
||||
SAY_END_NORMAL_2 = -1603282,
|
||||
SAY_END_NORMAL_3 = -1603283,
|
||||
SAY_END_HARD_1 = -1603284,
|
||||
SAY_END_HARD_2 = -1603285,
|
||||
SAY_END_HARD_3 = -1603286,
|
||||
SAY_YS_HELP = -1603287,
|
||||
};
|
||||
|
||||
struct boss_thorimAI : public BossAI
|
||||
{
|
||||
boss_thorimAI(Creature* pCreature) : BossAI(pCreature, TYPE_THORIM)
|
||||
{
|
||||
m_pInstance = pCreature->GetInstanceData();
|
||||
Reset();
|
||||
}
|
||||
|
||||
ScriptedInstance* m_pInstance;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
_Reset();
|
||||
}
|
||||
|
||||
void EnterEvadeMode()
|
||||
{
|
||||
DoScriptText(SAY_WIPE, m_creature);
|
||||
_EnterEvadeMode();
|
||||
}
|
||||
|
||||
void KilledUnit(Unit *victim)
|
||||
{
|
||||
DoScriptText(RAND(SAY_SLAY_1,SAY_SLAY_2), m_creature);
|
||||
}
|
||||
|
||||
void JustDied(Unit *victim)
|
||||
{
|
||||
if (m_pInstance)
|
||||
m_pInstance->SetData(TYPE_THORIM, DONE);
|
||||
DoScriptText(SAY_DEATH, m_creature);
|
||||
_JustDied();
|
||||
}
|
||||
|
||||
void Aggro(Unit* pWho)
|
||||
void EnterCombat(Unit* pWho)
|
||||
{
|
||||
// DoScriptText(SAY_AGGRO, m_creature);
|
||||
m_creature->SetInCombatWithZone();
|
||||
|
||||
if (m_pInstance)
|
||||
m_pInstance->SetData(TYPE_THORIM, IN_PROGRESS);
|
||||
DoScriptText(RAND(SAY_AGGRO_1,SAY_AGGRO_2), m_creature);
|
||||
_EnterCombat();
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
@@ -67,9 +85,7 @@ struct boss_thorimAI : public BossAI
|
||||
DoMeleeAttackIfReady();
|
||||
|
||||
EnterEvadeIfOutOfCombatArea(diff);
|
||||
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
CreatureAI* GetAI_boss_thorim(Creature* pCreature)
|
||||
@@ -84,5 +100,4 @@ void AddSC_boss_thorim()
|
||||
newscript->Name = "boss_thorim";
|
||||
newscript->GetAI = &GetAI_boss_thorim;
|
||||
newscript->RegisterSelf();
|
||||
|
||||
}
|
||||
|
||||
@@ -16,86 +16,788 @@
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
/*
|
||||
TODO:
|
||||
Add achievments
|
||||
Boombot explosion only hurt allies to the npc at the moment
|
||||
Boombot explosion visual
|
||||
Test the enrage timer
|
||||
Fix gravity bomb - tractor beam.
|
||||
Fix void zone spell
|
||||
If the boss is to close to a scrap pile -> no summon
|
||||
make the life sparks visible...
|
||||
*/
|
||||
|
||||
#include "ScriptedPch.h"
|
||||
#include "ulduar.h"
|
||||
|
||||
#define SPELL_SEARING_LIGHT 63018
|
||||
#define SPELL_SONIC_BOOM 38897
|
||||
enum Spells
|
||||
{
|
||||
SPELL_TYMPANIC_TANTRUM = 62776,
|
||||
SPELL_SEARING_LIGHT_10 = 63018,
|
||||
SPELL_SEARING_LIGHT_25 = 65121,
|
||||
|
||||
#define SAY_AGGRO -1000000
|
||||
#define SAY_SLAY -1000001
|
||||
SPELL_GRAVITY_BOMB_10 = 63024,
|
||||
SPELL_GRAVITY_BOMB_25 = 63234,
|
||||
SPELL_GRAVITY_BOMB_AURA_10 = 63025,
|
||||
SPELL_GRAVITY_BOMB_AURA_25 = 63233,
|
||||
|
||||
SPELL_HEARTBREAK_10 = 65737,
|
||||
SPELL_HEARTBREAK_25 = 64193,
|
||||
|
||||
SPELL_ENRAGE = 26662,
|
||||
|
||||
//------------------VOID ZONE--------------------
|
||||
SPELL_VOID_ZONE_10 = 64203,
|
||||
SPELL_VOID_ZONE_25 = 64235,
|
||||
|
||||
// Life Spark
|
||||
SPELL_STATIC_CHARGED_10 = 64227,
|
||||
SPELL_STATIC_CHARGED_25 = 64236,
|
||||
SPELL_SHOCK = 64230,
|
||||
|
||||
//----------------XT-002 HEART-------------------
|
||||
SPELL_EXPOSED_HEART = 63849,
|
||||
|
||||
//---------------XM-024 PUMMELLER----------------
|
||||
SPELL_ARCING_SMASH = 8374,
|
||||
SPELL_TRAMPLE = 5568,
|
||||
SPELL_UPPERCUT = 10966,
|
||||
|
||||
//------------------BOOMBOT-----------------------
|
||||
SPELL_BOOM = 62834,
|
||||
};
|
||||
|
||||
enum Timers
|
||||
{
|
||||
TIMER_TYMPANIC_TANTRUM_MIN = 32000,
|
||||
TIMER_TYMPANIC_TANTRUM_MAX = 36000,
|
||||
TIMER_SEARING_LIGHT = 20000,
|
||||
TIMER_SPAWN_LIFE_SPARK = 9000,
|
||||
TIMER_GRAVITY_BOMB = 20000,
|
||||
TIMER_HEART_PHASE = 30000,
|
||||
TIMER_ENRAGE = 600000,
|
||||
TIMER_GRAVITY_BOMB_AURA = 8900,
|
||||
|
||||
TIMER_VOID_ZONE = 3000,
|
||||
|
||||
// Life Spark
|
||||
TIMER_SHOCK = 12000,
|
||||
|
||||
// Pummeller
|
||||
// Timers may be off
|
||||
TIMER_ARCING_SMASH = 27000,
|
||||
TIMER_TRAMPLE = 22000,
|
||||
TIMER_UPPERCUT = 17000,
|
||||
|
||||
TIMER_SPAWN_ADD = 12000,
|
||||
};
|
||||
|
||||
enum Creatures
|
||||
{
|
||||
NPC_VOID_ZONE = 34001,
|
||||
NPC_LIFE_SPARK = 34004,
|
||||
NPC_XT002_HEART = 33329,
|
||||
NPC_XS013_SCRAPBOT = 33343,
|
||||
NPC_XM024_PUMMELLER = 33344,
|
||||
NPC_XE321_BOOMBOT = 33346,
|
||||
};
|
||||
|
||||
enum Actions
|
||||
{
|
||||
ACTION_ENTER_HARD_MODE = 0,
|
||||
};
|
||||
|
||||
enum XT002Data
|
||||
{
|
||||
DATA_TRANSFERED_HEALTH = 0,
|
||||
};
|
||||
|
||||
enum Yells
|
||||
{
|
||||
SAY_AGGRO = -1603300,
|
||||
SAY_HEART_OPENED = -1603301,
|
||||
SAY_HEART_CLOSED = -1603302,
|
||||
SAY_TYMPANIC_TANTRUM = -1603303,
|
||||
SAY_SLAY_1 = -1603304,
|
||||
SAY_SLAY_2 = -1603305,
|
||||
SAY_BERSERK = -1603306,
|
||||
SAY_DEATH = -1603307,
|
||||
SAY_SUMMON = -1603308,
|
||||
};
|
||||
|
||||
//#define GRAVITY_BOMB_DMG_MIN_10 11700
|
||||
//#define GRAVITY_BOMB_DMG_MAX_10 12300
|
||||
//#define GRAVITY_BOMB_DMG_MIN_25 14625
|
||||
//#define GRAVITY_BOMB_DMG_MAX_25 15375
|
||||
//#define GRAVITY_BOMB_RADIUS 12
|
||||
|
||||
//#define VOID_ZONE_DMG_10 5000
|
||||
//#define VOID_ZONE_DMG_25 7500
|
||||
//#define VOID_ZONE_RADIUS
|
||||
|
||||
|
||||
/************************************************
|
||||
-----------------SPAWN LOCATIONS-----------------
|
||||
************************************************/
|
||||
//Shared Z-level
|
||||
#define SPAWN_Z 412
|
||||
//Lower right
|
||||
#define LR_X 796
|
||||
#define LR_Y -94
|
||||
//Lower left
|
||||
#define LL_X 796
|
||||
#define LL_Y 57
|
||||
//Upper right
|
||||
#define UR_X 890
|
||||
#define UR_Y -82
|
||||
//Upper left
|
||||
#define UL_X 894
|
||||
#define UL_Y 62
|
||||
|
||||
/*-------------------------------------------------------
|
||||
*
|
||||
* XT-002 DECONSTRUCTOR
|
||||
*
|
||||
*///----------------------------------------------------
|
||||
struct boss_xt002_AI : public BossAI
|
||||
{
|
||||
boss_xt002_AI(Creature *pCreature) : BossAI(pCreature, TYPE_XT002)
|
||||
{
|
||||
m_pInstance = pCreature->GetInstanceData();
|
||||
}
|
||||
|
||||
ScriptedInstance* m_pInstance;
|
||||
uint32 uiSearingLightTimer;
|
||||
uint32 uiSpawnLifeSparkTimer;
|
||||
uint32 uiGravityBombTimer;
|
||||
uint32 uiGravityBombAuraTimer;
|
||||
uint32 uiTympanicTantrumTimer;
|
||||
uint32 uiHeartPhaseTimer;
|
||||
uint32 uiSpawnAddTimer;
|
||||
uint32 uiEnrageTimer;
|
||||
|
||||
bool searing_light_active;
|
||||
uint64 uiSearingLightTarget;
|
||||
|
||||
uint32 SEARING_LIGHT_Timer;
|
||||
uint32 SONIC_BOOM_Timer;
|
||||
bool gravity_bomb_active;
|
||||
uint64 uiGravityBombTarget;
|
||||
|
||||
uint8 phase;
|
||||
uint8 heart_exposed;
|
||||
bool enraged;
|
||||
|
||||
uint32 transferHealth;
|
||||
bool enterHardMode;
|
||||
bool hardMode;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
SEARING_LIGHT_Timer = 100;
|
||||
SONIC_BOOM_Timer = 20;
|
||||
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_NOT_SELECTABLE);
|
||||
|
||||
//Makes XT-002 to cast a light bomb 10 seconds after aggro.
|
||||
uiSearingLightTimer = TIMER_SEARING_LIGHT/2;
|
||||
uiSpawnLifeSparkTimer = TIMER_SPAWN_LIFE_SPARK;
|
||||
uiGravityBombTimer = TIMER_GRAVITY_BOMB;
|
||||
uiGravityBombAuraTimer = TIMER_GRAVITY_BOMB_AURA;
|
||||
uiHeartPhaseTimer = TIMER_HEART_PHASE;
|
||||
uiSpawnAddTimer = TIMER_SPAWN_ADD;
|
||||
uiEnrageTimer = TIMER_ENRAGE;
|
||||
|
||||
//Tantrum is casted a bit slower the first time.
|
||||
uiTympanicTantrumTimer = urand(TIMER_TYMPANIC_TANTRUM_MIN, TIMER_TYMPANIC_TANTRUM_MAX) * 2;
|
||||
|
||||
searing_light_active = false;
|
||||
gravity_bomb_active = false;
|
||||
enraged = false;
|
||||
hardMode = false;
|
||||
enterHardMode = false;
|
||||
|
||||
phase = 1;
|
||||
heart_exposed = 0;
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
DoScriptText(SAY_AGGRO,m_creature);
|
||||
DoScriptText(SAY_AGGRO, m_creature);
|
||||
_EnterCombat();
|
||||
}
|
||||
|
||||
void DoAction(const int32 action)
|
||||
{
|
||||
switch (action)
|
||||
{
|
||||
case ACTION_ENTER_HARD_MODE:
|
||||
if (!hardMode)
|
||||
{
|
||||
hardMode = true;
|
||||
|
||||
// Enter hard mode
|
||||
enterHardMode = true;
|
||||
|
||||
// set max health
|
||||
m_creature->SetHealth(m_creature->GetMaxHealth());
|
||||
|
||||
// Get his heartbreak buff
|
||||
m_creature->CastSpell(m_creature, RAID_MODE(SPELL_HEARTBREAK_10, SPELL_HEARTBREAK_25), true);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void SetData(uint32 id, uint32 value)
|
||||
{
|
||||
switch(id)
|
||||
{
|
||||
case DATA_TRANSFERED_HEALTH:
|
||||
transferHealth = value;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim)
|
||||
{
|
||||
DoScriptText(SAY_SLAY, m_creature);
|
||||
DoScriptText(RAND(SAY_SLAY_1,SAY_SLAY_2), m_creature);
|
||||
}
|
||||
|
||||
void JustDied(Unit *victim)
|
||||
{
|
||||
DoScriptText(SAY_SLAY, m_creature);
|
||||
|
||||
if (m_pInstance)
|
||||
m_pInstance->SetData(TYPE_XT002, DONE);
|
||||
DoScriptText(SAY_DEATH, m_creature);
|
||||
_JustDied();
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* who) {}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
if(m_creature->GetPositionX() < 700) // Not Blizzlike, anti-exploit to prevent players from pulling bosses to vehicles.
|
||||
if (enterHardMode)
|
||||
{
|
||||
m_creature->RemoveAllAuras();
|
||||
m_creature->DeleteThreatList();
|
||||
m_creature->CombatStop(false);
|
||||
m_creature->GetMotionMaster()->MoveTargetedHome();
|
||||
SetPhaseOne();
|
||||
enterHardMode = false;
|
||||
}
|
||||
|
||||
if (SEARING_LIGHT_Timer <= diff)
|
||||
// Handles spell casting. These spells only occur during phase 1 and hard mode
|
||||
if (phase == 1 || hardMode)
|
||||
{
|
||||
DoCast(m_creature, SPELL_SEARING_LIGHT);
|
||||
DoScriptText(SAY_SLAY, m_creature);
|
||||
SEARING_LIGHT_Timer = 50000;
|
||||
} else SEARING_LIGHT_Timer -= diff;
|
||||
if (uiSearingLightTimer <= diff)
|
||||
{
|
||||
if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
|
||||
{
|
||||
DoCast(pTarget, RAID_MODE(SPELL_SEARING_LIGHT_10, SPELL_SEARING_LIGHT_25));
|
||||
uiSearingLightTarget = pTarget->GetGUID();
|
||||
}
|
||||
uiSpawnLifeSparkTimer = TIMER_SPAWN_LIFE_SPARK;
|
||||
if (hardMode)
|
||||
searing_light_active = true;
|
||||
uiSearingLightTimer = TIMER_SEARING_LIGHT;
|
||||
} else uiSearingLightTimer -= diff;
|
||||
|
||||
if (SONIC_BOOM_Timer <= diff)
|
||||
if (uiGravityBombTimer <= diff)
|
||||
{
|
||||
if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
|
||||
{
|
||||
DoCast(pTarget, RAID_MODE(SPELL_GRAVITY_BOMB_10,SPELL_GRAVITY_BOMB_25));
|
||||
uiGravityBombTarget = pTarget->GetGUID();
|
||||
}
|
||||
uiGravityBombTimer = TIMER_GRAVITY_BOMB;
|
||||
gravity_bomb_active = true;
|
||||
} else uiGravityBombTimer -= diff;
|
||||
|
||||
if (uiTympanicTantrumTimer <= 0)
|
||||
{
|
||||
DoScriptText(SAY_TYMPANIC_TANTRUM, m_creature);
|
||||
DoCast(SPELL_TYMPANIC_TANTRUM);
|
||||
uiTympanicTantrumTimer = urand(TIMER_TYMPANIC_TANTRUM_MIN, TIMER_TYMPANIC_TANTRUM_MAX);
|
||||
} else uiTympanicTantrumTimer -= diff;
|
||||
}
|
||||
|
||||
if (!hardMode)
|
||||
{
|
||||
DoCast(m_creature->getVictim(), SPELL_SONIC_BOOM);
|
||||
SONIC_BOOM_Timer = 20000;
|
||||
} else SONIC_BOOM_Timer -= diff;
|
||||
if (phase == 1)
|
||||
{
|
||||
if (HealthBelowPct(75) && heart_exposed == 0)
|
||||
{
|
||||
exposeHeart();
|
||||
}
|
||||
else if (HealthBelowPct(50) && heart_exposed == 1)
|
||||
{
|
||||
exposeHeart();
|
||||
}
|
||||
else if (HealthBelowPct(25) && heart_exposed == 2)
|
||||
{
|
||||
exposeHeart();
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
else
|
||||
{
|
||||
//Stop moving
|
||||
m_creature->StopMoving();
|
||||
|
||||
//Start summoning adds
|
||||
if (uiSpawnAddTimer <= diff)
|
||||
{
|
||||
DoScriptText(SAY_SUMMON, m_creature);
|
||||
|
||||
// Spawn Pummeller
|
||||
switch (rand() % 4)
|
||||
{
|
||||
case 0: m_creature->SummonCreature(NPC_XM024_PUMMELLER, LR_X, LR_Y, SPAWN_Z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); break;
|
||||
case 1: m_creature->SummonCreature(NPC_XM024_PUMMELLER, LL_X, LL_Y, SPAWN_Z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); break;
|
||||
case 2: m_creature->SummonCreature(NPC_XM024_PUMMELLER, UR_X, UR_Y, SPAWN_Z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); break;
|
||||
case 3: m_creature->SummonCreature(NPC_XM024_PUMMELLER, UL_X, UL_Y, SPAWN_Z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); break;
|
||||
}
|
||||
|
||||
// Spawn 5 Bombs
|
||||
for (int8 n = 0; n < 5; n++)
|
||||
{
|
||||
//Some randomes are added so they wont spawn in a pile
|
||||
switch(rand() % 4)
|
||||
{
|
||||
case 0: m_creature->SummonCreature(NPC_XS013_SCRAPBOT, irand(LR_X - 3, LR_X + 3), irand(LR_Y - 3, LR_Y + 3), SPAWN_Z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); break;
|
||||
case 1: m_creature->SummonCreature(NPC_XS013_SCRAPBOT, irand(LL_X - 3, LL_X + 3), irand(LL_Y - 3, LL_Y + 3), SPAWN_Z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); break;
|
||||
case 2: m_creature->SummonCreature(NPC_XS013_SCRAPBOT, irand(UR_X - 3, UR_X + 3), irand(UR_Y - 3, UR_Y + 3), SPAWN_Z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); break;
|
||||
case 3: m_creature->SummonCreature(NPC_XS013_SCRAPBOT, irand(UL_X - 3, UL_X + 3), irand(UL_Y - 3, UL_Y + 3), SPAWN_Z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); break;
|
||||
}
|
||||
}
|
||||
|
||||
//Spawn 5 Scrapbots
|
||||
switch (rand() % 4)
|
||||
{
|
||||
case 0: m_creature->SummonCreature(NPC_XE321_BOOMBOT, LR_X, LR_Y, SPAWN_Z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); break;
|
||||
case 1: m_creature->SummonCreature(NPC_XE321_BOOMBOT, LL_X, LL_Y, SPAWN_Z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); break;
|
||||
case 2: m_creature->SummonCreature(NPC_XE321_BOOMBOT, UR_X, UR_Y, SPAWN_Z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); break;
|
||||
case 3: m_creature->SummonCreature(NPC_XE321_BOOMBOT, UL_X, UL_Y, SPAWN_Z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); break;
|
||||
}
|
||||
|
||||
uiSpawnAddTimer = TIMER_SPAWN_ADD;
|
||||
} else uiSpawnAddTimer -= diff;
|
||||
|
||||
// Is the phase over?
|
||||
if (uiHeartPhaseTimer <= diff)
|
||||
{
|
||||
DoScriptText(SAY_HEART_CLOSED, m_creature);
|
||||
SetPhaseOne();
|
||||
}
|
||||
else
|
||||
uiHeartPhaseTimer -= diff;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Adding life sparks when searing light debuff runs out if hard mode
|
||||
if (searing_light_active)
|
||||
{
|
||||
if (uiSpawnLifeSparkTimer <= diff)
|
||||
{
|
||||
if (Unit *pSearingLightTarget = m_creature->GetUnit(*m_creature, uiSearingLightTarget))
|
||||
pSearingLightTarget->SummonCreature(NPC_LIFE_SPARK, pSearingLightTarget->GetPositionX(), pSearingLightTarget->GetPositionY(), pSearingLightTarget->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000);
|
||||
uiSpawnLifeSparkTimer = TIMER_SPAWN_LIFE_SPARK;
|
||||
searing_light_active = false;
|
||||
} else uiSpawnLifeSparkTimer -= diff;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
if (gravity_bomb_active)
|
||||
{
|
||||
if (uiGravityBombAuraTimer <= diff)
|
||||
{
|
||||
if (Unit *pGravityBombTarget = m_creature->GetUnit(*m_creature, uiGravityBombTarget))
|
||||
{
|
||||
pGravityBombTarget->RemoveAurasDueToSpell(RAID_MODE(SPELL_GRAVITY_BOMB_10,SPELL_GRAVITY_BOMB_25));
|
||||
if (hardMode)
|
||||
{
|
||||
//Remains spawned for 3 minutes
|
||||
pGravityBombTarget->SummonCreature(NPC_VOID_ZONE, pGravityBombTarget->GetPositionX(), pGravityBombTarget->GetPositionY(), pGravityBombTarget->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 180000);
|
||||
}
|
||||
}
|
||||
|
||||
gravity_bomb_active = false;
|
||||
uiGravityBombAuraTimer = TIMER_GRAVITY_BOMB_AURA;
|
||||
//gravityBomb();
|
||||
} else uiGravityBombAuraTimer -= diff;
|
||||
}
|
||||
|
||||
//Enrage stuff
|
||||
if (!enraged)
|
||||
if (uiEnrageTimer <= diff)
|
||||
{
|
||||
DoScriptText(SAY_BERSERK, m_creature);
|
||||
DoCast(m_creature, SPELL_ENRAGE);
|
||||
enraged = true;
|
||||
} else uiEnrageTimer -= diff;
|
||||
}
|
||||
|
||||
void exposeHeart()
|
||||
{
|
||||
//Make untargetable
|
||||
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
|
||||
|
||||
//Summon the heart npc
|
||||
m_creature->SummonCreature(NPC_XT002_HEART, m_creature->GetPositionX(), m_creature->GetPositionY(), m_creature->GetPositionZ() + 7, 0, TEMPSUMMON_TIMED_DESPAWN, TIMER_HEART_PHASE);
|
||||
|
||||
// Start "end of phase 2 timer"
|
||||
uiHeartPhaseTimer = TIMER_HEART_PHASE;
|
||||
|
||||
//Phase 2 has offically started
|
||||
phase = 2;
|
||||
heart_exposed++;
|
||||
|
||||
//Reset the add spawning timer
|
||||
uiSpawnAddTimer = TIMER_SPAWN_ADD;
|
||||
|
||||
DoScriptText(SAY_HEART_OPENED, m_creature);
|
||||
}
|
||||
|
||||
void SetPhaseOne()
|
||||
{
|
||||
uiSearingLightTimer = TIMER_SEARING_LIGHT / 2;
|
||||
uiGravityBombTimer = TIMER_GRAVITY_BOMB;
|
||||
uiTympanicTantrumTimer = urand(TIMER_TYMPANIC_TANTRUM_MIN, TIMER_TYMPANIC_TANTRUM_MAX);
|
||||
uiSpawnAddTimer = TIMER_SPAWN_ADD;
|
||||
|
||||
if (!hardMode)
|
||||
m_creature->ModifyHealth(-transferHealth);
|
||||
|
||||
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
|
||||
phase = 1;
|
||||
}
|
||||
|
||||
// TODO: put in comment and kept for reference. The spell should be fixed properly in spell system, if necessary.
|
||||
////Have to do this the custom way since the original spell messes up player movement
|
||||
//void gravityBomb()
|
||||
//{
|
||||
// uint32 maxDamage = RAID_MODE(GRAVITY_BOMB_DMG_MAX_10, GRAVITY_BOMB_DMG_MAX_25);
|
||||
// uint32 minDamage = RAID_MODE(GRAVITY_BOMB_DMG_MIN_10, GRAVITY_BOMB_DMG_MIN_25);
|
||||
// uint16 range = GRAVITY_BOMB_RADIUS;
|
||||
// Map* pMap = me->GetMap();
|
||||
// if (pMap && pMap->IsDungeon())
|
||||
// {
|
||||
// Map::PlayerList const &PlayerList = pMap->GetPlayers();
|
||||
// for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
|
||||
// {
|
||||
// //If a player is within the range of the spell
|
||||
// if (i->getSource() && i->getSource()->GetDistance2d(pGravityBombTarget) <= range)
|
||||
// {
|
||||
// //Deal damage to the victim
|
||||
// int32 damage = urand(minDamage, maxDamage);
|
||||
// i->getSource()->ModifyHealth(-damage);
|
||||
// m_creature->SendSpellNonMeleeDamageLog(i->getSource(), SPELL_GRAVITY_BOMB_AURA_10, damage, SPELL_SCHOOL_MASK_SHADOW, 0, 0, false, 0);
|
||||
|
||||
// //Replacing the tractor beam effect
|
||||
// i->getSource()->JumpTo(pGravityBombTarget, 5);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI_boss_xt002(Creature* pCreature)
|
||||
{
|
||||
return new boss_xt002_AI(pCreature);
|
||||
}
|
||||
|
||||
/*-------------------------------------------------------
|
||||
*
|
||||
* XT-002 HEART
|
||||
*
|
||||
*///----------------------------------------------------
|
||||
struct mob_xt002_heartAI : public ScriptedAI
|
||||
{
|
||||
mob_xt002_heartAI(Creature* pCreature) : ScriptedAI(pCreature)
|
||||
{
|
||||
m_pInstance = pCreature->GetInstanceData();
|
||||
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_STUNNED);
|
||||
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
|
||||
DoCast(m_creature, SPELL_EXPOSED_HEART);
|
||||
}
|
||||
|
||||
ScriptedInstance* m_pInstance;
|
||||
|
||||
void JustDied(Unit *victim)
|
||||
{
|
||||
if (m_pInstance)
|
||||
if (Creature* pXT002 = m_creature->GetCreature(*m_creature, m_pInstance->GetData64(TYPE_XT002)))
|
||||
if (pXT002->AI())
|
||||
pXT002->AI()->DoAction(ACTION_ENTER_HARD_MODE);
|
||||
|
||||
//removes the aura
|
||||
m_creature->RemoveAurasDueToSpell(SPELL_EXPOSED_HEART);
|
||||
}
|
||||
|
||||
void DamageTaken(Unit *pDone, uint32 &damage)
|
||||
{
|
||||
if (Creature* pXT002 = m_creature->GetCreature(*m_creature, m_pInstance->GetData64(TYPE_XT002)))
|
||||
if (pXT002->AI())
|
||||
{
|
||||
uint32 health = m_creature->GetHealth();
|
||||
health -= damage;
|
||||
if (health < 0)
|
||||
health = 0;
|
||||
|
||||
pXT002->AI()->SetData(DATA_TRANSFERED_HEALTH, m_creature->GetMaxHealth() - health);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI_mob_xt002_heart(Creature* pCreature)
|
||||
{
|
||||
return new mob_xt002_heartAI(pCreature);
|
||||
}
|
||||
|
||||
/*-------------------------------------------------------
|
||||
*
|
||||
* XS-013 SCRAPBOT
|
||||
*
|
||||
*///----------------------------------------------------
|
||||
struct mob_scrapbotAI : public ScriptedAI
|
||||
{
|
||||
mob_scrapbotAI(Creature* pCreature) : ScriptedAI(pCreature)
|
||||
{
|
||||
m_pInstance = m_creature->GetInstanceData();
|
||||
}
|
||||
|
||||
ScriptedInstance* m_pInstance;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
m_creature->SetReactState(REACT_PASSIVE);
|
||||
|
||||
if (Creature* pXT002 = m_creature->GetCreature(*m_creature, m_pInstance->GetData64(TYPE_XT002)))
|
||||
m_creature->GetMotionMaster()->MoveChase(pXT002);
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (Creature* pXT002 = m_creature->GetCreature(*m_creature, m_pInstance->GetData64(TYPE_XT002)))
|
||||
{
|
||||
if (m_creature->GetDistance2d(pXT002) <= 0.5)
|
||||
{
|
||||
// TODO Send raid message
|
||||
|
||||
// Increase health with 1 percent
|
||||
pXT002->ModifyHealth(pXT002->GetMaxHealth() * 0.01);
|
||||
|
||||
// Despawns the scrapbot
|
||||
m_creature->ForcedDespawn();
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI_mob_scrapbot(Creature* pCreature)
|
||||
{
|
||||
return new mob_scrapbotAI(pCreature);
|
||||
}
|
||||
|
||||
/*-------------------------------------------------------
|
||||
*
|
||||
* XM-024 PUMMELLER
|
||||
*
|
||||
*///----------------------------------------------------
|
||||
struct mob_pummellerAI : public ScriptedAI
|
||||
{
|
||||
mob_pummellerAI(Creature* pCreature) : ScriptedAI(pCreature)
|
||||
{
|
||||
m_pInstance = pCreature->GetInstanceData();
|
||||
}
|
||||
|
||||
ScriptedInstance* m_pInstance;
|
||||
int32 uiArcingSmashTimer;
|
||||
int32 uiTrampleTimer;
|
||||
int32 uiUppercutTimer;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
uiArcingSmashTimer = TIMER_ARCING_SMASH;
|
||||
uiTrampleTimer = TIMER_TRAMPLE;
|
||||
uiUppercutTimer = TIMER_UPPERCUT;
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
if (m_creature->IsWithinMeleeRange(m_creature->getVictim()))
|
||||
{
|
||||
if (uiArcingSmashTimer <= diff)
|
||||
{
|
||||
DoCast(m_creature->getVictim(), SPELL_ARCING_SMASH);
|
||||
uiArcingSmashTimer = TIMER_ARCING_SMASH;
|
||||
} else uiArcingSmashTimer -= diff;
|
||||
|
||||
if (uiTrampleTimer <= diff)
|
||||
{
|
||||
DoCast(m_creature->getVictim(), SPELL_TRAMPLE);
|
||||
uiTrampleTimer = TIMER_TRAMPLE;
|
||||
} else uiTrampleTimer -= diff;
|
||||
|
||||
if (uiUppercutTimer <= diff)
|
||||
{
|
||||
DoCast(m_creature->getVictim(), SPELL_UPPERCUT);
|
||||
uiUppercutTimer = TIMER_UPPERCUT;
|
||||
} else uiUppercutTimer -= diff;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI_boss_xt002(Creature* pCreature)
|
||||
CreatureAI* GetAI_mob_pummeller(Creature* pCreature)
|
||||
{
|
||||
return new boss_xt002_AI (pCreature);
|
||||
return new mob_pummellerAI(pCreature);
|
||||
}
|
||||
|
||||
/*-------------------------------------------------------
|
||||
*
|
||||
* XE-321 BOOMBOT
|
||||
*
|
||||
*///----------------------------------------------------
|
||||
struct mob_boombotAI : public ScriptedAI
|
||||
{
|
||||
mob_boombotAI(Creature* pCreature) : ScriptedAI(pCreature)
|
||||
{
|
||||
m_pInstance = pCreature->GetInstanceData();
|
||||
}
|
||||
|
||||
ScriptedInstance* m_pInstance;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
m_creature->SetReactState(REACT_PASSIVE);
|
||||
|
||||
if (Creature* pXT002 = m_creature->GetCreature(*m_creature, m_pInstance->GetData64(TYPE_XT002)))
|
||||
m_creature->GetMotionMaster()->MoveChase(pXT002);
|
||||
}
|
||||
|
||||
void JustDied(Unit *killer)
|
||||
{
|
||||
DoCast(SPELL_BOOM);
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (Creature* pXT002 = m_creature->GetCreature(*m_creature, m_pInstance->GetData64(TYPE_XT002)))
|
||||
{
|
||||
if (m_creature->GetDistance2d(pXT002) <= 0.5)
|
||||
{
|
||||
//Explosion
|
||||
DoCast(m_creature, SPELL_BOOM);
|
||||
|
||||
//Despawns the boombot
|
||||
m_creature->ForcedDespawn();
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI_mob_boombot(Creature* pCreature)
|
||||
{
|
||||
return new mob_boombotAI(pCreature);
|
||||
}
|
||||
|
||||
/*-------------------------------------------------------
|
||||
*
|
||||
* VOID ZONE
|
||||
*
|
||||
*///----------------------------------------------------
|
||||
struct mob_void_zoneAI : public ScriptedAI
|
||||
{
|
||||
mob_void_zoneAI(Creature* pCreature) : ScriptedAI(pCreature)
|
||||
{
|
||||
m_pInstance = pCreature->GetInstanceData();
|
||||
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
|
||||
}
|
||||
|
||||
ScriptedInstance* m_pInstance;
|
||||
uint32 uiVoidZoneTimer;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
uiVoidZoneTimer = TIMER_VOID_ZONE;
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (uiVoidZoneTimer <= diff)
|
||||
{
|
||||
//voidZone();
|
||||
uiVoidZoneTimer = TIMER_VOID_ZONE;
|
||||
} else uiVoidZoneTimer -= diff;
|
||||
}
|
||||
|
||||
// TODO: put in comment and kept for reference. The spell should be fixed properly in spell system, if necessary.
|
||||
//void voidZone()
|
||||
//{
|
||||
// Map* pMap = me->GetMap();
|
||||
// if (pMap && pMap->IsDungeon())
|
||||
// {
|
||||
// Map::PlayerList const &PlayerList = pMap->GetPlayers();
|
||||
// for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
|
||||
// {
|
||||
// // If a player is within the range of the spell
|
||||
// if (i->getSource() && i->getSource()->GetDistance2d(m_creature) <= 16)
|
||||
// {
|
||||
// // Deal damage to the victim
|
||||
// int32 damage = RAID_MODE(VOID_ZONE_DMG_10, VOID_ZONE_DMG_25);
|
||||
// m_creature->DealDamage(i->getSource(), damage, NULL, SPELL_DIRECT_DAMAGE, SPELL_SCHOOL_MASK_SHADOW);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI_mob_void_zone(Creature* pCreature)
|
||||
{
|
||||
return new mob_void_zoneAI(pCreature);
|
||||
}
|
||||
|
||||
/*-------------------------------------------------------
|
||||
*
|
||||
* LIFE SPARK
|
||||
*
|
||||
*///----------------------------------------------------
|
||||
struct mob_life_sparkAI : public ScriptedAI
|
||||
{
|
||||
mob_life_sparkAI(Creature* pCreature) : ScriptedAI(pCreature)
|
||||
{
|
||||
m_pInstance = pCreature->GetInstanceData();
|
||||
}
|
||||
|
||||
ScriptedInstance* m_pInstance;
|
||||
uint32 uiShockTimer;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
DoCast(m_creature, RAID_MODE(SPELL_STATIC_CHARGED_10, SPELL_STATIC_CHARGED_25));
|
||||
uiShockTimer = 0; // first one is immediate.
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
if (uiShockTimer <= diff)
|
||||
{
|
||||
if (m_creature->IsWithinMeleeRange(m_creature->getVictim()))
|
||||
{
|
||||
DoCast(m_creature->getVictim(), SPELL_SHOCK);
|
||||
uiShockTimer = TIMER_SHOCK;
|
||||
}
|
||||
}
|
||||
else uiShockTimer -= diff;
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI_mob_life_spark(Creature* pCreature)
|
||||
{
|
||||
return new mob_life_sparkAI(pCreature);
|
||||
}
|
||||
|
||||
void AddSC_boss_xt002()
|
||||
{
|
||||
Script *newscript;
|
||||
@@ -104,4 +806,34 @@ void AddSC_boss_xt002()
|
||||
newscript->Name = "boss_xt002";
|
||||
newscript->GetAI = &GetAI_boss_xt002;
|
||||
newscript->RegisterSelf();
|
||||
|
||||
newscript = new Script;
|
||||
newscript->Name = "mob_xt002_heart";
|
||||
newscript->GetAI = &GetAI_mob_xt002_heart;
|
||||
newscript->RegisterSelf();
|
||||
|
||||
newscript = new Script;
|
||||
newscript->Name = "mob_scrapbot";
|
||||
newscript->GetAI = &GetAI_mob_scrapbot;
|
||||
newscript->RegisterSelf();
|
||||
|
||||
newscript = new Script;
|
||||
newscript->Name = "mob_pummeller";
|
||||
newscript->GetAI = &GetAI_mob_pummeller;
|
||||
newscript->RegisterSelf();
|
||||
|
||||
newscript = new Script;
|
||||
newscript->Name = "mob_boombot";
|
||||
newscript->GetAI = &GetAI_mob_boombot;
|
||||
newscript->RegisterSelf();
|
||||
|
||||
newscript = new Script;
|
||||
newscript->Name = "mob_void_zone";
|
||||
newscript->GetAI = &GetAI_mob_void_zone;
|
||||
newscript->RegisterSelf();
|
||||
|
||||
newscript = new Script;
|
||||
newscript->Name = "mob_life_spark";
|
||||
newscript->GetAI = &GetAI_mob_life_spark;
|
||||
newscript->RegisterSelf();
|
||||
}
|
||||
|
||||
@@ -18,3 +18,33 @@
|
||||
|
||||
#include "ScriptedPch.h"
|
||||
#include "ulduar.h"
|
||||
|
||||
enum Sara_Yells
|
||||
{
|
||||
SAY_SARA_PREFIGHT_1 = -1603310,
|
||||
SAY_SARA_PREFIGHT_2 = -1603311,
|
||||
SAY_SARA_AGGRO_1 = -1603312,
|
||||
SAY_SARA_AGGRO_2 = -1603313,
|
||||
SAY_SARA_AGGRO_3 = -1603314,
|
||||
SAY_SARA_SLAY_1 = -1603315,
|
||||
SAY_SARA_SLAY_2 = -1603316,
|
||||
WHISP_SARA_INSANITY = -1603317,
|
||||
SAY_SARA_PHASE2_1 = -1603318,
|
||||
SAY_SARA_PHASE2_2 = -1603319,
|
||||
};
|
||||
|
||||
enum YoggSaron_Yells
|
||||
{
|
||||
SAY_PHASE2_1 = -1603330,
|
||||
SAY_PHASE2_2 = -1603331,
|
||||
SAY_PHASE2_3 = -1603332,
|
||||
SAY_PHASE2_4 = -1603333,
|
||||
SAY_PHASE2_5 = -1603334,
|
||||
SAY_PHASE3 = -1603335,
|
||||
SAY_VISION = -1603336,
|
||||
SAY_SLAY_1 = -1603337,
|
||||
SAY_SLAY_2 = -1603338,
|
||||
WHISP_INSANITY_1 = -1603339,
|
||||
WHISP_INSANITY_2 = -1603340,
|
||||
SAY_DEATH = -1603341,
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user