TrinityCore
Loading...
Searching...
No Matches
boss_blood_queen_lana_thel.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 "icecrown_citadel.h"
19#include "Containers.h"
20#include "GridNotifiers.h"
21#include "InstanceScript.h"
22#include "Map.h"
23#include "MotionMaster.h"
24#include "ObjectAccessor.h"
25#include "Player.h"
26#include "ScriptedCreature.h"
27#include "ScriptMgr.h"
28#include "SpellAuraEffects.h"
29#include "SpellMgr.h"
30#include "SpellScript.h"
31
48
79
87
89{
90 {70867, 71473, 71532, 71533},
91 {70879, 71525, 71530, 71531},
92 {70877, 71474, 70877, 71474},
93};
94
95#define ESSENCE_OF_BLOOD_QUEEN RAID_MODE<uint32>(70867, 71473, 71532, 71533)
96#define ESSENCE_OF_BLOOD_QUEEN_PLR RAID_MODE<uint32>(70879, 71525, 71530, 71531)
97#define FRENZIED_BLOODTHIRST RAID_MODE<uint32>(70877, 71474, 70877, 71474)
98#define DELIRIOUS_SLASH RAID_MODE<uint32>(71623, 71624, 71625, 71626)
99#define PRESENCE_OF_THE_DARKFALLEN RAID_MODE<uint32>(70994, 71962, 71963, 71964)
100
117
123
131
132Position const centerPos = {4595.7090f, 2769.4190f, 400.6368f, 0.000000f};
133Position const airPos = {4595.7090f, 2769.4190f, 422.3893f, 0.000000f};
134Position const mincharPos = {4629.3711f, 2782.6089f, 424.6390f, 0.000000f};
135
136bool IsVampire(Unit const* unit)
137{
138 for (uint8 i = 0; i < 3; ++i)
139 if (unit->HasAura(vampireAuras[i][unit->GetMap()->GetSpawnMode()]))
140 return true;
141 return false;
142}
143
144// 37955 - Blood-Queen Lana'thel
146{
151
153 {
156 _killMinchar = false;
157 }
158
174
195
196 void JustDied(Unit* /*killer*/) override
197 {
198 _JustDied();
200
203
204 CleanAuras();
205
206 // Blah, credit the quest
208 {
210 if (Player* player = me->GetLootRecipient())
211 player->RewardPlayerAndGroupAtEvent(Is25ManRaid() ? NPC_INFILTRATOR_MINCHAR_BQ_25 : NPC_INFILTRATOR_MINCHAR_BQ, player);
213 {
214 minchar->SetEmoteState(EMOTE_ONESHOT_NONE);
215 minchar->SetAnimTier(AnimTier::Ground);
216 minchar->SetCanFly(false);
217 minchar->RemoveAllAuras();
218 minchar->GetMotionMaster()->MoveCharge(4629.3711f, 2782.6089f, 401.5301f, SPEED_CHARGE / 3.0f);
219 }
220 }
221 }
222
236
237 void DoAction(int32 action) override
238 {
239 if (action != ACTION_KILL_MINCHAR)
240 return;
241
243 _killMinchar = true;
244 else
245 {
246 me->SetDisableGravity(true);
248 }
249 }
250
251 void EnterEvadeMode(EvadeReason why) override
252 {
253 if (!_EnterEvadeMode(why))
254 return;
255
256 CleanAuras();
257 if (_killMinchar)
258 {
259 _killMinchar = false;
260 me->SetDisableGravity(true);
262 }
263 else
264 {
267 Reset();
268 }
269 }
270
279
280 void KilledUnit(Unit* victim) override
281 {
282 if (victim->GetTypeId() == TYPEID_PLAYER)
283 Talk(SAY_KILL);
284 }
285
286 void SetGUID(ObjectGuid const& guid, int32 id) override
287 {
288 switch (id)
289 {
290 case GUID_VAMPIRE:
291 _vampires.insert(guid);
292 break;
293 case GUID_BLOODBOLT:
294 _bloodboltedPlayers.insert(guid);
295 break;
296 default:
297 break;
298 }
299 }
300
301 void MovementInform(uint32 type, uint32 id) override
302 {
303 if (type != POINT_MOTION_TYPE)
304 return;
305
306 switch (id)
307 {
308 case POINT_CENTER:
310 events.ScheduleEvent(EVENT_AIR_PHASE, 100s + (Is25ManRaid() ? 0s : 20s));
314 break;
315 case POINT_AIR:
316 _bloodboltedPlayers.clear();
320 break;
321 case POINT_GROUND:
322 me->SetDisableGravity(false);
324 if (Unit* victim = me->SelectVictim())
325 AttackStart(victim);
327 break;
328 case POINT_MINCHAR:
329 DoCast(me, SPELL_ANNIHILATE, true);
330 // already in evade mode
332 Reset();
333 break;
334 default:
335 break;
336 }
337 }
338
339 void UpdateAI(uint32 diff) override
340 {
341 if (!UpdateVictim())
342 return;
343
344 events.Update(diff);
345
347 return;
348
349 while (uint32 eventId = events.ExecuteEvent())
350 {
351 switch (eventId)
352 {
353 case EVENT_BERSERK:
357 break;
359 {
360 std::list<Player*> targets;
361 SelectRandomTarget(false, &targets);
362 if (!targets.empty())
363 {
364 Unit* target = targets.front();
368 _vampires.insert(target->GetGUID());
371 }
372 break;
373 }
375 {
376 // victim can be nullptr when this is processed in the same update tick as EVENT_AIR_PHASE
377 if (me->GetVictim())
378 {
379 Player* newOfftank = SelectRandomTarget(true);
380 if (newOfftank)
381 {
382 if (_offtankGUID != newOfftank->GetGUID())
383 {
384 _offtankGUID = newOfftank->GetGUID();
385
386 // both spells have SPELL_ATTR5_SINGLE_TARGET_SPELL, no manual removal needed
387 newOfftank->CastSpell(me->GetVictim(), SPELL_BLOOD_MIRROR_DAMAGE, true);
388 me->EnsureVictim()->CastSpell(newOfftank, SPELL_BLOOD_MIRROR_DUMMY, true);
391 newOfftank->HasAura(SPELL_UNSATED_CRAVING) && !newOfftank->HasAura(SPELL_THIRST_QUENCHED) &&
392 !newOfftank->HasAura(SPELL_GUSHING_WOUND))
393 newOfftank->CastSpell(newOfftank, SPELL_GUSHING_WOUND, TRIGGERED_FULL_MASK);
394
395 }
396 }
397 else
399 }
401 break;
402 }
406 DoCast(_offtank, SPELL_DELIRIOUS_SLASH);
408 break;
410 {
411 std::list<Player*> targets;
412 SelectRandomTarget(false, &targets);
414 if (targets.size() > 1)
415 {
417 for (std::list<Player*>::iterator itr = targets.begin(); itr != targets.end(); ++itr)
419 }
421 break;
422 }
424 if (Player* target = SelectRandomTarget(false))
425 {
429 }
431 break;
433 {
434 std::list<Player*> targets;
435 SelectRandomTarget(false, &targets);
437 for (std::list<Player*>::iterator itr = targets.begin(); itr != targets.end(); ++itr)
441 break;
442 }
443 case EVENT_AIR_PHASE:
444 DoStopAttack();
449 break;
451 me->SetDisableGravity(true);
453 break;
456 break;
457 default:
458 break;
459 }
460
462 return;
463 }
464
466 }
467
468 bool WasVampire(ObjectGuid guid) const
469 {
470 return _vampires.count(guid) != 0;
471 }
472
473 bool WasBloodbolted(ObjectGuid guid) const
474 {
475 return _bloodboltedPlayers.count(guid) != 0;
476 }
477
478private:
479 // offtank for this encounter is the player standing closest to main tank
480 Player* SelectRandomTarget(bool includeOfftank, std::list<Player*>* targetList = nullptr)
481 {
483 return nullptr;
484
485 std::list<Player*> tempTargets;
486 Unit* maintank = me->GetThreatManager().GetCurrentVictim();
488 if (Player* refTarget = ref->GetVictim()->ToPlayer())
489 if (refTarget != maintank && (includeOfftank || (refTarget->GetGUID() != _offtankGUID)))
490 tempTargets.push_back(refTarget->ToPlayer());
491
492 if (tempTargets.empty())
493 return nullptr;
494
495 if (targetList)
496 {
497 *targetList = std::move(tempTargets);
498 return nullptr;
499 }
500
501 if (includeOfftank)
502 {
503 tempTargets.sort(Trinity::ObjectDistanceOrderPred(me->GetVictim()));
504 return tempTargets.front();
505 }
506
508 }
509
515};
516
517// helper for shortened code
519
520// 70946, 71475, 71476, 71477 - Vampiric Bite
522{
524
529
540
541 void OnCast(SpellMissInfo missInfo)
542 {
543 if (GetCaster()->GetTypeId() != TYPEID_PLAYER || missInfo != SPELL_MISS_NONE)
544 return;
545
546 uint32 spellId = sSpellMgr->GetSpellIdForDifficulty(SPELL_FRENZIED_BLOODTHIRST, GetCaster());
549
550 // Shadowmourne questline
551 if (Aura* aura = GetCaster()->GetAura(SPELL_GUSHING_WOUND))
552 {
553 if (aura->GetStackAmount() == 3)
554 {
556 GetCaster()->RemoveAura(aura);
557 }
558 else
560 }
561
562 if (InstanceScript* instance = GetCaster()->GetInstanceScript())
563 if (Creature* bloodQueen = ObjectAccessor::GetCreature(*GetCaster(), instance->GetGuidData(DATA_BLOOD_QUEEN_LANA_THEL)))
564 bloodQueen->AI()->SetGUID(GetHitUnit()->GetGUID(), GUID_VAMPIRE);
565 }
566
572
579};
580
581// 70877, 71474 - Frenzied Bloodthirst
583{
585
586 void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
587 {
588 if (InstanceScript* instance = GetTarget()->GetInstanceScript())
589 if (Creature* bloodQueen = ObjectAccessor::GetCreature(*GetTarget(), instance->GetGuidData(DATA_BLOOD_QUEEN_LANA_THEL)))
590 bloodQueen->AI()->Talk(EMOTE_BLOODTHIRST, GetTarget());
591 }
592
593 void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
594 {
595 Unit* target = GetTarget();
596 if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE)
597 if (InstanceScript* instance = target->GetInstanceScript())
598 if (Creature* bloodQueen = ObjectAccessor::GetCreature(*target, instance->GetGuidData(DATA_BLOOD_QUEEN_LANA_THEL)))
599 {
600 // this needs to be done BEFORE charm aura or we hit an assert in Unit::SetCharmedBy
601 if (target->GetVehicleKit())
602 target->RemoveVehicleKit();
603
604 bloodQueen->AI()->Talk(SAY_MIND_CONTROL);
605 bloodQueen->CastSpell(target, SPELL_UNCONTROLLABLE_FRENZY, true);
606 }
607 }
608
614};
615
617{
618 public:
619 explicit BloodboltHitCheck(LanaThelAI* ai) : _ai(ai) { }
620
621 bool operator()(WorldObject* object) const
622 {
623 return _ai->WasBloodbolted(object->GetGUID());
624 }
625
626 private:
628};
629
630// 71899, 71900, 71901, 71902 - Bloodbolt Whirl
632{
634
635 bool Validate(SpellInfo const* /*spell*/) override
636 {
638 }
639
640 bool Load() override
641 {
643 }
644
645 void FilterTargets(std::list<WorldObject*>& targets)
646 {
647 uint32 targetCount = (targets.size() + 2) / 3;
648 targets.remove_if(BloodboltHitCheck(static_cast<LanaThelAI*>(GetCaster()->GetAI())));
649 Trinity::Containers::RandomResize(targets, targetCount);
650 // mark targets now, effect hook has missile travel time delay (might cast next in that time)
651 for (std::list<WorldObject*>::const_iterator itr = targets.begin(); itr != targets.end(); ++itr)
652 GetCaster()->GetAI()->SetGUID((*itr)->GetGUID(), GUID_BLOODBOLT);
653 }
654
660
666};
667
668// 70871 - Essence of the Blood Queen
670{
672
673 bool Validate(SpellInfo const* /*spellInfo*/) override
674 {
676 }
677
678 void OnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
679 {
681 DamageInfo* damageInfo = eventInfo.GetDamageInfo();
682 if (!damageInfo || !damageInfo->GetDamage())
683 return;
684
685 CastSpellExtraArgs args(aurEff);
686 args.AddSpellBP0(CalculatePct(damageInfo->GetDamage(), aurEff->GetAmount()));
688 }
689
694};
695
696// 71390 - Pact of the Darkfallen
698{
700
701 void FilterTargets(std::list<WorldObject*>& targets)
702 {
703 targets.remove_if(Trinity::UnitAuraCheck(false, SPELL_PACT_OF_THE_DARKFALLEN));
704
705 bool remove = true;
706 std::list<WorldObject*>::const_iterator itrEnd = targets.end(), itr, itr2;
707 // we can do this, unitList is MAX 4 in size
708 for (itr = targets.begin(); itr != itrEnd && remove; ++itr)
709 {
710 if (!GetCaster()->IsWithinDist(*itr, 5.0f, false))
711 remove = false;
712
713 for (itr2 = targets.begin(); itr2 != itrEnd && remove; ++itr2)
714 if (itr != itr2 && !(*itr2)->IsWithinDist(*itr, 5.0f, false))
715 remove = false;
716 }
717
718 if (remove)
719 {
720 if (InstanceScript* instance = GetCaster()->GetInstanceScript())
721 {
722 instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_PACT_OF_THE_DARKFALLEN);
723 targets.clear();
724 }
725 }
726 }
727
732};
733
734// 71340 - Pact of the Darkfallen
736{
738
739 bool Validate(SpellInfo const* /*spell*/) override
740 {
742 }
743
744 // this is an additional effect to be executed
745 void PeriodicTick(AuraEffect const* aurEff)
746 {
747 SpellInfo const* damageSpell = sSpellMgr->AssertSpellInfo(SPELL_PACT_OF_THE_DARKFALLEN_DAMAGE);
748 int32 damage = damageSpell->GetEffect(EFFECT_0).CalcValue();
749 float multiplier = 0.3375f + 0.1f * uint32(aurEff->GetTickNumber()/10); // do not convert to 0.01f - we need tick number/10 as INT (damage increases every 10 ticks)
750 damage = int32(damage * multiplier);
751
753 args.AddSpellBP0(damage);
755 }
756
761};
762
763// 71341 - Pact of the Darkfallen
779
780// 71446, 71478, 71479, 71480 - Twilight Bloodbolt
782{
784
785 void HandleResistance(DamageInfo const& damageInfo, uint32& resistAmount, int32& /*absorbAmount*/)
786 {
787 Unit* caster = damageInfo.GetAttacker();;
788 Unit* target = damageInfo.GetVictim();
789 uint32 damage = damageInfo.GetDamage();
790 uint32 resistedDamage = Unit::CalcSpellResistedDamage(caster, target, damage, SPELL_SCHOOL_MASK_SHADOW, nullptr);
791 resistedDamage += Unit::CalcSpellResistedDamage(caster, target, damage, SPELL_SCHOOL_MASK_ARCANE, nullptr);
792 resistAmount = resistedDamage;
793 }
794
799};
800
802{
803 public:
804 achievement_once_bitten_twice_shy_n() : AchievementCriteriaScript("achievement_once_bitten_twice_shy_n") { }
805
806 bool OnCheck(Player* source, Unit* target) override
807 {
808 if (!target)
809 return false;
810
811 if (LanaThelAI* lanaThelAI = CAST_AI(LanaThelAI, target->GetAI()))
812 return !lanaThelAI->WasVampire(source->GetGUID());
813 return false;
814 }
815};
816
818{
819 public:
820 achievement_once_bitten_twice_shy_v() : AchievementCriteriaScript("achievement_once_bitten_twice_shy_v") { }
821
822 bool OnCheck(Player* source, Unit* target) override
823 {
824 if (!target)
825 return false;
826
827 if (LanaThelAI* lanaThelAI = CAST_AI(LanaThelAI, target->GetAI()))
828 return lanaThelAI->WasVampire(source->GetGUID());
829 return false;
830 }
831};
832
#define MAX_DIFFICULTY
Definition DBCEnums.h:296
uint8_t uint8
Definition Define.h:135
int32_t int32
Definition Define.h:129
uint32_t uint32
Definition Define.h:133
@ IN_PROGRESS
@ FAIL
@ DONE
@ POINT_MOTION_TYPE
#define SPEED_CHARGE
@ TYPEID_PLAYER
Definition ObjectGuid.h:39
std::set< ObjectGuid > GuidSet
Definition ObjectGuid.h:260
@ SPELL_BERSERK
Definition PlayerAI.cpp:371
@ QUEST_STATUS_INCOMPLETE
Definition QuestDef.h:107
#define RegisterSpellScript(spell_script)
Definition ScriptMgr.h:1128
SpellEffIndex
@ EFFECT_1
@ EFFECT_0
@ SPELL_EFFECT_SCRIPT_EFFECT
@ SPELL_EFFECT_TRIGGER_SPELL
@ TARGET_UNIT_SRC_AREA_ALLY
@ TARGET_UNIT_SRC_AREA_ENEMY
@ EMOTE_ONESHOT_NONE
@ SPELL_SCHOOL_MASK_SHADOW
@ SPELL_SCHOOL_MASK_ARCANE
@ SPELL_CUSTOM_ERROR_CANT_TARGET_VAMPIRES
SpellMissInfo
@ SPELL_MISS_NONE
SpellCastResult
@ SPELL_FAILED_CUSTOM_ERROR
@ SPELL_CAST_OK
@ AURA_REMOVE_BY_EXPIRE
@ AURA_REMOVE_BY_ENEMY_SPELL
AuraEffectHandleModes
@ AURA_EFFECT_HANDLE_REAL
@ SPELL_AURA_DUMMY
@ SPELL_AURA_OVERRIDE_SPELLS
@ SPELL_AURA_PERIODIC_TRIGGER_SPELL
@ TRIGGERED_FULL_MASK
Will return SPELL_FAILED_DONT_REPORT in CheckCast functions.
#define sSpellMgr
Definition SpellMgr.h:738
#define BeforeSpellHitFn(F)
#define SpellCheckCastFn(F)
#define AuraEffectProcFn(F, I, N)
#define SpellOnResistAbsorbCalculateFn(F)
#define SpellEffectFn(F, I, N)
#define SpellObjectAreaTargetSelectFn(F, I, N)
#define AuraEffectPeriodicFn(F, I, N)
#define AuraEffectApplyFn(F, I, N, M)
#define AuraEffectRemoveFn(F, I, N, M)
#define CAST_AI(a, b)
Definition UnitAI.h:27
@ REACT_PASSIVE
@ REACT_AGGRESSIVE
@ UNIT_STATE_EVADE
Definition Unit.h:242
@ UNIT_STATE_CASTING
Definition Unit.h:235
T CalculatePct(T base, U pct)
Definition Util.h:71
uint32 const vampireAuras[3][MAX_DIFFICULTY]
#define ESSENCE_OF_BLOOD_QUEEN
Position const centerPos
@ SPELL_FRENZIED_BLOODTHIRST_VISUAL
@ SPELL_UNCONTROLLABLE_FRENZY
@ SPELL_CLEAR_ALL_STATUS_AILMENTS
@ SPELL_PACT_OF_THE_DARKFALLEN_TARGET
@ SPELL_PRESENCE_OF_THE_DARKFALLEN
@ SPELL_PACT_OF_THE_DARKFALLEN_DAMAGE
@ SPELL_ESSENCE_OF_THE_BLOOD_QUEEN_PLR
@ SPELL_ESSENCE_OF_THE_BLOOD_QUEEN_HEAL
@ SPELL_BLOOD_INFUSION_CREDIT
@ SPELL_PACT_OF_THE_DARKFALLEN
@ SPELL_PRESENCE_OF_THE_DARKFALLEN_2
@ SPELL_TWILIGHT_BLOODBOLT_TARGET
boss_blood_queen_lana_thel LanaThelAI
#define ESSENCE_OF_BLOOD_QUEEN_PLR
bool IsVampire(Unit const *unit)
void AddSC_boss_blood_queen_lana_thel()
#define PRESENCE_OF_THE_DARKFALLEN
#define FRENZIED_BLOODTHIRST
#define DELIRIOUS_SLASH
Position const mincharPos
Position const airPos
uint32 GetTickNumber() const
int32 GetAmount() const
void PreventDefaultAction()
AuraApplication const * GetTargetApplication() const
HookList< EffectApplyHandler > AfterEffectRemove
HookList< EffectPeriodicHandler > OnEffectPeriodic
Unit * GetTarget() const
HookList< EffectProcHandler > OnEffectProc
HookList< AuraProcHandler > OnProc
HookList< EffectApplyHandler > OnEffectApply
bool operator()(WorldObject *object) const
InstanceScript *const instance
void _JustReachedHome()
EventMap events
@ EVADE_REASON_OTHER
Definition CreatureAI.h:98
bool _EnterEvadeMode(EvadeReason why=EVADE_REASON_OTHER)
void DoZoneInCombat(Creature *creature=nullptr)
bool UpdateVictim()
Creature *const me
Definition CreatureAI.h:82
void SetReactState(ReactStates st)
Definition Creature.h:119
Player * GetLootRecipient() const
Unit * SelectVictim()
Unit * GetVictim() const
Definition Unit.h:459
Unit * GetAttacker() const
Definition Unit.h:458
uint32 GetDamage() const
Definition Unit.h:464
void Update(uint32 time)
Definition EventMap.h:67
void DelayEvents(Milliseconds delay)
Definition EventMap.cpp:95
EventId ExecuteEvent()
Definition EventMap.cpp:73
void RescheduleEvent(EventId eventId, Milliseconds time, GroupIndex group=0u, PhaseIndex phase=0u)
Definition EventMap.cpp:52
void CancelEventGroup(GroupIndex group)
Definition EventMap.cpp:165
void ScheduleEvent(EventId eventId, Milliseconds time, GroupIndex group=0u, PhaseIndex phase=0u)
Definition EventMap.cpp:36
virtual bool SetBossState(uint32 id, EncounterState state)
void DoRemoveAurasDueToSpellOnPlayers(uint32 spell, bool includePets=false, bool includeControlled=false)
void DoCastSpellOnPlayers(uint32 spell, bool includePets=false, bool includeControlled=false)
EncounterState GetBossState(uint32 id) const
virtual bool CheckRequiredBosses(uint32, Player const *=nullptr) const
uint8 GetSpawnMode() const
Definition Map.h:388
void MovePoint(uint32 id, Position const &pos, bool generatePath=true, Optional< float > finalOrient={})
void MoveTargetedHome()
static ObjectGuid const Empty
Definition ObjectGuid.h:140
bool IsEmpty() const
Definition ObjectGuid.h:172
void Clear()
Definition ObjectGuid.h:150
TypeID GetTypeId() const
Definition Object.h:93
uint32 GetEntry() const
Definition Object.h:81
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:78
static Player * ToPlayer(Object *o)
Definition Object.h:180
QuestStatus GetQuestStatus(uint32 quest_id) const
Definition Player.cpp:15642
DamageInfo * GetDamageInfo() const
Definition Unit.h:519
int32 CalcValue(WorldObject const *caster=nullptr, int32 const *basePoints=nullptr) const
SpellEffectInfo const & GetEffect(SpellEffIndex index) const
Definition SpellInfo.h:483
HookList< CheckCastHandler > OnCheckCast
Unit * GetCaster() const
void PreventHitDefaultEffect(SpellEffIndex effIndex)
Unit * GetHitUnit() const
HookList< EffectHandler > OnEffectHitTarget
HookList< CastHandler > OnCast
HookList< OnCalculateResistAbsorbHandler > OnCalculateResistAbsorb
void SetCustomCastResultMessage(SpellCustomErrors result)
HookList< BeforeHitHandler > BeforeHit
Unit * GetExplTargetUnit() const
HookList< ObjectAreaTargetSelectHandler > OnObjectAreaTargetSelect
Unit * GetCurrentVictim()
bool IsThreatListEmpty(bool includeOffline=false) const
Trinity::IteratorPair< ThreatListIterator, std::nullptr_t > GetSortedThreatList() const
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
virtual void SetGUID(ObjectGuid const &, int32=0)
Definition UnitAI.h:157
SpellCastResult DoCastAOE(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.h:243
SpellCastResult DoCast(uint32 spellId)
Definition UnitAI.cpp:106
Definition Unit.h:769
void RemoveAura(AuraApplicationMap::iterator &i, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:3638
ThreatManager & GetThreatManager()
Definition Unit.h:1155
MotionMaster * GetMotionMaster()
Definition Unit.h:1667
static uint32 CalcSpellResistedDamage(Unit const *attacker, Unit *victim, uint32 damage, SpellSchoolMask schoolMask, SpellInfo const *spellInfo)
Definition Unit.cpp:1653
void RemoveVehicleKit()
Definition Unit.cpp:11808
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition Unit.cpp:4535
UnitAI * GetAI() const
Definition Unit.h:800
bool SetDisableGravity(bool disable, bool updateAnimTier=true)
Definition Unit.cpp:13286
AnimTier GetAnimTier() const
Definition Unit.h:1010
void AddUnitState(uint32 f)
Definition Unit.h:875
Unit * EnsureVictim() const
Definition Unit.h:861
Unit * GetVictim() const
Definition Unit.h:859
bool HasUnitState(const uint32 f) const
Definition Unit.h:876
Vehicle * GetVehicleKit() const
Definition Unit.h:1735
Map * GetMap() const
Definition Object.h:449
InstanceScript * GetInstanceScript() const
Definition Object.cpp:1087
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition Object.cpp:2832
void setActive(bool isActiveObject)
Definition Object.cpp:991
Creature * FindNearestCreature(uint32 entry, float range, bool alive=true) const
Definition Object.cpp:2099
bool IsWithinDist(WorldObject const *obj, float dist2compare, bool is3D=true) const
Definition Object.cpp:1187
virtual uint32 GetData(uint32) const
Definition ZoneScript.h:55
virtual void SetData(uint32, uint32)
Definition ZoneScript.h:56
static bool ValidateSpellInfo(std::initializer_list< uint32 > spellIds)
bool OnCheck(Player *source, Unit *target) override
bool OnCheck(Player *source, Unit *target) override
bool Validate(SpellInfo const *) override
void FilterTargets(std::list< WorldObject * > &targets)
PrepareSpellScript(spell_blood_queen_bloodbolt)
void HandleScript(SpellEffIndex effIndex)
void OnProc(AuraEffect const *aurEff, ProcEventInfo &eventInfo)
PrepareAuraScript(spell_blood_queen_essence_of_the_blood_queen)
PrepareAuraScript(spell_blood_queen_frenzied_bloodthirst)
void OnRemove(AuraEffect const *, AuraEffectHandleModes)
void OnApply(AuraEffect const *, AuraEffectHandleModes)
PrepareSpellScript(spell_blood_queen_pact_of_the_darkfallen_dmg_target)
void FilterTargets(std::list< WorldObject * > &unitList)
PrepareAuraScript(spell_blood_queen_pact_of_the_darkfallen_dmg)
void FilterTargets(std::list< WorldObject * > &targets)
PrepareSpellScript(spell_blood_queen_pact_of_the_darkfallen)
PrepareSpellScript(spell_blood_queen_twilight_bloodbolt)
void HandleResistance(DamageInfo const &damageInfo, uint32 &resistAmount, int32 &)
bool Validate(SpellInfo const *) override
PrepareSpellScript(spell_blood_queen_vampiric_bite)
@ SPELL_UNSATED_CRAVING
@ SPELL_SHADOWS_FATE
@ LIGHT_S_HAMMER_TELEPORT
#define RegisterIcecrownCitadelCreatureAI(ai_name)
@ ACTION_KILL_MINCHAR
@ DATA_BLOOD_QUICKENING_STATE
@ DATA_BLOOD_QUEEN_LANA_THEL
@ NPC_INFILTRATOR_MINCHAR_BQ
@ NPC_BLOOD_QUEEN_LANA_THEL
@ NPC_INFILTRATOR_MINCHAR_BQ_25
TC_GAME_API Player * GetPlayer(Map const *, ObjectGuid const &guid)
TC_GAME_API Creature * GetCreature(WorldObject const &u, ObjectGuid const &guid)
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
CastSpellExtraArgs & AddSpellBP0(int32 val)
void AttackStart(Unit *) override
bool Is25ManRaid() const
void KilledUnit(Unit *victim) override
bool WasBloodbolted(ObjectGuid guid) const
bool WasVampire(ObjectGuid guid) const
void SetGUID(ObjectGuid const &guid, int32 id) override
void DoAction(int32 action) override
Player * SelectRandomTarget(bool includeOfftank, std::list< Player * > *targetList=nullptr)
void MovementInform(uint32 type, uint32 id) override
void EnterEvadeMode(EvadeReason why) override