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 * Move spell script of spell 43421 to this file
22 * Currently we generate random companions after every wipe, doubt it is correct
23 */
24
25#include "ScriptMgr.h"
26#include "AreaTrigger.h"
27#include "AreaTriggerAI.h"
28#include "Containers.h"
29#include "InstanceScript.h"
30#include "Map.h"
31#include "MotionMaster.h"
32#include "PassiveAI.h"
33#include "ScriptedCreature.h"
34#include "SpellAuraEffects.h"
35#include "SpellInfo.h"
36#include "SpellMgr.h"
37#include "SpellScript.h"
38#include "zulaman.h"
39
51
53{
54 // Malacrass
58
59 // Warrior
63
64 // Paladin
68
69 // Hunter
73
74 // Rogue
78
79 // Priest
84
85 // Death Knight
89
90 // Shaman
94
95 // Mage
99
100 // Warlock
104
105 // Monk
109
110 // Druid
114
115 // Alyson Antille
119
120 // Thurg
123
124 // Slither
127
128 // Lord Raadan
131
132 // Gazakroth
134
135 // Fenstalker
137
138 // Darkheart
140
141 // Koragg
144
145 // Scripts
152
216
221
227
228static constexpr std::array<std::array<uint32, 2>, 2> MalacrassSpawnGroups =
229{{
230 {{ 368, 370 }},
231 {{ 372, 374 }}
232}};
233
234// 24239 - Hex Lord Malacrass
236{
238
239 void JustAppeared() override
240 {
242 }
243
244 void JustEngagedWith(Unit* who) override
245 {
247
249
252 }
253
254 void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
255 {
256 if (!_canUseDrainPower && me->HealthBelowPctDamaged(80, damage))
257 {
258 _canUseDrainPower = true;
260 }
261 }
262
263 void DoAction(int32 action) override
264 {
265 if (action == ACTION_COMPANION_DEATH)
267 }
268
269 void SetData(uint32 type, uint32 data) override
270 {
271 if (type == DATA_PLAYER_CLASS)
272 {
273 if (data > CLASS_NONE && data <= CLASS_DRUID)
274 {
275 switch (data)
276 {
277 case CLASS_WARRIOR:
281 break;
282 case CLASS_PALADIN:
286 break;
287 case CLASS_HUNTER:
291 break;
292 case CLASS_ROGUE:
296 break;
297 case CLASS_PRIEST:
302 break;
307 break;
308 case CLASS_SHAMAN:
312 break;
313 case CLASS_MAGE:
317 break;
318 case CLASS_WARLOCK:
322 break;
323 case CLASS_MONK:
327 break;
328 case CLASS_DRUID:
332 break;
333 default:
334 break;
335 }
336
338 }
339 }
340 }
341
343 {
344 for (std::array<uint32, 2> const& spawnGroupsForSlot : MalacrassSpawnGroups)
346 }
347
349 {
350 for (std::array<uint32, 2> const& spawnGroupsForSlot : MalacrassSpawnGroups)
351 for (uint32 spawnGroupId : spawnGroupsForSlot)
352 me->GetMap()->SpawnGroupDespawn(spawnGroupId);
353 }
354
355 void OnSpellCast(SpellInfo const* spellInfo) override
356 {
357 switch (spellInfo->Id)
358 {
361 break;
364 break;
367 break;
368 default:
369 break;
370 }
371 }
372
373 void EnterEvadeMode(EvadeReason /*why*/) override
374 {
377
379 }
380
381 void KilledUnit(Unit* /*victim*/) override
382 {
383 Talk(SAY_SLAY);
384 }
385
386 void JustDied(Unit* /*killer*/) override
387 {
388 _JustDied();
390
392 }
393
395 {
397
405 return;
406
407 while (uint32 eventId = _specialEvents.ExecuteEvent())
408 {
409 switch (eventId)
410 {
414 break;
415
418 _specialEvents.Repeat(10s, 15s);
419 break;
421 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f))
423 _specialEvents.Repeat(15s, 20s);
424 break;
428 break;
429
432 _specialEvents.Repeat(20s, 25s);
433 break;
436 _specialEvents.Repeat(15s, 20s);
437 break;
439 if (Unit* target = DoSelectLowestHpFriendly(40.0f))
441 _specialEvents.Repeat(10s, 15s);
442 break;
443
446 _specialEvents.Repeat(15s, 20s);
447 break;
450 _specialEvents.Repeat(10s, 20s);
451 break;
454 _specialEvents.Repeat(10s, 20s);
455 break;
456
458 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 10.0f))
460 _specialEvents.Repeat(15s, 20s);
461 break;
464 _specialEvents.Repeat(0s, 5s);
465 break;
469 break;
470
473 _specialEvents.Repeat(10s, 15s);
474 break;
477 _specialEvents.Repeat(10s, 15s);
478 break;
481 break;
483 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f))
485 _specialEvents.Repeat(10s, 15s);
486 break;
487
490 _specialEvents.Repeat(10s, 15s);
491 break;
493 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f))
495 _specialEvents.Repeat(15s, 20s);
496 break;
499 _specialEvents.Repeat(10s, 15s);
500 break;
501
503 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f))
505 _specialEvents.Repeat(10s, 15s);
506 break;
509 _specialEvents.Repeat(15s, 20s);
510 break;
513 _specialEvents.Repeat(10s, 15s);
514 break;
515
518 _specialEvents.Repeat(15s, 20s);
519 break;
521 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f))
522 DoCast(target, SPELL_MG_ICE_LANCE);
523 _specialEvents.Repeat(5s, 10s);
524 break;
526 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f))
527 DoCast(target, SPELL_MG_FROSTBOLT);
528 _specialEvents.Repeat(5s, 10s);
529 break;
530
532 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true, true, -SPELL_WL_CURSE_OF_DOOM))
534 _specialEvents.Repeat(10s, 15s);
535 break;
537 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 40.0f))
539 _specialEvents.Repeat(10s, 15s);
540 break;
542 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true, true, -SPELL_WL_UNSTABLE_AFFLICTION))
544 _specialEvents.Repeat(5s, 10s);
545 break;
546
549 _specialEvents.Repeat(10s, 15s);
550 break;
553 _specialEvents.Repeat(8s, 14s);
554 break;
558 break;
559
560 case EVENT_DR_TYPHOON:
563 break;
566 _specialEvents.Repeat(10s, 15s);
567 break;
569 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f))
570 DoCast(target, SPELL_DR_MOONFIRE);
571 _specialEvents.Repeat(3s, 4s);
572 break;
573
576 break;
577 default:
578 break;
579 }
580 }
581 }
582
583 void UpdateAI(uint32 diff) override
584 {
585 if (!UpdateVictim())
586 return;
587
589
590 events.Update(diff);
591
593 return;
594
595 while (uint32 eventId = events.ExecuteEvent())
596 {
597 switch (eventId)
598 {
601 events.Repeat(40s);
602 break;
605 events.Repeat(60s);
606 break;
607 default:
608 break;
609 }
610
612 return;
613 }
614 }
615
616private:
619};
620
622{
623 MalacrassCompanionBaseAI(Creature* creature) : ScriptedAI(creature), Instance(creature->GetInstanceScript()) { }
624
625 void InitializeAI() override
626 {
627 me->SetCorpseDelay(5, true);
628
630 {
632 });
633
635 }
636
637 void Reset() override
638 {
640 }
641
642 void JustEngagedWith(Unit* /*who*/) override
643 {
645 }
646
647 virtual void ScheduleEvents() = 0;
648
649 void JustDied(Unit* /*killer*/) override
650 {
651 if (Creature* malacrass = Instance->GetCreature(BOSS_HEXLORD))
652 malacrass->AI()->DoAction(ACTION_COMPANION_DEATH);
653 }
654
655 void UpdateAI(uint32 diff) override
656 {
657 if (!UpdateVictim())
658 return;
659
660 Scheduler.Update(diff);
661 }
662
663protected:
666};
667
668// 24240 - Alyson Antille
670{
672
673 void ScheduleEvents() override
674 {
676 .Schedule(10s, 20s, [this](TaskContext& task)
677 {
679 task.Repeat(10s, 20s);
680 })
681 .Schedule(0s, 5s, [this](TaskContext& task)
682 {
683 if (Unit* target = DoSelectLowestHpFriendly(40.0f))
684 DoCast(target, SPELL_FLASH_HEAL);
685 task.Repeat(5s, 10s);
686 })
687 .Schedule(5s, 10s, [this](TaskContext& task)
688 {
689 Unit* target = nullptr;
690
691 if (urand(0, 1))
692 target = DoSelectLowestHpFriendly(40.0f, 0);
693 else
695 if (target)
696 DoCast(target, SPELL_DISPEL_MAGIC);
697 task.Repeat(10s, 15s);
698 });
699 }
700};
701
702// 24241 - Thurg
704{
706
707 void ScheduleEvents() override
708 {
710 .Schedule(5s, 10s, [this](TaskContext& task)
711 {
713 task.Repeat(10s, 15s);
714 })
715 .Schedule(5s, 10s, [this](TaskContext& task)
716 {
717 std::list<Creature*> creatureList = DoFindFriendlyMissingBuff(50.0f, SPELL_BLOODLUST);
718 if (!creatureList.empty())
719 {
720 if (Unit* target = *(creatureList.begin()))
721 DoCast(target, SPELL_BLOODLUST);
722 }
723 task.Repeat(10s, 15s);
724 });
725 }
726};
727
728// 24242 - Slither
730{
732
733 void JustAppeared() override
734 {
736 }
737
738 void ScheduleEvents() override
739 {
741 .Schedule(0s, 5s, [this](TaskContext& task)
742 {
744 task.Repeat(5s, 10s);
745 });
746 }
747};
748
749// 24243 - Lord Raadan
751{
753
754 void ScheduleEvents() override
755 {
757 .Schedule(5s, 10s, [this](TaskContext& task)
758 {
760 task.Repeat(10s, 15s);
761 })
762 .Schedule(0s, 5s, [this](TaskContext& task)
763 {
765 task.Repeat(10s, 15s);
766 });
767 }
768};
769
770// 24244 - Gazakroth
772{
774
775 void ScheduleEvents() override
776 {
778 .Schedule(0s, [this](TaskContext& task)
779 {
781 task.Repeat(1200ms);
782 });
783 }
784};
785
786// 24245 - Fenstalker
788{
790
791 void ScheduleEvents() override
792 {
794 .Schedule(5s, 10s, [this](TaskContext& task)
795 {
796 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 40.0f, true, true, -SPELL_VOLATILE_INFECTION))
798 task.Repeat(15s, 20s);
799 });
800 }
801};
802
803// 24246 - Darkheart
805{
807
808 void ScheduleEvents() override
809 {
811 .Schedule(5s, 10s, [this](TaskContext& task)
812 {
814 task.Repeat(15s, 20s);
815 });
816 }
817};
818
819// 24247 - Koragg
821{
823
824 void ScheduleEvents() override
825 {
827 .Schedule(5s, 10s, [this](TaskContext& task)
828 {
830 task.Repeat(10s, 15s);
831 })
832 .Schedule(10s, 15s, [this](TaskContext& task)
833 {
834 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true))
835 DoCast(target, SPELL_COLD_STARE);
836 task.Repeat(15s, 20s);
837 });
838 }
839};
840
841// 52827 - Blood Worm
843{
845
846 void IsSummonedBy(WorldObject* /*summoner*/) override
847 {
849 me->GetMotionMaster()->MoveFollow(hexlord, 0.0f, me->GetRelativeAngle(hexlord));
850 }
851
852 void MovementInform(uint32 type, uint32 /*id*/) override
853 {
854 if (type != FOLLOW_MOTION_TYPE)
855 return;
856
860 }
861};
862
863// 127737 - Hex Sphere
864// CreatePropertiesId - 407
866{
868
869 void OnUnitEnter(Unit* unit) override
870 {
871 Unit* caster = at->GetCaster();
872 if (!caster)
873 return;
874
875 if (!caster->IsValidAttackTarget(unit, sSpellMgr->GetSpellInfo(SPELL_HEX_SPHERE_DAMAGE, caster->GetMap()->GetDifficultyID())))
876 return;
877
878 caster->CastSpell(unit, SPELL_HEX_SPHERE_DAMAGE);
879 at->Remove();
880 }
881};
882
883// 43498 - Siphon Soul
885{
886 bool Validate(SpellInfo const* /*spellInfo*/) override
887 {
889 }
890
891 void FilterTargets(std::list<WorldObject*>& targets)
892 {
893 // This is wrong, full list of targets is sent to client
895 }
896
897 void HandleDummy(SpellEffIndex /*effIndex*/)
898 {
899 Unit* target = GetHitUnit();
900
901 if (Creature* caster = GetCaster()->ToCreature())
902 {
903 caster->CastSpell(target, SPELL_SIPHON_SOUL_EFFECT);
904 caster->GetAI()->SetData(DATA_PLAYER_CLASS, target->GetClass());
905 }
906 }
907
913};
914
915// 43522 - Unstable Affliction
917{
918 bool Validate(SpellInfo const* /*spellInfo*/) override
919 {
921 }
922
923 void HandleDispel(DispelInfo* dispelInfo)
924 {
925 if (Unit* caster = GetCaster())
926 caster->CastSpell(dispelInfo->GetDispeller(), SPELL_UNSTABLE_AFFL_DISPEL, GetEffect(EFFECT_0));
927 }
928
933};
934
935// 43550 - Mind Control
937{
938 void FilterTargets(std::list<WorldObject*>& targets)
939 {
940 // Target count - verified. Removing victim - guessed
941 targets.remove(GetCaster()->GetVictim());
943 }
944
949};
950
951// 61606 - Mark of Blood
953{
954 bool Validate(SpellInfo const* /*spellInfo*/) override
955 {
957 }
958
959 void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
960 {
961 eventInfo.GetActor()->CastSpell(eventInfo.GetActionTarget(), SPELL_MARK_OF_BLOOD_HEAL, aurEff);
962 }
963
968};
969
970// 97628 - Blood Worms
972{
973 void SelectTarget(std::list<WorldObject*>& targets)
974 {
975 if (targets.empty())
976 return;
977
979 {
980 return std::max(caster->GetExactDist(target) - caster->GetCombatReach(), CONTACT_DISTANCE);
981 });
982 targets.assign(1, target);
983 }
984
989};
990
991// 97640 - Leap of Faith
993{
994 void SelectTarget(std::list<WorldObject*>& targets)
995 {
996 if (targets.size() < 2)
997 return;
998
999 targets.sort(Trinity::ObjectDistanceOrderPred(GetCaster(), false));
1000 targets.resize(1);
1001 }
1002
1003 void TriggerSpell(SpellEffIndex /*effIndex*/)
1004 {
1006 }
1007
1013};
1014
int32_t int32
Definition Define.h:150
uint32_t uint32
Definition Define.h:154
@ FOLLOW_MOTION_TYPE
#define CONTACT_DISTANCE
uint32 urand(uint32 min, uint32 max)
Definition Random.cpp:43
#define RegisterAreaTriggerAI(ai_name)
Definition ScriptMgr.h:1428
#define RegisterSpellScript(spell_script)
Definition ScriptMgr.h:1383
SpellEffIndex
@ EFFECT_0
@ SPELL_EFFECT_DUMMY
@ SPELL_EFFECT_SCRIPT_EFFECT
@ CLASS_HUNTER
@ CLASS_DRUID
@ CLASS_SHAMAN
@ CLASS_MONK
@ CLASS_PRIEST
@ CLASS_WARRIOR
@ CLASS_WARLOCK
@ CLASS_MAGE
@ CLASS_DEATH_KNIGHT
@ CLASS_PALADIN
@ CLASS_NONE
@ CLASS_ROGUE
@ TARGET_UNIT_SRC_AREA_ALLY
@ TARGET_UNIT_SRC_AREA_ENEMY
@ SPELL_AURA_DUMMY
#define sSpellMgr
Definition SpellMgr.h:812
#define AuraEffectProcFn(F, I, N)
#define SpellEffectFn(F, I, N)
#define SpellObjectAreaTargetSelectFn(F, I, N)
#define AuraDispelFn(F)
EvadeReason
DamageEffectType
@ UNIT_STATE_CASTING
Definition Unit.h:290
MalacrassMisc
@ DATA_PLAYER_CLASS
@ ACTION_COMPANION_DEATH
MalacrassEventGroups
@ EVENT_GROUP_PLAYER_ABILITY
static constexpr std::array< std::array< uint32, 2 >, 2 > MalacrassSpawnGroups
MalacrassEvents
@ EVENT_PA_HOLY_LIGHT
@ EVENT_SIPHON_SOUL
@ EVENT_HU_FREEZING_TRAP
@ EVENT_SH_CHAIN_LIGHTNING
@ EVENT_HU_SNAKE_TRAP
@ EVENT_PR_LEAP_OF_FAITH
@ EVENT_MG_FROSTBOLT
@ EVENT_PR_SHADOW_WORD_PAIN
@ EVENT_MK_HEX_SPHERE
@ EVENT_DRAIN_POWER
@ EVENT_WR_MORTAL_STRIKE
@ EVENT_DR_MOONFIRE
@ EVENT_SH_HEALING_WAVE
@ EVENT_DK_DEATH_AND_DECAY
@ EVENT_WR_HEROIC_LEAP
@ EVENT_WL_UNSTABLE_AFFLICTION
@ EVENT_RO_SLICE_AND_DICE
@ EVENT_SPIRIT_BOLTS
@ EVENT_HU_EXPLOSIVE_TRAP
@ EVENT_RO_WOUND_POISON
@ EVENT_WL_RAIN_OF_FIRE
@ EVENT_CANCEL_CLASS_ABILITIES
@ EVENT_MK_RISING_SUN_KICK
@ EVENT_DK_PLAGUE_STRIKE
@ EVENT_DR_LIFEBLOOM
@ EVENT_MG_ICE_LANCE
@ EVENT_WR_SPELL_REFLECTION
@ EVENT_MK_RENEWING_MIST
@ EVENT_PA_CONSECRATION
@ EVENT_MG_FROST_NOVA
@ EVENT_DK_BLOOD_WORMS
@ EVENT_RO_SMOKE_BOMB
@ EVENT_SH_FIRE_NOVA_TOTEM
@ EVENT_PR_PSYCHIC_SCREAM
@ EVENT_DR_TYPHOON
@ EVENT_PA_AVENGING_WRATH
@ EVENT_PR_FLASH_HEAL
@ EVENT_WL_CURSE_OF_DOOM
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_BLOOD_WORMS_HEAL
@ SPELL_SH_CHAIN_LIGHTNING
@ SPELL_WR_HEROIC_LEAP
@ SPELL_CLEAVE
@ SPELL_MK_HEX_SPHERE
@ SPELL_ARCANE_TORRENT
@ SPELL_DK_PLAGUE_STRIKE
@ SPELL_PR_PSYCHIC_SCREAM
@ SPELL_SPIRIT_BOLTS
@ SPELL_SH_FIRE_NOVA_TOTEM
@ SPELL_DR_TYPHOON
@ SPELL_HEX_SPHERE_DAMAGE
@ SPELL_BLOODLUST
@ SPELL_FLASH_HEAL
@ SPELL_DK_DEATH_AND_DECAY
@ SPELL_HU_EXPLOSIVE_TRAP
@ SPELL_DK_BLOOD_WORMS
@ SPELL_WR_MORTAL_STRIKE
@ SPELL_SIPHON_SOUL
@ SPELL_PR_LEAP_OF_FAITH
@ 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_MK_RISING_SUN_KICK
@ SPELL_DEADLY_POISON
@ SPELL_DR_MOONFIRE
@ SPELL_THUNDERCLAP
@ SPELL_DRAIN_POWER
@ SPELL_WL_CURSE_OF_DOOM
@ SPELL_RO_WOUND_POISON
@ SPELL_RO_SMOKE_BOMB
@ SPELL_SIPHON_SOUL_EFFECT
@ SPELL_PR_SHADOW_WORD_PAIN
@ SPELL_COLD_STARE
@ SPELL_MG_ICE_LANCE
@ SPELL_MG_FROSTBOLT
@ SPELL_PA_AVENGING_WRATH
@ SPELL_MG_FROST_NOVA
@ SPELL_MK_RENEWING_MIST
@ 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
AreaTrigger *const at
AreaTriggerAI(AreaTrigger *a, uint32 scriptId={}) noexcept
Unit * GetCaster() const
Unit * GetCaster() const
AuraEffect * GetEffect(uint8 effIndex) 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:63
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
void SetCorpseDelay(uint32 delay, bool ignoreCorpseDecayRatio=false)
Definition Creature.h:118
WorldObject * GetDispeller() const
Definition Unit.h:410
void Update(uint32 time)
Definition EventMap.h:77
void Repeat(Milliseconds time)
Definition EventMap.cpp:67
EventId ExecuteEvent()
Definition EventMap.cpp:77
void CancelEventGroup(GroupIndex group)
Definition EventMap.cpp:178
void ScheduleEvent(EventId eventId, Milliseconds time, GroupIndex group=0u, PhaseIndex phase=0u)
Definition EventMap.cpp:40
Creature * GetCreature(uint32 type)
bool SpawnGroupSpawn(uint32 groupId, bool ignoreRespawn=false, bool force=false, std::vector< WorldObject * > *spawnedObjects=nullptr)
Definition Map.cpp:2360
Difficulty GetDifficultyID() const
Definition Map.h:363
bool SpawnGroupDespawn(uint32 groupId, bool deleteRespawnTimes=false, size_t *count=nullptr)
Definition Map.cpp:2449
void MoveFollow(Unit *target, float dist, Optional< ChaseAngle > angle={}, Optional< Milliseconds > duration={}, bool ignoreTargetWalk=false, MovementSlot slot=MOTION_SLOT_ACTIVE, Scripting::v2::ActionResultSetter< MovementStopReason > &&scriptResult={})
NullCreatureAI(Creature *creature, uint32 scriptId={}) noexcept
Definition PassiveAI.cpp:33
Unit * GetActionTarget() const
Definition Unit.h:514
Unit * GetActor() const
Definition Unit.h:513
uint32 const Id
Definition SpellInfo.h:328
static bool ValidateSpellInfo(std::initializer_list< uint32 > spellIds)
Unit * GetCaster() const
int32 GetEffectValueAsInt() const
Unit * GetHitUnit() const
HookList< EffectHandler > OnEffectHitTarget
HookList< ObjectAreaTargetSelectHandler > OnObjectAreaTargetSelect
TaskContext & Repeat(TaskScheduler::duration_t duration)
TaskScheduler & CancelAll()
TaskScheduler & Schedule(duration_t time, task_handler_t task)
TaskScheduler & SetValidator(P &&predicate)
Sets a validator which is asked if tasks are allowed to be executed.
TaskScheduler & Update()
Update the scheduler to the current time.
SpellCastResult DoCastSelf(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.h:160
virtual void InitializeAI()
Definition UnitAI.cpp:35
SpellCastResult DoCastVictim(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.cpp:172
Unit * SelectTarget(SelectTargetMethod targetType, uint32 offset=0, float dist=0.0f, bool playerOnly=false, bool withTank=true, int32 aura=0)
Definition UnitAI.cpp:71
SpellCastResult DoCast(uint32 spellId)
Definition UnitAI.cpp:81
Definition Unit.h:647
uint8 GetClass() const
Definition Unit.h:776
Spell * FindCurrentSpellBySpellId(uint32 spell_id) const
Definition Unit.cpp:3268
MotionMaster * GetMotionMaster()
Definition Unit.h:1750
bool HealthBelowPctDamaged(float pct, uint32 damage) const
Definition Unit.h:805
bool HasUnitState(const uint32 f) const
Definition Unit.h:755
Map * GetMap() const
Definition Object.h:411
InstanceScript * GetInstanceScript() const
Definition Object.cpp:394
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition Object.cpp:2222
bool IsValidAttackTarget(WorldObject const *target, SpellInfo const *bySpell=nullptr) const
Definition Object.cpp:2329
void SelectTarget(std::list< WorldObject * > &targets)
void SelectTarget(std::list< WorldObject * > &targets)
void HandleProc(AuraEffect const *aurEff, ProcEventInfo &eventInfo)
bool Validate(SpellInfo const *) override
void FilterTargets(std::list< WorldObject * > &targets)
bool Validate(SpellInfo const *) override
void FilterTargets(std::list< WorldObject * > &targets)
void HandleDummy(SpellEffIndex)
void HandleDispel(DispelInfo *dispelInfo)
bool Validate(SpellInfo const *) override
auto SelectRandomWeightedContainerElement(C const &container, std::span< double > const &weights) -> decltype(std::ranges::begin(container))
Definition Containers.h:127
auto SelectRandomContainerElement(C const &container) -> std::add_const_t< decltype(*std::ranges::begin(container))> &
Definition Containers.h:110
void RandomResize(C &container, std::size_t requestedSize)
Definition Containers.h:67
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
float GetRelativeAngle(float x, float y) const
Definition Position.h:147
Unit * DoSelectLowestHpFriendly(float range, uint32 minHPDiff=1)
std::list< Creature * > DoFindFriendlyMissingBuff(float range, uint32 spellId)
void OnUnitEnter(Unit *unit) override
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
void MovementInform(uint32 type, uint32) override
void IsSummonedBy(WorldObject *) override
@ BOSS_HEXLORD
Definition zulaman.h:32
#define RegisterZulAmanCreatureAI(ai_name)
Definition zulaman.h:114