aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/BloodFurnace/blood_furnace.h4
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp195
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp2
3 files changed, 137 insertions, 64 deletions
diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/blood_furnace.h b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/blood_furnace.h
index de6d9e04db6..4edf289f1d0 100644
--- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/blood_furnace.h
+++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/blood_furnace.h
@@ -51,9 +51,7 @@ enum BFCreatureIds
NPC_BROGGOK = 17380,
NPC_KELIDAN_THE_BREAKER = 17377,
NPC_PRISONER1 = 17398,
- NPC_PRISONER2 = 17429,
- NPC_BROGGOK_POISON_CLOUD = 17662,
- NPC_INCOMBAT_TRIGGER = 16006
+ NPC_PRISONER2 = 17429
};
enum BFGameObjectIds
diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp
index 068b70116b7..b8b794d20cc 100644
--- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp
@@ -21,36 +21,54 @@
#include "GameObject.h"
#include "GameObjectAI.h"
#include "InstanceScript.h"
-#include "ObjectAccessor.h"
+#include "MotionMaster.h"
#include "ScriptedCreature.h"
#include "SpellAuraEffects.h"
#include "SpellScript.h"
enum BroggokTexts
{
- SAY_AGGRO = 0
+ SAY_INTRO = 0,
+ SAY_AGGRO = 1
};
enum BroggokSpells
{
- SPELL_SLIME_SPRAY = 30913,
- SPELL_POISON_CLOUD = 30916,
- SPELL_POISON_BOLT = 30917,
- SPELL_POISON_CLOUD_PASSIVE = 30914,
- SPELL_SUMMON_INCOMBAT_TRIGGER = 26837,
+ SPELL_SLIME_SPRAY = 30913,
+ SPELL_POISON_BOLT = 30917,
+ SPELL_POISON_CLOUD = 30916,
+
+ SPELL_SUMMON_INCOMBAT_TRIGGER = 26837,
+ SPELL_DESPAWN_INCOMBAT_TRIGGER = 26838,
+
+ // Cloud
+ SPELL_POISON_CLOUD_PASSIVE = 30914,
// Prisioners
- SPELL_STOMP = 31900,
- SPELL_CONCUSSION_BLOW = 22427,
- SPELL_FRENZY = 8269,
- SPELL_CHARGE = 22120
+ SPELL_STOMP = 31900,
+ SPELL_CONCUSSION_BLOW = 22427,
+ SPELL_FRENZY = 8269,
+ SPELL_CHARGE = 22120
};
enum BroggokEvents
{
- EVENT_SLIME_SPRAY = 1,
+ EVENT_SLIME_SPRAY = 1,
EVENT_POISON_BOLT,
EVENT_POISON_CLOUD,
+
+ EVENT_INTRO_1,
+ EVENT_INTRO_2,
+
+ EVENT_ACTIVATE_1,
+ EVENT_ACTIVATE_2
+};
+
+enum BroggokMisc
+{
+ PATH_ROOM = 1381150,
+ NPC_BROGGOK_POISON_CLOUD = 17662,
+ NPC_INCOMBAT_TRIGGER = 16006
};
// 17380 - Broggok
@@ -67,11 +85,11 @@ struct boss_broggok : public BossAI
void JustEngagedWith(Unit* who) override
{
BossAI::JustEngagedWith(who);
- Talk(SAY_AGGRO);
+ DoCastSelf(SPELL_DESPAWN_INCOMBAT_TRIGGER);
- events.ScheduleEvent(EVENT_SLIME_SPRAY, 10s);
- events.ScheduleEvent(EVENT_POISON_BOLT, 7s);
- events.ScheduleEvent(EVENT_POISON_CLOUD, 5s);
+ events.ScheduleEvent(EVENT_SLIME_SPRAY, 8s, 12s);
+ events.ScheduleEvent(EVENT_POISON_BOLT, 2s, 10s);
+ events.ScheduleEvent(EVENT_POISON_CLOUD, 5s, 10s);
}
void JustSummoned(Creature* summoned) override
@@ -90,22 +108,29 @@ struct boss_broggok : public BossAI
}
}
+ void EnterEvadeMode(EvadeReason /*why*/) override
+ {
+ summons.DespawnEntry(NPC_BROGGOK_POISON_CLOUD);
+ DoCastSelf(SPELL_DESPAWN_INCOMBAT_TRIGGER, true);
+ instance->SetBossState(DATA_BROGGOK, NOT_STARTED);
+ _DespawnAtEvade();
+ }
+
void DoAction(int32 action) override
{
switch (action)
{
case ACTION_PREPARE_BROGGOK:
- DoCastSelf(SPELL_SUMMON_INCOMBAT_TRIGGER);
+ events.ScheduleEvent(EVENT_INTRO_1, 0s);
break;
case ACTION_ACTIVATE_BROGGOK:
- me->SetReactState(REACT_AGGRESSIVE);
- me->RemoveUnitFlag(UNIT_FLAG_UNINTERACTIBLE);
- DoZoneInCombat();
+ events.ScheduleEvent(EVENT_ACTIVATE_1, 0s);
break;
case ACTION_RESET_BROGGOK:
me->SetReactState(REACT_PASSIVE);
me->SetUnitFlag(UNIT_FLAG_UNINTERACTIBLE);
- summons.DespawnAll();
+ summons.DespawnEntry(NPC_BROGGOK_POISON_CLOUD);
+ DoCastSelf(SPELL_DESPAWN_INCOMBAT_TRIGGER);
instance->SetBossState(DATA_BROGGOK, NOT_STARTED);
if (GameObject * lever = instance->GetGameObject(DATA_BROGGOK_LEVER))
{
@@ -118,24 +143,73 @@ struct boss_broggok : public BossAI
}
}
- void ExecuteEvent(uint32 eventId) override
+ void UpdateAI(uint32 diff) override
{
- switch (eventId)
+ if (!UpdateVictim())
{
- 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;
+ UpdateOutOfCombatEvents(diff);
+ return;
+ }
+
+ events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_SLIME_SPRAY:
+ DoCastSelf(SPELL_SLIME_SPRAY);
+ events.Repeat(4s, 12s);
+ break;
+ case EVENT_POISON_BOLT:
+ DoCastSelf(SPELL_POISON_BOLT);
+ events.Repeat(4s, 12s);
+ break;
+ case EVENT_POISON_CLOUD:
+ DoCastSelf(SPELL_POISON_CLOUD);
+ events.Repeat(20s);
+ break;
+ default:
+ break;
+ }
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+ }
+
+ DoMeleeAttackIfReady();
+ }
+
+ void UpdateOutOfCombatEvents(uint32 diff)
+ {
+ events.Update(diff);
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_INTRO_1:
+ DoCastSelf(SPELL_SUMMON_INCOMBAT_TRIGGER);
+ events.ScheduleEvent(EVENT_INTRO_2, 2s);
+ break;
+ case EVENT_INTRO_2:
+ Talk(SAY_INTRO);
+ break;
+ case EVENT_ACTIVATE_1:
+ me->SetReactState(REACT_AGGRESSIVE);
+ me->RemoveUnitFlag(UNIT_FLAG_UNINTERACTIBLE);
+ events.ScheduleEvent(EVENT_ACTIVATE_2, 4s);
+ break;
+ case EVENT_ACTIVATE_2:
+ Talk(SAY_AGGRO);
+ me->GetMotionMaster()->MovePath(PATH_ROOM, false);
+ break;
+ default:
+ break;
+ }
}
}
};
@@ -154,10 +228,10 @@ struct BroggokPrisionersAI : public ScriptedAI
void Reset() override
{
scheduler.CancelAll();
- scheduler.Schedule(1s, 5s, [this](TaskContext emote)
+ scheduler.Schedule(1s, 5s, [this](TaskContext task)
{
me->HandleEmoteCommand(Trinity::Containers::SelectRandomContainerElement(PrisionersEmotes));
- emote.Repeat(6s, 9s);
+ task.Repeat(6s, 9s);
});
}
@@ -202,17 +276,18 @@ struct npc_nascent_fel_orc : public BroggokPrisionersAI
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);
- });
+ scheduler
+ .Schedule(15s, [this](TaskContext task)
+ {
+ DoCastVictim(SPELL_CONCUSSION_BLOW);
+ task.Repeat(8s, 11s);
+ })
+ .Schedule(7s, [this](TaskContext task)
+ {
+ DoCastSelf(SPELL_STOMP);
+ task.Repeat(16s, 21s);
+ });
}
-
};
// 17429 - Fel Orc Neophyte
@@ -222,17 +297,19 @@ struct npc_fel_orc_neophyte : public BroggokPrisionersAI
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);
- });
+ scheduler
+ .Schedule(5s, [this](TaskContext task)
+ {
+ if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
+ DoCast(target, SPELL_CHARGE);
+ task.Repeat(20s);
+ })
+ .Schedule(1s, [this](TaskContext task)
+ {
+ DoCastSelf(SPELL_FRENZY);
+ task.Repeat(12s, 13s);
+ });
}
-
};
// 181982 - Cell Door Lever
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 50d89a71548..6fc6a707eb4 100644
--- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp
@@ -221,7 +221,6 @@ class instance_blood_furnace : public InstanceMapScript
{
if (!prisoner->IsAlive())
prisoner->Respawn(true);
- prisoner->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
prisoner->SetImmuneToAll(true);
if (prisoner->IsAIEnabled())
prisoner->AI()->EnterEvadeMode();
@@ -313,7 +312,6 @@ class instance_blood_furnace : public InstanceMapScript
for (GuidSet::const_iterator i = prisoners.begin(); i != prisoners.end(); ++i)
if (Creature* prisoner = instance->GetCreature(*i))
{
- prisoner->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
prisoner->SetImmuneToAll(false);
prisoner->AI()->DoZoneInCombat();
}