aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKeader <keader.android@gmail.com>2020-01-07 23:09:59 -0300
committerShauren <shauren.trinity@gmail.com>2021-12-20 20:18:55 +0100
commit174f4bad3d9b42e6d56113450f9e9851dda2942e (patch)
tree52f5531f264d44f34a3b654b294c7cb4de43ea05 /src
parent93e446d9d7a32cfb867be81ff807832f83caaa22 (diff)
Scripts/Blood Furnace: Fixed Broggok reset issues and some little improvements
Closes #23658 (cherry picked from commit 1bdc792559fbf4fa713fce40cdcf012e63fdc741)
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/BloodFurnace/blood_furnace.h5
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp134
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp2
3 files changed, 128 insertions, 13 deletions
diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/blood_furnace.h b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/blood_furnace.h
index 217bd48d806..5420e9b9681 100644
--- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/blood_furnace.h
+++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/blood_furnace.h
@@ -52,7 +52,8 @@ enum BFCreatureIds
NPC_KELIDAN_THE_BREAKER = 17377,
NPC_PRISONER1 = 17398,
NPC_PRISONER2 = 17429,
- NPC_BROGGOK_POISON_CLOUD = 17662
+ NPC_BROGGOK_POISON_CLOUD = 17662,
+ NPC_INCOMBAT_TRIGGER = 16006
};
enum BFGameObjectIds
@@ -89,4 +90,6 @@ inline AI* GetBloodFurnaceAI(T* obj)
return GetInstanceAI<AI>(obj, BFScriptName);
}
+#define RegisterBloodFurnaceCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetBloodFurnaceAI)
+
#endif // BLOOD_FURNACE_H_
diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp
index 44a35450b52..1b64f80d312 100644
--- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp
@@ -32,11 +32,17 @@ enum Yells
enum Spells
{
- SPELL_SLIME_SPRAY = 30913,
- SPELL_POISON_CLOUD = 30916,
- SPELL_POISON_BOLT = 30917,
+ SPELL_SLIME_SPRAY = 30913,
+ SPELL_POISON_CLOUD = 30916,
+ SPELL_POISON_BOLT = 30917,
+ SPELL_POISON_CLOUD_PASSIVE = 30914,
+ SPELL_SUMMON_INCOMBAT_TRIGGER = 26837,
- SPELL_POISON_CLOUD_PASSIVE = 30914
+ // Prisioners
+ SPELL_STOMP = 31900,
+ SPELL_CONCUSSION_BLOW = 22427,
+ SPELL_FRENZY = 8269,
+ SPELL_CHARGE = 22120
};
enum Events
@@ -58,13 +64,6 @@ class boss_broggok : public CreatureScript
void Reset() override
{
_Reset();
-
- if (GameObject * lever = instance->GetGameObject(DATA_BROGGOK_LEVER))
- {
- lever->RemoveFlag(GameObjectFlags(GO_FLAG_NOT_SELECTABLE | GO_FLAG_IN_USE));
- lever->SetGoState(GO_STATE_READY);
- }
-
DoAction(ACTION_RESET_BROGGOK);
}
@@ -82,6 +81,12 @@ class boss_broggok : public CreatureScript
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
@@ -110,12 +115,13 @@ class boss_broggok : public CreatureScript
switch (action)
{
case ACTION_PREPARE_BROGGOK:
- DoZoneInCombat();
+ DoCastSelf(SPELL_SUMMON_INCOMBAT_TRIGGER);
break;
case ACTION_ACTIVATE_BROGGOK:
me->SetReactState(REACT_AGGRESSIVE);
me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
me->SetImmuneToAll(false);
+ DoZoneInCombat();
events.ScheduleEvent(EVENT_SLIME_SPRAY, 10s);
events.ScheduleEvent(EVENT_POISON_BOLT, 7s);
events.ScheduleEvent(EVENT_POISON_CLOUD, 5s);
@@ -124,6 +130,15 @@ class boss_broggok : public CreatureScript
me->SetReactState(REACT_PASSIVE);
me->AddUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
me->SetImmuneToAll(true);
+ summons.DespawnAll();
+ instance->SetBossState(DATA_BROGGOK, NOT_STARTED);
+ if (GameObject * lever = instance->GetGameObject(DATA_BROGGOK_LEVER))
+ {
+ lever->RemoveFlag(GameObjectFlags(GO_FLAG_NOT_SELECTABLE | GO_FLAG_IN_USE));
+ lever->SetGoState(GO_STATE_READY);
+ }
+ break;
+ default:
break;
}
}
@@ -135,6 +150,99 @@ class boss_broggok : public CreatureScript
}
};
+static std::vector<uint32> const PrisionersEmotes =
+{
+ EMOTE_ONESHOT_ROAR,
+ EMOTE_ONESHOT_SHOUT,
+ EMOTE_ONESHOT_BATTLE_ROAR
+};
+
+struct BroggokPrisionersAI : public ScriptedAI
+{
+ BroggokPrisionersAI(Creature* creature) : ScriptedAI(creature), instance(creature->GetInstanceScript()) { }
+
+ void Reset() override
+ {
+ scheduler.CancelAll();
+ scheduler.Schedule(1s, 5s, [this](TaskContext emote)
+ {
+ me->HandleEmoteCommand(Trinity::Containers::SelectRandomContainerElement(PrisionersEmotes));
+ emote.Repeat(6s, 9s);
+ });
+ }
+
+ void JustEngagedWith(Unit* /*who*/) override
+ {
+ scheduler.CancelAll();
+ ScheduleEvents();
+ }
+
+ virtual void ScheduleEvents() = 0;
+
+ void EnterEvadeMode(EvadeReason why) override
+ {
+ if (instance->GetBossState(DATA_BROGGOK) == IN_PROGRESS)
+ {
+ if (Creature* broggok = instance->GetCreature(DATA_BROGGOK))
+ broggok->AI()->DoAction(ACTION_RESET_BROGGOK);
+ }
+
+ ScriptedAI::EnterEvadeMode(why);
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ scheduler.Update(diff);
+
+ if (!UpdateVictim())
+ return;
+
+ DoMeleeAttackIfReady();
+ }
+
+protected:
+ InstanceScript* instance;
+ TaskScheduler scheduler;
+};
+
+struct npc_nascent_fel_orc : public BroggokPrisionersAI
+{
+ npc_nascent_fel_orc(Creature* creature) : BroggokPrisionersAI(creature) { }
+
+ void ScheduleEvents() override
+ {
+ scheduler.Schedule(15s, [this](TaskContext concussionBlow)
+ {
+ DoCastVictim(SPELL_CONCUSSION_BLOW);
+ concussionBlow.Repeat(8s, 11s);
+ }).Schedule(7s, [this](TaskContext stomp)
+ {
+ DoCastVictim(SPELL_STOMP);
+ stomp.Repeat(16s, 21s);
+ });
+ }
+
+};
+
+struct npc_fel_orc_neophyte : public BroggokPrisionersAI
+{
+ npc_fel_orc_neophyte(Creature* creature) : BroggokPrisionersAI(creature) { }
+
+ void ScheduleEvents() override
+ {
+ scheduler.Schedule(5s, [this](TaskContext charge)
+ {
+ DoCastVictim(SPELL_CHARGE);
+ charge.Repeat(20s);
+ }).Schedule(1s, [this](TaskContext frenzy)
+ {
+ DoCastSelf(SPELL_FRENZY);
+ frenzy.Repeat(12s, 13s);
+ });
+ }
+
+};
+
class go_broggok_lever : public GameObjectScript
{
public:
@@ -209,6 +317,8 @@ class spell_broggok_poison_cloud : public SpellScriptLoader
void AddSC_boss_broggok()
{
new boss_broggok();
+ RegisterBloodFurnaceCreatureAI(npc_nascent_fel_orc);
+ RegisterBloodFurnaceCreatureAI(npc_fel_orc_neophyte);
new go_broggok_lever();
new spell_broggok_poison_cloud();
}
diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp
index 75e3f9d565a..58e3494f18d 100644
--- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp
@@ -230,6 +230,8 @@ class instance_blood_furnace : public InstanceMapScript
prisoner->Respawn(true);
prisoner->AddUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
prisoner->SetImmuneToAll(true);
+ if (prisoner->IsAIEnabled())
+ prisoner->AI()->EnterEvadeMode();
}
void StorePrisoner(Creature* creature)