TrinityCore
Loading...
Searching...
No Matches
boss_tidesage_council.cpp
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#include "AreaTrigger.h"
19#include "AreaTriggerAI.h"
20#include "Creature.h"
21#include "GridNotifiers.h"
22#include "InstanceScript.h"
23#include "Map.h"
24#include "ObjectAccessor.h"
25#include "ScriptMgr.h"
26#include "ScriptedCreature.h"
27#include "SpellAuraEffects.h"
28#include "SpellScript.h"
29#include "TaskScheduler.h"
30#include "shrine_of_the_storm.h"
31
59
72
91
97
98namespace
99{
100void DespawnTidesageCouncil(InstanceScript* instance, EvadeReason why)
101{
102 if (instance->GetBossState(DATA_TIDESAGE_COUNCIL) == FAIL)
103 return;
104
106
107 for (uint32 bossesData : TidesageData)
108 {
109 if (Creature* council = instance->GetCreature(bossesData))
110 {
112 council->AI()->EnterEvadeMode(why);
113 }
114 }
115}
116
117void TidesageCouncilEncounterDone(InstanceScript* instance)
118{
119 if (instance->GetBossState(DATA_TIDESAGE_COUNCIL) == DONE)
120 return;
121
122 for (uint32 bossesData : TidesageData)
123 {
124 if (Creature* council = instance->GetCreature(bossesData))
125 {
126 if (council->IsAlive())
127 return;
128 }
129 }
130
132}
133}
134
136{
137 TidesageCouncilSharedAI(Creature* creature, uint32 bossId) : BossAI(creature, bossId)
138 {
140 }
141
142 void EnterEvadeMode(EvadeReason why) override
143 {
144 DespawnTidesageCouncil(instance, why);
145
146 Talk(SAY_WIPE);
147
148 events.Reset();
151 }
152
153 void JustEngagedWith(Unit* /*who*/) override
154 {
155 for (uint32 bossesData : TidesageData)
156 {
157 if (Creature* council = instance->GetCreature(bossesData))
158 {
159 if (!council->IsAlive() || council->IsInCombat())
160 continue;
161
162 council->AI()->DoZoneInCombat();
163 }
164 }
165
167
169
171 }
172
173 virtual void ScheduleEvents() = 0;
174
175 void JustDied(Unit* /*killer*/) override
176 {
177 _JustDied();
178
179 Talk(SAY_DEAD);
180
181 TidesageCouncilEncounterDone(instance);
182 }
183
184 void KilledUnit(Unit* victim) override
185 {
186 if (!victim->IsPlayer())
187 return;
188
189 Talk(SAY_SLAY);
190 }
191
192 void UpdateAI(uint32 diff) override
193 {
194 if (!UpdateVictim())
195 return;
196
197 events.Update(diff);
198
200 return;
201
202 while (uint32 eventId = events.ExecuteEvent())
203 {
204 ExecuteEvent(eventId);
206 return;
207 }
208 }
209};
210
211// 134063 - Brother Ironhull <Master of the Hull>
213{
215
222
223 void JustDied(Unit* killer) override
224 {
226
228 faye->AI()->Talk(SAY_BROTHER_DIES);
229 }
230
236
245
246 void ExecuteEvent(uint32 eventId) override
247 {
248 switch (eventId)
249 {
251 {
253 events.Repeat(33s);
254 break;
255 }
257 {
259 events.Repeat(17s);
260 break;
261 }
262 case EVENT_CHECK_MANA:
263 {
264 if (me->GetPowerPct(POWER_MANA) >= 100)
265 {
269 }
270 events.Repeat(500ms);
271 break;
272 }
273 default:
274 break;
275 }
276 }
277};
278
279// 134058 - Galecaller Faye <Master of the Tempest>
281{
283
290
291 void JustDied(Unit* killer) override
292 {
294
296 brother->AI()->Talk(SAY_FAYE_DIES);
297 }
298
304
313
314 void ExecuteEvent(uint32 eventId) override
315 {
316 switch (eventId)
317 {
319 {
322 events.Repeat(20s);
323 break;
324 }
326 {
328 events.Repeat(2500ms);
329 break;
330 }
331 case EVENT_CHECK_MANA:
332 {
333 if (me->GetPowerPct(POWER_MANA) >= 100)
334 {
338 }
339 events.Repeat(500ms);
340 break;
341 }
342 default:
343 break;
344 }
345 }
346};
347
348// 267902 - Swiftness Ward
349// 267903 - Reinforcing Ward
351{
352 bool Validate(SpellInfo const* spellInfo) override
353 {
354 return ValidateSpellInfo({ static_cast<uint32>(spellInfo->GetEffect(EFFECT_0).CalcValueAsInt()) });
355 }
356
364
365 void HandleAfterCast() const
366 {
368 }
369
375};
376
377// 267830 - Blessing of the Tempest
395
396// 267905 - Reinforcing Ward
398{
400
414
420
421 void OnCreate(Spell const* /*creatingSpell*/) override
422 {
423 _scheduler.Schedule(1s, [this](TaskContext& task)
424 {
425 for (ObjectGuid const& guid : at->GetInsideUnits())
426 {
427 Unit* unit = ObjectAccessor::GetUnit(*at, guid);
428 if (!unit)
429 continue;
430
431 if (unit->isDead())
432 continue;
433
434 if (unit->GetEntry() == BOSS_BROTHER_IRONHULL || unit->GetEntry() == BOSS_GALECALLER_FAYE)
436 else
438 }
439 task.Repeat(1s);
440 });
441 }
442
443 void OnUpdate(uint32 diff) override
444 {
445 _scheduler.Update(diff);
446 }
447
448private:
450};
451
452// 267891 - Swiftness Ward
453// Id - 13154
455{
457
458 void OnUnitEnter(Unit* unit) override
459 {
460 if (unit->GetEntry() != BOSS_BROTHER_IRONHULL && unit->GetEntry() != BOSS_GALECALLER_FAYE)
461 return;
462
463 Unit* caster = at->GetCaster();
464 if (!caster)
465 return;
466
468 }
469
470 void OnUnitExit(Unit* unit, AreaTriggerExitReason /*reason*/) override
471 {
473 }
474};
475
476// 267891 - Swiftness Ward
477// Id - 13157
495
496// 267836 - Blowback
498{
500
501 void OnUnitEnter(Unit* unit) override
502 {
503 if (!unit->IsPlayer())
504 return;
505
506 Unit* caster = at->GetCaster();
507 if (!caster)
508 return;
509
511 }
512};
513
AreaTriggerExitReason
Definition AreaTrigger.h:69
uint32_t uint32
Definition Define.h:154
@ FAIL
@ DONE
@ ENCOUNTER_FRAME_DISENGAGE
@ ENCOUNTER_FRAME_ENGAGE
#define RegisterAreaTriggerAI(ai_name)
Definition ScriptMgr.h:1428
#define RegisterSpellScript(spell_script)
Definition ScriptMgr.h:1383
SpellEffIndex
@ EFFECT_0
@ SPELL_EFFECT_DUMMY
@ POWER_MANA
@ TRIGGERED_IGNORE_CAST_IN_PROGRESS
Will not check if a current cast is in progress.
@ TRIGGERED_IGNORE_POWER_COST
Will ignore power and reagent cost.
@ TRIGGERED_DONT_REPORT_CAST_ERROR
Will return SPELL_FAILED_DONT_REPORT in CheckCast functions.
#define AuraProcFn(F)
#define SpellEffectFn(F, I, N)
#define SpellCastFn(F)
EvadeReason
@ UNIT_STATE_CASTING
Definition Unit.h:276
@ SAY_REINFORCING_WARD_WARNING
@ SAY_SWIFTING_WARD_WARNING
@ SAY_BLESSING_OF_THE_TEMPEST
@ SAY_REINFORCING_WARD
@ SAY_SWIFTING_WARD
@ SPELL_GALECALLER_FAYE_GAIN_ENERGY
@ SPELL_HINDERING_CLEAVE
@ SPELL_BLESSING_OF_THE_TEMPEST
@ SPELL_REINFORCING_WARD_SELECTOR
@ SPELL_BLOWBACK_DAMAGE
@ SPELL_BLESSING_OF_IRONSIDES
@ SPELL_REINFORCING_WARD_AREATRIGGER
@ SPELL_COSMETIC_REINFORCING_WARD
@ SPELL_SWIFTNESS_WARD_AREATRIGGER
@ SPELL_SWIFTNESS_WARD_SELECTOR
@ SPELL_BLOWBACK_AREATRIGGER
@ SPELL_SLICING_BLAST
@ SPELL_REINFORCING_WARD_DAMAGE_TAKEN_BOSS
@ SPELL_COSMETIC_SWIFTNESS_WARD
@ SPELL_BLOWBACK_MISSILE
@ SPELL_SWIFTNESS_WARD_HASTE_BOSS
@ SPELL_SWIFTNESS_WARD_HASTE_PLAYER
@ SPELL_REINFORCING_WARD_DISPEL_PLAYER
@ SPELL_BROTHER_IRONHULL_GAIN_ENERGY
@ SPELL_REINFORCING_WARD_DISPEL_BOSS
@ SPELL_REINFORCING_WARD_DAMAGE_TAKEN_PLAYER
uint32 const TidesageData[2]
void AddSC_boss_tidesage_council()
@ EVENT_HINDERING_CLEAVE
@ EVENT_BLESSING_OF_IRONSIDES
@ EVENT_SWIFTNESS_WARD
@ EVENT_SLICING_BLAST
@ EVENT_REINFORCING_WARD
@ EVENT_BLESSING_OF_THE_TEMPEST
AreaTrigger *const at
AreaTriggerAI(AreaTrigger *a, uint32 scriptId={}) noexcept
GuidUnorderedSet const & GetInsideUnits() const
Unit * GetCaster() const
Unit * GetTarget() const
HookList< AuraProcHandler > OnProc
bool IsPlayer() const
Definition BaseEntity.h:173
InstanceScript *const instance
void _DespawnAtEvade(Seconds delayToRespawn=30s, Creature *who=nullptr)
virtual void ExecuteEvent(uint32)
EventMap events
bool _EnterEvadeMode(EvadeReason why=EvadeReason::Other)
bool UpdateVictim()
void SetBoundary(CreatureBoundary const *boundary, bool negativeBoundaries=false)
Creature *const me
Definition CreatureAI.h:63
uint32 ExecuteEvent()
Definition EventMap.cpp:77
void Update(uint32 time)
Definition EventMap.h:61
void Repeat(Milliseconds time)
Definition EventMap.cpp:67
void ScheduleEvent(uint32 eventId, Milliseconds time, uint32 group=0, uint8 phase=0)
Definition EventMap.cpp:40
void Reset()
Definition EventMap.cpp:25
virtual bool SetBossState(uint32 id, EncounterState state)
Creature * GetCreature(uint32 type)
CreatureBoundary const * GetBossBoundary(uint32 id) const
EncounterState GetBossState(uint32 id) const
void SendEncounterUnit(EncounterFrameType type, Unit const *unit, Optional< int32 > param1={}, Optional< int32 > param2={})
uint32 GetEntry() const
Definition Object.h:89
SpellEffectInfo const & GetEffect(SpellEffIndex index) const
Definition SpellInfo.h:588
static bool ValidateSpellInfo(std::initializer_list< uint32 > spellIds)
HookList< CastHandler > AfterCast
Unit * GetCaster() const
int32 GetEffectValueAsInt() const
Unit * GetHitUnit() const
HookList< EffectHandler > OnEffectHitTarget
Spell * GetSpell() const
Definition Spell.h:277
TaskContext & Repeat(TaskScheduler::duration_t duration)
TaskScheduler & Schedule(duration_t time, task_handler_t task)
TaskScheduler & Update()
Update the scheduler to the current time.
SpellCastResult DoCastSelf(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.h:160
SpellCastResult DoCastVictim(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.cpp:180
Definition Unit.h:635
void SetPower(Powers power, int32 val, bool withPowerUpdate=true)
Definition Unit.cpp:10046
int32 GetMaxPower(Powers power) const
Definition Unit.cpp:10037
bool HasUnitState(const uint32 f) const
Definition Unit.h:743
float GetPowerPct(Powers power) const
Definition Unit.h:820
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint32 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:3974
void SetPowerType(Powers power, bool sendUpdate=true, bool onInit=false)
Definition Unit.cpp:5697
bool isDead() const
Definition Unit.h:1187
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition Object.cpp:2217
bool Validate(SpellInfo const *spellInfo) override
TC_GAME_API Unit * GetUnit(WorldObject const &, ObjectGuid const &guid)
#define RegisterShrineOfTheStormCreatureAI(ai_name)
@ DATA_BROTHER_IRONHULL
@ DATA_TIDESAGE_COUNCIL
@ DATA_GALECALLER_FAYE
@ BOSS_GALECALLER_FAYE
@ BOSS_BROTHER_IRONHULL
TriggerCastFlags TriggerFlags
bool IsHeroicOrHigher() const
void JustEngagedWith(Unit *) override
virtual void ScheduleEvents()=0
TidesageCouncilSharedAI(Creature *creature, uint32 bossId)
void EnterEvadeMode(EvadeReason why) override
void KilledUnit(Unit *victim) override
void UpdateAI(uint32 diff) override
void OnUnitEnter(Unit *unit) override
void OnUnitExit(Unit *unit, AreaTriggerExitReason) override
void OnUnitExit(Unit *unit, AreaTriggerExitReason) override
void OnUnitExit(Unit *unit, AreaTriggerExitReason) override
void JustEngagedWith(Unit *who) override
void ExecuteEvent(uint32 eventId) override
void JustDied(Unit *killer) override
boss_brother_ironhull(Creature *creature)
void JustDied(Unit *killer) override
void JustEngagedWith(Unit *who) override
boss_galecaller_faye(Creature *creature)
void ExecuteEvent(uint32 eventId) override