Scripts/BRS: Update scripts to new model (2/3) (#26417)

Co-authored-by: offl <offl@users.noreply.github.com>
This commit is contained in:
offl
2021-04-15 15:20:20 +03:00
committed by GitHub
parent 747333149d
commit 0fc3a05d3c
5 changed files with 459 additions and 526 deletions

View File

@@ -40,110 +40,99 @@ enum Events
EVENT_SHADOW_WRATH = 3
};
class boss_lord_valthalak : public CreatureScript
struct boss_lord_valthalak : public BossAI
{
public:
boss_lord_valthalak() : CreatureScript("boss_lord_valthalak") { }
struct boss_lord_valthalakAI : public BossAI
boss_lord_valthalak(Creature* creature) : BossAI(creature, DATA_LORD_VALTHALAK)
{
boss_lord_valthalakAI(Creature* creature) : BossAI(creature, DATA_LORD_VALTHALAK)
{
Initialize();
}
Initialize();
}
void Initialize()
{
frenzy40 = false;
frenzy15 = false;
}
void Initialize()
{
frenzy40 = false;
frenzy15 = false;
}
void Reset() override
{
_Reset();
Initialize();
}
void Reset() override
{
_Reset();
Initialize();
}
void JustEngagedWith(Unit* who) override
{
BossAI::JustEngagedWith(who);
events.ScheduleEvent(EVENT_SUMMON_SPECTRAL_ASSASSIN, 6s, 8s);
events.ScheduleEvent(EVENT_SHADOW_WRATH, 9s, 18s);
}
void JustEngagedWith(Unit* who) override
{
BossAI::JustEngagedWith(who);
events.ScheduleEvent(EVENT_SUMMON_SPECTRAL_ASSASSIN, 6s, 8s);
events.ScheduleEvent(EVENT_SHADOW_WRATH, 9s, 18s);
}
void JustDied(Unit* /*killer*/) override
{
instance->SetData(DATA_LORD_VALTHALAK, DONE);
}
void JustDied(Unit* /*killer*/) override
{
instance->SetData(DATA_LORD_VALTHALAK, DONE);
}
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
return;
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
return;
events.Update(diff);
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
while (uint32 eventId = events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_SUMMON_SPECTRAL_ASSASSIN:
DoCast(me, SPELL_SUMMON_SPECTRAL_ASSASSIN);
events.ScheduleEvent(EVENT_SUMMON_SPECTRAL_ASSASSIN, 30s, 35s);
break;
case EVENT_SHADOW_BOLT_VOLLEY:
DoCastVictim(SPELL_SHADOW_BOLT_VOLLEY);
events.ScheduleEvent(EVENT_SHADOW_BOLT_VOLLEY, 4s, 6s);
break;
case EVENT_SHADOW_WRATH:
DoCastVictim(SPELL_SHADOW_WRATH);
events.ScheduleEvent(EVENT_SHADOW_WRATH, 19s, 24s);
break;
default:
break;
}
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
while (uint32 eventId = events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_SUMMON_SPECTRAL_ASSASSIN:
DoCast(me, SPELL_SUMMON_SPECTRAL_ASSASSIN);
events.ScheduleEvent(EVENT_SUMMON_SPECTRAL_ASSASSIN, 30s, 35s);
break;
case EVENT_SHADOW_BOLT_VOLLEY:
DoCastVictim(SPELL_SHADOW_BOLT_VOLLEY);
events.ScheduleEvent(EVENT_SHADOW_BOLT_VOLLEY, 4s, 6s);
break;
case EVENT_SHADOW_WRATH:
DoCastVictim(SPELL_SHADOW_WRATH);
events.ScheduleEvent(EVENT_SHADOW_WRATH, 19s, 24s);
break;
default:
break;
}
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
}
if (!frenzy40)
{
if (HealthBelowPct(40))
{
DoCast(me, SPELL_FRENZY);
events.CancelEvent(EVENT_SUMMON_SPECTRAL_ASSASSIN);
frenzy40 = true;
}
}
if (!frenzy15)
{
if (HealthBelowPct(15))
{
DoCast(me, SPELL_FRENZY);
events.ScheduleEvent(EVENT_SHADOW_BOLT_VOLLEY, 7s, 14s);
frenzy15 = true;
}
}
DoMeleeAttackIfReady();
}
private:
bool frenzy40;
bool frenzy15;
};
CreatureAI* GetAI(Creature* creature) const override
{
return GetBlackrockSpireAI<boss_lord_valthalakAI>(creature);
if (!frenzy40)
{
if (HealthBelowPct(40))
{
DoCast(me, SPELL_FRENZY);
events.CancelEvent(EVENT_SUMMON_SPECTRAL_ASSASSIN);
frenzy40 = true;
}
}
if (!frenzy15)
{
if (HealthBelowPct(15))
{
DoCast(me, SPELL_FRENZY);
events.ScheduleEvent(EVENT_SHADOW_BOLT_VOLLEY, 7s, 14s);
frenzy15 = true;
}
}
DoMeleeAttackIfReady();
}
private:
bool frenzy40;
bool frenzy15;
};
void AddSC_boss_lord_valthalak()
{
new boss_lord_valthalak();
RegisterBlackrockSpireCreatureAI(boss_lord_valthalak);
}

View File

@@ -32,77 +32,65 @@ enum Events
EVENT_MOTHERS_MILK = 2,
};
class boss_mother_smolderweb : public CreatureScript
struct boss_mother_smolderweb : public BossAI
{
public:
boss_mother_smolderweb() : CreatureScript("boss_mother_smolderweb") { }
boss_mother_smolderweb(Creature* creature) : BossAI(creature, DATA_MOTHER_SMOLDERWEB) { }
CreatureAI* GetAI(Creature* creature) const override
void Reset() override
{
return GetBlackrockSpireAI<boss_mothersmolderwebAI>(creature);
_Reset();
}
struct boss_mothersmolderwebAI : public BossAI
void JustEngagedWith(Unit* who) override
{
boss_mothersmolderwebAI(Creature* creature) : BossAI(creature, DATA_MOTHER_SMOLDERWEB) { }
BossAI::JustEngagedWith(who);
events.ScheduleEvent(EVENT_CRYSTALIZE, 20s);
events.ScheduleEvent(EVENT_MOTHERS_MILK, 10s);
}
void Reset() override
void JustDied(Unit* /*killer*/) override
{
_JustDied();
}
void DamageTaken(Unit* /*done_by*/, uint32 &damage) override
{
if (me->GetHealth() <= damage)
DoCast(me, SPELL_SUMMON_SPIRE_SPIDERLING, true);
}
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
while (uint32 eventId = events.ExecuteEvent())
{
_Reset();
}
void JustEngagedWith(Unit* who) override
{
BossAI::JustEngagedWith(who);
events.ScheduleEvent(EVENT_CRYSTALIZE, 20s);
events.ScheduleEvent(EVENT_MOTHERS_MILK, 10s);
}
void JustDied(Unit* /*killer*/) override
{
_JustDied();
}
void DamageTaken(Unit* /*done_by*/, uint32 &damage) override
{
if (me->GetHealth() <= damage)
DoCast(me, SPELL_SUMMON_SPIRE_SPIDERLING, true);
}
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
return;
events.Update(diff);
switch (eventId)
{
case EVENT_CRYSTALIZE:
DoCast(me, SPELL_CRYSTALIZE);
events.ScheduleEvent(EVENT_CRYSTALIZE, 15s);
break;
case EVENT_MOTHERS_MILK:
DoCast(me, SPELL_MOTHERSMILK);
events.ScheduleEvent(EVENT_MOTHERS_MILK, 5s, 12500ms);
break;
}
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
while (uint32 eventId = events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_CRYSTALIZE:
DoCast(me, SPELL_CRYSTALIZE);
events.ScheduleEvent(EVENT_CRYSTALIZE, 15s);
break;
case EVENT_MOTHERS_MILK:
DoCast(me, SPELL_MOTHERSMILK);
events.ScheduleEvent(EVENT_MOTHERS_MILK, 5s, 12500ms);
break;
}
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
}
DoMeleeAttackIfReady();
}
};
DoMeleeAttackIfReady();
}
};
void AddSC_boss_mothersmolderweb()
{
new boss_mother_smolderweb();
RegisterBlackrockSpireCreatureAI(boss_mother_smolderweb);
}

View File

@@ -45,103 +45,92 @@ enum Adds
const Position SummonLocation1 = { -39.355f, -513.456f, 88.472f, 4.679f };
const Position SummonLocation2 = { -49.875f, -511.896f, 88.195f, 4.613f };
class boss_overlord_wyrmthalak : public CreatureScript
struct boss_overlord_wyrmthalak : public BossAI
{
public:
boss_overlord_wyrmthalak() : CreatureScript("boss_overlord_wyrmthalak") { }
CreatureAI* GetAI(Creature* creature) const override
boss_overlord_wyrmthalak(Creature* creature) : BossAI(creature, DATA_OVERLORD_WYRMTHALAK)
{
return GetBlackrockSpireAI<boss_overlordwyrmthalakAI>(creature);
Initialize();
}
struct boss_overlordwyrmthalakAI : public BossAI
void Initialize()
{
boss_overlordwyrmthalakAI(Creature* creature) : BossAI(creature, DATA_OVERLORD_WYRMTHALAK)
Summoned = false;
}
bool Summoned;
void Reset() override
{
_Reset();
Initialize();
}
void JustEngagedWith(Unit* who) override
{
BossAI::JustEngagedWith(who);
events.ScheduleEvent(EVENT_BLAST_WAVE, 20s);
events.ScheduleEvent(EVENT_SHOUT, 2s);
events.ScheduleEvent(EVENT_CLEAVE, 6s);
events.ScheduleEvent(EVENT_KNOCK_AWAY, 12s);
}
void JustDied(Unit* /*killer*/) override
{
_JustDied();
}
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
return;
if (!Summoned && HealthBelowPct(51))
{
Initialize();
}
void Initialize()
{
Summoned = false;
}
bool Summoned;
void Reset() override
{
_Reset();
Initialize();
}
void JustEngagedWith(Unit* who) override
{
BossAI::JustEngagedWith(who);
events.ScheduleEvent(EVENT_BLAST_WAVE, 20s);
events.ScheduleEvent(EVENT_SHOUT, 2s);
events.ScheduleEvent(EVENT_CLEAVE, 6s);
events.ScheduleEvent(EVENT_KNOCK_AWAY, 12s);
}
void JustDied(Unit* /*killer*/) override
{
_JustDied();
}
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
return;
if (!Summoned && HealthBelowPct(51))
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100, true))
{
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100, true))
{
if (Creature* warlord = me->SummonCreature(NPC_SPIRESTONE_WARLORD, SummonLocation1, TEMPSUMMON_TIMED_DESPAWN, 5min))
warlord->AI()->AttackStart(target);
if (Creature* berserker = me->SummonCreature(NPC_SMOLDERTHORN_BERSERKER, SummonLocation2, TEMPSUMMON_TIMED_DESPAWN, 5min))
berserker->AI()->AttackStart(target);
Summoned = true;
}
if (Creature* warlord = me->SummonCreature(NPC_SPIRESTONE_WARLORD, SummonLocation1, TEMPSUMMON_TIMED_DESPAWN, 5min))
warlord->AI()->AttackStart(target);
if (Creature* berserker = me->SummonCreature(NPC_SMOLDERTHORN_BERSERKER, SummonLocation2, TEMPSUMMON_TIMED_DESPAWN, 5min))
berserker->AI()->AttackStart(target);
Summoned = true;
}
}
events.Update(diff);
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
while (uint32 eventId = events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_BLAST_WAVE:
DoCastVictim(SPELL_BLASTWAVE);
events.ScheduleEvent(EVENT_BLAST_WAVE, 20s);
break;
case EVENT_SHOUT:
DoCastVictim(SPELL_SHOUT);
events.ScheduleEvent(EVENT_SHOUT, 10s);
break;
case EVENT_CLEAVE:
DoCastVictim(SPELL_CLEAVE);
events.ScheduleEvent(EVENT_CLEAVE, 7s);
break;
case EVENT_KNOCK_AWAY:
DoCastVictim(SPELL_KNOCKAWAY);
events.ScheduleEvent(EVENT_KNOCK_AWAY, 14s);
break;
}
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
while (uint32 eventId = events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_BLAST_WAVE:
DoCastVictim(SPELL_BLASTWAVE);
events.ScheduleEvent(EVENT_BLAST_WAVE, 20s);
break;
case EVENT_SHOUT:
DoCastVictim(SPELL_SHOUT);
events.ScheduleEvent(EVENT_SHOUT, 10s);
break;
case EVENT_CLEAVE:
DoCastVictim(SPELL_CLEAVE);
events.ScheduleEvent(EVENT_CLEAVE, 7s);
break;
case EVENT_KNOCK_AWAY:
DoCastVictim(SPELL_KNOCKAWAY);
events.ScheduleEvent(EVENT_KNOCK_AWAY, 14s);
break;
}
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
}
DoMeleeAttackIfReady();
}
};
DoMeleeAttackIfReady();
}
};
void AddSC_boss_overlordwyrmthalak()
{
new boss_overlord_wyrmthalak();
RegisterBlackrockSpireCreatureAI(boss_overlord_wyrmthalak);
}

View File

@@ -71,220 +71,209 @@ enum Events
EVENT_ENTER_COMBAT = 9
};
class boss_pyroguard_emberseer : public CreatureScript
struct boss_pyroguard_emberseer : public BossAI
{
public:
boss_pyroguard_emberseer() : CreatureScript("boss_pyroguard_emberseer") { }
boss_pyroguard_emberseer(Creature* creature) : BossAI(creature, DATA_PYROGAURD_EMBERSEER) { }
struct boss_pyroguard_emberseerAI : public BossAI
void Reset() override
{
boss_pyroguard_emberseerAI(Creature* creature) : BossAI(creature, DATA_PYROGAURD_EMBERSEER) { }
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
me->SetImmuneToPC(true);
events.Reset();
// Apply auras on spawn and reset
// DoCast(me, SPELL_FIRE_SHIELD_TRIGGER); // Need to find this in old DBC if possible
me->RemoveAura(SPELL_EMBERSEER_FULL_STRENGTH);
me->RemoveAura(SPELL_EMBERSEER_GROWING);
me->RemoveAura(SPELL_EMBERSEER_GROWING_TRIGGER);
events.ScheduleEvent(EVENT_RESPAWN, 5s);
// Hack for missing trigger spell
events.ScheduleEvent(EVENT_FIRE_SHIELD, 3s);
}
void Reset() override
void SetData(uint32 /*type*/, uint32 data) override
{
switch (data)
{
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
me->SetImmuneToPC(true);
events.Reset();
// Apply auras on spawn and reset
// DoCast(me, SPELL_FIRE_SHIELD_TRIGGER); // Need to find this in old DBC if possible
me->RemoveAura(SPELL_EMBERSEER_FULL_STRENGTH);
me->RemoveAura(SPELL_EMBERSEER_GROWING);
me->RemoveAura(SPELL_EMBERSEER_GROWING_TRIGGER);
events.ScheduleEvent(EVENT_RESPAWN, 5s);
// Hack for missing trigger spell
events.ScheduleEvent(EVENT_FIRE_SHIELD, 3s);
case 1:
events.ScheduleEvent(EVENT_PLAYER_CHECK, 5s);
break;
default:
break;
}
}
void SetData(uint32 /*type*/, uint32 data) override
void JustEngagedWith(Unit* /*who*/) override
{
// ### TODO Check combat timing ###
events.ScheduleEvent(EVENT_FIRENOVA, 6s);
events.ScheduleEvent(EVENT_FLAMEBUFFET, 3s);
events.ScheduleEvent(EVENT_PYROBLAST, 14s);
}
void JustDied(Unit* /*killer*/) override
{
// Activate all the runes
UpdateRunes(GO_STATE_READY);
// Complete encounter
instance->SetBossState(DATA_PYROGAURD_EMBERSEER, DONE);
}
void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override
{
if (spellInfo->Id == SPELL_ENCAGE_EMBERSEER)
{
switch (data)
if (!me->GetAuraCount(SPELL_ENCAGED_EMBERSEER))
{
case 1:
events.ScheduleEvent(EVENT_PLAYER_CHECK, 5s);
break;
default:
break;
me->CastSpell(me, SPELL_ENCAGED_EMBERSEER);
Reset();
}
}
void JustEngagedWith(Unit* /*who*/) override
if (spellInfo->Id == SPELL_EMBERSEER_GROWING_TRIGGER)
{
// ### TODO Check combat timing ###
events.ScheduleEvent(EVENT_FIRENOVA, 6s);
events.ScheduleEvent(EVENT_FLAMEBUFFET, 3s);
events.ScheduleEvent(EVENT_PYROBLAST, 14s);
}
if (me->GetAuraCount(SPELL_EMBERSEER_GROWING_TRIGGER) == 10)
Talk(EMOTE_TEN_STACK);
void JustDied(Unit* /*killer*/) override
{
// Activate all the runes
UpdateRunes(GO_STATE_READY);
// Complete encounter
instance->SetBossState(DATA_PYROGAURD_EMBERSEER, DONE);
}
void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override
{
if (spellInfo->Id == SPELL_ENCAGE_EMBERSEER)
if (me->GetAuraCount(SPELL_EMBERSEER_GROWING_TRIGGER) == 20)
{
if (!me->GetAuraCount(SPELL_ENCAGED_EMBERSEER))
{
me->CastSpell(me, SPELL_ENCAGED_EMBERSEER);
Reset();
}
}
if (spellInfo->Id == SPELL_EMBERSEER_GROWING_TRIGGER)
{
if (me->GetAuraCount(SPELL_EMBERSEER_GROWING_TRIGGER) == 10)
Talk(EMOTE_TEN_STACK);
if (me->GetAuraCount(SPELL_EMBERSEER_GROWING_TRIGGER) == 20)
{
me->RemoveAura(SPELL_FREEZE_ANIM);
me->CastSpell(me, SPELL_EMBERSEER_FULL_STRENGTH);
Talk(EMOTE_FREE_OF_BONDS);
Talk(YELL_FREE_OF_BONDS);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
me->SetImmuneToPC(false);
events.ScheduleEvent(EVENT_ENTER_COMBAT, 2s);
}
me->RemoveAura(SPELL_FREEZE_ANIM);
me->CastSpell(me, SPELL_EMBERSEER_FULL_STRENGTH);
Talk(EMOTE_FREE_OF_BONDS);
Talk(YELL_FREE_OF_BONDS);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
me->SetImmuneToPC(false);
events.ScheduleEvent(EVENT_ENTER_COMBAT, 2s);
}
}
}
void UpdateRunes(GOState state)
void UpdateRunes(GOState state)
{
// update all runes
if (GameObject* rune1 = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(GO_EMBERSEER_RUNE_1)))
rune1->SetGoState(state);
if (GameObject* rune2 = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(GO_EMBERSEER_RUNE_2)))
rune2->SetGoState(state);
if (GameObject* rune3 = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(GO_EMBERSEER_RUNE_3)))
rune3->SetGoState(state);
if (GameObject* rune4 = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(GO_EMBERSEER_RUNE_4)))
rune4->SetGoState(state);
if (GameObject* rune5 = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(GO_EMBERSEER_RUNE_5)))
rune5->SetGoState(state);
if (GameObject* rune6 = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(GO_EMBERSEER_RUNE_6)))
rune6->SetGoState(state);
if (GameObject* rune7 = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(GO_EMBERSEER_RUNE_7)))
rune7->SetGoState(state);
}
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
{
// update all runes
if (GameObject* rune1 = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(GO_EMBERSEER_RUNE_1)))
rune1->SetGoState(state);
if (GameObject* rune2 = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(GO_EMBERSEER_RUNE_2)))
rune2->SetGoState(state);
if (GameObject* rune3 = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(GO_EMBERSEER_RUNE_3)))
rune3->SetGoState(state);
if (GameObject* rune4 = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(GO_EMBERSEER_RUNE_4)))
rune4->SetGoState(state);
if (GameObject* rune5 = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(GO_EMBERSEER_RUNE_5)))
rune5->SetGoState(state);
if (GameObject* rune6 = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(GO_EMBERSEER_RUNE_6)))
rune6->SetGoState(state);
if (GameObject* rune7 = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(GO_EMBERSEER_RUNE_7)))
rune7->SetGoState(state);
}
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
{
events.Update(diff);
while (uint32 eventId = events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_RESPAWN:
{
instance->SetData(DATA_BLACKHAND_INCARCERATOR, 1);
instance->SetBossState(DATA_PYROGAURD_EMBERSEER, NOT_STARTED);
break;
}
case EVENT_PRE_FIGHT_1:
{
// Set data on all Blackhand Incarcerators
std::list<Creature*> creatureList;
GetCreatureListWithEntryInGrid(creatureList, me, NPC_BLACKHAND_INCARCERATOR, 35.0f);
for (std::list<Creature*>::iterator itr = creatureList.begin(); itr != creatureList.end(); ++itr)
{
if (Creature* creature = *itr)
{
creature->SetImmuneToAll(false);
creature->InterruptSpell(CURRENT_CHANNELED_SPELL);
DoZoneInCombat(creature);
}
}
me->RemoveAura(SPELL_ENCAGED_EMBERSEER);
events.ScheduleEvent(EVENT_PRE_FIGHT_2, 32s);
break;
}
case EVENT_PRE_FIGHT_2:
me->CastSpell(me, SPELL_FREEZE_ANIM);
me->CastSpell(me, SPELL_EMBERSEER_GROWING);
Talk(EMOTE_ONE_STACK);
break;
case EVENT_FIRE_SHIELD:
// #### Spell isn't doing any damage ??? ####
DoCast(me, SPELL_FIRE_SHIELD);
events.ScheduleEvent(EVENT_FIRE_SHIELD, 3s);
break;
case EVENT_PLAYER_CHECK:
{
// As of Patch 3.0.8 only one person needs to channel the altar
bool _hasAura = false;
Map::PlayerList const& players = me->GetMap()->GetPlayers();
for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
if (Player* player = itr->GetSource()->ToPlayer())
if (player->HasAura(SPELL_EMBERSEER_OBJECT_VISUAL))
{
_hasAura = true;
break;
}
if (_hasAura)
{
events.ScheduleEvent(EVENT_PRE_FIGHT_1, 1s);
instance->SetBossState(DATA_PYROGAURD_EMBERSEER, IN_PROGRESS);
}
break;
}
case EVENT_ENTER_COMBAT:
AttackStart(me->SelectNearestPlayer(30.0f));
break;
default:
break;
}
}
return;
}
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
while (uint32 eventId = events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_RESPAWN:
{
instance->SetData(DATA_BLACKHAND_INCARCERATOR, 1);
instance->SetBossState(DATA_PYROGAURD_EMBERSEER, NOT_STARTED);
break;
}
case EVENT_PRE_FIGHT_1:
{
// Set data on all Blackhand Incarcerators
std::list<Creature*> creatureList;
GetCreatureListWithEntryInGrid(creatureList, me, NPC_BLACKHAND_INCARCERATOR, 35.0f);
for (std::list<Creature*>::iterator itr = creatureList.begin(); itr != creatureList.end(); ++itr)
{
if (Creature* creature = *itr)
{
creature->SetImmuneToAll(false);
creature->InterruptSpell(CURRENT_CHANNELED_SPELL);
DoZoneInCombat(creature);
}
}
me->RemoveAura(SPELL_ENCAGED_EMBERSEER);
events.ScheduleEvent(EVENT_PRE_FIGHT_2, 32s);
break;
}
case EVENT_PRE_FIGHT_2:
me->CastSpell(me, SPELL_FREEZE_ANIM);
me->CastSpell(me, SPELL_EMBERSEER_GROWING);
Talk(EMOTE_ONE_STACK);
break;
case EVENT_FIRE_SHIELD:
// #### Spell isn't doing any damage ??? ####
DoCast(me, SPELL_FIRE_SHIELD);
events.Repeat(Seconds(3));
events.ScheduleEvent(EVENT_FIRE_SHIELD, 3s);
break;
case EVENT_FIRENOVA:
DoCast(me, SPELL_FIRENOVA);
events.Repeat(Seconds(6));
case EVENT_PLAYER_CHECK:
{
// As of Patch 3.0.8 only one person needs to channel the altar
bool _hasAura = false;
Map::PlayerList const& players = me->GetMap()->GetPlayers();
for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
if (Player* player = itr->GetSource()->ToPlayer())
if (player->HasAura(SPELL_EMBERSEER_OBJECT_VISUAL))
{
_hasAura = true;
break;
}
if (_hasAura)
{
events.ScheduleEvent(EVENT_PRE_FIGHT_1, 1s);
instance->SetBossState(DATA_PYROGAURD_EMBERSEER, IN_PROGRESS);
}
break;
case EVENT_FLAMEBUFFET:
DoCast(me, SPELL_FLAMEBUFFET);
events.Repeat(Seconds(14));
break;
case EVENT_PYROBLAST:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100, true))
DoCast(target, SPELL_PYROBLAST);
events.Repeat(Seconds(15));
}
case EVENT_ENTER_COMBAT:
AttackStart(me->SelectNearestPlayer(30.0f));
break;
default:
break;
}
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
}
DoMeleeAttackIfReady();
return;
}
};
CreatureAI* GetAI(Creature* creature) const override
{
return GetBlackrockSpireAI<boss_pyroguard_emberseerAI>(creature);
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
while (uint32 eventId = events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_FIRE_SHIELD:
DoCast(me, SPELL_FIRE_SHIELD);
events.Repeat(Seconds(3));
break;
case EVENT_FIRENOVA:
DoCast(me, SPELL_FIRENOVA);
events.Repeat(Seconds(6));
break;
case EVENT_FLAMEBUFFET:
DoCast(me, SPELL_FLAMEBUFFET);
events.Repeat(Seconds(14));
break;
case EVENT_PYROBLAST:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100, true))
DoCast(target, SPELL_PYROBLAST);
events.Repeat(Seconds(15));
break;
default:
break;
}
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
}
DoMeleeAttackIfReady();
}
};
@@ -301,81 +290,70 @@ enum IncarceratorEvents
EVENT_ENCAGE = 3
};
class npc_blackhand_incarcerator : public CreatureScript
struct npc_blackhand_incarcerator : public ScriptedAI
{
public:
npc_blackhand_incarcerator() : CreatureScript("npc_blackhand_incarcerator") { }
npc_blackhand_incarcerator(Creature* creature) : ScriptedAI(creature) { }
struct npc_blackhand_incarceratorAI : public ScriptedAI
void JustAppeared() override
{
npc_blackhand_incarceratorAI(Creature* creature) : ScriptedAI(creature) { }
void JustAppeared() override
{
DoCast(SPELL_ENCAGE_EMBERSEER);
}
void JustEngagedWith(Unit* /*who*/) override
{
// Had to do this because CallForHelp will ignore any npcs without LOS
std::list<Creature*> creatureList;
GetCreatureListWithEntryInGrid(creatureList, me, NPC_BLACKHAND_INCARCERATOR, 60.0f);
for (std::list<Creature*>::iterator itr = creatureList.begin(); itr != creatureList.end(); ++itr)
{
if (Creature* creature = *itr)
DoZoneInCombat(creature); // AI()->AttackStart(me->GetVictim());
}
_events.ScheduleEvent(EVENT_STRIKE, 8s, 16s);
_events.ScheduleEvent(EVENT_ENCAGE, 10s, 20s);
}
void JustReachedHome() override
{
DoCast(SPELL_ENCAGE_EMBERSEER);
me->SetImmuneToAll(true);
}
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
return;
_events.Update(diff);
while (uint32 eventId = _events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_STRIKE:
DoCastVictim(SPELL_STRIKE, true);
_events.Repeat(Seconds(14), Seconds(23));
break;
case EVENT_ENCAGE:
DoCast(SelectTarget(SelectTargetMethod::Random, 0, 100, true), SPELL_ENCAGE, true);
_events.Repeat(Seconds(6), Seconds(12));
break;
default:
break;
}
}
DoMeleeAttackIfReady();
}
private:
EventMap _events;
};
CreatureAI* GetAI(Creature* creature) const override
{
return GetBlackrockSpireAI<npc_blackhand_incarceratorAI>(creature);
DoCast(SPELL_ENCAGE_EMBERSEER);
}
void JustEngagedWith(Unit* /*who*/) override
{
// Had to do this because CallForHelp will ignore any npcs without LOS
std::list<Creature*> creatureList;
GetCreatureListWithEntryInGrid(creatureList, me, NPC_BLACKHAND_INCARCERATOR, 60.0f);
for (std::list<Creature*>::iterator itr = creatureList.begin(); itr != creatureList.end(); ++itr)
{
if (Creature* creature = *itr)
DoZoneInCombat(creature); // AI()->AttackStart(me->GetVictim());
}
_events.ScheduleEvent(EVENT_STRIKE, 8s, 16s);
_events.ScheduleEvent(EVENT_ENCAGE, 10s, 20s);
}
void JustReachedHome() override
{
DoCast(SPELL_ENCAGE_EMBERSEER);
me->SetImmuneToAll(true);
}
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
return;
_events.Update(diff);
while (uint32 eventId = _events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_STRIKE:
DoCastVictim(SPELL_STRIKE, true);
_events.Repeat(Seconds(14), Seconds(23));
break;
case EVENT_ENCAGE:
DoCast(SelectTarget(SelectTargetMethod::Random, 0, 100, true), SPELL_ENCAGE, true);
_events.Repeat(Seconds(6), Seconds(12));
break;
default:
break;
}
}
DoMeleeAttackIfReady();
}
private:
EventMap _events;
};
void AddSC_boss_pyroguard_emberseer()
{
new boss_pyroguard_emberseer();
new npc_blackhand_incarcerator();
RegisterBlackrockSpireCreatureAI(boss_pyroguard_emberseer);
RegisterBlackrockSpireCreatureAI(npc_blackhand_incarcerator);
}

View File

@@ -33,70 +33,59 @@ enum Events
EVENT_STUN_BOMB = 2
};
class quartermaster_zigris : public CreatureScript
struct quartermaster_zigris : public BossAI
{
public:
quartermaster_zigris() : CreatureScript("quartermaster_zigris") { }
quartermaster_zigris(Creature* creature) : BossAI(creature, DATA_QUARTERMASTER_ZIGRIS) { }
struct boss_quatermasterzigrisAI : public BossAI
void Reset() override
{
boss_quatermasterzigrisAI(Creature* creature) : BossAI(creature, DATA_QUARTERMASTER_ZIGRIS) { }
_Reset();
}
void Reset() override
void JustEngagedWith(Unit* who) override
{
BossAI::JustEngagedWith(who);
events.ScheduleEvent(EVENT_SHOOT, 1s);
events.ScheduleEvent(EVENT_STUN_BOMB, 16s);
}
void JustDied(Unit* /*killer*/) override
{
_JustDied();
}
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
while (uint32 eventId = events.ExecuteEvent())
{
_Reset();
}
void JustEngagedWith(Unit* who) override
{
BossAI::JustEngagedWith(who);
events.ScheduleEvent(EVENT_SHOOT, 1s);
events.ScheduleEvent(EVENT_STUN_BOMB, 16s);
}
void JustDied(Unit* /*killer*/) override
{
_JustDied();
}
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
return;
events.Update(diff);
switch (eventId)
{
case EVENT_SHOOT:
DoCastVictim(SPELL_SHOOT);
events.ScheduleEvent(EVENT_SHOOT, 500ms);
break;
case EVENT_STUN_BOMB:
DoCastVictim(SPELL_STUNBOMB);
events.ScheduleEvent(EVENT_STUN_BOMB, 14s);
break;
}
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
while (uint32 eventId = events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_SHOOT:
DoCastVictim(SPELL_SHOOT);
events.ScheduleEvent(EVENT_SHOOT, 500ms);
break;
case EVENT_STUN_BOMB:
DoCastVictim(SPELL_STUNBOMB);
events.ScheduleEvent(EVENT_STUN_BOMB, 14s);
break;
}
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
}
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI(Creature* creature) const override
{
return GetBlackrockSpireAI<boss_quatermasterzigrisAI>(creature);
DoMeleeAttackIfReady();
}
};
void AddSC_boss_quatermasterzigris()
{
new quartermaster_zigris();
RegisterBlackrockSpireCreatureAI(quartermaster_zigris);
}