mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-17 16:10:49 +01:00
Scripts/Blood Furnace: Update scripts (#31012)
This commit is contained in:
12
sql/updates/world/3.3.5/2025_06_10_04_world.sql
Normal file
12
sql/updates/world/3.3.5/2025_06_10_04_world.sql
Normal file
@@ -0,0 +1,12 @@
|
||||
--
|
||||
DELETE FROM `creature_text` WHERE `CreatureID` IN (17377,17653);
|
||||
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
|
||||
(17377,0,0,"Who dares interrupt--What is this; what have you done? You'll ruin everything!",14,0,100,0,0,10164,15130,0,"kelidan SAY_WAKE"),
|
||||
(17377,1,0,"Closer! Come closer... and burn!",14,0,100,0,0,10165,15132,0,"kelidan SAY_NOVA"),
|
||||
(17377,2,0,"Just as you deserve!",14,0,100,0,0,10169,17670,0,"kelidan SAY_SLAY_1"),
|
||||
(17377,2,1,"Your friends will soon be joining you!",14,0,100,0,0,10170,17671,0,"kelidan SAY_SLAY_2"),
|
||||
(17377,3,0,"Good...luck. You'll need it.",14,0,100,0,0,10171,17672,0,"kelidan SAY_DEATH"),
|
||||
|
||||
(17653,0,0,"You mustn't let him loose!",14,0,100,0,0,10166,17673,0,"Shadowmoon Channeler SAY_AGGRO_1"),
|
||||
(17653,0,1,"Ignorant whelps!",14,0,100,0,0,10167,17674,0,"Shadowmoon Channeler SAY_AGGRO_2"),
|
||||
(17653,0,2,"You fools! He'll kill us all!",14,0,100,0,0,10168,17675,0,"Shadowmoon Channeler SAY_AGGRO_3");
|
||||
@@ -91,5 +91,6 @@ inline AI* GetBloodFurnaceAI(T* obj)
|
||||
}
|
||||
|
||||
#define RegisterBloodFurnaceCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetBloodFurnaceAI)
|
||||
#define RegisterBloodFurnaceGameObjectAI(ai_name) RegisterGameObjectAIWithFactory(ai_name, GetBloodFurnaceAI)
|
||||
|
||||
#endif // BLOOD_FURNACE_H_
|
||||
|
||||
@@ -26,12 +26,12 @@
|
||||
#include "SpellAuraEffects.h"
|
||||
#include "SpellScript.h"
|
||||
|
||||
enum Yells
|
||||
enum BroggokTexts
|
||||
{
|
||||
SAY_AGGRO = 0
|
||||
SAY_AGGRO = 0
|
||||
};
|
||||
|
||||
enum Spells
|
||||
enum BroggokSpells
|
||||
{
|
||||
SPELL_SLIME_SPRAY = 30913,
|
||||
SPELL_POISON_CLOUD = 30916,
|
||||
@@ -46,107 +46,98 @@ enum Spells
|
||||
SPELL_CHARGE = 22120
|
||||
};
|
||||
|
||||
enum Events
|
||||
enum BroggokEvents
|
||||
{
|
||||
EVENT_SLIME_SPRAY = 1,
|
||||
EVENT_SLIME_SPRAY = 1,
|
||||
EVENT_POISON_BOLT,
|
||||
EVENT_POISON_CLOUD,
|
||||
};
|
||||
|
||||
class boss_broggok : public CreatureScript
|
||||
// 17380 - Broggok
|
||||
struct boss_broggok : public BossAI
|
||||
{
|
||||
public:
|
||||
boss_broggok() : CreatureScript("boss_broggok") { }
|
||||
boss_broggok(Creature* creature) : BossAI(creature, DATA_BROGGOK) { }
|
||||
|
||||
struct boss_broggokAI : public BossAI
|
||||
void Reset() override
|
||||
{
|
||||
_Reset();
|
||||
DoAction(ACTION_RESET_BROGGOK);
|
||||
}
|
||||
|
||||
void JustEngagedWith(Unit* who) override
|
||||
{
|
||||
BossAI::JustEngagedWith(who);
|
||||
Talk(SAY_AGGRO);
|
||||
|
||||
events.ScheduleEvent(EVENT_SLIME_SPRAY, 10s);
|
||||
events.ScheduleEvent(EVENT_POISON_BOLT, 7s);
|
||||
events.ScheduleEvent(EVENT_POISON_CLOUD, 5s);
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summoned) override
|
||||
{
|
||||
if (summoned->GetEntry() == NPC_BROGGOK_POISON_CLOUD)
|
||||
{
|
||||
boss_broggokAI(Creature* creature) : BossAI(creature, DATA_BROGGOK) { }
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
_Reset();
|
||||
DoAction(ACTION_RESET_BROGGOK);
|
||||
}
|
||||
|
||||
void JustEngagedWith(Unit* who) override
|
||||
{
|
||||
BossAI::JustEngagedWith(who);
|
||||
Talk(SAY_AGGRO);
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summoned) override
|
||||
{
|
||||
if (summoned->GetEntry() == NPC_BROGGOK_POISON_CLOUD)
|
||||
{
|
||||
summoned->SetReactState(REACT_PASSIVE);
|
||||
summoned->CastSpell(summoned, SPELL_POISON_CLOUD_PASSIVE, true);
|
||||
summons.Summon(summoned);
|
||||
}
|
||||
else if (summoned->GetEntry() == NPC_INCOMBAT_TRIGGER)
|
||||
{
|
||||
summoned->SetReactState(REACT_PASSIVE);
|
||||
DoZoneInCombat(summoned);
|
||||
summons.Summon(summoned);
|
||||
}
|
||||
}
|
||||
|
||||
void ExecuteEvent(uint32 eventId) override
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_SLIME_SPRAY:
|
||||
DoCastVictim(SPELL_SLIME_SPRAY);
|
||||
events.ScheduleEvent(EVENT_SLIME_SPRAY, 4s, 12s);
|
||||
break;
|
||||
case EVENT_POISON_BOLT:
|
||||
DoCastVictim(SPELL_POISON_BOLT);
|
||||
events.ScheduleEvent(EVENT_POISON_BOLT, 4s, 12s);
|
||||
break;
|
||||
case EVENT_POISON_CLOUD:
|
||||
DoCast(me, SPELL_POISON_CLOUD);
|
||||
events.ScheduleEvent(EVENT_POISON_CLOUD, 20s);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void DoAction(int32 action) override
|
||||
{
|
||||
switch (action)
|
||||
{
|
||||
case ACTION_PREPARE_BROGGOK:
|
||||
DoCastSelf(SPELL_SUMMON_INCOMBAT_TRIGGER);
|
||||
break;
|
||||
case ACTION_ACTIVATE_BROGGOK:
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
me->RemoveUnitFlag(UNIT_FLAG_UNINTERACTIBLE);
|
||||
DoZoneInCombat();
|
||||
events.ScheduleEvent(EVENT_SLIME_SPRAY, 10s);
|
||||
events.ScheduleEvent(EVENT_POISON_BOLT, 7s);
|
||||
events.ScheduleEvent(EVENT_POISON_CLOUD, 5s);
|
||||
break;
|
||||
case ACTION_RESET_BROGGOK:
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
me->SetUnitFlag(UNIT_FLAG_UNINTERACTIBLE);
|
||||
summons.DespawnAll();
|
||||
instance->SetBossState(DATA_BROGGOK, NOT_STARTED);
|
||||
if (GameObject * lever = instance->GetGameObject(DATA_BROGGOK_LEVER))
|
||||
{
|
||||
lever->RemoveFlag(GO_FLAG_NOT_SELECTABLE | GO_FLAG_IN_USE);
|
||||
lever->SetGoState(GO_STATE_READY);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
{
|
||||
return GetBloodFurnaceAI<boss_broggokAI>(creature);
|
||||
summoned->SetReactState(REACT_PASSIVE);
|
||||
summoned->CastSpell(summoned, SPELL_POISON_CLOUD_PASSIVE, true);
|
||||
summons.Summon(summoned);
|
||||
}
|
||||
else if (summoned->GetEntry() == NPC_INCOMBAT_TRIGGER)
|
||||
{
|
||||
summoned->SetReactState(REACT_PASSIVE);
|
||||
DoZoneInCombat(summoned);
|
||||
summons.Summon(summoned);
|
||||
}
|
||||
}
|
||||
|
||||
void DoAction(int32 action) override
|
||||
{
|
||||
switch (action)
|
||||
{
|
||||
case ACTION_PREPARE_BROGGOK:
|
||||
DoCastSelf(SPELL_SUMMON_INCOMBAT_TRIGGER);
|
||||
break;
|
||||
case ACTION_ACTIVATE_BROGGOK:
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
me->RemoveUnitFlag(UNIT_FLAG_UNINTERACTIBLE);
|
||||
DoZoneInCombat();
|
||||
break;
|
||||
case ACTION_RESET_BROGGOK:
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
me->SetUnitFlag(UNIT_FLAG_UNINTERACTIBLE);
|
||||
summons.DespawnAll();
|
||||
instance->SetBossState(DATA_BROGGOK, NOT_STARTED);
|
||||
if (GameObject * lever = instance->GetGameObject(DATA_BROGGOK_LEVER))
|
||||
{
|
||||
lever->RemoveFlag(GO_FLAG_NOT_SELECTABLE | GO_FLAG_IN_USE);
|
||||
lever->SetGoState(GO_STATE_READY);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void ExecuteEvent(uint32 eventId) override
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_SLIME_SPRAY:
|
||||
DoCastVictim(SPELL_SLIME_SPRAY);
|
||||
events.Repeat(4s, 12s);
|
||||
break;
|
||||
case EVENT_POISON_BOLT:
|
||||
DoCastVictim(SPELL_POISON_BOLT);
|
||||
events.Repeat(4s, 12s);
|
||||
break;
|
||||
case EVENT_POISON_CLOUD:
|
||||
DoCastSelf(SPELL_POISON_CLOUD);
|
||||
events.Repeat(20s);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
static Emote const PrisionersEmotes[] =
|
||||
@@ -204,6 +195,7 @@ protected:
|
||||
TaskScheduler scheduler;
|
||||
};
|
||||
|
||||
// 17398 - Nascent Fel Orc
|
||||
struct npc_nascent_fel_orc : public BroggokPrisionersAI
|
||||
{
|
||||
npc_nascent_fel_orc(Creature* creature) : BroggokPrisionersAI(creature) { }
|
||||
@@ -223,6 +215,7 @@ struct npc_nascent_fel_orc : public BroggokPrisionersAI
|
||||
|
||||
};
|
||||
|
||||
// 17429 - Fel Orc Neophyte
|
||||
struct npc_fel_orc_neophyte : public BroggokPrisionersAI
|
||||
{
|
||||
npc_fel_orc_neophyte(Creature* creature) : BroggokPrisionersAI(creature) { }
|
||||
@@ -242,82 +235,61 @@ struct npc_fel_orc_neophyte : public BroggokPrisionersAI
|
||||
|
||||
};
|
||||
|
||||
class go_broggok_lever : public GameObjectScript
|
||||
// 181982 - Cell Door Lever
|
||||
struct go_broggok_lever : public GameObjectAI
|
||||
{
|
||||
public:
|
||||
go_broggok_lever() : GameObjectScript("go_broggok_lever") { }
|
||||
go_broggok_lever(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { }
|
||||
|
||||
struct go_broggok_leverAI : public GameObjectAI
|
||||
InstanceScript* instance;
|
||||
|
||||
bool OnGossipHello(Player* /*player*/) override
|
||||
{
|
||||
if (instance->GetBossState(DATA_BROGGOK) != DONE && instance->GetBossState(DATA_BROGGOK) != IN_PROGRESS)
|
||||
{
|
||||
go_broggok_leverAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { }
|
||||
|
||||
InstanceScript* instance;
|
||||
|
||||
bool OnGossipHello(Player* /*player*/) override
|
||||
{
|
||||
if (instance->GetBossState(DATA_BROGGOK) != DONE && instance->GetBossState(DATA_BROGGOK) != IN_PROGRESS)
|
||||
{
|
||||
instance->SetBossState(DATA_BROGGOK, IN_PROGRESS);
|
||||
if (Creature* broggok = instance->GetCreature(DATA_BROGGOK))
|
||||
broggok->AI()->DoAction(ACTION_PREPARE_BROGGOK);
|
||||
}
|
||||
|
||||
me->SetFlag(GO_FLAG_NOT_SELECTABLE | GO_FLAG_IN_USE);
|
||||
me->SetGoState(GO_STATE_ACTIVE);
|
||||
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
GameObjectAI* GetAI(GameObject* go) const override
|
||||
{
|
||||
return GetBloodFurnaceAI<go_broggok_leverAI>(go);
|
||||
instance->SetBossState(DATA_BROGGOK, IN_PROGRESS);
|
||||
if (Creature* broggok = instance->GetCreature(DATA_BROGGOK))
|
||||
broggok->AI()->DoAction(ACTION_PREPARE_BROGGOK);
|
||||
}
|
||||
|
||||
me->SetFlag(GO_FLAG_NOT_SELECTABLE | GO_FLAG_IN_USE);
|
||||
me->SetGoState(GO_STATE_ACTIVE);
|
||||
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
// 30914, 38462 - Poison
|
||||
class spell_broggok_poison_cloud : public SpellScriptLoader
|
||||
class spell_broggok_poison_cloud : public AuraScript
|
||||
{
|
||||
public:
|
||||
spell_broggok_poison_cloud() : SpellScriptLoader("spell_broggok_poison_cloud") { }
|
||||
PrepareAuraScript(spell_broggok_poison_cloud);
|
||||
|
||||
class spell_broggok_poison_cloud_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_broggok_poison_cloud_AuraScript);
|
||||
bool Validate(SpellInfo const* spellInfo) override
|
||||
{
|
||||
return ValidateSpellInfo({ spellInfo->GetEffect(EFFECT_0).TriggerSpell });
|
||||
}
|
||||
|
||||
bool Validate(SpellInfo const* spellInfo) override
|
||||
{
|
||||
return ValidateSpellInfo({ spellInfo->GetEffect(EFFECT_0).TriggerSpell });
|
||||
}
|
||||
void PeriodicTick(AuraEffect const* aurEff)
|
||||
{
|
||||
PreventDefaultAction();
|
||||
if (!aurEff->GetTotalTicks())
|
||||
return;
|
||||
|
||||
void PeriodicTick(AuraEffect const* aurEff)
|
||||
{
|
||||
PreventDefaultAction();
|
||||
if (!aurEff->GetTotalTicks())
|
||||
return;
|
||||
uint32 triggerSpell = aurEff->GetSpellEffectInfo().TriggerSpell;
|
||||
int32 mod = int32(((float(aurEff->GetTickNumber()) / aurEff->GetTotalTicks()) * 0.9f + 0.1f) * 10000 * 2 / 3);
|
||||
GetTarget()->CastSpell(nullptr, triggerSpell, CastSpellExtraArgs(aurEff).AddSpellMod(SPELLVALUE_RADIUS_MOD, mod));
|
||||
}
|
||||
|
||||
uint32 triggerSpell = aurEff->GetSpellEffectInfo().TriggerSpell;
|
||||
int32 mod = int32(((float(aurEff->GetTickNumber()) / aurEff->GetTotalTicks()) * 0.9f + 0.1f) * 10000 * 2 / 3);
|
||||
GetTarget()->CastSpell(nullptr, triggerSpell, CastSpellExtraArgs(aurEff).AddSpellMod(SPELLVALUE_RADIUS_MOD, mod));
|
||||
}
|
||||
|
||||
void Register() override
|
||||
{
|
||||
OnEffectPeriodic += AuraEffectPeriodicFn(spell_broggok_poison_cloud_AuraScript::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const override
|
||||
{
|
||||
return new spell_broggok_poison_cloud_AuraScript();
|
||||
}
|
||||
void Register() override
|
||||
{
|
||||
OnEffectPeriodic += AuraEffectPeriodicFn(spell_broggok_poison_cloud::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_broggok()
|
||||
{
|
||||
new boss_broggok();
|
||||
RegisterBloodFurnaceCreatureAI(boss_broggok);
|
||||
RegisterBloodFurnaceCreatureAI(npc_nascent_fel_orc);
|
||||
RegisterBloodFurnaceCreatureAI(npc_fel_orc_neophyte);
|
||||
new go_broggok_lever();
|
||||
new spell_broggok_poison_cloud();
|
||||
RegisterBloodFurnaceGameObjectAI(go_broggok_lever);
|
||||
RegisterSpellScript(spell_broggok_poison_cloud);
|
||||
}
|
||||
|
||||
@@ -15,6 +15,8 @@
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* Find a more elegant way to handle channelers */
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "blood_furnace.h"
|
||||
#include "ObjectAccessor.h"
|
||||
@@ -22,354 +24,327 @@
|
||||
#include "SpellAuras.h"
|
||||
#include "TemporarySummon.h"
|
||||
|
||||
enum Kelidan
|
||||
enum KelidanTexts
|
||||
{
|
||||
SAY_WAKE = 0,
|
||||
SAY_ADD_AGGRO = 1,
|
||||
SAY_KILL = 2,
|
||||
SAY_NOVA = 3,
|
||||
SAY_DIE = 4,
|
||||
SAY_NOVA = 1,
|
||||
SAY_SLAY = 2,
|
||||
SAY_DEATH = 3,
|
||||
|
||||
SAY_AGGRO = 0
|
||||
};
|
||||
|
||||
enum KelidanSpells
|
||||
{
|
||||
SPELL_CORRUPTION = 30938,
|
||||
SPELL_EVOCATION = 30935,
|
||||
|
||||
SPELL_FIRE_NOVA = 33132,
|
||||
H_SPELL_FIRE_NOVA = 37371,
|
||||
SPELL_FIRE_NOVA_H = 37371,
|
||||
|
||||
SPELL_SHADOW_BOLT_VOLLEY = 28599,
|
||||
H_SPELL_SHADOW_BOLT_VOLLEY = 40070,
|
||||
SPELL_SHADOW_BOLT_VOLLEY_H = 40070,
|
||||
|
||||
SPELL_BURNING_NOVA = 30940,
|
||||
SPELL_VORTEX = 37370,
|
||||
|
||||
ENTRY_KELIDAN = 17377,
|
||||
ENTRY_CHANNELER = 17653,
|
||||
// Shadowmoon Channeler
|
||||
SPELL_SHADOW_BOLT = 12739,
|
||||
SPELL_SHADOW_BOLT_H = 15472,
|
||||
|
||||
ACTION_ACTIVATE_ADDS = 92
|
||||
SPELL_MARK_OF_SHADOW = 30937,
|
||||
SPELL_CHANNELING = 39123
|
||||
};
|
||||
|
||||
const float ShadowmoonChannelers[5][4]=
|
||||
enum KelidanMisc
|
||||
{
|
||||
{302.0f, -87.0f, -24.4f, 0.157f},
|
||||
{321.0f, -63.5f, -24.6f, 4.887f},
|
||||
{346.0f, -74.5f, -24.6f, 3.595f},
|
||||
{344.0f, -103.5f, -24.5f, 2.356f},
|
||||
{316.0f, -109.0f, -24.6f, 1.257f}
|
||||
NPC_KELIDAN = 17377,
|
||||
NPC_CHANNELER = 17653
|
||||
};
|
||||
|
||||
class boss_kelidan_the_breaker : public CreatureScript
|
||||
Position const ShadowmoonChannelers[5] =
|
||||
{
|
||||
public:
|
||||
boss_kelidan_the_breaker() : CreatureScript("boss_kelidan_the_breaker") { }
|
||||
{ 301.988f, -86.7465f, -24.4517f, 0.15708f },
|
||||
{ 320.750f, -63.6121f, -24.6361f, 4.88692f },
|
||||
{ 345.848f, -74.4559f, -24.6402f, 3.59538f },
|
||||
{ 343.584f, -103.631f, -24.5688f, 2.35619f },
|
||||
{ 316.274f, -108.877f, -24.6027f, 1.25664f }
|
||||
};
|
||||
|
||||
struct boss_kelidan_the_breakerAI : public BossAI
|
||||
// 17377 - Keli'dan the Breaker
|
||||
struct boss_kelidan_the_breaker : public BossAI
|
||||
{
|
||||
boss_kelidan_the_breaker(Creature* creature) : BossAI(creature, DATA_KELIDAN_THE_BREAKER)
|
||||
{
|
||||
Initialize();
|
||||
Firenova_Timer = 0;
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
ShadowVolley_Timer = 1000;
|
||||
BurningNova_Timer = 15000;
|
||||
Corruption_Timer = 5000;
|
||||
check_Timer = 0;
|
||||
Firenova = false;
|
||||
}
|
||||
|
||||
uint32 ShadowVolley_Timer;
|
||||
uint32 BurningNova_Timer;
|
||||
uint32 Firenova_Timer;
|
||||
uint32 Corruption_Timer;
|
||||
uint32 check_Timer;
|
||||
bool Firenova;
|
||||
ObjectGuid Channelers[5];
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
_Reset();
|
||||
Initialize();
|
||||
SummonChannelers();
|
||||
me->SetImmuneToNPC(true);
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
|
||||
}
|
||||
|
||||
void JustEngagedWith(Unit* who) override
|
||||
{
|
||||
BossAI::JustEngagedWith(who);
|
||||
Talk(SAY_WAKE);
|
||||
if (me->IsNonMeleeSpellCast(false))
|
||||
me->InterruptNonMeleeSpells(true);
|
||||
DoStartMovement(who);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/) override
|
||||
{
|
||||
if (rand32() % 2)
|
||||
return;
|
||||
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
|
||||
void ChannelerEngaged(Unit* who)
|
||||
{
|
||||
for (uint8 i = 0; i<5; ++i)
|
||||
{
|
||||
boss_kelidan_the_breakerAI(Creature* creature) : BossAI(creature, DATA_KELIDAN_THE_BREAKER)
|
||||
{
|
||||
Initialize();
|
||||
Firenova_Timer = 0;
|
||||
}
|
||||
Creature* channeler = ObjectAccessor::GetCreature(*me, Channelers[i]);
|
||||
if (who && channeler && !channeler->IsInCombat())
|
||||
channeler->AI()->AttackStart(who);
|
||||
}
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
void ChannelerDied(Unit* killer)
|
||||
{
|
||||
for (uint8 i = 0; i < 5; ++i)
|
||||
{
|
||||
Creature* channeler = ObjectAccessor::GetCreature(*me, Channelers[i]);
|
||||
if (channeler && channeler->IsAlive())
|
||||
return;
|
||||
}
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
me->SetImmuneToNPC(false);
|
||||
me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
|
||||
if (killer)
|
||||
AttackStart(killer);
|
||||
}
|
||||
|
||||
ObjectGuid GetChanneled(Creature* channeler1)
|
||||
{
|
||||
SummonChannelers();
|
||||
if (!channeler1)
|
||||
return ObjectGuid::Empty;
|
||||
|
||||
uint8 i;
|
||||
for (i = 0; i < 5; ++i)
|
||||
{
|
||||
Creature* channeler = ObjectAccessor::GetCreature(*me, Channelers[i]);
|
||||
if (channeler && channeler->GetGUID() == channeler1->GetGUID())
|
||||
break;
|
||||
}
|
||||
return Channelers[(i + 2) % 5];
|
||||
}
|
||||
|
||||
void SummonChannelers()
|
||||
{
|
||||
for (uint8 i = 0; i < 5; ++i)
|
||||
{
|
||||
Creature* channeler = ObjectAccessor::GetCreature(*me, Channelers[i]);
|
||||
if (!channeler || channeler->isDead())
|
||||
channeler = me->SummonCreature(NPC_CHANNELER, ShadowmoonChannelers[i], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5min);
|
||||
if (channeler)
|
||||
Channelers[i] = channeler->GetGUID();
|
||||
else
|
||||
Channelers[i].Clear();
|
||||
}
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
{
|
||||
_JustDied();
|
||||
Talk(SAY_DEATH);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
{
|
||||
if (check_Timer <= diff)
|
||||
{
|
||||
ShadowVolley_Timer = 1000;
|
||||
BurningNova_Timer = 15000;
|
||||
Corruption_Timer = 5000;
|
||||
check_Timer = 0;
|
||||
if (!me->IsNonMeleeSpellCast(false))
|
||||
DoCast(me, SPELL_EVOCATION);
|
||||
check_Timer = 5000;
|
||||
}
|
||||
else
|
||||
check_Timer -= diff;
|
||||
return;
|
||||
}
|
||||
|
||||
if (Firenova)
|
||||
{
|
||||
if (Firenova_Timer <= diff)
|
||||
{
|
||||
DoCast(me, SPELL_FIRE_NOVA, true);
|
||||
Firenova = false;
|
||||
addYell = false;
|
||||
ShadowVolley_Timer = 2000;
|
||||
}
|
||||
else
|
||||
Firenova_Timer -=diff;
|
||||
|
||||
uint32 ShadowVolley_Timer;
|
||||
uint32 BurningNova_Timer;
|
||||
uint32 Firenova_Timer;
|
||||
uint32 Corruption_Timer;
|
||||
uint32 check_Timer;
|
||||
bool Firenova;
|
||||
bool addYell;
|
||||
ObjectGuid Channelers[5];
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
_Reset();
|
||||
Initialize();
|
||||
SummonChannelers();
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
|
||||
me->SetImmuneToAll(true);
|
||||
}
|
||||
|
||||
void JustEngagedWith(Unit* who) override
|
||||
{
|
||||
BossAI::JustEngagedWith(who);
|
||||
Talk(SAY_WAKE);
|
||||
if (me->IsNonMeleeSpellCast(false))
|
||||
me->InterruptNonMeleeSpells(true);
|
||||
DoStartMovement(who);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/) override
|
||||
{
|
||||
if (rand32() % 2)
|
||||
return;
|
||||
|
||||
Talk(SAY_KILL);
|
||||
}
|
||||
|
||||
void ChannelerEngaged(Unit* who)
|
||||
{
|
||||
if (who && !addYell)
|
||||
{
|
||||
addYell = true;
|
||||
Talk(SAY_ADD_AGGRO);
|
||||
}
|
||||
for (uint8 i = 0; i<5; ++i)
|
||||
{
|
||||
Creature* channeler = ObjectAccessor::GetCreature(*me, Channelers[i]);
|
||||
if (who && channeler && !channeler->IsInCombat())
|
||||
channeler->AI()->AttackStart(who);
|
||||
}
|
||||
}
|
||||
|
||||
void ChannelerDied(Unit* killer)
|
||||
{
|
||||
for (uint8 i = 0; i < 5; ++i)
|
||||
{
|
||||
Creature* channeler = ObjectAccessor::GetCreature(*me, Channelers[i]);
|
||||
if (channeler && channeler->IsAlive())
|
||||
return;
|
||||
}
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
|
||||
me->SetImmuneToAll(false);
|
||||
if (killer)
|
||||
AttackStart(killer);
|
||||
}
|
||||
|
||||
ObjectGuid GetChanneled(Creature* channeler1)
|
||||
{
|
||||
SummonChannelers();
|
||||
if (!channeler1)
|
||||
return ObjectGuid::Empty;
|
||||
|
||||
uint8 i;
|
||||
for (i = 0; i < 5; ++i)
|
||||
{
|
||||
Creature* channeler = ObjectAccessor::GetCreature(*me, Channelers[i]);
|
||||
if (channeler && channeler->GetGUID() == channeler1->GetGUID())
|
||||
break;
|
||||
}
|
||||
return Channelers[(i + 2) % 5];
|
||||
}
|
||||
|
||||
void SummonChannelers()
|
||||
{
|
||||
for (uint8 i = 0; i < 5; ++i)
|
||||
{
|
||||
Creature* channeler = ObjectAccessor::GetCreature(*me, Channelers[i]);
|
||||
if (!channeler || channeler->isDead())
|
||||
channeler = me->SummonCreature(ENTRY_CHANNELER, ShadowmoonChannelers[i][0], ShadowmoonChannelers[i][1], ShadowmoonChannelers[i][2], ShadowmoonChannelers[i][3], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5min);
|
||||
if (channeler)
|
||||
Channelers[i] = channeler->GetGUID();
|
||||
else
|
||||
Channelers[i].Clear();
|
||||
}
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
{
|
||||
_JustDied();
|
||||
Talk(SAY_DIE);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
{
|
||||
if (check_Timer <= diff)
|
||||
{
|
||||
if (!me->IsNonMeleeSpellCast(false))
|
||||
DoCast(me, SPELL_EVOCATION);
|
||||
check_Timer = 5000;
|
||||
}
|
||||
else
|
||||
check_Timer -= diff;
|
||||
return;
|
||||
}
|
||||
|
||||
if (Firenova)
|
||||
{
|
||||
if (Firenova_Timer <= diff)
|
||||
{
|
||||
DoCast(me, SPELL_FIRE_NOVA, true);
|
||||
Firenova = false;
|
||||
ShadowVolley_Timer = 2000;
|
||||
}
|
||||
else
|
||||
Firenova_Timer -=diff;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (ShadowVolley_Timer <= diff)
|
||||
{
|
||||
DoCast(me, SPELL_SHADOW_BOLT_VOLLEY);
|
||||
ShadowVolley_Timer = 5000 + rand32() % 8000;
|
||||
}
|
||||
else
|
||||
ShadowVolley_Timer -=diff;
|
||||
|
||||
if (Corruption_Timer <= diff)
|
||||
{
|
||||
DoCast(me, SPELL_CORRUPTION);
|
||||
Corruption_Timer = 30000 + rand32() % 20000;
|
||||
}
|
||||
else
|
||||
Corruption_Timer -=diff;
|
||||
|
||||
if (BurningNova_Timer <= diff)
|
||||
{
|
||||
if (me->IsNonMeleeSpellCast(false))
|
||||
me->InterruptNonMeleeSpells(true);
|
||||
|
||||
Talk(SAY_NOVA);
|
||||
|
||||
me->AddAura(SPELL_BURNING_NOVA, me);
|
||||
|
||||
if (IsHeroic())
|
||||
DoTeleportAll(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation());
|
||||
|
||||
BurningNova_Timer = 20000 + rand32() % 8000;
|
||||
Firenova_Timer= 5000;
|
||||
Firenova = true;
|
||||
}
|
||||
else
|
||||
BurningNova_Timer -=diff;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
{
|
||||
return GetBloodFurnaceAI<boss_kelidan_the_breakerAI>(creature);
|
||||
return;
|
||||
}
|
||||
|
||||
if (ShadowVolley_Timer <= diff)
|
||||
{
|
||||
DoCast(me, SPELL_SHADOW_BOLT_VOLLEY);
|
||||
ShadowVolley_Timer = 5000 + rand32() % 8000;
|
||||
}
|
||||
else
|
||||
ShadowVolley_Timer -=diff;
|
||||
|
||||
if (Corruption_Timer <= diff)
|
||||
{
|
||||
DoCast(me, SPELL_CORRUPTION);
|
||||
Corruption_Timer = 30000 + rand32() % 20000;
|
||||
}
|
||||
else
|
||||
Corruption_Timer -=diff;
|
||||
|
||||
if (BurningNova_Timer <= diff)
|
||||
{
|
||||
if (me->IsNonMeleeSpellCast(false))
|
||||
me->InterruptNonMeleeSpells(true);
|
||||
|
||||
Talk(SAY_NOVA);
|
||||
|
||||
me->AddAura(SPELL_BURNING_NOVA, me);
|
||||
|
||||
if (IsHeroic())
|
||||
DoTeleportAll(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation());
|
||||
|
||||
BurningNova_Timer = 20000 + rand32() % 8000;
|
||||
Firenova_Timer= 5000;
|
||||
Firenova = true;
|
||||
}
|
||||
else
|
||||
BurningNova_Timer -=diff;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
/*######
|
||||
## npc_shadowmoon_channeler
|
||||
######*/
|
||||
|
||||
enum Shadowmoon
|
||||
// 17653 - Shadowmoon Channeler
|
||||
struct npc_shadowmoon_channeler : public ScriptedAI
|
||||
{
|
||||
SPELL_SHADOW_BOLT = 12739,
|
||||
H_SPELL_SHADOW_BOLT = 15472,
|
||||
npc_shadowmoon_channeler(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
SPELL_MARK_OF_SHADOW = 30937,
|
||||
SPELL_CHANNELING = 39123
|
||||
};
|
||||
void Initialize()
|
||||
{
|
||||
ShadowBolt_Timer = 1000 + rand32() % 1000;
|
||||
MarkOfShadow_Timer = 5000 + rand32() % 2000;
|
||||
check_Timer = 0;
|
||||
}
|
||||
|
||||
class npc_shadowmoon_channeler : public CreatureScript
|
||||
{
|
||||
public:
|
||||
uint32 ShadowBolt_Timer;
|
||||
uint32 MarkOfShadow_Timer;
|
||||
uint32 check_Timer;
|
||||
|
||||
npc_shadowmoon_channeler() : CreatureScript("npc_shadowmoon_channeler") { }
|
||||
void Reset() override
|
||||
{
|
||||
Initialize();
|
||||
if (me->IsNonMeleeSpellCast(false))
|
||||
me->InterruptNonMeleeSpells(true);
|
||||
}
|
||||
|
||||
struct npc_shadowmoon_channelerAI : public ScriptedAI
|
||||
void JustEngagedWith(Unit* who) override
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
|
||||
if (Creature* Kelidan = me->FindNearestCreature(NPC_KELIDAN, 100))
|
||||
ENSURE_AI(boss_kelidan_the_breaker, Kelidan->AI())->ChannelerEngaged(who);
|
||||
if (me->IsNonMeleeSpellCast(false))
|
||||
me->InterruptNonMeleeSpells(true);
|
||||
DoStartMovement(who);
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer) override
|
||||
{
|
||||
if (!killer)
|
||||
return;
|
||||
|
||||
if (Creature* Kelidan = me->FindNearestCreature(NPC_KELIDAN, 100))
|
||||
ENSURE_AI(boss_kelidan_the_breaker, Kelidan->AI())->ChannelerDied(killer);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
{
|
||||
npc_shadowmoon_channelerAI(Creature* creature) : ScriptedAI(creature)
|
||||
if (check_Timer <= diff)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
ShadowBolt_Timer = 1000 + rand32() % 1000;
|
||||
MarkOfShadow_Timer = 5000 + rand32() % 2000;
|
||||
check_Timer = 0;
|
||||
}
|
||||
|
||||
uint32 ShadowBolt_Timer;
|
||||
uint32 MarkOfShadow_Timer;
|
||||
uint32 check_Timer;
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
Initialize();
|
||||
if (me->IsNonMeleeSpellCast(false))
|
||||
me->InterruptNonMeleeSpells(true);
|
||||
}
|
||||
|
||||
void JustEngagedWith(Unit* who) override
|
||||
{
|
||||
if (Creature* Kelidan = me->FindNearestCreature(ENTRY_KELIDAN, 100))
|
||||
ENSURE_AI(boss_kelidan_the_breaker::boss_kelidan_the_breakerAI, Kelidan->AI())->ChannelerEngaged(who);
|
||||
if (me->IsNonMeleeSpellCast(false))
|
||||
me->InterruptNonMeleeSpells(true);
|
||||
DoStartMovement(who);
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer) override
|
||||
{
|
||||
if (!killer)
|
||||
return;
|
||||
|
||||
if (Creature* Kelidan = me->FindNearestCreature(ENTRY_KELIDAN, 100))
|
||||
ENSURE_AI(boss_kelidan_the_breaker::boss_kelidan_the_breakerAI, Kelidan->AI())->ChannelerDied(killer);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
if (!me->IsNonMeleeSpellCast(false))
|
||||
{
|
||||
if (check_Timer <= diff)
|
||||
if (Creature* Kelidan = me->FindNearestCreature(NPC_KELIDAN, 100))
|
||||
{
|
||||
if (!me->IsNonMeleeSpellCast(false))
|
||||
{
|
||||
if (Creature* Kelidan = me->FindNearestCreature(ENTRY_KELIDAN, 100))
|
||||
{
|
||||
ObjectGuid channeler = ENSURE_AI(boss_kelidan_the_breaker::boss_kelidan_the_breakerAI, Kelidan->AI())->GetChanneled(me);
|
||||
if (Unit* channeled = ObjectAccessor::GetUnit(*me, channeler))
|
||||
DoCast(channeled, SPELL_CHANNELING);
|
||||
}
|
||||
}
|
||||
check_Timer = 5000;
|
||||
ObjectGuid channeler = ENSURE_AI(boss_kelidan_the_breaker, Kelidan->AI())->GetChanneled(me);
|
||||
if (Unit* channeled = ObjectAccessor::GetUnit(*me, channeler))
|
||||
DoCast(channeled, SPELL_CHANNELING);
|
||||
}
|
||||
else
|
||||
check_Timer -= diff;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (MarkOfShadow_Timer <= diff)
|
||||
{
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
|
||||
DoCast(target, SPELL_MARK_OF_SHADOW);
|
||||
MarkOfShadow_Timer = 15000 + rand32() % 5000;
|
||||
}
|
||||
else
|
||||
MarkOfShadow_Timer -=diff;
|
||||
|
||||
if (ShadowBolt_Timer <= diff)
|
||||
{
|
||||
DoCastVictim(SPELL_SHADOW_BOLT);
|
||||
ShadowBolt_Timer = 5000 + rand32() % 1000;
|
||||
}
|
||||
else
|
||||
ShadowBolt_Timer -=diff;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
check_Timer = 5000;
|
||||
}
|
||||
};
|
||||
else
|
||||
check_Timer -= diff;
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
{
|
||||
return GetBloodFurnaceAI<npc_shadowmoon_channelerAI>(creature);
|
||||
return;
|
||||
}
|
||||
|
||||
if (MarkOfShadow_Timer <= diff)
|
||||
{
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
|
||||
DoCast(target, SPELL_MARK_OF_SHADOW);
|
||||
MarkOfShadow_Timer = 15000 + rand32() % 5000;
|
||||
}
|
||||
else
|
||||
MarkOfShadow_Timer -=diff;
|
||||
|
||||
if (ShadowBolt_Timer <= diff)
|
||||
{
|
||||
DoCastVictim(SPELL_SHADOW_BOLT);
|
||||
ShadowBolt_Timer = 5000 + rand32() % 1000;
|
||||
}
|
||||
else
|
||||
ShadowBolt_Timer -=diff;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_kelidan_the_breaker()
|
||||
{
|
||||
new boss_kelidan_the_breaker();
|
||||
new npc_shadowmoon_channeler();
|
||||
RegisterBloodFurnaceCreatureAI(boss_kelidan_the_breaker);
|
||||
RegisterBloodFurnaceCreatureAI(npc_shadowmoon_channeler);
|
||||
}
|
||||
|
||||
@@ -19,14 +19,14 @@
|
||||
#include "ScriptedCreature.h"
|
||||
#include "blood_furnace.h"
|
||||
|
||||
enum Yells
|
||||
enum MakerTexts
|
||||
{
|
||||
SAY_AGGRO = 0,
|
||||
SAY_KILL = 1,
|
||||
SAY_DIE = 2
|
||||
SAY_SLAY = 1,
|
||||
SAY_DEATH = 2
|
||||
};
|
||||
|
||||
enum Spells
|
||||
enum MakerSpells
|
||||
{
|
||||
SPELL_ACID_SPRAY = 38153,
|
||||
SPELL_EXPLODING_BREAKER = 30925,
|
||||
@@ -34,7 +34,7 @@ enum Spells
|
||||
SPELL_DOMINATION = 25772
|
||||
};
|
||||
|
||||
enum Events
|
||||
enum MakerEvents
|
||||
{
|
||||
EVENT_ACID_SPRAY = 1,
|
||||
EVENT_EXPLODING_BREAKER,
|
||||
@@ -42,73 +42,63 @@ enum Events
|
||||
EVENT_KNOCKDOWN
|
||||
};
|
||||
|
||||
class boss_the_maker : public CreatureScript
|
||||
// 17381 - The Maker
|
||||
struct boss_the_maker : public BossAI
|
||||
{
|
||||
public:
|
||||
boss_the_maker() : CreatureScript("boss_the_maker") { }
|
||||
boss_the_maker(Creature* creature) : BossAI(creature, DATA_THE_MAKER) { }
|
||||
|
||||
struct boss_the_makerAI : public BossAI
|
||||
void JustEngagedWith(Unit* who) override
|
||||
{
|
||||
BossAI::JustEngagedWith(who);
|
||||
Talk(SAY_AGGRO);
|
||||
|
||||
events.ScheduleEvent(EVENT_ACID_SPRAY, 15s);
|
||||
events.ScheduleEvent(EVENT_EXPLODING_BREAKER, 6s);
|
||||
events.ScheduleEvent(EVENT_DOMINATION, 120s);
|
||||
events.ScheduleEvent(EVENT_KNOCKDOWN, 10s);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* who) override
|
||||
{
|
||||
if (who->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
{
|
||||
_JustDied();
|
||||
Talk(SAY_DEATH);
|
||||
}
|
||||
|
||||
void ExecuteEvent(uint32 eventId) override
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
boss_the_makerAI(Creature* creature) : BossAI(creature, DATA_THE_MAKER) { }
|
||||
|
||||
void JustEngagedWith(Unit* who) override
|
||||
{
|
||||
BossAI::JustEngagedWith(who);
|
||||
Talk(SAY_AGGRO);
|
||||
|
||||
events.ScheduleEvent(EVENT_ACID_SPRAY, 15s);
|
||||
events.ScheduleEvent(EVENT_EXPLODING_BREAKER, 6s);
|
||||
events.ScheduleEvent(EVENT_DOMINATION, 120s);
|
||||
events.ScheduleEvent(EVENT_KNOCKDOWN, 10s);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* who) override
|
||||
{
|
||||
if (who->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_KILL);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
{
|
||||
_JustDied();
|
||||
Talk(SAY_DIE);
|
||||
}
|
||||
|
||||
void ExecuteEvent(uint32 eventId) override
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_ACID_SPRAY:
|
||||
DoCastVictim(SPELL_ACID_SPRAY);
|
||||
events.ScheduleEvent(EVENT_ACID_SPRAY, 15s, 23s);
|
||||
break;
|
||||
case EVENT_EXPLODING_BREAKER:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f, true))
|
||||
DoCast(target, SPELL_EXPLODING_BREAKER);
|
||||
events.ScheduleEvent(EVENT_EXPLODING_BREAKER, 4s, 12s);
|
||||
break;
|
||||
case EVENT_DOMINATION:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true))
|
||||
DoCast(target, SPELL_DOMINATION);
|
||||
events.ScheduleEvent(EVENT_DOMINATION, 120s);
|
||||
break;
|
||||
case EVENT_KNOCKDOWN:
|
||||
DoCastVictim(SPELL_KNOCKDOWN);
|
||||
events.ScheduleEvent(EVENT_KNOCKDOWN, 4s, 12s);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
{
|
||||
return GetBloodFurnaceAI<boss_the_makerAI>(creature);
|
||||
case EVENT_ACID_SPRAY:
|
||||
DoCastVictim(SPELL_ACID_SPRAY);
|
||||
events.Repeat(15s, 23s);
|
||||
break;
|
||||
case EVENT_EXPLODING_BREAKER:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f, true))
|
||||
DoCast(target, SPELL_EXPLODING_BREAKER);
|
||||
events.Repeat(4s, 12s);
|
||||
break;
|
||||
case EVENT_DOMINATION:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true))
|
||||
DoCast(target, SPELL_DOMINATION);
|
||||
events.Repeat(120s);
|
||||
break;
|
||||
case EVENT_KNOCKDOWN:
|
||||
DoCastVictim(SPELL_KNOCKDOWN);
|
||||
events.Repeat(4s, 12s);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_the_maker()
|
||||
{
|
||||
new boss_the_maker();
|
||||
RegisterBloodFurnaceCreatureAI(boss_the_maker);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user