Scripts/Blood Furnace: Update scripts (#31012)

This commit is contained in:
offl
2025-06-10 15:48:40 +03:00
committed by GitHub
parent 147d239422
commit b4e749a7fa
5 changed files with 473 additions and 523 deletions

View 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");

View File

@@ -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_

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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);
}