TrinityCore
Loading...
Searching...
No Matches
boss_hexlord.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/*
19 * SAY_BERSERK is NYI, is it used?
20 * Combat timers requires to be revisited, mainly player class abilities, half of timers are guessed
21 * Currently we generate random companions after every wipe, doubt it is correct
22 * We interrupt Siphon Soul instantly to allow casting player class abilities, that's a hack
23 */
24
25#include "ScriptMgr.h"
26#include "Containers.h"
27#include "InstanceScript.h"
28#include "Map.h"
29#include "ScriptedCreature.h"
30#include "SpellAuraEffects.h"
31#include "SpellInfo.h"
32#include "SpellScript.h"
33#include "zulaman.h"
34
46
48{
49 // Malacrass
53
54 // Warrior
58
59 // Paladin
63
64 // Hunter
68
69 // Rogue
73
74 // Priest
78
79 // Death Knight
83
84 // Shaman
88
89 // Mage
93
94 // Warlock
98
99 // Druid
103
104 // Alyson Antille
108
109 // Thurg
112
113 // Slither
116
117 // Lord Raadan
120
121 // Gazakroth
123
124 // Fenstalker
126
127 // Darkheart
129
130 // Koragg
133
134 // Scripts
140
198
203
209
210static constexpr std::array<std::array<uint32, 2>, 4> MalacrassSpawnGroups =
211{{
212 {{ 368, 369 }},
213 {{ 370, 371 }},
214 {{ 372, 373 }},
215 {{ 374, 375 }},
216}};
217
218// 24239 - Hex Lord Malacrass
220{
222
223 void JustAppeared() override
224 {
226 }
227
228 void JustEngagedWith(Unit* who) override
229 {
231
233
236 }
237
238 void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
239 {
240 if (!_canUseDrainPower && me->HealthBelowPctDamaged(80, damage))
241 {
242 _canUseDrainPower = true;
244 }
245 }
246
247 void DoAction(int32 action) override
248 {
249 if (action == ACTION_COMPANION_DEATH)
251 }
252
253 void SetData(uint32 type, uint32 data) override
254 {
255 if (type == DATA_PLAYER_CLASS)
256 {
257 if (data > CLASS_NONE && data <= CLASS_DRUID)
258 {
259 switch (data)
260 {
261 case CLASS_WARRIOR:
265 break;
266 case CLASS_PALADIN:
270 break;
271 case CLASS_HUNTER:
275 break;
276 case CLASS_ROGUE:
280 break;
281 case CLASS_PRIEST:
285 break;
290 break;
291 case CLASS_SHAMAN:
295 break;
296 case CLASS_MAGE:
300 break;
301 case CLASS_WARLOCK:
305 break;
306 case CLASS_DRUID:
310 break;
311 default:
312 break;
313 }
314
316 }
317 }
318 }
319
321 {
322 for (std::array<uint32, 2> const& spawnGroupsForSlot : MalacrassSpawnGroups)
324 }
325
327 {
328 for (std::array<uint32, 2> const& spawnGroupsForSlot : MalacrassSpawnGroups)
329 for (uint32 spawnGroupId : spawnGroupsForSlot)
330 me->GetMap()->SpawnGroupDespawn(spawnGroupId);
331 }
332
333 void OnSpellCast(SpellInfo const* spellInfo) override
334 {
335 switch (spellInfo->Id)
336 {
339 break;
343 break;
346 break;
347 default:
348 break;
349 }
350 }
351
352 void EnterEvadeMode(EvadeReason /*why*/) override
353 {
356
358 }
359
360 void KilledUnit(Unit* /*victim*/) override
361 {
362 Talk(SAY_SLAY);
363 }
364
365 void JustDied(Unit* /*killer*/) override
366 {
367 _JustDied();
369
371 }
372
374 {
376
384 return;
385
386 while (uint32 eventId = _specialEvents.ExecuteEvent())
387 {
388 switch (eventId)
389 {
393 break;
394
397 _specialEvents.Repeat(10s, 15s);
398 break;
401 _specialEvents.Repeat(15s, 20s);
402 break;
406 break;
407
410 _specialEvents.Repeat(20s, 25s);
411 break;
414 _specialEvents.Repeat(15s, 20s);
415 break;
417 if (Unit* target = DoSelectLowestHpFriendly(40.0f))
419 _specialEvents.Repeat(10s, 15s);
420 break;
421
424 _specialEvents.Repeat(15s, 20s);
425 break;
428 _specialEvents.Repeat(10s, 20s);
429 break;
432 _specialEvents.Repeat(10s, 20s);
433 break;
434
435 case EVENT_RO_BLIND:
436 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 10.0f))
437 DoCast(target, SPELL_RO_BLIND);
438 _specialEvents.Repeat(15s, 20s);
439 break;
442 _specialEvents.Repeat(0s, 5s);
443 break;
447 break;
448
451 _specialEvents.Repeat(10s, 15s);
452 break;
455 _specialEvents.Repeat(10s, 15s);
456 break;
459 _specialEvents.Repeat(10s, 15s);
460 break;
461
464 _specialEvents.Repeat(10s, 15s);
465 break;
467 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f))
469 _specialEvents.Repeat(15s, 20s);
470 break;
472 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f))
474 _specialEvents.Repeat(10s, 15s);
475 break;
476
478 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f))
480 _specialEvents.Repeat(10s, 15s);
481 break;
484 _specialEvents.Repeat(15s, 20s);
485 break;
488 _specialEvents.Repeat(10s, 15s);
489 break;
490
493 _specialEvents.Repeat(15s, 20s);
494 break;
496 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f))
497 DoCast(target, SPELL_MG_ICE_LANCE);
498 _specialEvents.Repeat(5s, 10s);
499 break;
501 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f))
502 DoCast(target, SPELL_MG_FROSTBOLT);
503 _specialEvents.Repeat(5s, 10s);
504 break;
505
507 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true, true, -SPELL_WL_CURSE_OF_DOOM))
509 _specialEvents.Repeat(10s, 15s);
510 break;
512 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 40.0f))
514 _specialEvents.Repeat(10s, 15s);
515 break;
517 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true, true, -SPELL_WL_UNSTABLE_AFFLICTION))
519 _specialEvents.Repeat(5s, 10s);
520 break;
521
522 case EVENT_DR_THORNS:
525 break;
528 _specialEvents.Repeat(10s, 15s);
529 break;
531 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f))
532 DoCast(target, SPELL_DR_MOONFIRE);
533 _specialEvents.Repeat(3s, 4s);
534 break;
535
538 break;
539 default:
540 break;
541 }
542 }
543 }
544
545 void UpdateAI(uint32 diff) override
546 {
547 if (!UpdateVictim())
548 return;
549
551
552 events.Update(diff);
553
555 return;
556
557 while (uint32 eventId = events.ExecuteEvent())
558 {
559 switch (eventId)
560 {
563 events.Repeat(40s);
564 break;
567 events.Repeat(40s);
568 break;
569 default:
570 break;
571 }
572
574 return;
575 }
576
578 }
579
580private:
583};
584
586{
587 MalacrassCompanionBaseAI(Creature* creature) : ScriptedAI(creature), Instance(creature->GetInstanceScript()) { }
588
589 void InitializeAI() override
590 {
591 me->SetCorpseDelay(5, true);
592
594 {
596 });
597
599 }
600
601 void Reset() override
602 {
604 }
605
606 void JustEngagedWith(Unit* /*who*/) override
607 {
609 }
610
611 virtual void ScheduleEvents() = 0;
612
613 void JustDied(Unit* /*killer*/) override
614 {
615 if (Creature* malacrass = Instance->GetCreature(BOSS_HEXLORD))
616 malacrass->AI()->DoAction(ACTION_COMPANION_DEATH);
617 }
618
619 void UpdateAI(uint32 diff) override
620 {
621 if (!UpdateVictim())
622 return;
623
624 Scheduler.Update(diff);
625
627 }
628
629protected:
632};
633
634// 24240 - Alyson Antille
636{
638
639 void ScheduleEvents() override
640 {
642 .Schedule(10s, 20s, [this](TaskContext task)
643 {
645 task.Repeat(10s, 20s);
646 })
647 .Schedule(0s, 5s, [this](TaskContext task)
648 {
649 if (Unit* target = DoSelectLowestHpFriendly(40.0f))
650 DoCast(target, SPELL_FLASH_HEAL);
651 task.Repeat(5s, 10s);
652 })
653 .Schedule(5s, 10s, [this](TaskContext task)
654 {
655 Unit* target = nullptr;
656
657 if (urand(0, 1))
658 target = DoSelectLowestHpFriendly(40.0f, 0);
659 else
661 if (target)
662 DoCast(target, SPELL_DISPEL_MAGIC);
663 task.Repeat(10s, 15s);
664 });
665 }
666};
667
668// 24241 - Thurg
670{
672
673 void ScheduleEvents() override
674 {
676 .Schedule(5s, 10s, [this](TaskContext task)
677 {
679 task.Repeat(10s, 15s);
680 })
681 .Schedule(5s, 10s, [this](TaskContext task)
682 {
683 std::list<Creature*> creatureList = DoFindFriendlyMissingBuff(50.0f, SPELL_BLOODLUST);
684 if (!creatureList.empty())
685 {
686 if (Unit* target = *(creatureList.begin()))
687 DoCast(target, SPELL_BLOODLUST);
688 }
689 task.Repeat(10s, 15s);
690 });
691 }
692};
693
694// 24242 - Slither
696{
698
699 void JustAppeared() override
700 {
702 }
703
704 void ScheduleEvents() override
705 {
707 .Schedule(0s, 5s, [this](TaskContext task)
708 {
710 task.Repeat(5s, 10s);
711 });
712 }
713};
714
715// 24243 - Lord Raadan
717{
719
720 void ScheduleEvents() override
721 {
723 .Schedule(5s, 10s, [this](TaskContext task)
724 {
726 task.Repeat(10s, 15s);
727 })
728 .Schedule(0s, 5s, [this](TaskContext task)
729 {
731 task.Repeat(10s, 15s);
732 });
733 }
734};
735
736// 24244 - Gazakroth
738{
740
741 void ScheduleEvents() override
742 {
744 .Schedule(0s, [this](TaskContext task)
745 {
747 task.Repeat(1200ms);
748 });
749 }
750};
751
752// 24245 - Fenstalker
754{
756
757 void ScheduleEvents() override
758 {
760 .Schedule(5s, 10s, [this](TaskContext task)
761 {
762 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 40.0f, true, true, -SPELL_VOLATILE_INFECTION))
764 task.Repeat(15s, 20s);
765 });
766 }
767};
768
769// 24246 - Darkheart
771{
773
774 void ScheduleEvents() override
775 {
777 .Schedule(5s, 10s, [this](TaskContext task)
778 {
780 task.Repeat(15s, 20s);
781 });
782 }
783};
784
785// 24247 - Koragg
787{
789
790 void ScheduleEvents() override
791 {
793 .Schedule(5s, 10s, [this](TaskContext task)
794 {
796 task.Repeat(10s, 15s);
797 })
798 .Schedule(10s, 15s, [this](TaskContext task)
799 {
800 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true))
801 DoCast(target, SPELL_COLD_STARE);
802 task.Repeat(15s, 20s);
803 });
804 }
805};
806
807// 43421 - Lifebloom
809{
811
812 bool Validate(SpellInfo const* /*spellInfo*/) override
813 {
815 }
816
817 void AfterRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
818 {
819 if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE && GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_ENEMY_SPELL)
820 return;
821
822 GetTarget()->CastSpell(nullptr, SPELL_LIFEBLOOM_FINAL_HEAL, CastSpellExtraArgs(aurEff).SetOriginalCaster(GetCasterGUID()));
823 }
824
829};
830
831// 43498 - Siphon Soul
833{
835
836 bool Validate(SpellInfo const* /*spellInfo*/) override
837 {
839 }
840
841 void FilterTargets(std::list<WorldObject*>& targets)
842 {
843 if (targets.empty())
844 return;
845
847
848 _selectedTargetGuid = target->GetGUID();
849 }
850
851 void HandleDummy(SpellEffIndex /*effIndex*/)
852 {
853 Unit* target = GetHitUnit();
854
855 if (target->GetGUID() != _selectedTargetGuid)
856 return;
857
858 if (Creature* caster = GetCaster()->ToCreature())
859 {
860 caster->CastSpell(target, SPELL_SIPHON_SOUL_EFFECT);
861 caster->GetAI()->SetData(DATA_PLAYER_CLASS, target->GetClass());
862 }
863 }
864
870
871private:
873};
874
875// 43522 - Unstable Affliction
877{
879
880 bool Validate(SpellInfo const* /*spellInfo*/) override
881 {
883 }
884
885 void HandleDispel(DispelInfo* dispelInfo)
886 {
887 if (Unit* caster = GetCaster())
888 caster->CastSpell(dispelInfo->GetDispeller(), SPELL_UNSTABLE_AFFL_DISPEL, GetEffect(EFFECT_0));
889 }
890
895};
896
897// 43550 - Mind Control
899{
901
902 void FilterTargets(std::list<WorldObject*>& targets)
903 {
904 // Target count - verified. Removing victim - guessed
905 targets.remove(GetCaster()->GetVictim());
907 }
908
913};
914
915// 61606 - Mark of Blood
917{
919
920 bool Validate(SpellInfo const* /*spellInfo*/) override
921 {
923 }
924
925 void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
926 {
927 eventInfo.GetActor()->CastSpell(eventInfo.GetActionTarget(), SPELL_MARK_OF_BLOOD_HEAL, aurEff);
928 }
929
934};
935
int32_t int32
Definition Define.h:129
uint32_t uint32
Definition Define.h:133
uint32 urand(uint32 min, uint32 max)
Definition Random.cpp:42
#define RegisterSpellScript(spell_script)
Definition ScriptMgr.h:1128
SpellEffIndex
@ EFFECT_0
@ SPELL_EFFECT_DUMMY
@ TARGET_UNIT_SRC_AREA_ENEMY
@ CLASS_HUNTER
@ CLASS_DRUID
@ CLASS_SHAMAN
@ CLASS_PRIEST
@ CLASS_WARRIOR
@ CLASS_WARLOCK
@ CLASS_MAGE
@ CLASS_DEATH_KNIGHT
@ CLASS_PALADIN
@ CLASS_NONE
@ CLASS_ROGUE
@ AURA_REMOVE_BY_EXPIRE
@ AURA_REMOVE_BY_ENEMY_SPELL
AuraEffectHandleModes
@ AURA_EFFECT_HANDLE_REAL
@ SPELL_AURA_PERIODIC_HEAL
@ SPELL_AURA_DUMMY
#define AuraEffectProcFn(F, I, N)
#define SpellEffectFn(F, I, N)
#define SpellObjectAreaTargetSelectFn(F, I, N)
#define AuraDispelFn(F)
#define AuraEffectRemoveFn(F, I, N, M)
@ UNIT_STATE_CASTING
Definition Unit.h:249
DamageEffectType
Definition Unit.h:366
MalacrassMisc
@ DATA_PLAYER_CLASS
@ ACTION_COMPANION_DEATH
MalacrassEventGroups
@ EVENT_GROUP_PLAYER_ABILITY
MalacrassEvents
@ EVENT_PA_HOLY_LIGHT
@ EVENT_DK_MARK_OF_BLOOD
@ EVENT_SIPHON_SOUL
@ EVENT_HU_FREEZING_TRAP
@ EVENT_SH_CHAIN_LIGHTNING
@ EVENT_HU_SNAKE_TRAP
@ EVENT_MG_FROSTBOLT
@ EVENT_DRAIN_POWER
@ EVENT_WR_MORTAL_STRIKE
@ EVENT_DR_MOONFIRE
@ EVENT_DR_THORNS
@ EVENT_SH_HEALING_WAVE
@ EVENT_DK_DEATH_AND_DECAY
@ EVENT_WL_UNSTABLE_AFFLICTION
@ EVENT_RO_SLICE_AND_DICE
@ EVENT_SPIRIT_BOLTS
@ EVENT_HU_EXPLOSIVE_TRAP
@ EVENT_RO_WOUND_POISON
@ EVENT_WR_WHIRLWIND
@ EVENT_PR_MIND_CONTROL
@ EVENT_RO_BLIND
@ EVENT_WL_RAIN_OF_FIRE
@ EVENT_CANCEL_CLASS_ABILITIES
@ EVENT_DK_PLAGUE_STRIKE
@ EVENT_DR_LIFEBLOOM
@ EVENT_MG_ICE_LANCE
@ EVENT_WR_SPELL_REFLECTION
@ EVENT_PA_CONSECRATION
@ EVENT_MG_FROST_NOVA
@ EVENT_SH_FIRE_NOVA_TOTEM
@ EVENT_PR_PSYCHIC_SCREAM
@ EVENT_PA_AVENGING_WRATH
@ EVENT_PR_FLASH_HEAL
@ EVENT_WL_CURSE_OF_DOOM
static constexpr std::array< std::array< uint32, 2 >, 4 > MalacrassSpawnGroups
void AddSC_boss_hex_lord_malacrass()
MalacrassTexts
@ SAY_DEATH
@ SAY_AGGRO
@ SAY_CHARM
@ SAY_SLAY
@ SAY_DRAIN_POWER
@ SAY_BERSERK
@ SAY_SPIRIT_BOLTS
@ SAY_PET_DIES
MalacrassSpells
@ SPELL_UNSTABLE_AFFL_DISPEL
@ SPELL_SH_CHAIN_LIGHTNING
@ SPELL_CLEAVE
@ SPELL_ARCANE_TORRENT
@ SPELL_DK_PLAGUE_STRIKE
@ SPELL_PR_PSYCHIC_SCREAM
@ SPELL_SPIRIT_BOLTS
@ SPELL_SH_FIRE_NOVA_TOTEM
@ SPELL_BLOODLUST
@ SPELL_FLASH_HEAL
@ SPELL_DK_DEATH_AND_DECAY
@ SPELL_DR_THORNS
@ SPELL_WR_WHIRLWIND
@ SPELL_HU_EXPLOSIVE_TRAP
@ SPELL_WR_MORTAL_STRIKE
@ SPELL_SIPHON_SOUL
@ SPELL_PR_MIND_CONTROL
@ SPELL_WL_RAIN_OF_FIRE
@ SPELL_FLAME_BREATH
@ SPELL_PA_HOLY_LIGHT
@ SPELL_PA_CONSECRATION
@ SPELL_DISPEL_MAGIC
@ SPELL_HU_FREEZING_TRAP
@ SPELL_SH_HEALING_WAVE
@ SPELL_FIREBOLT
@ SPELL_LIFEBLOOM_FINAL_HEAL
@ SPELL_DEADLY_POISON
@ SPELL_DR_MOONFIRE
@ SPELL_THUNDERCLAP
@ SPELL_DRAIN_POWER
@ SPELL_WL_CURSE_OF_DOOM
@ SPELL_RO_WOUND_POISON
@ SPELL_SIPHON_SOUL_EFFECT
@ SPELL_RO_BLIND
@ SPELL_COLD_STARE
@ SPELL_MG_ICE_LANCE
@ SPELL_MG_FROSTBOLT
@ SPELL_PA_AVENGING_WRATH
@ SPELL_MG_FROST_NOVA
@ SPELL_DK_MARK_OF_BLOOD
@ SPELL_WR_SPELL_REFLECTION
@ SPELL_RO_SLICE_AND_DICE
@ SPELL_WL_UNSTABLE_AFFLICTION
@ SPELL_PSYCHIC_WAIL
@ SPELL_DR_LIFEBLOOM
@ SPELL_PR_FLASH_HEAL
@ SPELL_MIGHTY_BLOW
@ SPELL_HU_SNAKE_TRAP
@ SPELL_VOLATILE_INFECTION
@ SPELL_MARK_OF_BLOOD_HEAL
@ SPELL_VENOM_SPIT
AuraApplication const * GetTargetApplication() const
HookList< EffectApplyHandler > AfterEffectRemove
Unit * GetCaster() const
AuraEffect * GetEffect(uint8 effIndex) const
Unit * GetTarget() const
ObjectGuid GetCasterGUID() const
HookList< AuraDispelHandler > AfterDispel
HookList< EffectProcHandler > OnEffectProc
void JustEngagedWith(Unit *who) override
void _DespawnAtEvade(Seconds delayToRespawn=30s, Creature *who=nullptr)
SummonList summons
EventMap events
bool UpdateVictim()
Creature *const me
Definition CreatureAI.h:82
void SetCorpseDelay(uint32 delay, bool ignoreCorpseDecayRatio=false)
Definition Creature.h:98
WorldObject * GetDispeller() const
Definition Unit.h:418
void Update(uint32 time)
Definition EventMap.h:67
void Repeat(Milliseconds time)
Definition EventMap.cpp:63
EventId ExecuteEvent()
Definition EventMap.cpp:73
void CancelEventGroup(GroupIndex group)
Definition EventMap.cpp:165
void ScheduleEvent(EventId eventId, Milliseconds time, GroupIndex group=0u, PhaseIndex phase=0u)
Definition EventMap.cpp:36
Creature * GetCreature(uint32 type)
bool SpawnGroupSpawn(uint32 groupId, bool ignoreRespawn=false, bool force=false, std::vector< WorldObject * > *spawnedObjects=nullptr)
Definition Map.cpp:3382
bool SpawnGroupDespawn(uint32 groupId, bool deleteRespawnTimes=false, size_t *count=nullptr)
Definition Map.cpp:3458
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:78
Unit * GetActionTarget() const
Definition Unit.h:523
Unit * GetActor()
Definition Unit.h:522
uint32 Id
Definition SpellInfo.h:289
Unit * GetCaster() const
Unit * GetHitUnit() const
HookList< EffectHandler > OnEffectHitTarget
HookList< ObjectAreaTargetSelectHandler > OnObjectAreaTargetSelect
TaskContext & Repeat(std::chrono::duration< _Rep, _Period > const &duration)
TaskScheduler & CancelAll()
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 DoMeleeAttackIfReady()
Definition UnitAI.cpp:54
SpellCastResult DoCastSelf(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.h:241
virtual void InitializeAI()
Definition UnitAI.cpp:36
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:783
uint8 GetClass() const
Definition Unit.h:909
Spell * FindCurrentSpellBySpellId(uint32 spell_id) const
Definition Unit.cpp:3131
void InterruptNonMeleeSpells(bool withDelayed, uint32 spellid=0, bool withInstant=true)
Definition Unit.cpp:3116
bool HasUnitState(const uint32 f) const
Definition Unit.h:890
bool HealthBelowPctDamaged(int32 pct, uint32 damage) const
Definition Unit.h:932
Map * GetMap() const
Definition Object.h:451
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition Object.cpp:2833
static bool ValidateSpellInfo(std::initializer_list< uint32 > spellIds)
PrepareAuraScript(spell_malacrass_lifebloom)
bool Validate(SpellInfo const *) override
void AfterRemove(AuraEffect const *aurEff, AuraEffectHandleModes)
void HandleProc(AuraEffect const *aurEff, ProcEventInfo &eventInfo)
PrepareAuraScript(spell_malacrass_mark_of_blood)
bool Validate(SpellInfo const *) override
void FilterTargets(std::list< WorldObject * > &targets)
PrepareSpellScript(spell_malacrass_mind_control)
bool Validate(SpellInfo const *) override
PrepareSpellScript(spell_malacrass_siphon_soul)
void FilterTargets(std::list< WorldObject * > &targets)
void HandleDummy(SpellEffIndex)
PrepareAuraScript(spell_malacrass_unstable_affliction)
void HandleDispel(DispelInfo *dispelInfo)
bool Validate(SpellInfo const *) override
auto SelectRandomContainerElement(C const &container) -> typename std::add_const< decltype(*std::begin(container))>::type &
Definition Containers.h:108
void RandomResize(C &container, std::size_t requestedSize)
Definition Containers.h:66
void InitializeAI() override
void JustEngagedWith(Unit *) override
void UpdateAI(uint32 diff) override
virtual void ScheduleEvents()=0
void JustDied(Unit *) override
MalacrassCompanionBaseAI(Creature *creature)
InstanceScript * Instance
Unit * DoSelectLowestHpFriendly(float range, uint32 minHPDiff=1)
std::list< Creature * > DoFindFriendlyMissingBuff(float range, uint32 spellId)
void ScheduleEvents() override
void ScheduleEvents() override
void ScheduleEvents() override
void ScheduleEvents() override
void KilledUnit(Unit *) override
void OnSpellCast(SpellInfo const *spellInfo) override
void DoAction(int32 action) override
void UpdateSpecialEvents(uint32 diff)
void DamageTaken(Unit *, uint32 &damage, DamageEffectType, SpellInfo const *) override
void JustAppeared() override
void UpdateAI(uint32 diff) override
void SetData(uint32 type, uint32 data) override
boss_hexlord_malacrass(Creature *creature)
void JustEngagedWith(Unit *who) override
void JustDied(Unit *) override
void EnterEvadeMode(EvadeReason) override
void ScheduleEvents() override
void ScheduleEvents() override
void ScheduleEvents() override
void JustAppeared() override
void ScheduleEvents() override
@ BOSS_HEXLORD
Definition zulaman.h:32
#define RegisterZulAmanCreatureAI(ai_name)
Definition zulaman.h:94