Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
boss_blood_queen_lana_thel.cpp
Go to the documentation of this file.
1/*
2* This file is part of Project SkyFire https://www.projectskyfire.org.
3* See LICENSE.md file for Copyright information
4*/
5
6#include "ObjectMgr.h"
7#include "ScriptMgr.h"
8#include "ScriptedCreature.h"
9#include "Spell.h"
10#include "SpellAuraEffects.h"
11#include "GridNotifiers.h"
12#include "icecrown_citadel.h"
13
30
60
68
69uint32 const vampireAuras[3][4] =
70{
71 {70867, 71473, 71532, 71533},
72 {70879, 71525, 71530, 71531},
73 {70877, 71474, 70877, 71474},
74};
75
76#define ESSENCE_OF_BLOOD_QUEEN RAID_MODE<uint32>(70867, 71473, 71532, 71533)
77#define ESSENCE_OF_BLOOD_QUEEN_PLR RAID_MODE<uint32>(70879, 71525, 71530, 71531)
78#define FRENZIED_BLOODTHIRST RAID_MODE<uint32>(70877, 71474, 70877, 71474)
79#define DELIRIOUS_SLASH RAID_MODE<uint32>(71623, 71624, 71625, 71626)
80#define PRESENCE_OF_THE_DARKFALLEN RAID_MODE<uint32>(70994, 71962, 71963, 71964)
81
98
100{
103};
104
112
113Position const centerPos = {4595.7090f, 2769.4190f, 400.6368f, 0.000000f};
114Position const airPos = {4595.7090f, 2769.4190f, 422.3893f, 0.000000f};
115Position const mincharPos = {4629.3711f, 2782.6089f, 424.6390f, 0.000000f};
116
117bool IsVampire(Unit const* unit)
118{
119 for (uint8 i = 0; i < 3; ++i)
120 if (unit->HasAura(vampireAuras[i][unit->GetMap()->GetSpawnMode()]))
121 return true;
122 return false;
123}
124
126{
127 public:
128 boss_blood_queen_lana_thel() : CreatureScript("boss_blood_queen_lana_thel") { }
129
131 {
135
137 {
138 _Reset();
139 events.ScheduleEvent(EVENT_BERSERK, 330000);
140 events.ScheduleEvent(EVENT_VAMPIRIC_BITE, 15000);
142 events.ScheduleEvent(EVENT_DELIRIOUS_SLASH, std::rand() % 24000 + 20000, EVENT_GROUP_NORMAL);
144 events.ScheduleEvent(EVENT_SWARMING_SHADOWS, 30500, EVENT_GROUP_NORMAL);
145 events.ScheduleEvent(EVENT_TWILIGHT_BLOODBOLT, std::rand() % 25000 + 20000, EVENT_GROUP_NORMAL);
146 events.ScheduleEvent(EVENT_AIR_PHASE, 124000 + uint32(Is25ManRaid() ? 3000 : 0));
147 CleanAuras();
148 _offtankGUID = 0;
149 _vampires.clear();
151 _killMinchar = false;
152 }
153
155 {
156 if (!instance->CheckRequiredBosses(DATA_BLOOD_QUEEN_LANA_THEL, who->ToPlayer()))
157 {
159 instance->DoCastSpellOnPlayers(LIGHT_S_HAMMER_TELEPORT);
160 return;
161 }
162
163 me->setActive(true);
167 CleanAuras();
168
172 }
173
174 void JustDied(Unit* killer) OVERRIDE
175 {
176 _JustDied();
178
179 if (Is25ManRaid() && me->HasAura(SPELL_SHADOWS_FATE))
181
182 CleanAuras();
183 // Blah, credit the quest
185 {
187 if (Player* player = killer->ToPlayer())
188 player->RewardPlayerAndGroupAtEvent(NPC_INFILTRATOR_MINCHAR_BQ, player);
189 if (Creature* minchar = me->FindNearestCreature(NPC_INFILTRATOR_MINCHAR_BQ, 200.0f))
190 {
191 minchar->SetUInt32Value(UNIT_FIELD_NPC_EMOTESTATE, 0);
192 minchar->RemoveByteFlag(UNIT_FIELD_ANIM_TIER, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND);
193 minchar->SetCanFly(false);
194 minchar->RemoveAllAuras();
195 minchar->GetMotionMaster()->MoveCharge(4629.3711f, 2782.6089f, 401.5301f, SPEED_CHARGE/3.0f);
196 }
197 }
198 }
199
201 {
202 instance->DoRemoveAurasDueToSpellOnPlayers(ESSENCE_OF_BLOOD_QUEEN);
203 instance->DoRemoveAurasDueToSpellOnPlayers(ESSENCE_OF_BLOOD_QUEEN_PLR);
204 instance->DoRemoveAurasDueToSpellOnPlayers(FRENZIED_BLOODTHIRST);
205 instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_UNCONTROLLABLE_FRENZY);
206 instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_BLOOD_MIRROR_DAMAGE);
207 instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_BLOOD_MIRROR_VISUAL);
208 instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_BLOOD_MIRROR_DUMMY);
209 instance->DoRemoveAurasDueToSpellOnPlayers(DELIRIOUS_SLASH);
210 instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_PACT_OF_THE_DARKFALLEN);
211 instance->DoRemoveAurasDueToSpellOnPlayers(PRESENCE_OF_THE_DARKFALLEN);
212 }
213
215 {
216 if (action != ACTION_KILL_MINCHAR)
217 return;
218
219 if (instance->GetBossState(DATA_BLOOD_QUEEN_LANA_THEL) == IN_PROGRESS)
220 _killMinchar = true;
221 else
222 {
223 me->SetDisableGravity(true);
225 me->GetMotionMaster()->MovePoint(POINT_MINCHAR, mincharPos);
226 }
227 }
228
230 {
232 CleanAuras();
233 if (_killMinchar)
234 {
235 _killMinchar = false;
236 me->SetDisableGravity(true);
238 me->GetMotionMaster()->MovePoint(POINT_MINCHAR, mincharPos);
239 }
240 else
241 {
242 me->GetMotionMaster()->MoveTargetedHome();
243 Reset();
244 }
245 }
246
248 {
249 me->SetDisableGravity(false);
251 me->SetReactState(REACT_AGGRESSIVE);
253 Talk(SAY_WIPE);
255 }
256
258 {
259 if (victim->GetTypeId() == TypeID::TYPEID_PLAYER)
260 Talk(SAY_KILL);
261 }
262
263 void SetGUID(uint64 guid, int32 type = 0) OVERRIDE
264 {
265 switch (type)
266 {
267 case GUID_VAMPIRE:
268 _vampires.insert(guid);
269 break;
270 case GUID_BLOODBOLT:
271 _bloodboltedPlayers.insert(guid);
272 break;
273 default:
274 break;
275 }
276 }
277
279 {
280 if (type != POINT_MOTION_TYPE)
281 return;
282
283 switch (id)
284 {
285 case POINT_CENTER:
287 events.ScheduleEvent(EVENT_AIR_PHASE, 100000 + uint32(Is25ManRaid() ? 0 : 20000));
288 events.RescheduleEvent(EVENT_SWARMING_SHADOWS, 30500, EVENT_GROUP_NORMAL);
290 events.ScheduleEvent(EVENT_AIR_START_FLYING, 5000);
291 break;
292 case POINT_AIR:
293 _bloodboltedPlayers.clear();
296 events.ScheduleEvent(EVENT_AIR_FLY_DOWN, 10000);
297 break;
298 case POINT_GROUND:
299 me->SetDisableGravity(false);
301 me->SetReactState(REACT_AGGRESSIVE);
302 if (Unit* victim = me->SelectVictim())
303 AttackStart(victim);
305 break;
306 case POINT_MINCHAR:
307 DoCast(me, SPELL_ANNIHILATE, true);
308 // already in evade mode
309 me->GetMotionMaster()->MoveTargetedHome();
310 Reset();
311 default:
312 break;
313 }
314 }
315
317 {
318 if (!UpdateVictim() || !CheckInRoom())
319 return;
320
321 events.Update(diff);
322
323 if (me->HasUnitState(UNIT_STATE_CASTING))
324 return;
325
326 while (uint32 eventId = events.ExecuteEvent())
327 {
328 switch (eventId)
329 {
330 case EVENT_BERSERK:
334 break;
336 {
337 std::list<Player*> targets;
338 SelectRandomTarget(false, &targets);
339 if (!targets.empty())
340 {
341 Unit* target = targets.front();
345 _vampires.insert(target->GetGUID());
348 }
349 break;
350 }
352 {
353 // victim can be NULL when this is processed in the same update tick as EVENT_AIR_PHASE
354 if (me->GetVictim())
355 {
356 Player* newOfftank = SelectRandomTarget(true);
357 if (newOfftank)
358 {
359 if (_offtankGUID != newOfftank->GetGUID())
360 {
361 _offtankGUID = newOfftank->GetGUID();
362
363 // both spells have SPELL_ATTR5_SINGLE_TARGET_SPELL, no manual removal needed
364 newOfftank->CastSpell(me->GetVictim(), SPELL_BLOOD_MIRROR_DAMAGE, true);
365 me->GetVictim()->CastSpell(newOfftank, SPELL_BLOOD_MIRROR_DUMMY, true);
368 newOfftank->HasAura(SPELL_UNSATED_CRAVING) && !newOfftank->HasAura(SPELL_THIRST_QUENCHED) &&
369 !newOfftank->HasAura(SPELL_GUSHING_WOUND))
370 newOfftank->CastSpell(newOfftank, SPELL_GUSHING_WOUND, TRIGGERED_FULL_MASK);
371 }
372 }
373 else
374 _offtankGUID = 0;
375 }
377 break;
378 }
382 DoCast(_offtank, SPELL_DELIRIOUS_SLASH);
383 events.ScheduleEvent(EVENT_DELIRIOUS_SLASH, std::rand() % 24000 + 20000, EVENT_GROUP_NORMAL);
384 break;
386 {
387 std::list<Player*> targets;
388 SelectRandomTarget(false, &targets);
390 if (targets.size() > 1)
391 {
393 for (std::list<Player*>::iterator itr = targets.begin(); itr != targets.end(); ++itr)
395 }
397 break;
398 }
400 if (Player* target = SelectRandomTarget(false))
401 {
405 }
406 events.ScheduleEvent(EVENT_SWARMING_SHADOWS, 30500, EVENT_GROUP_NORMAL);
407 break;
409 {
410 std::list<Player*> targets;
411 SelectRandomTarget(false, &targets);
413 for (std::list<Player*>::iterator itr = targets.begin(); itr != targets.end(); ++itr)
416 events.ScheduleEvent(EVENT_TWILIGHT_BLOODBOLT, std::rand() % 15000 + 10000, EVENT_GROUP_NORMAL);
417 break;
418 }
419 case EVENT_AIR_PHASE:
420 DoStopAttack();
421 me->SetReactState(REACT_PASSIVE);
422 events.DelayEvents(10000, EVENT_GROUP_NORMAL);
423 events.CancelEventGroup(EVENT_GROUP_CANCELLABLE);
424 me->GetMotionMaster()->MovePoint(POINT_CENTER, centerPos);
425 break;
427 me->SetDisableGravity(true);
429 me->GetMotionMaster()->MovePoint(POINT_AIR, airPos);
430 break;
432 me->GetMotionMaster()->MovePoint(POINT_GROUND, centerPos);
433 break;
434 default:
435 break;
436 }
437 }
438
440 }
441
443 {
444 return _vampires.count(guid) != 0;
445 }
446
448 {
449 return _bloodboltedPlayers.count(guid) != 0;
450 }
451
452 private:
453 // offtank for this encounter is the player standing closest to main tank
454 Player* SelectRandomTarget(bool includeOfftank, std::list<Player*>* targetList = NULL)
455 {
456 std::list<HostileReference*> const& threatlist = me->getThreatManager().getThreatList();
457 std::list<Player*> tempTargets;
458
459 if (threatlist.empty())
460 return NULL;
461
462 for (std::list<HostileReference*>::const_iterator itr = threatlist.begin(); itr != threatlist.end(); ++itr)
463 if (Unit* refTarget = (*itr)->getTarget())
464 if (refTarget != me->GetVictim() && refTarget->GetTypeId() == TypeID::TYPEID_PLAYER && (includeOfftank || (refTarget->GetGUID() != _offtankGUID)))
465 tempTargets.push_back(refTarget->ToPlayer());
466
467 if (tempTargets.empty())
468 return NULL;
469
470 if (targetList)
471 {
472 *targetList = tempTargets;
473 return NULL;
474 }
475
476 if (includeOfftank)
477 {
478 tempTargets.sort(Skyfire::ObjectDistanceOrderPred(me->GetVictim()));
479 return tempTargets.front();
480 }
481
483 }
484
485 std::set<uint64> _vampires;
486 std::set<uint64> _bloodboltedPlayers;
490 };
491
493 {
495 }
496};
497
498// helper for shortened code
500
502{
503 public:
504 spell_blood_queen_vampiric_bite() : SpellScriptLoader("spell_blood_queen_vampiric_bite") { }
505
507 {
509
510 bool Validate(SpellInfo const* /*spell*/) OVERRIDE
511 {
513 return false;
514 if (!sSpellMgr->GetSpellInfo(SPELL_FRENZIED_BLOODTHIRST))
515 return false;
517 return false;
518 return true;
519 }
520
531
532 void OnCast()
533 {
534 if (GetCaster()->GetTypeId() != TypeID::TYPEID_PLAYER)
535 return;
536
537 uint32 spellId = sSpellMgr->GetSpellIdForDifficulty(SPELL_FRENZIED_BLOODTHIRST, GetCaster());
540
541 // Shadowmourne questline
542 if (Aura* aura = GetCaster()->GetAura(SPELL_GUSHING_WOUND))
543 {
544 if (aura->GetStackAmount() == 3)
545 {
547 GetCaster()->RemoveAura(aura);
548 }
549 else
551 }
552
553 if (InstanceScript* instance = GetCaster()->GetInstanceScript())
554 if (Creature* bloodQueen = ObjectAccessor::GetCreature(*GetCaster(), instance->GetData64(DATA_BLOOD_QUEEN_LANA_THEL)))
555 bloodQueen->AI()->SetGUID(GetHitUnit()->GetGUID(), GUID_VAMPIRE);
556 }
557
563
570 };
571
576};
577
579{
580 public:
581 spell_blood_queen_frenzied_bloodthirst() : SpellScriptLoader("spell_blood_queen_frenzied_bloodthirst") { }
582
584 {
586
587 void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
588 {
589 if (InstanceScript* instance = GetTarget()->GetInstanceScript())
590 if (Creature* bloodQueen = ObjectAccessor::GetCreature(*GetTarget(), instance->GetData64(DATA_BLOOD_QUEEN_LANA_THEL)))
591 bloodQueen->AI()->Talk(EMOTE_BLOODTHIRST, GetTarget());
592 }
593
594 void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
595 {
596 Unit* target = GetTarget();
597 if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE)
598 if (InstanceScript* instance = target->GetInstanceScript())
599 if (Creature* bloodQueen = ObjectAccessor::GetCreature(*target, instance->GetData64(DATA_BLOOD_QUEEN_LANA_THEL)))
600 {
601 // this needs to be done BEFORE charm aura or we hit an assert in Unit::SetCharmedBy
602 if (target->GetVehicleKit())
603 target->RemoveVehicleKit();
604
605 bloodQueen->AI()->Talk(SAY_MIND_CONTROL);
606 bloodQueen->CastSpell(target, SPELL_UNCONTROLLABLE_FRENZY, true);
607 }
608 }
609
615 };
616
621};
622
624{
625 public:
626 explicit BloodboltHitCheck(LanaThelAI* ai) : _ai(ai) { }
627
628 bool operator()(WorldObject* object) const
629 {
630 return _ai->WasBloodbolted(object->GetGUID());
631 }
632
633 private:
635};
636
638{
639 public:
640 spell_blood_queen_bloodbolt() : SpellScriptLoader("spell_blood_queen_bloodbolt") { }
641
643 {
645
646 bool Validate(SpellInfo const* /*spell*/) OVERRIDE
647 {
648 if (!sSpellMgr->GetSpellInfo(SPELL_TWILIGHT_BLOODBOLT))
649 return false;
650 return true;
651 }
652
654 {
656 }
657
658 void FilterTargets(std::list<WorldObject*>& targets)
659 {
660 uint32 targetCount = (targets.size() + 2) / 3;
661 targets.remove_if(BloodboltHitCheck(static_cast<LanaThelAI*>(GetCaster()->GetAI())));
662 Skyfire::Containers::RandomResizeList(targets, targetCount);
663 // mark targets now, effect hook has missile travel time delay (might cast next in that time)
664 for (std::list<WorldObject*>::const_iterator itr = targets.begin(); itr != targets.end(); ++itr)
665 GetCaster()->GetAI()->SetGUID((*itr)->GetGUID(), GUID_BLOODBOLT);
666 }
667
673
679 };
680
685};
686
687// 70871 - Essence of the Blood Queen
722
724{
725 public:
726 spell_blood_queen_pact_of_the_darkfallen() : SpellScriptLoader("spell_blood_queen_pact_of_the_darkfallen") { }
727
729 {
731
732 void FilterTargets(std::list<WorldObject*>& targets)
733 {
734 targets.remove_if(Skyfire::UnitAuraCheck(false, SPELL_PACT_OF_THE_DARKFALLEN));
735
736 bool remove = true;
737 std::list<WorldObject*>::const_iterator itrEnd = targets.end(), itr, itr2;
738 // we can do this, unitList is MAX 4 in size
739 for (itr = targets.begin(); itr != itrEnd && remove; ++itr)
740 {
741 if (!GetCaster()->IsWithinDist(*itr, 5.0f, false))
742 remove = false;
743
744 for (itr2 = targets.begin(); itr2 != itrEnd && remove; ++itr2)
745 if (itr != itr2 && !(*itr2)->IsWithinDist(*itr, 5.0f, false))
746 remove = false;
747 }
748
749 if (remove)
750 {
751 if (InstanceScript* instance = GetCaster()->GetInstanceScript())
752 {
753 instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_PACT_OF_THE_DARKFALLEN);
754 targets.clear();
755 }
756 }
757 }
758
763 };
764
769};
770
772{
773 public:
774 spell_blood_queen_pact_of_the_darkfallen_dmg() : SpellScriptLoader("spell_blood_queen_pact_of_the_darkfallen_dmg") { }
775
777 {
779
780 bool Validate(SpellInfo const* /*spell*/) OVERRIDE
781 {
783 return false;
784 return true;
785 }
786
787 // this is an additional effect to be executed
788 void PeriodicTick(AuraEffect const* aurEff)
789 {
790 SpellInfo const* damageSpell = sSpellMgr->GetSpellInfo(SPELL_PACT_OF_THE_DARKFALLEN_DAMAGE);
791 int32 damage = damageSpell->Effects[EFFECT_0].CalcValue();
792 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)
793 damage = int32(damage * multiplier);
795 }
796
801 };
802
807};
808
835
837{
838 public:
839 achievement_once_bitten_twice_shy_n() : AchievementCriteriaScript("achievement_once_bitten_twice_shy_n") { }
840
841 bool OnCheck(Player* source, Unit* target) OVERRIDE
842 {
843 if (!target)
844 return false;
845
846 if (LanaThelAI* lanaThelAI = CAST_AI(LanaThelAI, target->GetAI()))
847 return !lanaThelAI->WasVampire(source->GetGUID());
848 return false;
849 }
850};
851
853{
854 public:
855 achievement_once_bitten_twice_shy_v() : AchievementCriteriaScript("achievement_once_bitten_twice_shy_v") { }
856
857 bool OnCheck(Player* source, Unit* target) OVERRIDE
858 {
859 if (!target)
860 return false;
861
862 if (LanaThelAI* lanaThelAI = CAST_AI(LanaThelAI, target->GetAI()))
863 return lanaThelAI->WasVampire(source->GetGUID());
864 return false;
865 }
866};
867
std::int32_t int32
Definition Define.h:73
std::uint8_t uint8
Definition Define.h:79
std::uint32_t uint32
Definition Define.h:77
#define OVERRIDE
Definition Define.h:60
std::uint64_t uint64
Definition Define.h:76
@ IN_PROGRESS
@ FAIL
@ DONE
@ POINT_MOTION_TYPE
#define SPEED_CHARGE
@ TYPEID_PLAYER
Definition Object.h:55
@ QUEST_STATUS_INCOMPLETE
Definition QuestDef.h:89
#define CAST_AI(a, b)
SpellEffIndex
@ EFFECT_1
@ EFFECT_0
@ SPELL_EFFECT_SCRIPT_EFFECT
@ SPELL_EFFECT_TRIGGER_SPELL
@ TARGET_UNIT_SRC_AREA_ALLY
@ TARGET_UNIT_SRC_AREA_ENEMY
@ SPELL_CUSTOM_ERROR_CANT_TARGET_VAMPIRES
SpellCastResult
@ SPELL_AURA_DUMMY
@ SPELL_AURA_OVERRIDE_SPELLS
@ SPELL_AURA_PERIODIC_TRIGGER_SPELL
AuraEffectHandleModes
@ AURA_EFFECT_HANDLE_REAL
#define sSpellMgr
Definition SpellMgr.h:744
#define SpellCheckCastFn(F)
#define AuraEffectProcFn(F, I, N)
#define SpellEffectFn(F, I, N)
#define SpellObjectAreaTargetSelectFn(F, I, N)
#define AuraEffectPeriodicFn(F, I, N)
#define AuraEffectApplyFn(F, I, N, M)
#define SpellHitFn(F)
#define AuraEffectRemoveFn(F, I, N, M)
@ SPELLVALUE_BASE_POINT0
Definition Unit.h:114
@ UNIT_BYTE1_FLAG_HOVER
Definition Unit.h:189
@ UNIT_BYTE1_FLAG_ALWAYS_STAND
Definition Unit.h:188
@ AURA_REMOVE_BY_EXPIRE
Definition Unit.h:410
@ AURA_REMOVE_BY_ENEMY_SPELL
Definition Unit.h:409
@ TRIGGERED_FULL_MASK
Will ignore most target checks (mostly DBC target checks).
Definition Unit.h:435
@ UNIT_STATE_CASTING
Definition Unit.h:527
@ REACT_PASSIVE
Definition Unit.h:1156
@ REACT_AGGRESSIVE
Definition Unit.h:1158
@ UNIT_FIELD_ANIM_TIER
@ UNIT_FIELD_NPC_EMOTESTATE
T CalculatePct(T base, U pct)
Definition Util.h:103
@ SAY_BERSERK
@ POINT_GROUND
@ POINT_AIR
#define ESSENCE_OF_BLOOD_QUEEN
Position const centerPos
#define ESSENCE_OF_BLOOD_QUEEN_PLR
@ SPELL_FRENZIED_BLOODTHIRST_VISUAL
@ SPELL_UNCONTROLLABLE_FRENZY
@ 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
bool IsVampire(Unit const *unit)
void AddSC_boss_blood_queen_lana_thel()
#define PRESENCE_OF_THE_DARKFALLEN
#define FRENZIED_BLOODTHIRST
boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI LanaThelAI
#define DELIRIOUS_SLASH
uint32 const vampireAuras[3][4]
Position const mincharPos
Position const airPos
@ EVENT_PACT_OF_THE_DARKFALLEN
#define SAY_DEATH
#define SAY_AGGRO
#define SAY_KILL
#define SPELL_BERSERK
@ EVENT_BERSERK
AchievementCriteriaScript(const char *name)
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< EffectApplyHandler > OnEffectApply
bool operator()(WorldObject *object) const
InstanceScript *const instance
void _JustReachedHome()
bool CheckInRoom()
EventMap events
BossAI(Creature *creature, uint32 bossId)
void DoZoneInCombat(Creature *creature=NULL, float maxRangeToNearestTarget=50.0f)
bool _EnterEvadeMode()
void Talk(uint8 id, WorldObject const *whisperTarget=NULL)
bool UpdateVictim()
CreatureScript(const char *name)
uint32 GetDamage() const
Definition Unit.h:923
uint8 GetSpawnMode() const
Definition Map.h:358
static Creature * GetCreature(WorldObject const &u, uint64 guid)
static Player * GetPlayer(WorldObject const &, uint64 guid)
uint64 GetGUID() const
Definition Object.h:119
Player * ToPlayer()
Definition Object.h:204
uint32 GetEntry() const
Definition Object.h:125
QuestStatus GetQuestStatus(uint32 quest_id) const
DamageInfo * GetDamageInfo() const
Definition Unit.h:985
int32 CalcValue(Unit const *caster=NULL, int32 const *basePoints=NULL, Unit const *target=NULL) const
SpellEffectInfo Effects[MAX_SPELL_EFFECTS]
Definition SpellInfo.h:255
Unit * GetExplTargetUnit()
HookList< CheckCastHandler > OnCheckCast
void PreventHitDefaultEffect(SpellEffIndex effIndex)
HookList< EffectHandler > OnEffectHitTarget
Unit * GetHitUnit()
void SetCustomCastResultMessage(SpellCustomErrors result)
Unit * GetCaster()
HookList< ObjectAreaTargetSelectHandler > OnObjectAreaTargetSelect
HookList< HitHandler > BeforeHit
SpellScriptLoader(const char *name)
virtual void SetGUID(uint64, int32=0)
Definition UnitAI.h:129
void DoMeleeAttackIfReady()
Definition UnitAI.cpp:28
void DoCast(uint32 spellId)
Definition UnitAI.cpp:110
void DoCastVictim(uint32 spellId, bool triggered=false)
Definition UnitAI.cpp:168
void DoCastAOE(uint32 spellId, bool triggered=false)
Definition UnitAI.cpp:176
Definition Unit.h:1367
void RemoveAura(AuraApplicationMap::iterator &i, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
void CastSpell(SpellCastTargets const &targets, SpellInfo const *spellInfo, CustomSpellValues const *value, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=NULL, AuraEffect const *triggeredByAura=NULL, uint64 originalCaster=0)
void RemoveVehicleKit(bool remove=false)
Definition Unit.cpp:7179
bool HasAura(uint32 spellId, uint64 casterGUID=0, uint64 itemCasterGUID=0, uint32 reqEffMask=0) const
void CastCustomSpell(Unit *victim, uint32 spellId, int32 const *bp0, int32 const *bp1, int32 const *bp2, bool triggered, Item *castItem=NULL, AuraEffect const *triggeredByAura=NULL, uint64 originalCaster=0)
UnitAI * GetAI()
Definition Unit.h:1393
Vehicle * GetVehicleKit() const
Definition Unit.h:2739
Map * GetMap() const
Definition Object.h:740
InstanceScript * GetInstanceScript()
Definition Object.cpp:1612
bool OnCheck(Player *source, Unit *target) OVERRIDE
bool OnCheck(Player *source, Unit *target) OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
PrepareSpellScript(spell_blood_queen_bloodbolt_SpellScript)
SpellScript * GetSpellScript() const OVERRIDE
SpellScript * GetSpellScript() const OVERRIDE
@ NPC_INFILTRATOR_MINCHAR_BQ
@ NPC_BLOOD_QUEEN_LANA_THEL
CreatureAI * GetIcecrownCitadelAI(Creature *creature)
@ ACTION_KILL_MINCHAR
@ LIGHT_S_HAMMER_TELEPORT
@ SPELL_UNSATED_CRAVING
@ SPELL_SHADOWS_FATE
@ DATA_BLOOD_QUICKENING_STATE
@ DATA_BLOOD_QUEEN_LANA_THEL
void RandomResizeList(std::list< T > &list, uint32 size)
Definition Containers.h:19
C::value_type const & SelectRandomContainerElement(C const &container)
Definition Containers.h:48
Creature * me
bool Is25ManRaid() const
void AttackStart(Unit *) OVERRIDE
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
Player * SelectRandomTarget(bool includeOfftank, std::list< Player * > *targetList=NULL)