TrinityCore
Loading...
Searching...
No Matches
PlayerAI.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 "PlayerAI.h"
19#include "CommonHelpers.h"
20#include "Creature.h"
21#include "Item.h"
22#include "MotionMaster.h"
23#include "ObjectAccessor.h"
24#include "Player.h"
25#include "Spell.h"
26#include "SpellAuras.h"
27#include "SpellAuraEffects.h"
28#include "SpellHistory.h"
29#include "SpellMgr.h"
30
32{
33 /* Generic */
38
39 /* Warrior - Generic */
43 SPELL_CHARGE = 11578,
50
51 /* Warrior - Arms */
55 SPELL_REND = 47465,
59
60 /* Warrior - Fury */
69
70 /* Warrior - Protection */
81
82 /* Paladin - Generic */
93
94 /* Paladin - Holy*/
103
104 /* Paladin - Protection */
112
113 /* Paladin - Retribution */
119
120 /* Hunter - Generic */
128
129 /* Hunter - Beast Mastery */
133
134 /* Hunter - Marksmanship */
142
143 /* Hunter - Survival */
148
149 /* Rogue - Generic */
156
157 /* Rogue - Assassination */
162
163 /* Rogue - Combat */
169
170 /* Rogue - Sublety */
176
177 /* Priest - Generic */
186
187 /* Priest - Discipline */
194
195 /* Priest - Holy */
200 SPELL_RENEW = 48068,
201
202 /* Priest - Shadow */
211
212 /* Death Knight - Generic */
225
226 /* Death Knight - Blood */
234
235 /* Death Knight - Frost */
242
243 /* Death Knight - Unholy */
250
251 /* Shaman - Generic */
255
256 /* Shaman - Elemental*/
266
267 /* Shaman - Enhancement */
274
275 /* Shaman - Restoration*/
283
284 /* Mage - Generic */
292
293 /* Mage - Arcane */
301
302 /* Mage - Fire */
310
311 /* Mage - Frost */
319
320 /* Warlock - Generic */
329
330 /* Warlock - Affliction */
333 SPELL_HAUNT = 48181,
336
337 /* Warlock - Demonology */
346
347 /* Warlock - Destruction */
352
353 /* Druid - Generic */
356
357 /* Druid - Balance */
365 SPELL_WRATH = 48461,
366
367 /* Druid - Feral */
374 SPELL_RAKE = 48574,
375 SPELL_RIP = 49800,
378 SPELL_CLAW = 48570,
379 SPELL_DASH = 33357,
380 SPELL_MAIM = 49802,
381
382 /* Druid - Restoration */
392 SPELL_LIFEBLOOM = 48451
394
395PlayerAI::PlayerAI(Player* player) : UnitAI(player), me(player),
396 _selfSpec(Trinity::Helpers::Entity::GetPlayerSpecialization(player)),
397 _isSelfHealer(Trinity::Helpers::Entity::IsPlayerHealer(player)),
398 _isSelfRangedAttacker(Trinity::Helpers::Entity::IsPlayerRangedAttacker(player))
399{
400}
401
403{
406 return nullptr;
407}
408
410{
411 return (!who || who == me) ? _selfSpec : Trinity::Helpers::Entity::GetPlayerSpecialization(who);
412}
413
414bool PlayerAI::IsHealer(Player const * who) const
415{
416 return (!who || who == me) ? _isSelfHealer : Trinity::Helpers::Entity::IsPlayerHealer(who);
417}
418
419bool PlayerAI::IsRangedAttacker(Player const * who) const
420{
422}
423
425{
426 // Find highest spell rank that we know
427 uint32 knownRank, nextRank;
428 if (me->HasSpell(spellId))
429 {
430 // this will save us some lookups if the player has the highest rank (expected case)
431 knownRank = spellId;
432 nextRank = sSpellMgr->GetNextSpellInChain(spellId);
433 }
434 else
435 {
436 knownRank = 0;
437 nextRank = sSpellMgr->GetFirstSpellInChain(spellId);
438 }
439
440 while (nextRank && me->HasSpell(nextRank))
441 {
442 knownRank = nextRank;
443 nextRank = sSpellMgr->GetNextSpellInChain(knownRank);
444 }
445
446 if (!knownRank)
447 return {};
448
449 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(knownRank);
450 if (!spellInfo)
451 return {};
452
453 if (me->GetSpellHistory()->HasGlobalCooldown(spellInfo))
454 return {};
455
456 Spell* spell = new Spell(me, spellInfo, TRIGGERED_NONE);
457 if (spell->CanAutoCast(target))
458 return{ spell, target };
459
460 delete spell;
461 return {};
462}
463
465{
466 Unit* pTarget = nullptr;
467 switch (target)
468 {
469 case TARGET_NONE:
470 break;
471 case TARGET_VICTIM:
472 pTarget = me->GetVictim();
473 if (!pTarget)
474 return {};
475 break;
476 case TARGET_CHARMER:
477 pTarget = me->GetCharmer();
478 if (!pTarget)
479 return {};
480 break;
481 case TARGET_SELF:
482 pTarget = me;
483 break;
484 }
485
486 return VerifySpellCast(spellId, pTarget);
487}
488
490{
491 uint32 totalWeights = 0;
492 for (PossibleSpell const& wSpell : spells)
493 totalWeights += wSpell.second;
494
495 TargetedSpell selected;
496 uint32 randNum = urand(0, totalWeights - 1);
497 for (PossibleSpell const& wSpell : spells)
498 {
499 if (selected)
500 {
501 delete wSpell.first.first;
502 continue;
503 }
504
505 if (randNum < wSpell.second)
506 selected = wSpell.first;
507 else
508 {
509 randNum -= wSpell.second;
510 delete wSpell.first.first;
511 }
512 }
513
514 spells.clear();
515 return selected;
516}
517
519{
520 SpellCastTargets targets;
521 targets.SetUnitTarget(spell.second);
522 spell.first->prepare(targets);
523}
524
526{
528 return;
529
531 return;
532
533 Unit* victim = me->GetVictim();
534 if (!victim)
535 return;
536
537 uint32 rangedAttackSpell = 0;
538
540 if (ItemTemplate const* rangedTemplate = rangedItem ? rangedItem->GetTemplate() : nullptr)
541 {
542 switch (rangedTemplate->SubClass)
543 {
547 rangedAttackSpell = SPELL_SHOOT;
548 break;
550 rangedAttackSpell = SPELL_THROW;
551 break;
553 rangedAttackSpell = SPELL_SHOOT_WAND;
554 break;
555 }
556 }
557
558 if (!rangedAttackSpell)
559 return;
560
561 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(rangedAttackSpell);
562 if (!spellInfo)
563 return;
564
565 Spell* spell = new Spell(me, spellInfo, TRIGGERED_CAST_DIRECTLY);
566 if (spell->CheckPetCast(victim) != SPELL_CAST_OK)
567 {
568 delete spell;
569 return;
570 }
571
572 SpellCastTargets targets;
573 targets.SetUnitTarget(victim);
574 spell->prepare(targets);
575
577}
578
586
588{
589 std::list<AuraEffect*> const& shapeshiftAuras = me->GetAuraEffectsByType(SPELL_AURA_MOD_SHAPESHIFT);
590 std::set<Aura*> removableShapeshifts;
591 for (AuraEffect* auraEff : shapeshiftAuras)
592 {
593 Aura* aura = auraEff->GetBase();
594 if (!aura)
595 continue;
596 SpellInfo const* auraInfo = aura->GetSpellInfo();
597 if (!auraInfo)
598 continue;
600 continue;
601 if (!auraInfo->IsPositive() || auraInfo->IsPassive())
602 continue;
603 removableShapeshifts.insert(aura);
604 }
605
606 for (Aura* aura : removableShapeshifts)
608}
609
611{
612 return me->GetCharmer() ? me->GetCharmer()->GetVictim() : nullptr;
613}
614
616{
618 UnitAI const* const _ai;
619 bool operator()(Unit const* target) const
620 {
621 return _ai->CanAIAttack(target);
622 }
623};
624
626{
628 return false;
629 if (Unit* charmer = me->GetCharmer())
630 if (!charmer->IsValidAttackTarget(who))
631 return false;
632 return UnitAI::CanAIAttack(who);
633}
634
636{
637 if (Unit* charmer = me->GetCharmer())
638 {
639 if (UnitAI* charmerAI = charmer->GetAI())
640 return charmerAI->SelectTarget(SelectTargetMethod::Random, 0, ValidTargetSelectPredicate(this));
641 return charmer->GetVictim();
642 }
643 return nullptr;
644}
645
647{
648 PossibleSpellVector spells;
649
650 switch (me->GetClass())
651 {
652 case CLASS_WARRIOR:
654 {
657 }
661 {
664 }
666 switch (GetSpec())
667 {
681 break;
692 break;
701 break;
702 }
703 break;
704 case CLASS_PALADIN:
714 if (Creature* creatureCharmer = GetCharmer())
715 {
716 if (creatureCharmer->IsDungeonBoss() || creatureCharmer->isWorldBoss())
717 VerifyAndPushSpellCast(spells, SPELL_HAND_OF_SACRIFICE, creatureCharmer, 10);
718 else
719 VerifyAndPushSpellCast(spells, SPELL_HAND_OF_PROTECTION, creatureCharmer, 3);
720 }
721
722 switch (GetSpec())
723 {
731 break;
739 break;
746 break;
747 }
748 break;
749 case CLASS_HUNTER:
757
758 switch (GetSpec())
759 {
765 break;
773 break;
779 break;
780 }
781 break;
782 case CLASS_ROGUE:
783 {
789
790 uint32 builder = 0, finisher = 0;
791 switch (GetSpec())
792 {
794 builder = SPELL_MUTILATE, finisher = SPELL_ENVENOM;
796 break;
798 builder = SPELL_SINISTER_STRIKE, finisher = SPELL_EVISCERATE;
802 break;
804 builder = SPELL_HEMORRHAGE, finisher = SPELL_EVISCERATE;
809 break;
810 }
811
812 if (Unit* victim = me->GetVictim())
813 {
814 if (victim->HasUnitState(UNIT_STATE_CASTING))
816
817 uint8 const cp = me->GetComboPoints(victim);
818 if (cp >= 4)
819 VerifyAndPushSpellCast(spells, finisher, TARGET_VICTIM, 10);
820 if (cp <= 4)
821 VerifyAndPushSpellCast(spells, builder, TARGET_VICTIM, 5);
822 }
823 break;
824 }
825 case CLASS_PRIEST:
834 switch (GetSpec())
835 {
843 break;
844 case SPEC_PRIEST_HOLY:
849 break;
852 {
854 break;
855 }
856 if (Unit* victim = me->GetVictim())
857 {
858 if (!victim->GetAuraApplicationOfRankedSpell(SPELL_VAMPIRIC_TOUCH, me->GetGUID()))
860 if (!victim->GetAuraApplicationOfRankedSpell(SPELL_SHADOW_WORD_PAIN, me->GetGUID()))
862 if (!victim->GetAuraApplicationOfRankedSpell(SPELL_DEVOURING_PLAGUE, me->GetGUID()))
864 }
868 break;
869 }
870 break;
872 {
879
880 bool hasFF = false, hasBP = false;
881 if (Unit* victim = me->GetVictim())
882 {
883 if (victim->HasUnitState(UNIT_STATE_CASTING))
885
886 hasFF = !!victim->GetAuraApplicationOfRankedSpell(AURA_FROST_FEVER, me->GetGUID()), hasBP = !!victim->GetAuraApplicationOfRankedSpell(AURA_BLOOD_PLAGUE, me->GetGUID());
887 if (hasFF && hasBP)
889 if (!hasFF)
891 if (!hasBP)
893 }
894 switch (GetSpec())
895 {
899 if (Creature* creatureCharmer = GetCharmer())
900 if (!creatureCharmer->IsDungeonBoss() && !creatureCharmer->isWorldBoss())
901 VerifyAndPushSpellCast(spells, SPELL_HYSTERIA, creatureCharmer, 15);
903 if (hasFF && hasBP)
908 break;
910 if (hasFF && hasBP)
917 break;
919 if (hasFF && hasBP)
926 break;
927 }
928 break;
929 }
930 case CLASS_SHAMAN:
934 switch (GetSpec())
935 {
937 if (Unit* charmer = me->GetCharmer())
938 if (!charmer->GetAuraApplicationOfRankedSpell(SPELL_EARTH_SHIELD, me->GetGUID()))
939 VerifyAndPushSpellCast(spells, SPELL_EARTH_SHIELD, charmer, 2);
942 else
947 break;
949 if (Unit* victim = me->GetVictim())
950 {
951 if (victim->GetAuraOfRankedSpell(SPELL_FLAME_SHOCK, GetGUID()))
953 else
955 }
960 break;
962 if (Aura const* maelstrom = me->GetAura(AURA_MAELSTROM_WEAPON))
963 if (maelstrom->GetStackAmount() == 5)
969 break;
970 }
971 break;
972 case CLASS_MAGE:
982 switch (GetSpec())
983 {
984 case SPEC_MAGE_ARCANE:
985 if (Aura* abAura = me->GetAura(AURA_ARCANE_BLAST))
986 if (abAura->GetStackAmount() >= 3)
992 break;
993 case SPEC_MAGE_FIRE:
1001 break;
1002 case SPEC_MAGE_FROST:
1007 if (me->GetVictim() && me->GetVictim()->HasAuraState(AURA_STATE_FROZEN, nullptr, me))
1009 break;
1010 }
1011 break;
1012 case CLASS_WARLOCK:
1019 switch (GetSpec())
1020 {
1022 if (Unit* victim = me->GetVictim())
1023 {
1025 if (!victim->GetAuraApplicationOfRankedSpell(SPELL_UNSTABLE_AFFLICTION, me->GetGUID()))
1027 if (!victim->GetAuraApplicationOfRankedSpell(SPELL_HAUNT, me->GetGUID()))
1029 if (!victim->GetAuraApplicationOfRankedSpell(SPELL_CURSE_OF_AGONY, me->GetGUID()))
1031 if (victim->HealthBelowPct(25))
1033 }
1034 break;
1041 {
1045 }
1050 break;
1060 break;
1061 }
1062 break;
1063 case CLASS_DRUID:
1066 switch (GetSpec())
1067 {
1070 {
1073 break;
1074 }
1077 if (Creature* creatureCharmer = GetCharmer())
1078 {
1079 VerifyAndPushSpellCast(spells, SPELL_NOURISH, creatureCharmer, 5);
1080 VerifyAndPushSpellCast(spells, SPELL_WILD_GROWTH, creatureCharmer, 5);
1081 if (!creatureCharmer->GetAuraApplicationOfRankedSpell(SPELL_REJUVENATION, me->GetGUID()))
1082 VerifyAndPushSpellCast(spells, SPELL_REJUVENATION, creatureCharmer, 8);
1083 if (!creatureCharmer->GetAuraApplicationOfRankedSpell(SPELL_REGROWTH, me->GetGUID()))
1084 VerifyAndPushSpellCast(spells, SPELL_REGROWTH, creatureCharmer, 8);
1085 uint8 lifebloomStacks = 0;
1086 if (Aura const* lifebloom = creatureCharmer->GetAura(SPELL_LIFEBLOOM, me->GetGUID()))
1087 lifebloomStacks = lifebloom->GetStackAmount();
1088 if (lifebloomStacks < 3)
1089 VerifyAndPushSpellCast(spells, SPELL_LIFEBLOOM, creatureCharmer, 5);
1090 if (creatureCharmer->GetAuraApplicationOfRankedSpell(SPELL_REJUVENATION) ||
1091 creatureCharmer->GetAuraApplicationOfRankedSpell(SPELL_REGROWTH))
1092 VerifyAndPushSpellCast(spells, SPELL_SWIFTMEND, creatureCharmer, 10);
1094 VerifyAndPushSpellCast(spells, SPELL_HEALING_TOUCH, creatureCharmer, 100);
1095 }
1096 break;
1097 case SPEC_DRUID_BALANCE:
1098 {
1100 {
1103 break;
1104 }
1105 uint32 const mainAttackSpell = me->HasAura(AURA_ECLIPSE_LUNAR) ? SPELL_STARFIRE : SPELL_WRATH;
1107 VerifyAndPushSpellCast(spells, mainAttackSpell, TARGET_VICTIM, 10);
1114 break;
1115 }
1116 case SPEC_DRUID_FERAL:
1117 if (!me->HasAura(SPELL_CAT_FORM))
1118 {
1121 break;
1122 }
1127 if (Unit* victim = me->GetVictim())
1128 {
1129 uint8 const cp = me->GetComboPoints(victim);
1130 if (victim->HasUnitState(UNIT_STATE_CASTING) && cp >= 1)
1132 if (!me->IsWithinMeleeRange(victim))
1134 if (cp >= 4)
1136 if (cp <= 4)
1137 {
1140 if (!victim->GetAuraApplicationOfRankedSpell(SPELL_RAKE, me->GetGUID()))
1144 }
1145 }
1146 break;
1147 }
1148 break;
1149 }
1150
1151 return SelectSpellCast(spells);
1152}
1153
1154static const float CASTER_CHASE_DISTANCE = 28.0f;
1156{
1157 Creature* charmer = GetCharmer();
1158 if (!charmer)
1159 return;
1160
1161 // kill self if charm aura has infinite duration
1162 if (charmer->IsInEvadeMode())
1163 {
1165 {
1166 if (aura->GetCasterGUID() == charmer->GetGUID() && aura->GetBase()->IsPermanent())
1167 {
1168 me->KillSelf();
1169 return;
1170 }
1171 }
1172 }
1173
1174 if (charmer->IsEngaged())
1175 {
1176 Unit* target = me->GetVictim();
1177 if (!target || !CanAIAttack(target))
1178 {
1179 target = SelectAttackTarget();
1180 if (!target || !CanAIAttack(target))
1181 {
1182 if (!_isFollowing)
1183 {
1184 _isFollowing = true;
1185 me->AttackStop();
1186 me->CastStop();
1187
1190
1192 }
1193 return;
1194 }
1195 _isFollowing = false;
1196
1197 if (IsRangedAttacker())
1198 {
1199 _chaseCloser = !me->IsWithinLOSInMap(target);
1200 if (_chaseCloser)
1201 AttackStart(target);
1202 else
1204 }
1205 else
1206 AttackStart(target);
1207 _forceFacing = true;
1208 }
1209
1211 {
1212 float targetAngle = me->GetAbsoluteAngle(target);
1213 if (_forceFacing || fabs(me->GetOrientation() - targetAngle) > 0.4f)
1214 {
1215 me->SetFacingTo(targetAngle);
1216 _forceFacing = false;
1217 }
1218 }
1219
1220 if (_castCheckTimer <= diff)
1221 {
1223 _castCheckTimer = 0;
1224 else
1225 {
1226 if (IsRangedAttacker()) // chase to zero if the target isn't in line of sight
1227 {
1228 bool inLOS = me->IsWithinLOSInMap(target);
1229 if (_chaseCloser != !inLOS)
1230 {
1231 _chaseCloser = !inLOS;
1232 if (_chaseCloser)
1233 AttackStart(target);
1234 else
1236 }
1237 }
1239 DoCastAtTarget(shouldCast);
1240 _castCheckTimer = 500;
1241 }
1242 }
1243 else
1244 _castCheckTimer -= diff;
1245
1247 }
1248 else if (!_isFollowing)
1249 {
1250 _isFollowing = true;
1251 me->AttackStop();
1252 me->CastStop();
1253
1256
1258 }
1259}
1260
1262{
1263 if (me->IsCharmed())
1264 {
1265 me->CastStop();
1266 me->AttackStop();
1267
1268 if (me->GetMotionMaster()->Size() <= 1) // if there is no current movement (we dont want to erase/overwrite any existing stuff)
1269 me->GetMotionMaster()->MovePoint(0, me->GetPosition(), false); // force re-sync of current position for all clients
1270 }
1271 else
1272 {
1273 me->CastStop();
1274 me->AttackStop();
1275
1277 }
1278
1279 PlayerAI::OnCharmed(isNew);
1280}
uint8_t uint8
Definition Define.h:135
uint32_t uint32
Definition Define.h:133
@ ITEM_SUBCLASS_WEAPON_CROSSBOW
@ ITEM_SUBCLASS_WEAPON_GUN
@ ITEM_SUBCLASS_WEAPON_BOW
@ ITEM_SUBCLASS_WEAPON_WAND
@ ITEM_SUBCLASS_WEAPON_THROWN
@ MOTION_PRIORITY_NORMAL
@ CHASE_MOTION_TYPE
#define PET_FOLLOW_ANGLE
Definition PetDefines.h:86
#define PET_FOLLOW_DIST
Definition PetDefines.h:85
Spells
Definition PlayerAI.cpp:32
@ SPELL_SCOURGE_STRIKE
Definition PlayerAI.cpp:246
@ SPELL_DISPERSION
Definition PlayerAI.cpp:210
@ SPELL_COLD_SNAP
Definition PlayerAI.cpp:317
@ SPELL_ENRAGED_REGEN
Definition PlayerAI.cpp:45
@ SPELL_SEED_OF_CORRUPTION
Definition PlayerAI.cpp:328
@ SPELL_SILENCING_SHOT
Definition PlayerAI.cpp:141
@ SPELL_HAMMER_OF_JUSTICE
Definition PlayerAI.cpp:89
@ SPELL_EXECUTE
Definition PlayerAI.cpp:65
@ PASSIVE_ILLUMINATION
Definition PlayerAI.cpp:95
@ SPELL_AVENGERS_SHIELD
Definition PlayerAI.cpp:107
@ SPELL_SHADOWSTEP
Definition PlayerAI.cpp:175
@ SPELL_GUARDIAN_SPIRIT
Definition PlayerAI.cpp:198
@ SPELL_CONFLAGRATE
Definition PlayerAI.cpp:349
@ SPELL_VAMPIRIC_EMBRACE
Definition PlayerAI.cpp:203
@ SPELL_DEEP_FREEZE
Definition PlayerAI.cpp:314
@ SPELL_DEMONIC_EMPOWERMENT
Definition PlayerAI.cpp:339
@ SPELL_MOONFIRE
Definition PlayerAI.cpp:363
@ SPELL_SHIELD_BASH
Definition PlayerAI.cpp:48
@ AURA_BLOOD_PLAGUE
Definition PlayerAI.cpp:223
@ SPELL_SHADOWFORM
Definition PlayerAI.cpp:204
@ SPELL_DEATH_WISH
Definition PlayerAI.cpp:61
@ SPELL_RIPTIDE
Definition PlayerAI.cpp:279
@ SPELL_SAVAGE_ROAR
Definition PlayerAI.cpp:376
@ SPELL_AVENGING_WRATH
Definition PlayerAI.cpp:86
@ SPELL_NATURE_SWIFTNESS
Definition PlayerAI.cpp:386
@ SPELL_DEATH_COIL_W
Definition PlayerAI.cpp:324
@ SPELL_STRANGULATE
Definition PlayerAI.cpp:214
@ SPELL_SHAMANISTIC_RAGE
Definition PlayerAI.cpp:273
@ SPELL_CHIMERA_SHOT
Definition PlayerAI.cpp:137
@ SPELL_METAMORPHOSIS
Definition PlayerAI.cpp:340
@ SPELL_CLOAK_OF_SHADOWS
Definition PlayerAI.cpp:155
@ SPELL_SHIELD_WALL
Definition PlayerAI.cpp:79
@ SPELL_SOUL_LINK
Definition PlayerAI.cpp:338
@ SPELL_EVASION
Definition PlayerAI.cpp:151
@ SPELL_IMMOLATION_AURA
Definition PlayerAI.cpp:341
@ SPELL_ADRENALINE_RUSH
Definition PlayerAI.cpp:166
@ SPELL_SHOOT
Definition PlayerAI.cpp:35
@ SPELL_FROSTBOLT
Definition PlayerAI.cpp:316
@ SPELL_FERAL_CHARGE_CAT
Definition PlayerAI.cpp:373
@ SPELL_STARFIRE
Definition PlayerAI.cpp:364
@ SPELL_ICE_BLOCK
Definition PlayerAI.cpp:291
@ SPELL_DASH
Definition PlayerAI.cpp:379
@ SPELL_AUTO_SHOT
Definition PlayerAI.cpp:34
@ SPELL_PLAGUE_STRIKE
Definition PlayerAI.cpp:222
@ SPELL_TYPHOON
Definition PlayerAI.cpp:361
@ SPELL_CONCUSSION_BLOW
Definition PlayerAI.cpp:74
@ SPELL_DIVINE_ILLUMINATION
Definition PlayerAI.cpp:102
@ SPELL_ANTI_MAGIC_ZONE
Definition PlayerAI.cpp:248
@ SPELL_BLOODLUST
Definition PlayerAI.cpp:253
@ PASSIVE_SIPHON_LIFE
Definition PlayerAI.cpp:331
@ AURA_DECIMATION
Definition PlayerAI.cpp:343
@ SPELL_FLASH_HEAL
Definition PlayerAI.cpp:199
@ SPELL_THUNDERSTORM
Definition PlayerAI.cpp:259
@ SPELL_VAMPIRIC_BLOOD
Definition PlayerAI.cpp:233
@ SPELL_DEATH_STRIKE
Definition PlayerAI.cpp:230
@ SPELL_FERAL_SPIRIT
Definition PlayerAI.cpp:270
@ SPELL_PAIN_SUPPRESSION
Definition PlayerAI.cpp:191
@ SPELL_RAKE
Definition PlayerAI.cpp:374
@ SPELL_STORMSTRIKE
Definition PlayerAI.cpp:272
@ SPELL_BEACON_OF_LIGHT
Definition PlayerAI.cpp:97
@ SPELL_HYSTERIA
Definition PlayerAI.cpp:228
@ SPELL_SINISTER_STRIKE
Definition PlayerAI.cpp:164
@ SPELL_HOWL_OF_TERROR
Definition PlayerAI.cpp:322
@ PASSIVE_ELEMENTAL_FOCUS
Definition PlayerAI.cpp:257
@ SPELL_PENANCE
Definition PlayerAI.cpp:190
@ SPELL_VAMPIRIC_TOUCH
Definition PlayerAI.cpp:205
@ SPELL_COUNTERSPELL
Definition PlayerAI.cpp:290
@ SPELL_MIRROR_IMAGE
Definition PlayerAI.cpp:288
@ PASSIVE_TRUESHOT_AURA
Definition PlayerAI.cpp:136
@ SPELL_CHARGE
Definition PlayerAI.cpp:43
@ SPELL_EVISCERATE
Definition PlayerAI.cpp:168
@ SPELL_DIVINE_PROTECTION
Definition PlayerAI.cpp:87
@ SPELL_LAST_STAND
Definition PlayerAI.cpp:76
@ SPELL_ARCANE_BARRAGE
Definition PlayerAI.cpp:296
@ SPELL_DEMON_CHARGE
Definition PlayerAI.cpp:342
@ SPELL_BLOOD_STRIKE
Definition PlayerAI.cpp:231
@ SPELL_POWER_INFUSION
Definition PlayerAI.cpp:189
@ SPELL_MANGLE
Definition PlayerAI.cpp:370
@ SPELL_BATTLE_STANCE
Definition PlayerAI.cpp:40
@ SPELL_DEFENSIVE_STANCE
Definition PlayerAI.cpp:42
@ SPELL_SOUL_FIRE
Definition PlayerAI.cpp:345
@ SPELL_HOWLING_BLAST
Definition PlayerAI.cpp:238
@ SPELL_SHATTERING_THROW
Definition PlayerAI.cpp:57
@ PASSIVE_ICY_TALONS
Definition PlayerAI.cpp:236
@ SPELL_BLACK_ARROW
Definition PlayerAI.cpp:147
@ PASSIVE_UNHOLY_BLIGHT
Definition PlayerAI.cpp:244
@ SPELL_RETALIATION
Definition PlayerAI.cpp:56
@ SPELL_LIFEBLOOM
Definition PlayerAI.cpp:392
@ SPELL_CLAW
Definition PlayerAI.cpp:378
@ SPELL_LAVA_LASH
Definition PlayerAI.cpp:269
@ SPELL_DEMO_SHOUT
Definition PlayerAI.cpp:64
@ SPELL_EXPLOSIVE_SHOT
Definition PlayerAI.cpp:146
@ SPELL_UNSTABLE_AFFLICTION
Definition PlayerAI.cpp:332
@ SPELL_SHOOT_WAND
Definition PlayerAI.cpp:37
@ SPELL_PREMEDITATION
Definition PlayerAI.cpp:172
@ SPELL_BARKSKIN
Definition PlayerAI.cpp:354
@ SPELL_KICK
Definition PlayerAI.cpp:152
@ PASSIVE_TITANS_GRIP
Definition PlayerAI.cpp:63
@ SPELL_MANA_SHIELD
Definition PlayerAI.cpp:287
@ SPELL_LAVA_BURST
Definition PlayerAI.cpp:263
@ SPELL_SHIELD_OF_RIGHTEOUS
Definition PlayerAI.cpp:111
@ SPELL_PUMMEL
Definition PlayerAI.cpp:47
@ SPELL_INSECT_SWARM
Definition PlayerAI.cpp:358
@ SPELL_BLESSING_OF_MIGHT
Definition PlayerAI.cpp:85
@ SPELL_BLIND
Definition PlayerAI.cpp:154
@ SPELL_DETERRENCE
Definition PlayerAI.cpp:121
@ SPELL_DIVINE_FAVOR
Definition PlayerAI.cpp:101
@ PASSIVE_SPIRIT_WEAPONS
Definition PlayerAI.cpp:268
@ SPELL_BLADE_FLURRY
Definition PlayerAI.cpp:165
@ SPELL_FEAR
Definition PlayerAI.cpp:321
@ SPELL_MIND_BLAST
Definition PlayerAI.cpp:207
@ SPELL_ARCANE_SHOT
Definition PlayerAI.cpp:138
@ SPELL_SPELLSTEAL
Definition PlayerAI.cpp:289
@ AURA_MAELSTROM_WEAPON
Definition PlayerAI.cpp:271
@ SPELL_ENVENOM
Definition PlayerAI.cpp:161
@ SPELL_DRAGONS_BREATH
Definition PlayerAI.cpp:308
@ SPELL_HEROIC_FURY
Definition PlayerAI.cpp:66
@ SPELL_DESPERATE_PRAYER
Definition PlayerAI.cpp:197
@ SPELL_RAPID_FIRE
Definition PlayerAI.cpp:124
@ SPELL_HEROISM
Definition PlayerAI.cpp:252
@ SPELL_ARCANE_POWER
Definition PlayerAI.cpp:295
@ PASSIVE_LOCK_AND_LOAD
Definition PlayerAI.cpp:144
@ SPELL_INNER_FOCUS
Definition PlayerAI.cpp:192
@ SPELL_POWER_WORD_SHIELD
Definition PlayerAI.cpp:193
@ SPELL_TOTEM_OF_WRATH
Definition PlayerAI.cpp:258
@ SPELL_CONSECRATION
Definition PlayerAI.cpp:98
@ SPELL_MARK_OF_BLOOD
Definition PlayerAI.cpp:232
@ SPELL_COMBUSTION
Definition PlayerAI.cpp:304
@ SPELL_HAND_OF_SACRIFICE
Definition PlayerAI.cpp:92
@ SPELL_FLASH_OF_LIGHT
Definition PlayerAI.cpp:99
@ AURA_FROST_FEVER
Definition PlayerAI.cpp:221
@ SPELL_MOONKIN_FORM
Definition PlayerAI.cpp:359
@ SPELL_DEATH_COIL_DK
Definition PlayerAI.cpp:218
@ SPELL_DEATH_AND_DECAY
Definition PlayerAI.cpp:247
@ SPELL_SHADOW_WORD_PAIN
Definition PlayerAI.cpp:208
@ SPELL_WILD_GROWTH
Definition PlayerAI.cpp:385
@ SPELL_BLAST_WAVE
Definition PlayerAI.cpp:309
@ SPELL_CRUSADER_STRIKE
Definition PlayerAI.cpp:115
@ SPELL_THUNDER_CLAP
Definition PlayerAI.cpp:58
@ SPELL_MORTAL_STRIKE
Definition PlayerAI.cpp:53
@ SPELL_SHADOW_PROTECTION
Definition PlayerAI.cpp:181
@ AURA_ECLIPSE_LUNAR
Definition PlayerAI.cpp:362
@ SPELL_SURVIVAL_INSTINCTS
Definition PlayerAI.cpp:369
@ SPELL_EARTH_SHIELD
Definition PlayerAI.cpp:278
@ SPELL_RECKLESSNESS
Definition PlayerAI.cpp:67
@ SPELL_INTERCEPT
Definition PlayerAI.cpp:44
@ SPELL_HOLY_SHOCK
Definition PlayerAI.cpp:96
@ SPELL_TIGER_FURY
Definition PlayerAI.cpp:377
@ SPELL_FIREBALL
Definition PlayerAI.cpp:306
@ SPELL_SHADOW_BOLT
Definition PlayerAI.cpp:325
@ SPELL_EVOCATION
Definition PlayerAI.cpp:286
@ AURA_ARCANE_BLAST
Definition PlayerAI.cpp:298
@ SPELL_STEADY_SHOT
Definition PlayerAI.cpp:139
@ SPELL_LIVING_BOMB
Definition PlayerAI.cpp:305
@ SPELL_FLAME_SHOCK
Definition PlayerAI.cpp:262
@ SPELL_DIVINE_SHIELD
Definition PlayerAI.cpp:88
@ SPELL_LESSER_HEAL_WAVE
Definition PlayerAI.cpp:281
@ SPELL_HEALING_TOUCH
Definition PlayerAI.cpp:389
@ SPELL_LIGHTNING_BOLT
Definition PlayerAI.cpp:260
@ SPELL_UNBREAKABLE_ARMOR
Definition PlayerAI.cpp:239
@ SPELL_HAMMER_OF_WRATH
Definition PlayerAI.cpp:118
@ SPELL_HEART_STRIKE
Definition PlayerAI.cpp:229
@ SPELL_MIND_FREEZE
Definition PlayerAI.cpp:219
@ SPELL_CURSE_OF_AGONY
Definition PlayerAI.cpp:334
@ SPELL_TIDAL_FORCE
Definition PlayerAI.cpp:282
@ SPELL_AURA_MASTERY
Definition PlayerAI.cpp:83
@ SPELL_AIMED_SHOT
Definition PlayerAI.cpp:135
@ SPELL_REJUVENATION
Definition PlayerAI.cpp:390
@ SPELL_BLOODRAGE
Definition PlayerAI.cpp:49
@ SPELL_MAIM
Definition PlayerAI.cpp:380
@ SPELL_SHA_NATURE_SWIFT
Definition PlayerAI.cpp:276
@ PASSIVE_SOUL_WARDING
Definition PlayerAI.cpp:188
@ SPELL_THROW
Definition PlayerAI.cpp:36
@ SPELL_ICY_TOUCH
Definition PlayerAI.cpp:220
@ SPELL_ICE_LANCE
Definition PlayerAI.cpp:318
@ SPELL_LAY_ON_HANDS
Definition PlayerAI.cpp:84
@ SPELL_VANISH
Definition PlayerAI.cpp:153
@ SPELL_IMMOLATE
Definition PlayerAI.cpp:327
@ SPELL_MANGLE_CAT
Definition PlayerAI.cpp:372
@ SPELL_VIGILANCE
Definition PlayerAI.cpp:71
@ SPELL_RENEW
Definition PlayerAI.cpp:200
@ SPELL_CAT_FORM
Definition PlayerAI.cpp:368
@ PASSIVE_BEAST_WITHIN
Definition PlayerAI.cpp:131
@ SPELL_CORRUPTION
Definition PlayerAI.cpp:323
@ SPELL_PIERCING_HOWL
Definition PlayerAI.cpp:68
@ SPELL_VIPER_STING
Definition PlayerAI.cpp:127
@ SPELL_MIND_FLAY
Definition PlayerAI.cpp:206
@ SPELL_DRAIN_SOUL
Definition PlayerAI.cpp:335
@ SPELL_PREPARATION
Definition PlayerAI.cpp:174
@ SPELL_HEALING_WAVE
Definition PlayerAI.cpp:280
@ SPELL_CHAOS_BOLT
Definition PlayerAI.cpp:350
@ SPELL_SHOCKWAVE
Definition PlayerAI.cpp:73
@ SPELL_DEATH_GRIP
Definition PlayerAI.cpp:213
@ SPELL_ANTI_MAGIC_SHELL
Definition PlayerAI.cpp:217
@ SPELL_ICY_VEINS
Definition PlayerAI.cpp:312
@ SPELL_FROST_NOVA
Definition PlayerAI.cpp:315
@ SPELL_RIGHTEOUS_FURY
Definition PlayerAI.cpp:110
@ SPELL_HAUNT
Definition PlayerAI.cpp:333
@ SPELL_BLADESTORM
Definition PlayerAI.cpp:54
@ SPELL_WRATH
Definition PlayerAI.cpp:365
@ SPELL_CHAIN_LIGHTNING
Definition PlayerAI.cpp:264
@ PASSIVE_SPIRIT_REDEMPTION
Definition PlayerAI.cpp:196
@ SPELL_SUMMON_GARGOYLE
Definition PlayerAI.cpp:249
@ SPELL_HEMORRHAGE
Definition PlayerAI.cpp:171
@ SPELL_HUNGER_FOR_BLOOD
Definition PlayerAI.cpp:160
@ SPELL_SHIELD_SLAM
Definition PlayerAI.cpp:78
@ SPELL_REND
Definition PlayerAI.cpp:55
@ SPELL_DIVINE_STORM
Definition PlayerAI.cpp:116
@ SPELL_HAND_OF_FREEDOM
Definition PlayerAI.cpp:90
@ SPELL_MULTI_SHOT
Definition PlayerAI.cpp:126
@ SPELL_SWEEPING_STRIKES
Definition PlayerAI.cpp:52
@ SPELL_HAMMER_OF_RIGHTEOUS
Definition PlayerAI.cpp:109
@ PASSIVE_BEAST_MASTERY
Definition PlayerAI.cpp:132
@ SPELL_KILL_SHOT
Definition PlayerAI.cpp:125
@ SPELL_FOCUS_MAGIC
Definition PlayerAI.cpp:294
@ SPELL_SHADOWFURY
Definition PlayerAI.cpp:351
@ SPELL_FROST_STRIKE
Definition PlayerAI.cpp:237
@ SPELL_NOURISH
Definition PlayerAI.cpp:388
@ SPELL_HYMN_OF_HOPE
Definition PlayerAI.cpp:183
@ SPELL_DIVINE_SPIRIT
Definition PlayerAI.cpp:180
@ SPELL_EMPOWER_RUNE_WEAP
Definition PlayerAI.cpp:215
@ SPELL_COLD_BLOOD
Definition PlayerAI.cpp:158
@ SPELL_DISMANTLE
Definition PlayerAI.cpp:150
@ SPELL_DIVINE_HYMN
Definition PlayerAI.cpp:182
@ SPELL_GROUNDING_TOTEM
Definition PlayerAI.cpp:254
@ SPELL_ICE_BARRIER
Definition PlayerAI.cpp:313
@ SPELL_BERSERK
Definition PlayerAI.cpp:371
@ SPELL_BLOODTHIRST
Definition PlayerAI.cpp:62
@ SPELL_PESTILENCE
Definition PlayerAI.cpp:224
@ SPELL_PRESENCE_OF_MIND
Definition PlayerAI.cpp:300
@ SPELL_FEAR_WARD
Definition PlayerAI.cpp:178
@ SPELL_SHADOWBURN
Definition PlayerAI.cpp:348
@ SPELL_ELEMENTAL_MASTERY
Definition PlayerAI.cpp:265
@ SPELL_DAMPEN_MAGIC
Definition PlayerAI.cpp:285
@ SPELL_KILLING_SPREE
Definition PlayerAI.cpp:167
@ SPELL_ICEBORN_FORTITUDE
Definition PlayerAI.cpp:216
@ SPELL_RIP
Definition PlayerAI.cpp:375
@ SPELL_DEVOURING_PLAGUE
Definition PlayerAI.cpp:209
@ SPELL_SHIELD_BLOCK
Definition PlayerAI.cpp:77
@ SPELL_INTIMIDATING_SHOUT
Definition PlayerAI.cpp:46
@ SPELL_SHADOW_DANCE
Definition PlayerAI.cpp:173
@ SPELL_RUNE_TAP
Definition PlayerAI.cpp:227
@ SPELL_DEVASTATE
Definition PlayerAI.cpp:72
@ SPELL_MUTILATE
Definition PlayerAI.cpp:159
@ SPELL_HOLY_SHIELD
Definition PlayerAI.cpp:106
@ PASSIVE_MASTER_OF_GHOUL
Definition PlayerAI.cpp:245
@ SPELL_POWER_WORD_FORT
Definition PlayerAI.cpp:179
@ SPELL_HAND_OF_PROTECTION
Definition PlayerAI.cpp:91
@ SPELL_PYROBLAST
Definition PlayerAI.cpp:303
@ SPELL_FIRE_BLAST
Definition PlayerAI.cpp:307
@ SPELL_SPELL_REFLECTION
Definition PlayerAI.cpp:80
@ SPELL_SHADOW_WORD_DEATH
Definition PlayerAI.cpp:184
@ SPELL_EARTH_SHOCK
Definition PlayerAI.cpp:261
@ SPELL_REGROWTH
Definition PlayerAI.cpp:391
@ SPELL_DIVINE_SACRIFICE
Definition PlayerAI.cpp:108
@ SPELL_SEAL_OF_COMMAND
Definition PlayerAI.cpp:114
@ SPELL_BESTIAL_WRATH
Definition PlayerAI.cpp:130
@ SPELL_READINESS
Definition PlayerAI.cpp:140
@ SPELL_DEATHCHILL
Definition PlayerAI.cpp:241
@ SPELL_JUDGEMENT
Definition PlayerAI.cpp:117
@ SPELL_ARCANE_BLAST
Definition PlayerAI.cpp:297
@ SPELL_SWIFTMEND
Definition PlayerAI.cpp:383
@ AURA_MOLTEN_CORE
Definition PlayerAI.cpp:344
@ SPELL_MANA_TIDE_TOTEM
Definition PlayerAI.cpp:277
@ SPELL_EXPLOSIVE_TRAP
Definition PlayerAI.cpp:122
@ SPELL_PSYCHIC_SCREAM
Definition PlayerAI.cpp:185
@ SPELL_STARFALL
Definition PlayerAI.cpp:360
@ SPELL_TREE_OF_LIFE
Definition PlayerAI.cpp:384
@ SPELL_TRANQUILITY
Definition PlayerAI.cpp:387
@ SPELL_WYVERN_STING
Definition PlayerAI.cpp:145
@ SPELL_ARCANE_MISSILES
Definition PlayerAI.cpp:299
@ SPELL_DISARM
Definition PlayerAI.cpp:75
@ SPELL_FREEZING_ARROW
Definition PlayerAI.cpp:123
@ SPELL_INNERVATE
Definition PlayerAI.cpp:355
@ SPELL_OBLITERATE
Definition PlayerAI.cpp:240
@ SPELL_INCINERATE
Definition PlayerAI.cpp:326
@ SPELL_BERSERKER_STANCE
Definition PlayerAI.cpp:41
@ SPELL_HOLY_LIGHT
Definition PlayerAI.cpp:100
@ SPELL_BLESS_OF_SANC
Definition PlayerAI.cpp:105
static const float CASTER_CHASE_DISTANCE
@ EQUIPMENT_SLOT_RANGED
Definition Player.h:569
#define INVENTORY_SLOT_BAG_0
Definition Player.h:547
uint32 urand(uint32 min, uint32 max)
Definition Random.cpp:42
@ SPEC_WARRIOR_PROTECTION
@ SPEC_WARRIOR_FURY
@ SPEC_PALADIN_RETRIBUTION
@ SPEC_WARLOCK_DEMONOLOGY
@ SPEC_ROGUE_COMBAT
@ SPEC_DRUID_BALANCE
@ SPEC_PRIEST_SHADOW
@ SPEC_PALADIN_PROTECTION
@ SPEC_DRUID_RESTORATION
@ SPEC_MAGE_FIRE
@ SPEC_DEATH_KNIGHT_FROST
@ SPEC_HUNTER_BEAST_MASTERY
@ SPEC_DEATH_KNIGHT_UNHOLY
@ SPEC_DEATH_KNIGHT_BLOOD
@ SPEC_ROGUE_SUBLETY
@ SPEC_PRIEST_HOLY
@ SPEC_SHAMAN_ELEMENTAL
@ SPEC_HUNTER_MARKSMANSHIP
@ SPEC_MAGE_FROST
@ SPEC_WARRIOR_ARMS
@ SPEC_DRUID_FERAL
@ SPEC_MAGE_ARCANE
@ SPEC_WARLOCK_DESTRUCTION
@ SPEC_SHAMAN_RESTORATION
@ SPEC_PRIEST_DISCIPLINE
@ SPEC_HUNTER_SURVIVAL
@ SPEC_PALADIN_HOLY
@ SPEC_ROGUE_ASSASSINATION
@ SPEC_WARLOCK_AFFLICTION
@ SPEC_SHAMAN_ENHANCEMENT
@ RANGED_ATTACK
@ CLASS_HUNTER
@ CLASS_DRUID
@ CLASS_SHAMAN
@ CLASS_PRIEST
@ CLASS_WARRIOR
@ CLASS_WARLOCK
@ CLASS_MAGE
@ CLASS_DEATH_KNIGHT
@ CLASS_PALADIN
@ CLASS_ROGUE
@ POWER_MANA
@ SPELL_ATTR0_CANT_CANCEL
@ AURA_STATE_FROZEN
@ SPELL_CAST_OK
@ AURA_REMOVE_BY_CANCEL
@ SPELL_AURA_MOD_SHAPESHIFT
@ SPELL_AURA_MOD_CHARM
@ TRIGGERED_CAST_DIRECTLY
Will ignore combo point requirement.
@ TRIGGERED_NONE
#define sSpellMgr
Definition SpellMgr.h:738
@ UNIT_STATE_CHASE
Definition Unit.h:225
@ UNIT_STATE_CANNOT_TURN
Definition Unit.h:264
@ UNIT_STATE_CASTING
Definition Unit.h:235
#define SPELL_FLASH_HEAL
#define SPELL_POWER_WORD_SHIELD
SpellInfo const * GetSpellInfo() const
Definition SpellAuras.h:115
bool IsEngaged() const override
bool IsInEvadeMode() const
Definition Creature.h:146
Definition Item.h:62
ItemTemplate const * GetTemplate() const
Definition Item.cpp:535
uint32 Size() const
void MovePoint(uint32 id, Position const &pos, bool generatePath=true, Optional< float > finalOrient={})
void MoveFollow(Unit *target, float dist, ChaseAngle angle, MovementSlot slot=MOTION_SLOT_ACTIVE)
void Remove(MovementGenerator *movement, MovementSlot slot=MOTION_SLOT_ACTIVE)
bool IsCreature() const
Definition ObjectGuid.h:173
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:78
void DoRangedAttackIfReady()
Definition PlayerAI.cpp:525
virtual Unit * SelectAttackTarget() const
Definition PlayerAI.cpp:610
uint8 GetSpec(Player const *who=nullptr) const
Definition PlayerAI.cpp:409
void VerifyAndPushSpellCast(PossibleSpellVector &spells, uint32 spellId, T target, uint32 weight)
Definition PlayerAI.h:70
std::pair< TargetedSpell, uint32 > PossibleSpell
Definition PlayerAI.h:49
void DoCastAtTarget(TargetedSpell spell)
Definition PlayerAI.cpp:518
void DoAutoAttackIfReady()
Definition PlayerAI.cpp:579
TargetedSpell SelectSpellCast(PossibleSpellVector &spells)
Definition PlayerAI.cpp:489
Player *const me
Definition PlayerAI.h:52
TargetedSpell VerifySpellCast(uint32 spellId, Unit *target)
Definition PlayerAI.cpp:424
PlayerAI(Player *player)
Definition PlayerAI.cpp:395
@ TARGET_VICTIM
Definition PlayerAI.h:58
@ TARGET_NONE
Definition PlayerAI.h:57
@ TARGET_SELF
Definition PlayerAI.h:60
@ TARGET_CHARMER
Definition PlayerAI.h:59
uint8 const _selfSpec
Definition PlayerAI.h:90
bool const _isSelfHealer
Definition PlayerAI.h:91
bool _isSelfRangedAttacker
Definition PlayerAI.h:92
bool IsRangedAttacker(Player const *who=nullptr) const
Definition PlayerAI.cpp:419
std::vector< PossibleSpell > PossibleSpellVector
Definition PlayerAI.h:50
void CancelAllShapeshifts()
Definition PlayerAI.cpp:587
bool IsHealer(Player const *who=nullptr) const
Definition PlayerAI.cpp:414
Creature * GetCharmer() const
Definition PlayerAI.cpp:402
Item * GetItemByPos(uint16 pos) const
Definition Player.cpp:9552
bool HasSpell(uint32 spell) const override
Definition Player.cpp:3853
void OnCharmed(bool isNew) override
bool CanAIAttack(Unit const *who) const override
Definition PlayerAI.cpp:625
TargetedSpell SelectAppropriateCastForSpec()
Definition PlayerAI.cpp:646
void UpdateAI(uint32 diff) override
Unit * SelectAttackTarget() const override
Definition PlayerAI.cpp:635
void SetUnitTarget(Unit *target)
Definition Spell.cpp:237
bool HasGlobalCooldown(SpellInfo const *spellInfo) const
bool IsPassive() const
bool HasAttribute(SpellAttr0 attribute) const
Definition SpellInfo.h:375
bool IsPositive() const
Definition Spell.h:152
SpellCastResult prepare(SpellCastTargets const &targets, AuraEffect const *triggeredByAura=nullptr)
Definition Spell.cpp:3070
SpellCastResult CheckPetCast(Unit *target)
Definition Spell.cpp:6196
bool CanAutoCast(Unit *target)
Definition Spell.cpp:6470
void AttackStartCaster(Unit *victim, float dist)
Definition UnitAI.cpp:48
void DoMeleeAttackIfReady()
Definition UnitAI.cpp:54
virtual bool CanAIAttack(Unit const *) const
Definition UnitAI.h:139
virtual ObjectGuid GetGUID(int32=0) const
Definition UnitAI.h:158
virtual void OnCharmed(bool isNew)
Definition UnitAI.cpp:42
virtual void AttackStart(Unit *)
Definition UnitAI.cpp:30
Definition Unit.h:769
bool IsStopped() const
Definition Unit.h:1671
void CastStop(uint32 except_spellid=0)
Definition Unit.cpp:988
bool IsWithinMeleeRange(Unit const *obj) const
Definition Unit.h:844
bool IsCharmed() const
Definition Unit.h:1280
void RemoveOwnedAura(AuraMap::iterator &i, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:3561
AuraEffectList const & GetAuraEffectsByType(AuraType type) const
Definition Unit.h:1384
void KillSelf(bool durabilityLoss=true)
Definition Unit.h:1023
Aura * GetAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition Unit.cpp:4439
bool HasBreakableByDamageCrowdControlAura(Unit *excludeCasterChannel=nullptr) const
Definition Unit.cpp:693
uint8 GetClass() const
Definition Unit.h:895
Unit * GetCharmer() const
Definition Unit.h:1253
MotionMaster * GetMotionMaster()
Definition Unit.h:1667
Powers GetPowerType() const
Definition Unit.h:931
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition Unit.cpp:4535
bool HasAuraState(AuraStateType flag, SpellInfo const *spellProto=nullptr, Unit const *Caster=nullptr) const
Definition Unit.cpp:5815
AuraApplication * GetAuraApplicationOfRankedSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraApplication *except=nullptr) const
Definition Unit.cpp:4445
Unit * GetVictim() const
Definition Unit.h:859
bool HasUnitState(const uint32 f) const
Definition Unit.h:876
void SetFacingTo(float ori, bool force=true, uint32 movementId=EVENT_FACE)
Definition Unit.cpp:13250
uint8 GetComboPoints(Unit const *who=nullptr) const
--------—Combo point system----------------—
Definition Unit.h:1695
SpellHistory * GetSpellHistory()
Definition Unit.h:1484
ObjectGuid GetCharmerGUID() const
Definition Unit.h:1252
bool isAttackReady(WeaponAttackType type=BASE_ATTACK) const
Definition Unit.h:835
void resetAttackTimer(WeaponAttackType type=BASE_ATTACK)
Definition Unit.cpp:598
bool AttackStop()
Definition Unit.cpp:5645
bool IsValidAttackTarget(WorldObject const *target, SpellInfo const *bySpell=nullptr) const
Definition Object.cpp:2856
bool IsWithinLOSInMap(WorldObject const *obj, LineOfSightChecks checks=LINEOFSIGHT_ALL_CHECKS, VMAP::ModelIgnoreFlags ignoreFlags=VMAP::ModelIgnoreFlags::Nothing) const
Definition Object.cpp:1226
TC_GAME_API Creature * GetCreature(WorldObject const &u, ObjectGuid const &guid)
TC_GAME_API uint8 GetPlayerSpecialization(Player const *who)
bool IsPlayerRangedAttacker(Player const *who)
TC_GAME_API bool IsPlayerHealer(Player const *who)
float GetOrientation() const
Definition Position.h:82
float GetAbsoluteAngle(float x, float y) const
Definition Position.h:128
void GetPosition(float &x, float &y) const
Definition Position.h:84
ValidTargetSelectPredicate(UnitAI const *ai)
Definition PlayerAI.cpp:617
UnitAI const *const _ai
Definition PlayerAI.cpp:618
bool operator()(Unit const *target) const
Definition PlayerAI.cpp:619