TrinityCore
Loading...
Searching...
No Matches
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 "CommonHelpers.h"
20#include "InstanceScript.h"
21#include "Map.h"
22#include "ObjectAccessor.h"
23#include "Player.h"
24#include "ScriptedCreature.h"
25#include "ScriptMgr.h"
26#include "SpellScript.h"
27#include "SpellInfo.h"
28#include "TemporarySummon.h"
29
48
50{
51 SPELL_INSANITY = 57496, // Dummy
56 SPELL_SHIVER = 57949,
57 SPELL_CLONE_PLAYER = 57507, // cast on player during insanity
63
71
74
75 // Death Knight
78 // Druid
86 // Hunter
89 // Mage
92 // Paladin
97 // Priest
102 // Rogue
105 // Shaman
111 // Warlock
114 // Warrior
121};
122
127
133
134struct boss_volazj : public BossAI
135{
137 {
138 Initialize();
139 }
140
141 void Reset() override
142 {
144
145 Initialize();
146
148
149 // Visible for all players in insanity
150 me->SetPhaseMask((1|16|32|64|128|256), true);
151
153
154 // Cleanup
157 }
158
160 {
161 // Used for Insanity handling
163 }
164
165 void ScheduleTasks() override
166 {
167 scheduler.Schedule(8s, [this](TaskContext task)
168 {
170 task.Repeat(20s);
171 })
172 .Schedule(5s, [this](TaskContext task)
173 {
175 task.Repeat();
176 })
177 .Schedule(15s, [this](TaskContext task)
178 {
180 DoCast(target, SPELL_SHIVER);
181 task.Repeat();
182 });
183 }
184
185 // returns the percentage of health after taking the given damage.
187 {
188 if (damage > me->GetHealth())
189 return 0;
190 return 100*(me->GetHealth()-damage)/me->GetMaxHealth();
191 }
192
193 void DamageTaken(Unit* /*pAttacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
194 {
196 damage = 0;
197
198 if ((GetHealthPct(0) >= 66 && GetHealthPct(damage) < 66) || (GetHealthPct(0) >= 33 && GetHealthPct(damage) < 33))
199 {
201 DoCast(me, SPELL_INSANITY, false);
202 }
203 }
204
205 void JustSummoned(Creature* summon) override
206 {
208 summons.Summon(summon);
209 }
210
211 void SpellHitTarget(WorldObject* target, SpellInfo const* spellInfo) override
212 {
213 if (spellInfo->Id == SPELL_INSANITY)
214 {
215 // Not good target or too many players
216 if (target->GetTypeId() != TYPEID_PLAYER || _insanityHandled > 4)
217 return;
218 // First target - start channel visual and set self as unnattackable
219 if (!_insanityHandled)
220 {
221 // Channel visual
222 DoCast(me, INSANITY_VISUAL, true);
225 // Unattackable
228 }
229 // phase mask
230 target->CastSpell(target, SPELL_INSANITY_TARGET + _insanityHandled, true);
231 // summon twisted party members for this target
232 Map::PlayerList const& players = me->GetMap()->GetPlayers();
233 for (auto i = players.begin(); i != players.end(); ++i)
234 {
235 Player* player = i->GetSource();
236 if (!player || !player->IsAlive())
237 continue;
238 // Summon clone
240 {
241 // clone
242 player->CastSpell(summon, SPELL_CLONE_PLAYER, true);
243 summon->GetAI()->SetData(DATA_TWISTED_VISAGE_PLAYER_CLASS, player->GetClass());
245 summon->SetReactState(REACT_AGGRESSIVE);
246 DoZoneInCombat(summon);
247 // set phase
248 summon->SetPhaseMask((1 << (4 + _insanityHandled)), true);
249 }
250 }
252 }
253 }
254
256 {
257 Map::PlayerList const& players = me->GetMap()->GetPlayers();
258 for (auto i = players.begin(); i != players.end(); ++i)
259 {
260 Player* player = i->GetSource();
262 }
263 }
264
273
275 {
276 uint32 spell = 0;
277 switch (phase)
278 {
279 case 16:
281 break;
282 case 32:
284 break;
285 case 64:
287 break;
288 case 128:
290 break;
291 case 256:
293 break;
294 }
295 return spell;
296 }
297
298 void SummonedCreatureDespawn(Creature* summon) override
299 {
301
302 uint32 phase = summon->GetPhaseMask();
303 uint32 nextPhase = 0;
304
305 // Check if all summons in this phase killed
306 for (SummonList::const_iterator iter = summons.begin(); iter != summons.end(); ++iter)
307 {
308 if (Creature* visage = ObjectAccessor::GetCreature(*me, *iter))
309 {
310 // Not all are dead
311 if (phase == visage->GetPhaseMask())
312 return;
313 else
314 nextPhase = visage->GetPhaseMask();
315 }
316 }
317
318 // Roll Insanity
319 uint32 spell = GetSpellForPhaseMask(phase);
320 uint32 spell2 = GetSpellForPhaseMask(nextPhase);
321 Map::PlayerList const& playerList = me->GetMap()->GetPlayers();
322 for (auto itr = playerList.begin(); itr != playerList.end(); ++itr)
323 {
324 if (Player* player = itr->GetSource())
325 {
326 if (player->HasAura(spell))
327 {
328 player->RemoveAurasDueToSpell(spell);
329 if (spell2) // if there is still some different mask cast spell for it
330 player->CastSpell(player, spell2, true);
331 }
332 }
333 }
334 }
335
336 void UpdateAI(uint32 diff) override
337 {
338 if (!UpdateVictim())
339 return;
340
342 {
343 if (!summons.empty())
344 return;
345
350 }
351
352 scheduler.Update(diff, [this]
353 {
355 });
356 }
357
358 void JustDied(Unit* killer) override
359 {
360 BossAI::JustDied(killer);
362
363 switch (urand(0, 1))
364 {
365 case 0:
368 break;
369 case 1:
372 break;
373 }
374 }
375
376 void KilledUnit(Unit* who) override
377 {
378 if (who->GetTypeId() != TYPEID_PLAYER)
379 return;
380
381 switch (urand(0, 2))
382 {
383 case 0:
386 break;
387 case 1:
390 break;
391 case 2:
394 break;
395 }
396 }
397
398private:
400};
401
403{
405
406 void Reset() override
407 {
409
411 {
413 });
414 }
415
416 void AttackStart(Unit* who) override
417 {
418 switch (_playerClass)
419 {
420 case CLASS_SHAMAN:
421 switch (_playerSpec)
422 {
426 break;
427 default:
429 break;
430 }
431 break;
432 case CLASS_DRUID:
433 switch (_playerSpec)
434 {
438 break;
439 default:
441 break;
442 }
443 break;
444 case CLASS_PRIEST:
445 case CLASS_HUNTER:
446 case CLASS_MAGE:
447 case CLASS_WARLOCK:
449 break;
450 default:
452 break;
453 }
454 }
455
456 void SetData(uint32 type, uint32 data) override
457 {
459 {
460 if (data > CLASS_NONE && data <= CLASS_DRUID)
461 _playerClass = data;
462 }
464 {
465 if (data < 3)
466 _playerSpec = data;
467
468 switch (_playerClass)
469 {
470 case CLASS_WARRIOR:
471 switch (data)
472 {
474 _scheduler.Schedule(3s, [this](TaskContext mortalStrike)
475 {
477 mortalStrike.Repeat(3s, 5s);
478 }).Schedule(5s, [this](TaskContext harmstring)
479 {
481 harmstring.Repeat(5s, 10s);
482 });
483 break;
484 default:
486 _scheduler.Schedule(2s, [this](TaskContext intercept)
487 {
488 if (!me->IsWithinCombatRange(me->GetVictim(), 8.0f))
489 {
491 intercept.Repeat(12s);
492 }
493 else
494 intercept.Repeat(1s);
495 }).Schedule(3s, [this](TaskContext bloodthirst)
496 {
498 bloodthirst.Repeat(3s, 5s);
499 });
500 break;
502 _scheduler.Schedule(5s, [this](TaskContext thunderClap)
503 {
505 thunderClap.Repeat(5s, 10s);
506 }).Schedule(3s, [this](TaskContext devastate)
507 {
509 devastate.Repeat(3s, 5s);
510 });
511 break;
512 }
513 break;
514 case CLASS_PALADIN:
515 switch (data)
516 {
518 _scheduler.Schedule(5s, [this](TaskContext consecration)
519 {
521 consecration.Repeat(5s, 10s);
522 }).Schedule(2s, [this](TaskContext avengersShield)
523 {
525 avengersShield.Repeat(5s, 10s);
526 });
527 break;
528 default:
530 _scheduler.Schedule(5s, [this](TaskContext consecration)
531 {
533 consecration.Repeat(5s, 10s);
534 }).Schedule(2s, [this](TaskContext /*sealCommand*/)
535 {
537 }).Schedule(3s, [this](TaskContext judgementLight)
538 {
540 judgementLight.Repeat(3s, 5s);
541 });
542 break;
543 }
544 break;
545 case CLASS_HUNTER:
546 _scheduler.Schedule(2s, [this](TaskContext shoot)
547 {
549 shoot.Repeat(1s, 4s);
550 }).Schedule(5s, [this](TaskContext disengage)
551 {
552 if (me->IsWithinCombatRange(me->GetVictim(), 4.0f))
553 {
555 disengage.Repeat(10s, 20s);
556 }
557 else
558 disengage.Repeat(1s);
559 });
560 break;
561 case CLASS_ROGUE:
562 me->SetCanDualWield(true);
563 _scheduler.Schedule(5s, [this](TaskContext eviscerate)
564 {
566 eviscerate.Repeat(5s, 10s);
567 }).Schedule(2s, [this](TaskContext sinisterStrike)
568 {
570 sinisterStrike.Repeat(3s, 5s);
571 });
572 break;
573 case CLASS_PRIEST:
574 switch (data)
575 {
577 _scheduler.Schedule(5s, [this](TaskContext shadowWordPain)
578 {
580 shadowWordPain.Repeat(5s, 10s);
581 }).Schedule(2s, [this](TaskContext mindFlay)
582 {
584 mindFlay.Repeat(3s, 5s);
585 });
586 break;
587 default:
588 _scheduler.Schedule(2s, [this](TaskContext renew)
589 {
590 if (Unit* target = DoSelectLowestHpFriendly(40.f))
591 {
593 renew.Repeat(2s, 5s);
594 }
595 else
596 renew.Repeat(1s);
597 }).Schedule(4s, [this](TaskContext greaterHeal)
598 {
599 if (Unit* target = DoSelectLowestHpFriendly(40.f))
600 {
602 greaterHeal.Repeat(4s, 6s);
603 }
604 else
605 greaterHeal.Repeat(1s);
606 });
607 break;
608 }
609 break;
611 _scheduler.Schedule(5s, [this](TaskContext deathGrip)
612 {
613 if (!me->IsWithinCombatRange(me->GetVictim(), 3.0f))
614 {
616 deathGrip.Repeat(12s);
617 }
618 else
619 deathGrip.Repeat(1s);
620 }).Schedule(2s, [this](TaskContext plagueStrike)
621 {
623 plagueStrike.Repeat(3s, 5s);
624 });
625 break;
626 case CLASS_SHAMAN:
627 switch (data)
628 {
629 default:
631 _scheduler.Schedule(5s, [this](TaskContext thunderstorm)
632 {
634 thunderstorm.Repeat(5s, 10s);
635 }).Schedule(2s, [this](TaskContext lightningBolt)
636 {
638 lightningBolt.Repeat(3s, 5s);
639 });
640 break;
642 _scheduler.Schedule(2s, [this](TaskContext earthShock)
643 {
645 earthShock.Repeat(3s, 5s);
646 });
647 break;
649 _scheduler.Schedule(2s, [this](TaskContext earthShield)
650 {
651 if (Unit* target = DoSelectLowestHpFriendly(40.f))
652 {
654 earthShield.Repeat(4s, 6s);
655 }
656 else
657 earthShield.Repeat(1s);
658 }).Schedule(4s, [this](TaskContext healingWave)
659 {
660 if (Unit* target = DoSelectLowestHpFriendly(40.f))
661 {
663 healingWave.Repeat(4s, 6s);
664 }
665 else
666 healingWave.Repeat(1s);
667 });
668 break;
669 }
670 break;
671 case CLASS_MAGE:
672 _scheduler.Schedule(5s, [this](TaskContext frostNova)
673 {
675 frostNova.Repeat(5s, 10s);
676 }).Schedule(2s, [this](TaskContext fireball)
677 {
679 fireball.Repeat(3s, 5s);
680 });
681 break;
682 case CLASS_WARLOCK:
683 _scheduler.Schedule(2s, [this](TaskContext corruption)
684 {
686 corruption.Repeat(6s, 10s);
687 }).Schedule(3s, [this](TaskContext shadowBolt)
688 {
690 shadowBolt.Repeat(3s, 5s);
691 });
692 break;
693 case CLASS_DRUID:
694 switch (data)
695 {
697 _scheduler.Schedule(2s, [this](TaskContext moonfire)
698 {
700 moonfire.Repeat(3s, 5s);
701 }).Schedule(3s, [this](TaskContext wrath)
702 {
704 wrath.Repeat(3s, 5s);
705 });
706 break;
707 case SPEC_DRUID_FERAL:
708 _scheduler.Schedule(1ms, [this](TaskContext /*catForm*/)
709 {
711 }).Schedule(2s, [this](TaskContext mangle)
712 {
714 mangle.Repeat(3s, 5s);
715 }).Schedule(3s, [this](TaskContext rip)
716 {
718 rip.Repeat(3s, 5s);
719 });
720 break;
721 default:
723 _scheduler.Schedule(2s, [this](TaskContext lifebloom)
724 {
725 if (Unit* target = DoSelectLowestHpFriendly(40.f))
726 {
728 lifebloom.Repeat(4s, 6s);
729 }
730 else
731 lifebloom.Repeat(1s);
732 }).Schedule(4s, [this](TaskContext nourish)
733 {
734 if (Unit* target = DoSelectLowestHpFriendly(40.f))
735 {
737 nourish.Repeat(4s, 6s);
738 }
739 else
740 nourish.Repeat(1s);
741 });
742 break;
743 }
744 break;
745 default:
746 break;
747 }
748 }
749 }
750
751 void JustDied(Unit* /*killer*/) override
752 {
754 }
755
756 void UpdateAI(uint32 diff) override
757 {
758 if (!UpdateVictim())
759 return;
760
761 _scheduler.Update(diff, [this]
762 {
764 });
765 }
766
767private:
771};
772
773/* 60291 - Volazj Whisper: Aggro
774 60292 - Volazj Whisper: Insanity
775 60293 - Volazj Whisper: Slay 01
776 60294 - Volazj Whisper: Slay 02
777 60295 - Volazj Whisper: Slay 03
778 60296 - Volazj Whisper: Death 01
779 60297 - Volazj Whisper: Death 02 */
781{
783
785 {
786 Player* target = GetHitPlayer();
787 Creature* caster = GetCaster()->ToCreature();
788 if (!target || !caster)
789 return;
790
791 uint32 text = 0;
792 switch (GetSpellInfo()->Id)
793 {
794 case SPELL_WHISPER_AGGRO: text = WHISPER_AGGRO; break;
795 case SPELL_WHISPER_INSANITY: text = WHISPER_INSANITY; break;
796 case SPELL_WHISPER_SLAY_1: text = WHISPER_SLAY_1; break;
797 case SPELL_WHISPER_SLAY_2: text = WHISPER_SLAY_2; break;
798 case SPELL_WHISPER_SLAY_3: text = WHISPER_SLAY_3; break;
799 case SPELL_WHISPER_DEATH_1: text = WHISPER_DEATH_1; break;
800 case SPELL_WHISPER_DEATH_2: text = WHISPER_DEATH_2; break;
801 default: return;
802 }
803 caster->AI()->Talk(text, target);
804 }
805
810};
811
@ ACHIEVEMENT_TIMED_TYPE_EVENT
Definition DBCEnums.h:122
uint32_t uint32
Definition Define.h:133
@ TEMPSUMMON_CORPSE_DESPAWN
@ TYPEID_PLAYER
Definition ObjectGuid.h:39
uint32 urand(uint32 min, uint32 max)
Definition Random.cpp:42
#define RegisterSpellScript(spell_script)
Definition ScriptMgr.h:1128
SpellEffIndex
@ EFFECT_0
@ SPELL_EFFECT_SCRIPT_EFFECT
@ SPEC_WARRIOR_PROTECTION
@ SPEC_WARRIOR_FURY
@ SPEC_PALADIN_RETRIBUTION
@ SPEC_DRUID_BALANCE
@ SPEC_PRIEST_SHADOW
@ SPEC_PALADIN_PROTECTION
@ SPEC_DRUID_RESTORATION
@ SPEC_SHAMAN_ELEMENTAL
@ SPEC_WARRIOR_ARMS
@ SPEC_DRUID_FERAL
@ SPEC_SHAMAN_RESTORATION
@ SPEC_SHAMAN_ENHANCEMENT
@ CLASS_HUNTER
@ CLASS_DRUID
@ CLASS_SHAMAN
@ CLASS_PRIEST
@ CLASS_WARRIOR
@ CLASS_WARLOCK
@ CLASS_MAGE
@ CLASS_DEATH_KNIGHT
@ CLASS_PALADIN
@ CLASS_NONE
@ CLASS_ROGUE
#define SpellEffectFn(F, I, N)
@ REACT_PASSIVE
@ REACT_AGGRESSIVE
@ UNIT_FLAG_UNINTERACTIBLE
@ UNIT_STATE_CASTING
Definition Unit.h:235
@ UNIT_STATE_STUNNED
Definition Unit.h:223
DamageEffectType
Definition Unit.h:352
@ 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
@ ACHIEV_QUICK_DEMISE_START_EVENT
@ DATA_TWISTED_VISAGE_PLAYER_CLASS
@ DATA_TWISTED_VISAGE_PLAYER_SPEC
@ WHISPER_AGGRO
@ WHISPER_SLAY_3
@ SAY_DEATH_2
@ SAY_INSANITY
@ WHISPER_INSANITY
@ WHISPER_DEATH_1
@ WHISPER_SLAY_2
@ WHISPER_SLAY_1
@ WHISPER_DEATH_2
@ 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(Creature *creature=nullptr)
void Talk(uint8 id, WorldObject const *whisperTarget=nullptr)
bool UpdateVictim()
Creature *const me
Definition CreatureAI.h:82
void SetPhaseMask(uint32 newPhaseMask, bool update) override
Definition Creature.cpp:652
void SetReactState(ReactStates st)
Definition Creature.h:119
void SetCanDualWield(bool value) override
CreatureAI * AI() const
Definition Creature.h:154
void DoStartTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry)
void DoStopTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry)
iterator end()
iterator begin()
PlayerList const & GetPlayers() const
Definition Map.h:448
static Creature * ToCreature(Object *o)
Definition Object.h:186
TypeID GetTypeId() const
Definition Object.h:93
uint32 Id
Definition SpellInfo.h:289
Player * GetHitPlayer() const
Unit * GetCaster() const
HookList< EffectHandler > OnEffectHitTarget
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 > const &duration)
TaskScheduler & Schedule(std::chrono::duration< _Rep, _Period > const &time, task_handler_t const &task)
TaskScheduler & Update(success_t const &callback=EmptyCallback)
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:48
void DoMeleeAttackIfReady()
Definition UnitAI.cpp:54
SpellCastResult DoCastSelf(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.h:241
SpellCastResult DoCastVictim(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.cpp:166
Unit * SelectTarget(SelectTargetMethod targetType, uint32 offset=0, float dist=0.0f, bool playerOnly=false, bool withTank=true, int32 aura=0)
Definition UnitAI.cpp:96
SpellCastResult DoCast(uint32 spellId)
Definition UnitAI.cpp:106
Definition Unit.h:769
void SetControlled(bool apply, UnitState state)
Definition Unit.cpp:11256
uint8 GetClass() const
Definition Unit.h:895
bool IsWithinCombatRange(Unit const *obj, float dist2compare) const
Definition Unit.cpp:603
void InterruptNonMeleeSpells(bool withDelayed, uint32 spellid=0, bool withInstant=true)
Definition Unit.cpp:3093
bool HasUnitFlag(UnitFlags flags) const
Definition Unit.h:953
uint32 GetMaxHealth() const
Definition Unit.h:914
bool IsAlive() const
Definition Unit.h:1234
uint32 GetHealth() const
Definition Unit.h:913
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:3784
Unit * GetVictim() const
Definition Unit.h:859
bool HasUnitState(const uint32 f) const
Definition Unit.h:876
void SetUnitFlag(UnitFlags flags)
Definition Unit.h:954
void RemoveUnitFlag(UnitFlags flags)
Definition Unit.h:955
uint32 GetPhaseMask() const
Definition Object.h:368
Map * GetMap() const
Definition Object.h:449
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition Object.cpp:2832
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:1992
PrepareSpellScript(spell_volazj_whisper)
void HandleScriptEffect(SpellEffIndex)
TC_GAME_API Creature * GetCreature(WorldObject const &u, ObjectGuid const &guid)
TC_GAME_API uint8 GetPlayerSpecialization(Player const *who)
float GetPositionZ() const
Definition Position.h:81
float GetOrientation() const
Definition Position.h:82
float GetPositionX() const
Definition Position.h:79
float GetPositionY() const
Definition Position.h:80
void AttackStart(Unit *) override
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 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