2121#include " GameObject.h"
2222#include " GameObjectAI.h"
2323#include " InstanceScript.h"
24- #include " ObjectAccessor .h"
24+ #include " MotionMaster .h"
2525#include " ScriptedCreature.h"
2626#include " SpellAuraEffects.h"
2727#include " SpellScript.h"
2828
2929enum BroggokTexts
3030{
31- SAY_AGGRO = 0
31+ SAY_INTRO = 0 ,
32+ SAY_AGGRO = 1
3233};
3334
3435enum BroggokSpells
3536{
36- SPELL_SLIME_SPRAY = 30913 ,
37- SPELL_POISON_CLOUD = 30916 ,
38- SPELL_POISON_BOLT = 30917 ,
39- SPELL_POISON_CLOUD_PASSIVE = 30914 ,
40- SPELL_SUMMON_INCOMBAT_TRIGGER = 26837 ,
37+ SPELL_SLIME_SPRAY = 30913 ,
38+ SPELL_POISON_BOLT = 30917 ,
39+ SPELL_POISON_CLOUD = 30916 ,
40+
41+ SPELL_SUMMON_INCOMBAT_TRIGGER = 26837 ,
42+ SPELL_DESPAWN_INCOMBAT_TRIGGER = 26838 ,
43+
44+ // Cloud
45+ SPELL_POISON_CLOUD_PASSIVE = 30914 ,
4146
4247 // Prisioners
43- SPELL_STOMP = 31900 ,
44- SPELL_CONCUSSION_BLOW = 22427 ,
45- SPELL_FRENZY = 8269 ,
46- SPELL_CHARGE = 22120
48+ SPELL_STOMP = 31900 ,
49+ SPELL_CONCUSSION_BLOW = 22427 ,
50+ SPELL_FRENZY = 8269 ,
51+ SPELL_CHARGE = 22120
4752};
4853
4954enum BroggokEvents
5055{
51- EVENT_SLIME_SPRAY = 1 ,
56+ EVENT_SLIME_SPRAY = 1 ,
5257 EVENT_POISON_BOLT,
5358 EVENT_POISON_CLOUD,
59+
60+ EVENT_INTRO_1,
61+ EVENT_INTRO_2,
62+
63+ EVENT_ACTIVATE_1,
64+ EVENT_ACTIVATE_2
65+ };
66+
67+ enum BroggokMisc
68+ {
69+ PATH_ROOM = 1381150 ,
70+ NPC_BROGGOK_POISON_CLOUD = 17662 ,
71+ NPC_INCOMBAT_TRIGGER = 16006
5472};
5573
5674// 17380 - Broggok
@@ -67,11 +85,11 @@ struct boss_broggok : public BossAI
6785 void JustEngagedWith (Unit* who) override
6886 {
6987 BossAI::JustEngagedWith (who);
70- Talk (SAY_AGGRO );
88+ DoCastSelf (SPELL_DESPAWN_INCOMBAT_TRIGGER );
7189
72- events.ScheduleEvent (EVENT_SLIME_SPRAY, 10s );
73- events.ScheduleEvent (EVENT_POISON_BOLT, 7s );
74- events.ScheduleEvent (EVENT_POISON_CLOUD, 5s);
90+ events.ScheduleEvent (EVENT_SLIME_SPRAY, 8s, 12s );
91+ events.ScheduleEvent (EVENT_POISON_BOLT, 2s, 10s );
92+ events.ScheduleEvent (EVENT_POISON_CLOUD, 5s, 10s );
7593 }
7694
7795 void JustSummoned (Creature* summoned) override
@@ -90,22 +108,29 @@ struct boss_broggok : public BossAI
90108 }
91109 }
92110
111+ void EnterEvadeMode (EvadeReason /* why*/ ) override
112+ {
113+ summons.DespawnEntry (NPC_BROGGOK_POISON_CLOUD);
114+ DoCastSelf (SPELL_DESPAWN_INCOMBAT_TRIGGER, true );
115+ instance->SetBossState (DATA_BROGGOK, NOT_STARTED);
116+ _DespawnAtEvade ();
117+ }
118+
93119 void DoAction (int32 action) override
94120 {
95121 switch (action)
96122 {
97123 case ACTION_PREPARE_BROGGOK:
98- DoCastSelf (SPELL_SUMMON_INCOMBAT_TRIGGER );
124+ events. ScheduleEvent (EVENT_INTRO_1, 0s );
99125 break ;
100126 case ACTION_ACTIVATE_BROGGOK:
101- me->SetReactState (REACT_AGGRESSIVE);
102- me->RemoveUnitFlag (UNIT_FLAG_UNINTERACTIBLE);
103- DoZoneInCombat ();
127+ events.ScheduleEvent (EVENT_ACTIVATE_1, 0s);
104128 break ;
105129 case ACTION_RESET_BROGGOK:
106130 me->SetReactState (REACT_PASSIVE);
107131 me->SetUnitFlag (UNIT_FLAG_UNINTERACTIBLE);
108- summons.DespawnAll ();
132+ summons.DespawnEntry (NPC_BROGGOK_POISON_CLOUD);
133+ DoCastSelf (SPELL_DESPAWN_INCOMBAT_TRIGGER);
109134 instance->SetBossState (DATA_BROGGOK, NOT_STARTED);
110135 if (GameObject * lever = instance->GetGameObject (DATA_BROGGOK_LEVER))
111136 {
@@ -118,24 +143,73 @@ struct boss_broggok : public BossAI
118143 }
119144 }
120145
121- void ExecuteEvent (uint32 eventId ) override
146+ void UpdateAI (uint32 diff ) override
122147 {
123- switch (eventId )
148+ if (! UpdateVictim () )
124149 {
125- case EVENT_SLIME_SPRAY:
126- DoCastVictim (SPELL_SLIME_SPRAY);
127- events.Repeat (4s, 12s);
128- break ;
129- case EVENT_POISON_BOLT:
130- DoCastVictim (SPELL_POISON_BOLT);
131- events.Repeat (4s, 12s);
132- break ;
133- case EVENT_POISON_CLOUD:
134- DoCastSelf (SPELL_POISON_CLOUD);
135- events.Repeat (20s);
136- break ;
137- default :
138- break ;
150+ UpdateOutOfCombatEvents (diff);
151+ return ;
152+ }
153+
154+ events.Update (diff);
155+
156+ if (me->HasUnitState (UNIT_STATE_CASTING))
157+ return ;
158+
159+ while (uint32 eventId = events.ExecuteEvent ())
160+ {
161+ switch (eventId)
162+ {
163+ case EVENT_SLIME_SPRAY:
164+ DoCastSelf (SPELL_SLIME_SPRAY);
165+ events.Repeat (4s, 12s);
166+ break ;
167+ case EVENT_POISON_BOLT:
168+ DoCastSelf (SPELL_POISON_BOLT);
169+ events.Repeat (4s, 12s);
170+ break ;
171+ case EVENT_POISON_CLOUD:
172+ DoCastSelf (SPELL_POISON_CLOUD);
173+ events.Repeat (20s);
174+ break ;
175+ default :
176+ break ;
177+ }
178+
179+ if (me->HasUnitState (UNIT_STATE_CASTING))
180+ return ;
181+ }
182+
183+ DoMeleeAttackIfReady ();
184+ }
185+
186+ void UpdateOutOfCombatEvents (uint32 diff)
187+ {
188+ events.Update (diff);
189+
190+ while (uint32 eventId = events.ExecuteEvent ())
191+ {
192+ switch (eventId)
193+ {
194+ case EVENT_INTRO_1:
195+ DoCastSelf (SPELL_SUMMON_INCOMBAT_TRIGGER);
196+ events.ScheduleEvent (EVENT_INTRO_2, 2s);
197+ break ;
198+ case EVENT_INTRO_2:
199+ Talk (SAY_INTRO);
200+ break ;
201+ case EVENT_ACTIVATE_1:
202+ me->SetReactState (REACT_AGGRESSIVE);
203+ me->RemoveUnitFlag (UNIT_FLAG_UNINTERACTIBLE);
204+ events.ScheduleEvent (EVENT_ACTIVATE_2, 4s);
205+ break ;
206+ case EVENT_ACTIVATE_2:
207+ Talk (SAY_AGGRO);
208+ me->GetMotionMaster ()->MovePath (PATH_ROOM, false );
209+ break ;
210+ default :
211+ break ;
212+ }
139213 }
140214 }
141215};
@@ -154,10 +228,10 @@ struct BroggokPrisionersAI : public ScriptedAI
154228 void Reset () override
155229 {
156230 scheduler.CancelAll ();
157- scheduler.Schedule (1s, 5s, [this ](TaskContext emote )
231+ scheduler.Schedule (1s, 5s, [this ](TaskContext task )
158232 {
159233 me->HandleEmoteCommand (Trinity::Containers::SelectRandomContainerElement (PrisionersEmotes));
160- emote .Repeat (6s, 9s);
234+ task .Repeat (6s, 9s);
161235 });
162236 }
163237
@@ -202,17 +276,18 @@ struct npc_nascent_fel_orc : public BroggokPrisionersAI
202276
203277 void ScheduleEvents () override
204278 {
205- scheduler.Schedule (15s, [this ](TaskContext concussionBlow)
206- {
207- DoCastVictim (SPELL_CONCUSSION_BLOW);
208- concussionBlow.Repeat (8s, 11s);
209- }).Schedule (7s, [this ](TaskContext stomp)
210- {
211- DoCastVictim (SPELL_STOMP);
212- stomp.Repeat (16s, 21s);
213- });
279+ scheduler
280+ .Schedule (15s, [this ](TaskContext task)
281+ {
282+ DoCastVictim (SPELL_CONCUSSION_BLOW);
283+ task.Repeat (8s, 11s);
284+ })
285+ .Schedule (7s, [this ](TaskContext task)
286+ {
287+ DoCastSelf (SPELL_STOMP);
288+ task.Repeat (16s, 21s);
289+ });
214290 }
215-
216291};
217292
218293// 17429 - Fel Orc Neophyte
@@ -222,17 +297,19 @@ struct npc_fel_orc_neophyte : public BroggokPrisionersAI
222297
223298 void ScheduleEvents () override
224299 {
225- scheduler.Schedule (5s, [this ](TaskContext charge)
226- {
227- DoCastVictim (SPELL_CHARGE);
228- charge.Repeat (20s);
229- }).Schedule (1s, [this ](TaskContext frenzy)
230- {
231- DoCastSelf (SPELL_FRENZY);
232- frenzy.Repeat (12s, 13s);
233- });
300+ scheduler
301+ .Schedule (5s, [this ](TaskContext task)
302+ {
303+ if (Unit* target = SelectTarget (SelectTargetMethod::Random, 0 ))
304+ DoCast (target, SPELL_CHARGE);
305+ task.Repeat (20s);
306+ })
307+ .Schedule (1s, [this ](TaskContext task)
308+ {
309+ DoCastSelf (SPELL_FRENZY);
310+ task.Repeat (12s, 13s);
311+ });
234312 }
235-
236313};
237314
238315// 181982 - Cell Door Lever
0 commit comments