TrinityCore
boss_herald_volazj.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 "ahnkahet.h"
19#include "DB2Stores.h"
20#include "InstanceScript.h"
21#include "Map.h"
22#include "ObjectAccessor.h"
23#include "PhasingHandler.h"
24#include "Player.h"
25#include "ScriptedCreature.h"
26#include "ScriptMgr.h"
27#include "SpellScript.h"
28#include "SpellInfo.h"
29#include "TemporarySummon.h"
30
32{
40
48};
49
51{
52 SPELL_INSANITY = 57496, // Dummy
57 SPELL_SHIVER = 57949,
58 SPELL_CLONE_PLAYER = 57507, // cast on player during insanity
64
72
75
76 // Death Knight
79 // Druid
87 // Hunter
90 // Mage
93 // Paladin
98 // Priest
103 // Rogue
106 // Shaman
112 // Warlock
115 // Warrior
122};
123
125{
127};
128
130{
133};
134
135struct boss_volazj : public BossAI
136{
138 {
139 Initialize();
140 }
141
142 void Reset() override
143 {
145
146 Initialize();
147
148 // Visible for all players in insanity
149 for (uint32 i = 173; i <= 177; ++i)
150 PhasingHandler::AddPhase(me, i, false);
151 PhasingHandler::AddPhase(me, 169, true);
152
154
155 // Cleanup
156 me->SetUninteractible(false);
158 }
159
161 {
162 // Used for Insanity handling
164 }
165
166 void ScheduleTasks() override
167 {
168 scheduler.Schedule(8s, [this](TaskContext task)
169 {
171 task.Repeat(20s);
172 })
173 .Schedule(5s, [this](TaskContext task)
174 {
176 task.Repeat();
177 })
178 .Schedule(15s, [this](TaskContext task)
179 {
181 DoCast(target, SPELL_SHIVER);
182 task.Repeat();
183 });
184 }
185
186 // returns the percentage of health after taking the given damage.
188 {
189 if (damage > me->GetHealth())
190 return 0;
191 return 100*(me->GetHealth()-damage)/me->GetMaxHealth();
192 }
193
194 void DamageTaken(Unit* /*pAttacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
195 {
196 if (me->IsUninteractible())
197 damage = 0;
198
199 if ((GetHealthPct(0) >= 66 && GetHealthPct(damage) < 66) || (GetHealthPct(0) >= 33 && GetHealthPct(damage) < 33))
200 {
202 DoCast(me, SPELL_INSANITY, false);
203 }
204 }
205
206 void JustSummoned(Creature* summon) override
207 {
209 summons.Summon(summon);
210 }
211
212 void SpellHitTarget(WorldObject* target, SpellInfo const* spellInfo) override
213 {
214 if (spellInfo->Id == SPELL_INSANITY)
215 {
216 // Not good target or too many players
217 if (target->GetTypeId() != TYPEID_PLAYER || _insanityHandled > 4)
218 return;
219 // First target - start channel visual and set self as unnattackable
220 if (!_insanityHandled)
221 {
222 // Channel visual
223 DoCast(me, INSANITY_VISUAL, true);
226 // Unattackable
227 me->SetUninteractible(true);
229 }
230 // phase mask
231 target->CastSpell(target, SPELL_INSANITY_TARGET + _insanityHandled, true);
232 // summon twisted party members for this target
233 Map::PlayerList const& players = me->GetMap()->GetPlayers();
234 for (auto i = players.begin(); i != players.end(); ++i)
235 {
236 Player* player = i->GetSource();
237 if (!player || !player->IsAlive())
238 continue;
239 // Summon clone
241 {
242 // clone
243 player->CastSpell(summon, SPELL_CLONE_PLAYER, true);
244 summon->GetAI()->SetData(DATA_TWISTED_VISAGE_PLAYER_CLASS, player->GetClass());
246 summon->SetReactState(REACT_AGGRESSIVE);
247 DoZoneInCombat(summon);
248 // set phase
249 PhasingHandler::AddPhase(summon, 173 + _insanityHandled, true);
250 }
251 }
253 }
254 }
255
257 {
258 Map::PlayerList const& players = me->GetMap()->GetPlayers();
259 for (auto i = players.begin(); i != players.end(); ++i)
260 {
261 Player* player = i->GetSource();
262 for (uint32 index = 0; index <= 4; ++index)
264 }
265 }
266
267 void JustEngagedWith(Unit* who) override
268 {
272
274 }
275
277 {
278 uint32 spell = 0;
279 switch (phase)
280 {
281 case 173:
283 break;
284 case 174:
286 break;
287 case 175:
289 break;
290 case 176:
292 break;
293 case 177:
295 break;
296 }
297 return spell;
298 }
299
300 void SummonedCreatureDespawn(Creature* summon) override
301 {
303
304 uint32 phase = !summon->GetPhaseShift().GetPhases().empty() ? summon->GetPhaseShift().GetPhases().begin()->Id : 0;
305 uint32 nextPhase = 0;
306
307 // Check if all summons in this phase killed
308 for (SummonList::const_iterator iter = summons.begin(); iter != summons.end(); ++iter)
309 {
310 if (Creature* visage = ObjectAccessor::GetCreature(*me, *iter))
311 {
312 // Not all are dead
313 if (visage->InSamePhase(summon))
314 return;
315 else if (!visage->GetPhaseShift().GetPhases().empty())
316 {
317 nextPhase = visage->GetPhaseShift().GetPhases().begin()->Id;
318 break;
319 }
320 }
321 }
322
323 // Roll Insanity
324 uint32 spell = GetSpellForPhaseMask(phase);
325 uint32 spell2 = GetSpellForPhaseMask(nextPhase);
326 Map::PlayerList const& playerList = me->GetMap()->GetPlayers();
327 for (auto itr = playerList.begin(); itr != playerList.end(); ++itr)
328 {
329 if (Player* player = itr->GetSource())
330 {
331 if (player->HasAura(spell))
332 {
333 player->RemoveAurasDueToSpell(spell);
334 if (spell2) // if there is still some different mask cast spell for it
335 player->CastSpell(player, spell2, true);
336 }
337 }
338 }
339 }
340
341 void UpdateAI(uint32 diff) override
342 {
343 if (!UpdateVictim())
344 return;
345
347 {
348 if (!summons.empty())
349 return;
350
352 me->SetUninteractible(false);
355 }
356
357 scheduler.Update(diff);
358 }
359
360 void JustDied(Unit* killer) override
361 {
362 BossAI::JustDied(killer);
364
365 switch (urand(0, 1))
366 {
367 case 0:
370 break;
371 case 1:
374 break;
375 }
376 }
377
378 void KilledUnit(Unit* who) override
379 {
380 if (who->GetTypeId() != TYPEID_PLAYER)
381 return;
382
383 switch (urand(0, 2))
384 {
385 case 0:
388 break;
389 case 1:
392 break;
393 case 2:
396 break;
397 }
398 }
399
400private:
402};
403
405{
407
408 void Reset() override
409 {
411
413 {
415 });
416 }
417
418 void AttackStart(Unit* who) override
419 {
420 ChrSpecializationEntry const* chrSpecialization = sChrSpecializationStore.LookupEntry(_playerSpec);
421 if (chrSpecialization && chrSpecialization->GetFlags().HasFlag(ChrSpecializationFlag::Ranged))
423 else
425 }
426
427 void SetData(uint32 type, uint32 data) override
428 {
430 {
431 if (data > CLASS_NONE && data < MAX_CLASSES)
432 _playerClass = data;
433 }
435 {
436 if (data < 3)
437 _playerSpec = data;
438
439 switch (_playerClass)
440 {
441 case CLASS_WARRIOR:
442 switch (ChrSpecialization(data))
443 {
445 _scheduler.Schedule(3s, [this](TaskContext mortalStrike)
446 {
448 mortalStrike.Repeat(3s, 5s);
449 }).Schedule(5s, [this](TaskContext harmstring)
450 {
452 harmstring.Repeat(5s, 10s);
453 });
454 break;
455 default:
457 _scheduler.Schedule(2s, [this](TaskContext intercept)
458 {
459 if (!me->IsWithinCombatRange(me->GetVictim(), 8.0f))
460 {
462 intercept.Repeat(12s);
463 }
464 else
465 intercept.Repeat(1s);
466 }).Schedule(3s, [this](TaskContext bloodthirst)
467 {
469 bloodthirst.Repeat(3s, 5s);
470 });
471 break;
473 _scheduler.Schedule(5s, [this](TaskContext thunderClap)
474 {
476 thunderClap.Repeat(5s, 10s);
477 }).Schedule(3s, [this](TaskContext devastate)
478 {
480 devastate.Repeat(3s, 5s);
481 });
482 break;
483 }
484 break;
485 case CLASS_PALADIN:
486 switch (ChrSpecialization(data))
487 {
489 _scheduler.Schedule(5s, [this](TaskContext consecration)
490 {
492 consecration.Repeat(5s, 10s);
493 }).Schedule(2s, [this](TaskContext avengersShield)
494 {
496 avengersShield.Repeat(5s, 10s);
497 });
498 break;
499 default:
501 _scheduler.Schedule(5s, [this](TaskContext consecration)
502 {
504 consecration.Repeat(5s, 10s);
505 }).Schedule(2s, [this](TaskContext /*sealCommand*/)
506 {
508 }).Schedule(3s, [this](TaskContext judgementLight)
509 {
511 judgementLight.Repeat(3s, 5s);
512 });
513 break;
514 }
515 break;
516 case CLASS_HUNTER:
517 _scheduler.Schedule(2s, [this](TaskContext shoot)
518 {
520 shoot.Repeat(1s, 4s);
521 }).Schedule(5s, [this](TaskContext disengage)
522 {
523 if (me->IsWithinCombatRange(me->GetVictim(), 4.0f))
524 {
526 disengage.Repeat(10s, 20s);
527 }
528 else
529 disengage.Repeat(1s);
530 });
531 break;
532 case CLASS_ROGUE:
533 me->SetCanDualWield(true);
534 _scheduler.Schedule(5s, [this](TaskContext eviscerate)
535 {
537 eviscerate.Repeat(5s, 10s);
538 }).Schedule(2s, [this](TaskContext sinisterStrike)
539 {
541 sinisterStrike.Repeat(3s, 5s);
542 });
543 break;
544 case CLASS_PRIEST:
545 switch (ChrSpecialization(data))
546 {
548 _scheduler.Schedule(5s, [this](TaskContext shadowWordPain)
549 {
551 shadowWordPain.Repeat(5s, 10s);
552 }).Schedule(2s, [this](TaskContext mindFlay)
553 {
555 mindFlay.Repeat(3s, 5s);
556 });
557 break;
558 default:
559 _scheduler.Schedule(2s, [this](TaskContext renew)
560 {
561 if (Unit* target = DoSelectLowestHpFriendly(40.f))
562 {
564 renew.Repeat(2s, 5s);
565 }
566 else
567 renew.Repeat(1s);
568 }).Schedule(4s, [this](TaskContext greaterHeal)
569 {
570 if (Unit* target = DoSelectLowestHpFriendly(40.f))
571 {
573 greaterHeal.Repeat(4s, 6s);
574 }
575 else
576 greaterHeal.Repeat(1s);
577 });
578 break;
579 }
580 break;
582 _scheduler.Schedule(5s, [this](TaskContext deathGrip)
583 {
584 if (!me->IsWithinCombatRange(me->GetVictim(), 3.0f))
585 {
587 deathGrip.Repeat(12s);
588 }
589 else
590 deathGrip.Repeat(1s);
591 }).Schedule(2s, [this](TaskContext plagueStrike)
592 {
594 plagueStrike.Repeat(3s, 5s);
595 });
596 break;
597 case CLASS_SHAMAN:
598 switch (ChrSpecialization(data))
599 {
600 default:
602 _scheduler.Schedule(5s, [this](TaskContext thunderstorm)
603 {
605 thunderstorm.Repeat(5s, 10s);
606 }).Schedule(2s, [this](TaskContext lightningBolt)
607 {
609 lightningBolt.Repeat(3s, 5s);
610 });
611 break;
613 _scheduler.Schedule(2s, [this](TaskContext earthShock)
614 {
616 earthShock.Repeat(3s, 5s);
617 });
618 break;
620 _scheduler.Schedule(2s, [this](TaskContext earthShield)
621 {
622 if (Unit* target = DoSelectLowestHpFriendly(40.f))
623 {
625 earthShield.Repeat(4s, 6s);
626 }
627 else
628 earthShield.Repeat(1s);
629 }).Schedule(4s, [this](TaskContext healingWave)
630 {
631 if (Unit* target = DoSelectLowestHpFriendly(40.f))
632 {
634 healingWave.Repeat(4s, 6s);
635 }
636 else
637 healingWave.Repeat(1s);
638 });
639 break;
640 }
641 break;
642 case CLASS_MAGE:
643 _scheduler.Schedule(5s, [this](TaskContext frostNova)
644 {
646 frostNova.Repeat(5s, 10s);
647 }).Schedule(2s, [this](TaskContext fireball)
648 {
650 fireball.Repeat(3s, 5s);
651 });
652 break;
653 case CLASS_WARLOCK:
654 _scheduler.Schedule(2s, [this](TaskContext corruption)
655 {
657 corruption.Repeat(6s, 10s);
658 }).Schedule(3s, [this](TaskContext shadowBolt)
659 {
661 shadowBolt.Repeat(3s, 5s);
662 });
663 break;
664 case CLASS_DRUID:
665 switch (ChrSpecialization(data))
666 {
668 _scheduler.Schedule(2s, [this](TaskContext moonfire)
669 {
671 moonfire.Repeat(3s, 5s);
672 }).Schedule(3s, [this](TaskContext wrath)
673 {
675 wrath.Repeat(3s, 5s);
676 });
677 break;
680 _scheduler.Schedule(1ms, [this](TaskContext /*catForm*/)
681 {
683 }).Schedule(2s, [this](TaskContext mangle)
684 {
686 mangle.Repeat(3s, 5s);
687 }).Schedule(3s, [this](TaskContext rip)
688 {
690 rip.Repeat(3s, 5s);
691 });
692 break;
693 default:
695 _scheduler.Schedule(2s, [this](TaskContext lifebloom)
696 {
697 if (Unit* target = DoSelectLowestHpFriendly(40.f))
698 {
700 lifebloom.Repeat(4s, 6s);
701 }
702 else
703 lifebloom.Repeat(1s);
704 }).Schedule(4s, [this](TaskContext nourish)
705 {
706 if (Unit* target = DoSelectLowestHpFriendly(40.f))
707 {
709 nourish.Repeat(4s, 6s);
710 }
711 else
712 nourish.Repeat(1s);
713 });
714 break;
715 }
716 break;
717 default:
718 break;
719 }
720 }
721 }
722
723 void JustDied(Unit* /*killer*/) override
724 {
726 }
727
728 void UpdateAI(uint32 diff) override
729 {
730 if (!UpdateVictim())
731 return;
732
733 _scheduler.Update(diff);
734 }
735
736private:
740};
741
742/* 60291 - Volazj Whisper: Aggro
743 60292 - Volazj Whisper: Insanity
744 60293 - Volazj Whisper: Slay 01
745 60294 - Volazj Whisper: Slay 02
746 60295 - Volazj Whisper: Slay 03
747 60296 - Volazj Whisper: Death 01
748 60297 - Volazj Whisper: Death 02 */
750{
752 {
753 Player* target = GetHitPlayer();
754 Creature* caster = GetCaster()->ToCreature();
755 if (!target || !caster)
756 return;
757
758 uint32 text = 0;
759 switch (GetSpellInfo()->Id)
760 {
761 case SPELL_WHISPER_AGGRO: text = WHISPER_AGGRO; break;
762 case SPELL_WHISPER_INSANITY: text = WHISPER_INSANITY; break;
763 case SPELL_WHISPER_SLAY_1: text = WHISPER_SLAY_1; break;
764 case SPELL_WHISPER_SLAY_2: text = WHISPER_SLAY_2; break;
765 case SPELL_WHISPER_SLAY_3: text = WHISPER_SLAY_3; break;
766 case SPELL_WHISPER_DEATH_1: text = WHISPER_DEATH_1; break;
767 case SPELL_WHISPER_DEATH_2: text = WHISPER_DEATH_2; break;
768 default: return;
769 }
770 caster->AI()->Talk(text, target);
771 }
772
773 void Register() override
774 {
776 }
777};
778
780{
784}
DB2Storage< ChrSpecializationEntry > sChrSpecializationStore("ChrSpecialization.db2", &ChrSpecializationLoadInfo::Instance)
ChrSpecialization
Definition: DBCEnums.h:357
uint32_t uint32
Definition: Define.h:142
@ TEMPSUMMON_CORPSE_DESPAWN
Definition: ObjectDefines.h:67
@ TYPEID_PLAYER
Definition: ObjectGuid.h:41
uint32 urand(uint32 min, uint32 max)
Definition: Random.cpp:42
#define RegisterSpellScript(spell_script)
Definition: ScriptMgr.h:1369
SpellEffIndex
Definition: SharedDefines.h:29
@ EFFECT_0
Definition: SharedDefines.h:30
@ CLASS_HUNTER
@ CLASS_DRUID
@ CLASS_SHAMAN
@ CLASS_PRIEST
@ CLASS_WARRIOR
@ CLASS_WARLOCK
@ CLASS_MAGE
@ CLASS_DEATH_KNIGHT
@ CLASS_PALADIN
@ CLASS_NONE
@ CLASS_ROGUE
@ SPELL_EFFECT_SCRIPT_EFFECT
#define MAX_CLASSES
#define SpellEffectFn(F, I, N)
Definition: SpellScript.h:842
@ REACT_PASSIVE
Definition: UnitDefines.h:506
@ REACT_AGGRESSIVE
Definition: UnitDefines.h:508
DamageEffectType
Definition: UnitDefines.h:131
@ UNIT_STATE_CASTING
Definition: Unit.h:270
@ UNIT_STATE_STUNNED
Definition: Unit.h:258
constexpr std::underlying_type< E >::type AsUnderlyingType(E enumValue)
Definition: Util.h:491
@ DATA_HERALD_VOLAZJ
Definition: ahnkahet.h:35
#define RegisterAhnKahetCreatureAI(ai_name)
Definition: ahnkahet.h:87
@ NPC_TWISTED_VISAGE
Definition: ahnkahet.h:70
void AddSC_boss_volazj()
@ SPELL_TWISTED_VISAGE_EARTH_SHIELD
@ SPELL_INSANITY_PHASING_1
@ SPELL_SHADOW_BOLT_VOLLEY
@ SPELL_TWISTED_VISAGE_NOURISH
@ SPELL_TWISTED_VISAGE_SHOOT
@ SPELL_INSANITY
@ INSANITY_VISUAL
@ SPELL_TWISTED_VISAGE_CAT_FORM
@ SPELL_WHISPER_SLAY_3
@ SPELL_TWISTED_VISAGE_SEAL_OF_COMMAND
@ SPELL_TWISTED_VISAGE_THUNDERSTORM
@ SPELL_TWISTED_VISAGE_HEALING_WEAVE
@ SPELL_WHISPER_SLAY_1
@ SPELL_INSANITY_PHASING_5
@ SPELL_CLONE_PLAYER
@ SPELL_TWISTED_VISAGE_LIGHTNING_BOLT
@ SPELL_TWISTED_VISAGE_CONSECRATION
@ SPELL_TWISTED_VISAGE_SHADOW_WORD_PAIN
@ SPELL_TWISTED_VISAGE_LIFEBLOOM
@ SPELL_TWISTED_VISAGE_WRATH
@ SPELL_TWISTED_VISAGE_RIP
@ SPELL_TWISTED_VISAGE_MANGLE
@ SPELL_TWISTED_VISAGE_SHADOW_BOLT
@ SPELL_TWISTED_VISAGE_MORTAL_STRIKE
@ SPELL_TWISTED_VISAGE_VISUAL
@ SPELL_TWISTED_VISAGE_HAMSTRING
@ SPELL_TWISTED_VISAGE_DEATH
@ SPELL_TWISTED_VISAGE_INTERCEPT
@ SPELL_TWISTED_VISAGE_SINISTER_STRIKE
@ SPELL_TWISTED_VISAGE_DEATH_GRIP
@ SPELL_TWISTED_VISAGE_JUDGEMENT_OF_LIGHT
@ SPELL_WHISPER_INSANITY
@ SPELL_TWISTED_VISAGE_FIREBALL
@ SPELL_WHISPER_AGGRO
@ SPELL_TWISTED_VISAGE_FROST_NOVA
@ SPELL_TWISTED_VISAGE_CORRUPTION
@ SPELL_INSANITY_PHASING_4
@ SPELL_MIND_FLAY
@ SPELL_TWISTED_VISAGE_PLAGUE_STRIKE
@ SPELL_TWISTED_VISAGE_EVISCERATE
@ SPELL_TWISTED_VISAGE_MIND_FLAY
@ SPELL_WHISPER_DEATH_1
@ SPELL_TWISTED_VISAGE_BLOODTHIRST
@ SPELL_TWISTED_VISAGE_MOONFIRE
@ SPELL_INSANITY_TARGET
@ SPELL_WHISPER_SLAY_2
@ SPELL_TWISTED_VISAGE_THUNDER_CLAP
@ SPELL_TWISTED_VISAGE_GREATER_HEAL
@ SPELL_SHIVER
@ SPELL_TWISTED_VISAGE_RENEW
@ SPELL_INSANITY_PHASING_2
@ SPELL_INSANITY_PHASING_3
@ SPELL_TWISTED_VISAGE_DEVASTATE
@ SPELL_WHISPER_DEATH_2
@ SPELL_TWISTED_VISAGE_AVENGER__S_SHIELD
@ SPELL_TWISTED_VISAGE_EARTH_SHOCK
@ SPELL_TWISTED_VISAGE_DISENGAGE
VolazjAchievements
@ ACHIEV_QUICK_DEMISE_START_EVENT
@ DATA_TWISTED_VISAGE_PLAYER_CLASS
@ DATA_TWISTED_VISAGE_PLAYER_SPEC
@ WHISPER_AGGRO
@ WHISPER_SLAY_3
@ SAY_SLAY_2
@ SAY_DEATH_2
@ SAY_INSANITY
@ SAY_AGGRO
@ SAY_SLAY_3
@ WHISPER_INSANITY
@ WHISPER_DEATH_1
@ WHISPER_SLAY_2
@ WHISPER_SLAY_1
@ WHISPER_DEATH_2
@ SAY_SLAY_1
@ SAY_DEATH_1
InstanceScript *const instance
void JustEngagedWith(Unit *who) override
void JustDied(Unit *) override
TaskScheduler scheduler
SummonList summons
void SummonedCreatureDespawn(Creature *summon) override
void Reset() override
void DoZoneInCombat()
Definition: CreatureAI.h:161
void Talk(uint8 id, WorldObject const *whisperTarget=nullptr)
Definition: CreatureAI.cpp:56
bool UpdateVictim()
Definition: CreatureAI.cpp:245
Creature *const me
Definition: CreatureAI.h:61
void SetReactState(ReactStates st)
Definition: Creature.h:160
void SetCanDualWield(bool value) override
Definition: Creature.cpp:1940
CreatureAI * AI() const
Definition: Creature.h:214
void TriggerGameEvent(uint32 gameEventId, WorldObject *source=nullptr, WorldObject *target=nullptr) override
iterator end()
Definition: MapRefManager.h:35
iterator begin()
Definition: MapRefManager.h:34
PlayerList const & GetPlayers() const
Definition: Map.h:367
static Creature * ToCreature(Object *o)
Definition: Object.h:219
TypeID GetTypeId() const
Definition: Object.h:173
PhaseContainer const & GetPhases() const
Definition: PhaseShift.h:101
static void AddPhase(WorldObject *object, uint32 phaseId, bool updateVisibility)
ChrSpecialization GetPrimarySpecialization() const
Definition: Player.h:1841
uint32 const Id
Definition: SpellInfo.h:325
Player * GetHitPlayer() const
Unit * GetCaster() const
HookList< EffectHandler > OnEffectHitTarget
Definition: SpellScript.h:840
SpellInfo const * GetSpellInfo() const
bool empty() const
iterator begin()
StorageType::const_iterator const_iterator
void Summon(Creature const *summon)
iterator end()
TaskContext & Repeat(std::chrono::duration< Rep, Period > duration)
TaskScheduler & Schedule(std::chrono::duration< Rep, Period > time, task_handler_t task)
TaskScheduler & Update(success_t const &callback=nullptr)
TaskScheduler & SetValidator(P &&predicate)
Sets a validator which is asked if tasks are allowed to be executed.
void AttackStartCaster(Unit *victim, float dist)
Definition: UnitAI.cpp:55
SpellCastResult DoCastSelf(uint32 spellId, CastSpellExtraArgs const &args={})
Definition: UnitAI.h:159
SpellCastResult DoCastVictim(uint32 spellId, CastSpellExtraArgs const &args={})
Definition: UnitAI.cpp:180
Unit * SelectTarget(SelectTargetMethod targetType, uint32 offset=0, float dist=0.0f, bool playerOnly=false, bool withTank=true, int32 aura=0)
Definition: UnitAI.cpp:79
SpellCastResult DoCast(uint32 spellId)
Definition: UnitAI.cpp:89
Definition: Unit.h:627
void SetControlled(bool apply, UnitState state)
Definition: Unit.cpp:10911
uint8 GetClass() const
Definition: Unit.h:752
bool IsWithinCombatRange(Unit const *obj, float dist2compare) const
Definition: Unit.cpp:635
void InterruptNonMeleeSpells(bool withDelayed, uint32 spellid=0, bool withInstant=true)
Definition: Unit.cpp:3089
bool IsAlive() const
Definition: Unit.h:1164
void SetUninteractible(bool apply)
Definition: Unit.cpp:8147
uint64 GetMaxHealth() const
Definition: Unit.h:777
uint64 GetHealth() const
Definition: Unit.h:776
Unit * GetVictim() const
Definition: Unit.h:715
bool HasUnitState(const uint32 f) const
Definition: Unit.h:732
bool IsUninteractible() const
Definition: Unit.h:1037
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint32 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:3831
Map * GetMap() const
Definition: Object.h:624
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition: Object.cpp:2896
TempSummon * SummonCreature(uint32 entry, Position const &pos, TempSummonType despawnType=TEMPSUMMON_MANUAL_DESPAWN, Milliseconds despawnTime=0s, uint32 vehId=0, uint32 spellId=0, ObjectGuid privateObjectOwner=ObjectGuid::Empty)
Definition: Object.cpp:2025
PhaseShift & GetPhaseShift()
Definition: Object.h:523
void HandleScriptEffect(SpellEffIndex)
TC_GAME_API Creature * GetCreature(WorldObject const &u, ObjectGuid const &guid)
EnumFlag< ChrSpecializationFlag > GetFlags() const
Definition: DB2Structure.h:872
constexpr float GetPositionX() const
Definition: Position.h:76
constexpr float GetPositionY() const
Definition: Position.h:77
constexpr float GetOrientation() const
Definition: Position.h:79
constexpr float GetPositionZ() const
Definition: Position.h:78
void AttackStart(Unit *) override
== Triggered Actions Requested ==================
Unit * DoSelectLowestHpFriendly(float range, uint32 minHPDiff=1)
void Reset() override
void JustSummoned(Creature *summon) override
void DamageTaken(Unit *, uint32 &damage, DamageEffectType, SpellInfo const *) override
void ScheduleTasks() override
void JustDied(Unit *killer) override
void KilledUnit(Unit *who) override
void JustEngagedWith(Unit *who) override
void SpellHitTarget(WorldObject *target, SpellInfo const *spellInfo) override
void SummonedCreatureDespawn(Creature *summon) override
uint32 GetHealthPct(uint32 damage)
void UpdateAI(uint32 diff) override
uint32 GetSpellForPhaseMask(uint32 phase)
boss_volazj(Creature *creature)
void ResetPlayersPhaseMask()
void JustDied(Unit *) override
npc_twisted_visage(Creature *creature)
void SetData(uint32 type, uint32 data) override
void UpdateAI(uint32 diff) override
void AttackStart(Unit *who) override
== Triggered Actions Requested ==================