Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
boss_sindragosa.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 "SpellAuraEffects.h"
10#include "GridNotifiers.h"
11#include "icecrown_citadel.h"
12
14{
15 SAY_AGGRO = 0, // You are fools to have come to this place! The icy winds of Northrend will consume your souls!
16 SAY_UNCHAINED_MAGIC = 1, // Suffer, mortals, as your pathetic magic betrays you!
17 EMOTE_WARN_BLISTERING_COLD = 2, // %s prepares to unleash a wave of blistering cold!
18 SAY_BLISTERING_COLD = 3, // Can you feel the cold hand of death upon your heart?
19 SAY_RESPITE_FOR_A_TORMENTED_SOUL = 4, // Aaah! It burns! What sorcery is this?!
20 SAY_AIR_PHASE = 5, // Your incursion ends here! None shall survive!
21 SAY_PHASE_2 = 6, // Now feel my master's limitless power and despair!
22 EMOTE_WARN_FROZEN_ORB = 7, // %s fires a frozen orb towards $N!
23 SAY_KILL = 8, // Perish!
24 // A flaw of mortality...
25 SAY_BERSERK = 9, // Enough! I tire of these games!
26 SAY_DEATH = 10, // Free...at last...
28};
29
79
117
126
137
142
143Position const RimefangFlyPos = {4413.309f, 2456.421f, 233.3795f, 2.890186f};
144Position const RimefangLandPos = {4413.309f, 2456.421f, 203.3848f, 2.890186f};
145Position const SpinestalkerFlyPos = {4418.895f, 2514.233f, 230.4864f, 3.396045f};
146Position const SpinestalkerLandPos = {4418.895f, 2514.233f, 203.3848f, 3.396045f};
147Position const SindragosaSpawnPos = {4818.700f, 2483.710f, 287.0650f, 3.089233f};
148Position const SindragosaFlyPos = {4475.190f, 2484.570f, 234.8510f, 3.141593f};
149Position const SindragosaLandPos = {4419.190f, 2484.570f, 203.3848f, 3.141593f};
150Position const SindragosaAirPos = {4475.990f, 2484.430f, 247.9340f, 3.141593f};
151Position const SindragosaAirPosFar = {4525.600f, 2485.150f, 245.0820f, 3.141593f};
152Position const SindragosaFlyInPos = {4419.190f, 2484.360f, 232.5150f, 3.141593f};
153
155{
156 public:
157 FrostwyrmLandEvent(Creature& owner, Position const& dest) : _owner(owner), _dest(dest) { }
158
159 bool Execute(uint64 /*eventTime*/, uint32 /*updateTime*/)
160 {
161 _owner.GetMotionMaster()->MoveLand(POINT_FROSTWYRM_LAND, _dest);
162 return true;
163 }
164
165 private:
168};
169
171{
172 public:
173 FrostBombExplosion(Creature* owner, uint64 sindragosaGUID) : _owner(owner), _sindragosaGUID(sindragosaGUID) { }
174
175 bool Execute(uint64 /*eventTime*/, uint32 /*updateTime*/)
176 {
177 _owner->CastSpell((Unit*)NULL, SPELL_FROST_BOMB, false, NULL, NULL, _sindragosaGUID);
178 _owner->RemoveAurasDueToSpell(SPELL_FROST_BOMB_VISUAL);
179 return true;
180 }
181
182 private:
185};
186
188{
189 public:
190 FrostBeaconSelector(Unit* source) : _source(source) { }
191
192 bool operator()(Unit* target) const
193 {
194 return target->GetTypeId() == TypeID::TYPEID_PLAYER &&
195 target != _source->GetVictim() &&
197 }
198
199 private:
201};
202
204{
205 public:
206 boss_sindragosa() : CreatureScript("boss_sindragosa") { }
207
208 struct boss_sindragosaAI : public BossAI
209 {
211 {
212 }
213
215 {
217 me->SetReactState(REACT_DEFENSIVE);
219 events.ScheduleEvent(EVENT_BERSERK, 600000);
220 events.ScheduleEvent(EVENT_CLEAVE, 10000, EVENT_GROUP_LAND_PHASE);
221 events.ScheduleEvent(EVENT_TAIL_SMASH, 20000, EVENT_GROUP_LAND_PHASE);
222 events.ScheduleEvent(EVENT_FROST_BREATH, std::rand() % 12000 + 8000, EVENT_GROUP_LAND_PHASE);
223 events.ScheduleEvent(EVENT_UNCHAINED_MAGIC, std::rand() % 14000 + 9000, EVENT_GROUP_LAND_PHASE);
224 events.ScheduleEvent(EVENT_ICY_GRIP, 33500, EVENT_GROUP_LAND_PHASE);
225 events.ScheduleEvent(EVENT_AIR_PHASE, 50000);
227 _isInAirPhase = false;
228 _isThirdPhase = false;
229
230 if (!_summoned)
231 {
232 me->SetCanFly(true);
233 me->SetDisableGravity(true);
234 }
235 }
236
237 void JustDied(Unit* /* killer */) OVERRIDE
238 {
239 _JustDied();
241
242 if (Is25ManRaid() && me->HasAura(SPELL_SHADOWS_FATE))
244 }
245
247 {
248 if (!instance->CheckRequiredBosses(DATA_SINDRAGOSA, victim->ToPlayer()))
249 {
251 instance->DoCastSpellOnPlayers(LIGHT_S_HAMMER_TELEPORT);
252 return;
253 }
254
255 BossAI::EnterCombat(victim);
259 }
260
262 {
264 instance->SetBossState(DATA_SINDRAGOSA, FAIL);
265 me->SetCanFly(false);
266 me->SetDisableGravity(false);
267 }
268
270 {
271 if (victim->GetTypeId() == TypeID::TYPEID_PLAYER)
272 Talk(SAY_KILL);
273 }
274
276 {
277 if (action == ACTION_START_FROSTWYRM)
278 {
279 if (_summoned)
280 return;
281
282 _summoned = true;
283 if (TempSummon* summon = me->ToTempSummon())
284 summon->SetTempSummonType(TempSummonType::TEMPSUMMON_DEAD_DESPAWN);
285
286 if (me->isDead())
287 return;
288
289 me->setActive(true);
290 me->SetCanFly(true);
291 me->SetDisableGravity(true);
293 me->SetSpeed(MOVE_FLIGHT, 4.0f);
295 float moveTime = me->GetExactDist(&SindragosaFlyPos) / (me->GetSpeed(MOVE_FLIGHT) * 0.001f);
296 me->m_Events.AddEvent(new FrostwyrmLandEvent(*me, SindragosaLandPos), me->m_Events.CalculateTime(uint64(moveTime) + 250));
297 me->GetMotionMaster()->MovePoint(POINT_FROSTWYRM_FLY_IN, SindragosaFlyPos);
299 }
300 }
301
303 {
304 if (type == DATA_MYSTIC_BUFFET_STACK)
305 return _mysticBuffetStack;
306 return 0xFFFFFFFF;
307 }
308
310 {
311 if (type != POINT_MOTION_TYPE && type != EFFECT_MOTION_TYPE)
312 return;
313
314 switch (point)
315 {
317 me->setActive(false);
318 me->SetCanFly(false);
319 me->SetDisableGravity(false);
321 me->SetHomePosition(SindragosaLandPos);
323 me->SetSpeed(MOVE_FLIGHT, 2.5f);
324
325 // Sindragosa enters combat as soon as she lands
327 break;
328 case POINT_TAKEOFF:
329 events.ScheduleEvent(EVENT_AIR_MOVEMENT, 1);
330 break;
331 case POINT_AIR_PHASE:
332 me->CastCustomSpell(SPELL_ICE_TOMB_TARGET, SPELLVALUE_MAX_TARGETS, RAID_MODE<int32>(2, 5, 2, 6), NULL);
333 me->SetFacingTo(float(M_PI));
334 events.ScheduleEvent(EVENT_AIR_MOVEMENT_FAR, 1);
335 events.ScheduleEvent(EVENT_FROST_BOMB, 9000);
336 break;
338 me->SetFacingTo(float(M_PI));
339 events.ScheduleEvent(EVENT_LAND, 30000);
340 break;
341 case POINT_LAND:
342 events.ScheduleEvent(EVENT_LAND_GROUND, 1);
343 break;
345 {
346 me->SetCanFly(false);
347 me->SetDisableGravity(false);
349 me->SetReactState(REACT_DEFENSIVE);
350 if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() == POINT_MOTION_TYPE)
351 me->GetMotionMaster()->MovementExpired();
352 _isInAirPhase = false;
353 // trigger Asphyxiation
355 summons.DoAction(ACTION_TRIGGER_ASPHYXIATION, pred);
356 break;
357 }
358 default:
359 break;
360 }
361 }
362
363 void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/) OVERRIDE
364 {
365 if (!_isThirdPhase && !HealthAbovePct(35))
366 {
367 events.CancelEvent(EVENT_AIR_PHASE);
368 events.ScheduleEvent(EVENT_THIRD_PHASE_CHECK, 1000);
369 _isThirdPhase = true;
370 }
371 }
372
374 {
375 summons.Summon(summon);
376 if (summon->GetEntry() == NPC_FROST_BOMB)
377 {
378 summon->CastSpell(summon, SPELL_FROST_BOMB_VISUAL, true);
379 summon->CastSpell(summon, SPELL_BIRTH_NO_VISUAL, true);
380 summon->m_Events.AddEvent(new FrostBombExplosion(summon, me->GetGUID()), summon->m_Events.CalculateTime(5500));
381 }
382 }
383
385 {
387 if (summon->GetEntry() == NPC_ICE_TOMB)
388 summon->AI()->JustDied(summon);
389 }
390
391 void SpellHitTarget(Unit* target, SpellInfo const* spell) OVERRIDE
392 {
393 if (uint32 spellId = sSpellMgr->GetSpellIdForDifficulty(70127, me))
394 if (spellId == spell->Id)
395 if (Aura const* mysticBuffet = target->GetAura(spell->Id))
396 _mysticBuffetStack = std::max<uint8>(_mysticBuffetStack, mysticBuffet->GetStackAmount());
397 }
398
400 {
401 if (!UpdateVictim() || !CheckInRoom())
402 return;
403
404 events.Update(diff);
405
406 if (me->HasUnitState(UNIT_STATE_CASTING))
407 return;
408
409 while (uint32 eventId = events.ExecuteEvent())
410 {
411 switch (eventId)
412 {
413 case EVENT_BERSERK:
417 break;
418 case EVENT_CLEAVE:
420 events.ScheduleEvent(EVENT_CLEAVE, std::rand() % 20000 + 15000, EVENT_GROUP_LAND_PHASE);
421 break;
422 case EVENT_TAIL_SMASH:
424 events.ScheduleEvent(EVENT_TAIL_SMASH, std::rand() % 32000 + 27000, EVENT_GROUP_LAND_PHASE);
425 break;
428 events.ScheduleEvent(EVENT_FROST_BREATH, std::rand() % 25000 + 20000, EVENT_GROUP_LAND_PHASE);
429 break;
433 events.ScheduleEvent(EVENT_UNCHAINED_MAGIC, std::rand() % 35000 + 30000, EVENT_GROUP_LAND_PHASE);
434 break;
435 case EVENT_ICY_GRIP:
438 break;
443 break;
446 break;
447 case EVENT_AIR_PHASE:
448 {
449 _isInAirPhase = true;
451 me->SetCanFly(true);
452 me->SetDisableGravity(true);
454 me->SetReactState(REACT_PASSIVE);
455 me->AttackStop();
456 Position pos;
457 pos.Relocate(me);
458 pos.m_positionZ += 17.0f;
459 me->GetMotionMaster()->MoveTakeoff(POINT_TAKEOFF, pos);
460 events.CancelEventGroup(EVENT_GROUP_LAND_PHASE);
461 events.ScheduleEvent(EVENT_AIR_PHASE, 110000);
462 break;
463 }
465 me->GetMotionMaster()->MovePoint(POINT_AIR_PHASE, SindragosaAirPos);
466 break;
468 me->GetMotionMaster()->MovePoint(POINT_AIR_PHASE_FAR, SindragosaAirPosFar);
469 break;
470 case EVENT_ICE_TOMB:
472 {
474 DoCast(target, SPELL_ICE_TOMB_DUMMY, true);
475 }
476 events.ScheduleEvent(EVENT_ICE_TOMB, std::rand() % 23000 + 16000);
477 break;
478 case EVENT_FROST_BOMB:
479 {
480 float destX, destY, destZ;
481 destX = float(rand_norm()) * 75.0f + 4350.0f;
482 destY = float(rand_norm()) * 75.0f + 2450.0f;
483 destZ = 205.0f; // random number close to ground, get exact in next call
484 me->UpdateGroundPositionZ(destX, destY, destZ);
485 me->CastSpell(destX, destY, destZ, SPELL_FROST_BOMB_TRIGGER, false);
486 events.ScheduleEvent(EVENT_FROST_BOMB, std::rand() % 8000 + 6000);
487 break;
488 }
489 case EVENT_LAND:
490 {
491 events.CancelEvent(EVENT_FROST_BOMB);
492 me->GetMotionMaster()->MovePoint(POINT_LAND, SindragosaFlyInPos);
493 break;
494 }
496 events.ScheduleEvent(EVENT_CLEAVE, std::rand() % 15000 + 13000, EVENT_GROUP_LAND_PHASE);
497 events.ScheduleEvent(EVENT_TAIL_SMASH, std::rand() % 23000 + 19000, EVENT_GROUP_LAND_PHASE);
498 events.ScheduleEvent(EVENT_FROST_BREATH, std::rand() % 15000 + 10000, EVENT_GROUP_LAND_PHASE);
499 events.ScheduleEvent(EVENT_UNCHAINED_MAGIC, std::rand() % 17000 + 12000, EVENT_GROUP_LAND_PHASE);
500 events.ScheduleEvent(EVENT_ICY_GRIP, std::rand() % 40000 + 35000, EVENT_GROUP_LAND_PHASE);
501 me->GetMotionMaster()->MoveLand(POINT_LAND_GROUND, SindragosaLandPos);
502 break;
504 {
505 if (!_isInAirPhase)
506 {
508 events.ScheduleEvent(EVENT_ICE_TOMB, std::rand() % 10000 + 7000);
509 events.RescheduleEvent(EVENT_ICY_GRIP, std::rand() % 40000 + 35000);
511 }
512 else
513 events.ScheduleEvent(EVENT_THIRD_PHASE_CHECK, 5000);
514 break;
515 }
516 default:
517 break;
518 }
519 }
520
522 }
523
524 private:
529 };
530
532 {
534 }
535};
536
538{
539 public:
540 npc_ice_tomb() : CreatureScript("npc_ice_tomb") { }
541
543 {
544 npc_ice_tombAI(Creature* creature) : ScriptedAI(creature)
545 {
547 SetCombatMovement(false);
548 }
549
551 {
552 me->SetReactState(REACT_PASSIVE);
553 }
554
555 void SetGUID(uint64 guid, int32 type/* = 0 */) OVERRIDE
556 {
557 if (type == DATA_TRAPPED_PLAYER)
558 {
559 _trappedPlayerGUID = guid;
561 }
562 }
563
565 {
566 if (action == ACTION_TRIGGER_ASPHYXIATION)
568 player->CastSpell(player, SPELL_ASPHYXIATION, true);
569 }
570
571 void JustDied(Unit* /*killer*/) OVERRIDE
572 {
573 me->RemoveAllGameObjects();
574
576 {
578 player->RemoveAurasDueToSpell(SPELL_ICE_TOMB_DAMAGE);
579 player->RemoveAurasDueToSpell(SPELL_ASPHYXIATION);
580 }
581 }
582
584 {
586 return;
587
588 if (_existenceCheckTimer <= diff)
589 {
591 if (!player || player->isDead() || !player->HasAura(SPELL_ICE_TOMB_DAMAGE))
592 {
593 // Remove object
594 JustDied(me);
595 me->DespawnOrUnsummon();
596 return;
597 }
599 }
600 else
601 _existenceCheckTimer -= diff;
602 }
603
604 private:
607 };
608
610 {
612 }
613};
614
616{
617 public:
618 npc_spinestalker() : CreatureScript("npc_spinestalker") { }
619
621 {
622 npc_spinestalkerAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()), _summoned(false)
623 {
624 }
625
627 {
628 // Increase add count
629 if (!me->isDead())
630 {
631 _instance->SetData(DATA_SINDRAGOSA_FROSTWYRMS, me->GetDBTableGUIDLow()); // this cannot be in Reset because reset also happens on evade
632 Reset();
633 }
634 }
635
637 {
638 _events.Reset();
639 _events.ScheduleEvent(EVENT_BELLOWING_ROAR, std::rand() % 25000 + 20000);
640 _events.ScheduleEvent(EVENT_CLEAVE_SPINESTALKER, std::rand() % 15000 + 10000);
641 _events.ScheduleEvent(EVENT_TAIL_SWEEP, std::rand() % 12000 + 8000);
642 me->SetReactState(REACT_DEFENSIVE);
643
644 if (!_summoned)
645 {
646 me->SetCanFly(true);
647 me->SetDisableGravity(true);
648 }
649 }
650
652 {
654 _instance->SetData(DATA_SINDRAGOSA_FROSTWYRMS, me->GetDBTableGUIDLow()); // this cannot be in Reset because reset also happens on evade
655 }
656
657 void JustDied(Unit* /*killer*/) OVERRIDE
658 {
659 _events.Reset();
660 }
661
663 {
664 if (action == ACTION_START_FROSTWYRM)
665 {
666 if (_summoned)
667 return;
668
669 _summoned = true;
670 if (me->isDead())
671 return;
672
673 me->setActive(true);
674 me->SetSpeed(MOVE_FLIGHT, 2.0f);
676 float moveTime = me->GetExactDist(&SpinestalkerFlyPos) / (me->GetSpeed(MOVE_FLIGHT) * 0.001f);
677 me->m_Events.AddEvent(new FrostwyrmLandEvent(*me, SpinestalkerLandPos), me->m_Events.CalculateTime(uint64(moveTime) + 250));
678 me->SetDefaultMovementType(IDLE_MOTION_TYPE);
679 me->GetMotionMaster()->MoveIdle();
680 me->StopMoving();
681 me->GetMotionMaster()->MovePoint(POINT_FROSTWYRM_FLY_IN, SpinestalkerFlyPos);
682 }
683 }
684
686 {
687 if (type != EFFECT_MOTION_TYPE || point != POINT_FROSTWYRM_LAND)
688 return;
689
690 me->setActive(false);
691 me->SetCanFly(false);
692 me->SetDisableGravity(false);
694 me->SetHomePosition(SpinestalkerLandPos);
695 me->SetFacingTo(SpinestalkerLandPos.GetOrientation());
697 }
698
700 {
701 if (!UpdateVictim())
702 return;
703
704 _events.Update(diff);
705
706 if (me->HasUnitState(UNIT_STATE_CASTING))
707 return;
708
709 while (uint32 eventId = _events.ExecuteEvent())
710 {
711 switch (eventId)
712 {
715 _events.ScheduleEvent(EVENT_BELLOWING_ROAR, std::rand() % 30000 + 25000);
716 break;
719 _events.ScheduleEvent(EVENT_CLEAVE_SPINESTALKER, std::rand() % 15000 + 10000);
720 break;
721 case EVENT_TAIL_SWEEP:
723 _events.ScheduleEvent(EVENT_TAIL_SWEEP, std::rand() % 25000 + 22000);
724 break;
725 default:
726 break;
727 }
728 }
729
731 }
732
733 private:
737 };
738
740 {
742 }
743};
744
746{
747 public:
748 npc_rimefang() : CreatureScript("npc_rimefang_icc") { }
749
751 {
752 npc_rimefangAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()), _summoned(false)
753 {
754 }
755
757 {
758 // Increase add count
759 if (!me->isDead())
760 {
761 _instance->SetData(DATA_SINDRAGOSA_FROSTWYRMS, me->GetDBTableGUIDLow()); // this cannot be in Reset because reset also happens on evade
762 Reset();
763 }
764 }
765
767 {
768 _events.Reset();
769 _events.ScheduleEvent(EVENT_FROST_BREATH_RIMEFANG, std::rand() % 15000 + 12000);
770 _events.ScheduleEvent(EVENT_ICY_BLAST, std::rand() % 35000 + 30000);
771 me->SetReactState(REACT_DEFENSIVE);
773
774 if (!_summoned)
775 {
776 me->SetCanFly(true);
777 me->SetDisableGravity(true);
778 }
779 }
780
782 {
784 _instance->SetData(DATA_SINDRAGOSA_FROSTWYRMS, me->GetDBTableGUIDLow()); // this cannot be in Reset because reset also happens on evade
785 }
786
787 void JustDied(Unit* /*killer*/) OVERRIDE
788 {
789 _events.Reset();
790 }
791
793 {
794 if (action == ACTION_START_FROSTWYRM)
795 {
796 if (_summoned)
797 return;
798
799 _summoned = true;
800 if (me->isDead())
801 return;
802
803 me->setActive(true);
804 me->SetSpeed(MOVE_FLIGHT, 2.0f);
806 float moveTime = me->GetExactDist(&RimefangFlyPos) / (me->GetSpeed(MOVE_FLIGHT) * 0.001f);
807 me->m_Events.AddEvent(new FrostwyrmLandEvent(*me, RimefangLandPos), me->m_Events.CalculateTime(uint64(moveTime) + 250));
808 me->SetDefaultMovementType(IDLE_MOTION_TYPE);
809 me->GetMotionMaster()->MoveIdle();
810 me->StopMoving();
811 me->GetMotionMaster()->MovePoint(POINT_FROSTWYRM_FLY_IN, RimefangFlyPos);
812 }
813 }
814
816 {
817 if (type != EFFECT_MOTION_TYPE || point != POINT_FROSTWYRM_LAND)
818 return;
819
820 me->setActive(false);
821 me->SetCanFly(false);
822 me->SetDisableGravity(false);
824 me->SetHomePosition(RimefangLandPos);
825 me->SetFacingTo(RimefangLandPos.GetOrientation());
827 }
828
829 void EnterCombat(Unit* /*victim*/) OVERRIDE
830 {
832 }
833
835 {
836 if (!UpdateVictim())
837 return;
838
839 _events.Update(diff);
840
841 if (me->HasUnitState(UNIT_STATE_CASTING))
842 return;
843
844 while (uint32 eventId = _events.ExecuteEvent())
845 {
846 switch (eventId)
847 {
850 _events.ScheduleEvent(EVENT_FROST_BREATH_RIMEFANG, std::rand() % 40000 + 35000);
851 break;
852 case EVENT_ICY_BLAST:
853 {
855 me->SetReactState(REACT_PASSIVE);
856 me->AttackStop();
857 me->SetCanFly(true);
858 me->GetMotionMaster()->MovePoint(POINT_FROSTWYRM_FLY_IN, RimefangFlyPos);
859 float moveTime = me->GetExactDist(&RimefangFlyPos)/(me->GetSpeed(MOVE_FLIGHT)*0.001f);
860 _events.ScheduleEvent(EVENT_ICY_BLAST, uint64(moveTime) + std::rand() % 70000 + 60000);
861 _events.ScheduleEvent(EVENT_ICY_BLAST_CAST, uint64(moveTime) + 250);
862 break;
863 }
865 if (--_icyBlastCounter)
866 {
867 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true))
868 {
869 me->SetFacingToObject(target);
870 DoCast(target, SPELL_ICY_BLAST);
871 }
872 _events.ScheduleEvent(EVENT_ICY_BLAST_CAST, 3000);
873 }
874 else if (Unit* victim = me->SelectVictim())
875 {
876 me->SetReactState(REACT_DEFENSIVE);
877 AttackStart(victim);
878 me->SetCanFly(false);
879 }
880 break;
881 default:
882 break;
883 }
884 }
885
887 }
888
889 private:
894 };
895
897 {
899 }
900};
901
903{
904 public:
905 npc_sindragosa_trash() : CreatureScript("npc_sindragosa_trash") { }
906
908 {
910 {
911 _instance = creature->GetInstanceScript();
912 }
913
915 {
916 _frostwyrmId = (me->GetHomePosition().GetPositionY() < 2484.35f) ? DATA_RIMEFANG : DATA_SPINESTALKER;
917 // Increase add count
918 if (!me->isDead())
919 {
920 if (me->GetEntry() == NPC_FROSTWING_WHELP)
921 _instance->SetData(_frostwyrmId, me->GetDBTableGUIDLow()); // this cannot be in Reset because reset also happens on evade
922 Reset();
923 }
924 }
925
927 {
928 // This is shared AI for handler and whelps
929 if (me->GetEntry() == NPC_FROSTWARDEN_HANDLER)
930 {
931 _events.ScheduleEvent(EVENT_FROSTWARDEN_ORDER_WHELP, 3000);
932 _events.ScheduleEvent(EVENT_CONCUSSIVE_SHOCK, std::rand() % 10000 + 8000);
933 }
934
935 _isTaunted = false;
936 }
937
939 {
941
942 // Increase add count
943 if (me->GetEntry() == NPC_FROSTWING_WHELP)
944 _instance->SetData(_frostwyrmId, me->GetDBTableGUIDLow()); // this cannot be in Reset because reset also happens on evade
945 }
946
947 void SetData(uint32 type, uint32 data) OVERRIDE
948 {
949 if (type == DATA_WHELP_MARKER)
950 _isTaunted = data != 0;
951 }
952
954 {
955 if (type == DATA_FROSTWYRM_OWNER)
956 return _frostwyrmId;
957 else if (type == DATA_WHELP_MARKER)
958 return uint32(_isTaunted);
959 return 0;
960 }
961
963 {
964 if (!UpdateVictim())
965 return;
966
967 _events.Update(diff);
968
969 if (me->HasUnitState(UNIT_STATE_CASTING))
970 return;
971
972 while (uint32 eventId = _events.ExecuteEvent())
973 {
974 switch (eventId)
975 {
978 _events.ScheduleEvent(EVENT_FROSTWARDEN_ORDER_WHELP, 3000);
979 break;
982 _events.ScheduleEvent(EVENT_CONCUSSIVE_SHOCK, std::rand() % 13000 + 10000);
983 break;
984 default:
985 break;
986 }
987 }
988
990 }
991
992 private:
996 bool _isTaunted; // Frostwing Whelp only
997 };
998
1000 {
1002 }
1003};
1004
1006{
1007 public:
1008 spell_sindragosa_s_fury() : SpellScriptLoader("spell_sindragosa_s_fury") { }
1009
1011 {
1013
1015 {
1016 _targetCount = 0;
1017
1018 // This script should execute only in Icecrown Citadel
1019 if (InstanceMap* instance = GetCaster()->GetMap()->ToInstanceMap())
1020 if (instance->GetInstanceScript())
1021 if (instance->GetScriptId() == sObjectMgr->GetScriptId(ICCScriptName))
1022 return true;
1023
1024 return false;
1025 }
1026
1028 {
1029 if (Position* dest = const_cast<WorldLocation*>(GetExplTargetDest()))
1030 {
1031 float destX = float(rand_norm()) * 75.0f + 4350.0f;
1032 float destY = float(rand_norm()) * 75.0f + 2450.0f;
1033 float destZ = 205.0f; // random number close to ground, get exact in next call
1034 GetCaster()->UpdateGroundPositionZ(destX, destY, destZ);
1035 dest->Relocate(destX, destY, destZ);
1036 }
1037 }
1038
1039 void CountTargets(std::list<WorldObject*>& targets)
1040 {
1041 _targetCount = targets.size();
1042 }
1043
1045 {
1046 PreventHitDefaultEffect(effIndex);
1047
1048 if (!GetHitUnit()->IsAlive() || !_targetCount)
1049 return;
1050
1051 float resistance = float(GetHitUnit()->GetResistance(SpellSchoolMask(GetSpellInfo()->SchoolMask)));
1052 uint32 minResistFactor = uint32((resistance / (resistance + 510.0f)) * 10.0f) * 2;
1053 uint32 randomResist = std::rand() % ((9 - minResistFactor) * 100) / 100 + minResistFactor;
1054
1055 uint32 damage = (uint32(GetEffectValue() / _targetCount) * randomResist) / 10;
1056
1057 SpellNonMeleeDamage damageInfo(GetCaster(), GetHitUnit(), GetSpellInfo()->Id, GetSpellInfo()->SchoolMask);
1058 damageInfo.damage = damage;
1059 GetCaster()->SendSpellNonMeleeDamageLog(&damageInfo);
1060 GetCaster()->DealSpellDamage(&damageInfo, false);
1061 }
1062
1069
1071 };
1072
1077};
1078
1080{
1081 public:
1083
1084 bool operator()(WorldObject* object) const
1085 {
1086 if (Unit* unit = object->ToUnit())
1087 return unit->getPowerType() != POWER_MANA;
1088 return true;
1089 }
1090};
1091
1093{
1094 public:
1095 spell_sindragosa_unchained_magic() : SpellScriptLoader("spell_sindragosa_unchained_magic") { }
1096
1098 {
1100
1101 void FilterTargets(std::list<WorldObject*>& unitList)
1102 {
1103 unitList.remove_if(UnchainedMagicTargetSelector());
1104 uint32 maxSize = uint32(GetCaster()->GetMap()->GetSpawnMode() & 1 ? 6 : 2);
1105 if (unitList.size() > maxSize)
1106 Skyfire::Containers::RandomResizeList(unitList, maxSize);
1107 }
1108
1113 };
1114
1119};
1120
1122{
1123 public:
1124 spell_sindragosa_frost_breath() : SpellScriptLoader("spell_sindragosa_frost_breath") { }
1125
1127 {
1129
1131 {
1132 Player* target = GetHitPlayer();
1133 if (!target)
1134 return;
1135
1136 // Check difficulty and quest status
1138 return;
1139
1140 // Check if player has Shadow's Edge equipped and not ready for infusion
1142 return;
1143
1144 Aura* infusion = target->GetAura(SPELL_FROST_INFUSION, target->GetGUID());
1145 if (infusion && infusion->GetStackAmount() >= 3)
1146 {
1147 target->RemoveAura(infusion);
1149 }
1150 else
1152 }
1153
1158 };
1159
1164};
1165
1167{
1168 public:
1169 spell_sindragosa_instability() : SpellScriptLoader("spell_sindragosa_instability") { }
1170
1172 {
1174
1175 bool Validate(SpellInfo const* /*spell*/) OVERRIDE
1176 {
1177 if (!sSpellMgr->GetSpellInfo(SPELL_BACKLASH))
1178 return false;
1179 return true;
1180 }
1181
1182 void OnRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
1183 {
1184 if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE)
1186 }
1187
1192 };
1193
1198};
1199
1201{
1202 public:
1203 spell_sindragosa_frost_beacon() : SpellScriptLoader("spell_sindragosa_frost_beacon") { }
1204
1206 {
1208
1209 bool Validate(SpellInfo const* /*spell*/) OVERRIDE
1210 {
1211 if (!sSpellMgr->GetSpellInfo(SPELL_ICE_TOMB_DAMAGE))
1212 return false;
1213 return true;
1214 }
1215
1216 void PeriodicTick(AuraEffect const* /*aurEff*/)
1217 {
1219 if (Unit* caster = GetCaster())
1220 caster->CastSpell(GetTarget(), SPELL_ICE_TOMB_DAMAGE, true);
1221 }
1222
1227 };
1228
1233};
1234
1236{
1237 public:
1238 spell_sindragosa_ice_tomb() : SpellScriptLoader("spell_sindragosa_ice_tomb_trap") { }
1239
1241 {
1243
1244 bool Validate(SpellInfo const* /*spell*/) OVERRIDE
1245 {
1246 if (!sObjectMgr->GetCreatureTemplate(NPC_ICE_TOMB))
1247 return false;
1248 if (!sObjectMgr->GetGameObjectTemplate(GO_ICE_BLOCK))
1249 return false;
1250 return true;
1251 }
1252
1254 {
1255 Position pos;
1256 GetHitUnit()->GetPosition(&pos);
1257 if (TempSummon* summon = GetCaster()->SummonCreature(NPC_ICE_TOMB, pos))
1258 {
1259 summon->AI()->SetGUID(GetHitUnit()->GetGUID(), DATA_TRAPPED_PLAYER);
1260 if (GameObject* go = summon->SummonGameObject(GO_ICE_BLOCK, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation(), 0.0f, 0.0f, 0.0f, 0.0f, 0))
1261 {
1262 go->SetSpellId(SPELL_ICE_TOMB_DAMAGE);
1263 summon->AddGameObject(go);
1264 }
1265 }
1266 }
1267
1272 };
1273
1288
1293
1298};
1299
1301{
1302 public:
1303 spell_sindragosa_icy_grip() : SpellScriptLoader("spell_sindragosa_icy_grip") { }
1304
1327
1332};
1333
1335{
1336 public:
1337 explicit MysticBuffetTargetFilter(Unit* caster) : _caster(caster) { }
1338
1339 bool operator()(WorldObject* unit) const
1340 {
1341 return !unit->IsWithinLOSInMap(_caster);
1342 }
1343
1344 private:
1346};
1347
1373
1375{
1376 public:
1377 spell_rimefang_icy_blast() : SpellScriptLoader("spell_rimefang_icy_blast") { }
1378
1380 {
1382
1383 bool Validate(SpellInfo const* /*spell*/) OVERRIDE
1384 {
1385 if (!sSpellMgr->GetSpellInfo(SPELL_ICY_BLAST_AREA))
1386 return false;
1387 return true;
1388 }
1389
1391 {
1392 PreventHitDefaultEffect(effIndex);
1393 if (Position const* pos = GetExplTargetDest())
1394 if (TempSummon* summon = GetCaster()->SummonCreature(NPC_ICY_BLAST, *pos, TempSummonType::TEMPSUMMON_TIMED_DESPAWN, 40000))
1395 summon->CastSpell(summon, SPELL_ICY_BLAST_AREA, true);
1396 }
1397
1402 };
1403
1408};
1409
1411{
1412 public:
1413 explicit OrderWhelpTargetSelector(Creature* owner) : _owner(owner) { }
1414
1415 bool operator()(Creature* creature)
1416 {
1417 if (!creature->AI()->GetData(DATA_WHELP_MARKER) && creature->AI()->GetData(DATA_FROSTWYRM_OWNER) == _owner->AI()->GetData(DATA_FROSTWYRM_OWNER))
1418 return false;
1419 return true;
1420 }
1421
1422 private:
1424};
1425
1427{
1428 public:
1429 spell_frostwarden_handler_order_whelp() : SpellScriptLoader("spell_frostwarden_handler_order_whelp") { }
1430
1432 {
1434
1435 bool Validate(SpellInfo const* /*spell*/) OVERRIDE
1436 {
1437 if (!sSpellMgr->GetSpellInfo(SPELL_FOCUS_FIRE))
1438 return false;
1439 return true;
1440 }
1441
1442 void FilterTargets(std::list<WorldObject*>& targets)
1443 {
1444 targets.remove_if(Skyfire::ObjectTypeIdCheck(TypeID::TYPEID_PLAYER, false));
1445 if (targets.empty())
1446 return;
1447
1449 targets.clear();
1450 targets.push_back(target);
1451 }
1452
1454 {
1455 // caster is Frostwarden Handler, target is player, caster of triggered is whelp
1456 PreventHitDefaultEffect(effIndex);
1457 std::list<Creature*> unitList;
1459 if (Creature* creature = GetCaster()->ToCreature())
1460 unitList.remove_if(OrderWhelpTargetSelector(creature));
1461
1462 if (unitList.empty())
1463 return;
1464
1466 }
1467
1473 };
1474
1479};
1480
1482{
1483 public:
1484 spell_frostwarden_handler_focus_fire() : SpellScriptLoader("spell_frostwarden_handler_focus_fire") { }
1485
1502
1504 {
1506
1507 void PeriodicTick(AuraEffect const* /*aurEff*/)
1508 {
1510 if (Unit* caster = GetCaster())
1511 {
1512 caster->AddThreat(GetTarget(), -float(GetSpellInfo()->Effects[EFFECT_1].CalcValue()));
1513 caster->GetAI()->SetData(DATA_WHELP_MARKER, 0);
1514 }
1515 }
1516
1521 };
1522
1527
1532};
1533
1535{
1536 public:
1537 at_sindragosa_lair() : AreaTriggerScript("at_sindragosa_lair") { }
1538
1539 bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) OVERRIDE
1540 {
1541 if (InstanceScript* instance = player->GetInstanceScript())
1542 {
1543 if (!instance->GetData(DATA_SPINESTALKER))
1544 if (Creature* spinestalker = ObjectAccessor::GetCreature(*player, instance->GetData64(DATA_SPINESTALKER)))
1545 spinestalker->AI()->DoAction(ACTION_START_FROSTWYRM);
1546
1547 if (!instance->GetData(DATA_RIMEFANG))
1548 if (Creature* rimefang = ObjectAccessor::GetCreature(*player, instance->GetData64(DATA_RIMEFANG)))
1549 rimefang->AI()->DoAction(ACTION_START_FROSTWYRM);
1550
1551 if (!instance->GetData(DATA_SINDRAGOSA_FROSTWYRMS) && !instance->GetData64(DATA_SINDRAGOSA) && instance->GetBossState(DATA_SINDRAGOSA) != DONE)
1552 {
1553 if (player->GetMap()->IsHeroic() && !instance->GetData(DATA_HEROIC_ATTEMPTS))
1554 return true;
1555
1556 player->GetMap()->LoadGrid(SindragosaSpawnPos.GetPositionX(), SindragosaSpawnPos.GetPositionY());
1557 if (Creature* sindragosa = player->GetMap()->SummonCreature(NPC_SINDRAGOSA, SindragosaSpawnPos))
1558 sindragosa->AI()->DoAction(ACTION_START_FROSTWYRM);
1559 }
1560 }
1561
1562 return true;
1563 }
1564};
1565
1567{
1568 public:
1569 achievement_all_you_can_eat() : AchievementCriteriaScript("achievement_all_you_can_eat") { }
1570
1571 bool OnCheck(Player* /*source*/, Unit* target) OVERRIDE
1572 {
1573 if (!target)
1574 return false;
1575 return target->GetAI()->GetData(DATA_MYSTIC_BUFFET_STACK) <= 5;
1576 }
1577};
1578
#define M_PI
Definition Common.h:192
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
@ FAIL
@ DONE
@ IDLE_MOTION_TYPE
@ POINT_MOTION_TYPE
@ EFFECT_MOTION_TYPE
@ TYPEID_PLAYER
Definition Object.h:55
@ TEMPSUMMON_TIMED_DESPAWN
Definition Object.h:70
@ TEMPSUMMON_DEAD_DESPAWN
Definition Object.h:74
#define sObjectMgr
Definition ObjectMgr.h:1617
@ QUEST_STATUS_INCOMPLETE
Definition QuestDef.h:89
void GetCreatureListWithEntryInGrid(std::list< Creature * > &list, WorldObject *source, uint32 entry, float maxSearchRange)
SpellEffIndex
@ EFFECT_1
@ EFFECT_0
@ EFFECT_2
@ POWER_MANA
@ SPELL_EFFECT_DUMMY
@ SPELL_EFFECT_SCRIPT_EFFECT
@ SPELL_EFFECT_TRIGGER_MISSILE
@ SPELL_EFFECT_FORCE_CAST
@ TARGET_UNIT_DEST_AREA_ENEMY
@ TARGET_UNIT_SRC_AREA_ENEMY
@ TARGET_UNIT_DEST_AREA_ENTRY
SpellSchoolMask
@ SPELL_AURA_DUMMY
@ SPELL_AURA_PERIODIC_DUMMY
@ SPELL_AURA_PERIODIC_TRIGGER_SPELL
AuraEffectHandleModes
@ AURA_EFFECT_HANDLE_REAL
#define sSpellMgr
Definition SpellMgr.h:744
#define SpellEffectFn(F, I, N)
#define SpellObjectAreaTargetSelectFn(F, I, N)
#define AuraEffectPeriodicFn(F, I, N)
#define SpellCastFn(F)
#define SpellHitFn(F)
#define AuraEffectRemoveFn(F, I, N, M)
@ SPELLVALUE_MAX_TARGETS
Definition Unit.h:118
@ 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
@ TRIGGERED_FULL_MASK
Will ignore most target checks (mostly DBC target checks).
Definition Unit.h:435
@ UNIT_STATE_CASTING
Definition Unit.h:527
@ MOVE_FLIGHT
Definition Unit.h:561
@ REACT_DEFENSIVE
Definition Unit.h:1157
@ REACT_PASSIVE
Definition Unit.h:1156
@ UNIT_FLAG_NON_ATTACKABLE
Definition Unit.h:626
@ UNIT_FLAG_IMMUNE_TO_PC
Definition Unit.h:633
@ SELECT_TARGET_RANDOM
Definition UnitAI.h:23
@ UNIT_FIELD_ANIM_TIER
@ UNIT_FIELD_FLAGS
double rand_norm(void)
Definition Util.cpp:50
@ SPELL_CLEAVE
@ EVENT_CLEAVE
@ SAY_BERSERK
#define SAY_DEATH
#define SAY_AGGRO
#define SAY_KILL
#define SPELL_BERSERK
@ SPELL_BIRTH_NO_VISUAL
@ SPELL_FROST_BREATH
@ SPELL_BELLOWING_ROAR
@ SPELL_TAIL_SWEEP
@ EVENT_BERSERK
@ EVENT_TAIL_SWEEP
@ EVENT_BELLOWING_ROAR
@ POINT_LAND_GROUND
@ EVENT_AIR_MOVEMENT
@ EVENT_GROUP_LAND_PHASE
@ EVENT_LAND_GROUND
Position const SindragosaFlyInPos
@ SPELL_FROST_BREATH_P1
@ SPELL_TANK_MARKER
@ SPELL_FROST_BOMB_VISUAL
@ SPELL_CLEAVE
@ SPELL_PERMAEATING_CHILL
@ SPELL_FROST_BOMB_TRIGGER
@ SPELL_CLEAVE_SPINESTALKER
@ SPELL_FROST_BREATH
@ SPELL_UNCHAINED_MAGIC
@ SPELL_BACKLASH
@ SPELL_FROST_INFUSION
@ SPELL_BELLOWING_ROAR
@ SPELL_ICE_TOMB_DAMAGE
@ SPELL_FOCUS_FIRE
@ SPELL_ICE_TOMB_TARGET
@ SPELL_FROST_AURA_RIMEFANG
@ SPELL_ICE_TOMB_UNTARGETABLE
@ SPELL_ORDER_WHELP
@ SPELL_ASPHYXIATION
@ SPELL_FROST_AURA
@ SPELL_FROST_BEACON
@ SPELL_FROST_IMBUED_BLADE
@ SPELL_ICY_BLAST_AREA
@ SPELL_ICY_GRIP_JUMP
@ SPELL_FROST_INFUSION_CREDIT
@ SPELL_TAIL_SMASH
@ SPELL_ICY_BLAST
@ SPELL_FROST_BOMB
@ SPELL_ICE_TOMB_DUMMY
@ SPELL_FROST_BREATH_P2
@ SPELL_CONCUSSIVE_SHOCK
@ SPELL_MYSTIC_BUFFET
@ SPELL_TAIL_SWEEP
@ SPELL_SINDRAGOSA_S_FURY
@ SPELL_BLISTERING_COLD
@ SPELL_BIRTH_NO_VISUAL
@ SPELL_ICY_GRIP
void AddSC_boss_sindragosa()
FrostwingData
@ DATA_LINKED_GAMEOBJECT
@ DATA_MYSTIC_BUFFET_STACK
@ DATA_WHELP_MARKER
@ DATA_FROSTWYRM_OWNER
@ DATA_TRAPPED_PLAYER
Position const SpinestalkerFlyPos
Position const SpinestalkerLandPos
Position const SindragosaFlyPos
@ POINT_FROSTWYRM_LAND
@ POINT_TAKEOFF
@ POINT_FROSTWYRM_FLY_IN
@ POINT_AIR_PHASE
@ POINT_LAND
@ POINT_LAND_GROUND
@ POINT_AIR_PHASE_FAR
Position const RimefangLandPos
@ SAY_DEATH
@ EMOTE_WARN_FROZEN_ORB
@ EMOTE_BERSERK_RAID
@ SAY_UNCHAINED_MAGIC
@ SAY_AGGRO
@ EMOTE_WARN_BLISTERING_COLD
@ SAY_PHASE_2
@ SAY_KILL
@ SAY_BLISTERING_COLD
@ SAY_AIR_PHASE
@ SAY_BERSERK
@ SAY_RESPITE_FOR_A_TORMENTED_SOUL
@ QUEST_FROST_INFUSION
Position const RimefangFlyPos
Position const SindragosaAirPosFar
Position const SindragosaLandPos
Position const SindragosaSpawnPos
@ EVENT_ICY_BLAST_CAST
@ EVENT_AIR_MOVEMENT
@ EVENT_TAIL_SWEEP
@ EVENT_TAIL_SMASH
@ EVENT_AIR_PHASE
@ EVENT_AIR_MOVEMENT_FAR
@ EVENT_FROST_BREATH
@ EVENT_GROUP_LAND_PHASE
@ EVENT_LAND_GROUND
@ EVENT_FROST_BOMB
@ EVENT_BLISTERING_COLD
@ EVENT_UNCHAINED_MAGIC
@ EVENT_ICE_TOMB
@ EVENT_THIRD_PHASE_CHECK
@ EVENT_BLISTERING_COLD_YELL
@ EVENT_CLEAVE_SPINESTALKER
@ EVENT_CONCUSSIVE_SHOCK
@ EVENT_FROST_BREATH_RIMEFANG
@ EVENT_BERSERK
@ EVENT_BELLOWING_ROAR
@ EVENT_ICY_BLAST
@ EVENT_ICY_GRIP
@ EVENT_FROSTWARDEN_ORDER_WHELP
@ EVENT_CLEAVE
@ EVENT_LAND
Position const SindragosaAirPos
AchievementCriteriaScript(const char *name)
AreaTriggerScript(const char *name)
int32 GetAmount() const
uint8 GetStackAmount() const
Definition SpellAuras.h:133
void PreventDefaultAction()
AuraApplication const * GetTargetApplication() const
HookList< EffectApplyHandler > AfterEffectRemove
HookList< EffectPeriodicHandler > OnEffectPeriodic
SpellInfo const * GetSpellInfo() const
uint64 GetCasterGUID() const
Unit * GetCaster() const
Unit * GetTarget() const
InstanceScript *const instance
void SummonedCreatureDespawn(Creature *summon) OVERRIDE
void JustReachedHome() OVERRIDE
bool CheckInRoom()
SummonList summons
EventMap events
void Reset() OVERRIDE
BossAI(Creature *creature, uint32 bossId)
void EnterCombat(Unit *) OVERRIDE
void DoZoneInCombat(Creature *creature=NULL, float maxRangeToNearestTarget=50.0f)
virtual void JustRespawned()
Definition CreatureAI.h:115
void Talk(uint8 id, WorldObject const *whisperTarget=NULL)
bool UpdateVictim()
virtual void EnterEvadeMode()
CreatureAI * AI() const
Definition Creature.h:483
CreatureScript(const char *name)
bool operator()(Unit *target) const
FrostBeaconSelector(Unit *source)
bool Execute(uint64, uint32)
FrostBombExplosion(Creature *owner, uint64 sindragosaGUID)
FrostwyrmLandEvent(Creature &owner, Position const &dest)
Position const & _dest
bool Execute(uint64, uint32)
bool Is25ManRaid() const
Definition Map.cpp:3063
TempSummon * SummonCreature(uint32 entry, Position const &pos, SummonPropertiesEntry const *properties=NULL, uint32 duration=0, Unit *summoner=NULL, uint32 spellId=0, uint32 vehId=0)
Definition Object.cpp:2564
bool operator()(WorldObject *unit) const
static Creature * GetCreature(WorldObject const &u, uint64 guid)
static Player * GetPlayer(WorldObject const &, uint64 guid)
uint64 GetGUID() const
Definition Object.h:119
TypeID GetTypeId() const
Definition Object.h:131
Unit * ToUnit()
Definition Object.h:210
OrderWhelpTargetSelector(Creature *owner)
bool operator()(Creature *creature)
QuestStatus GetQuestStatus(uint32 quest_id) const
WorldLocation const * GetExplTargetDest()
Player * GetHitPlayer()
HookList< HitHandler > AfterHit
SpellInfo const * GetSpellInfo()
HookList< EffectHandler > OnEffectHit
void PreventHitDefaultEffect(SpellEffIndex effIndex)
HookList< EffectHandler > OnEffectHitTarget
Unit * GetHitUnit()
int32 GetEffectValue()
HookList< CastHandler > BeforeCast
Unit * GetCaster()
HookList< ObjectAreaTargetSelectHandler > OnObjectAreaTargetSelect
SpellScriptLoader(const char *name)
bool operator()(WorldObject *object) const
virtual void SetData(uint32, uint32)
Definition UnitAI.h:128
void DoMeleeAttackIfReady()
Definition UnitAI.cpp:28
void DoCast(uint32 spellId)
Definition UnitAI.cpp:110
virtual uint32 GetData(uint32) const
Definition UnitAI.h:127
Unit * SelectTarget(SelectAggroTarget targetType, uint32 position=0, float dist=0.0f, bool playerOnly=false, int32 aura=0)
Definition UnitAI.cpp:66
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 AddThreat(Unit *victim, float fThreat, SpellSchoolMask schoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *threatSpell=NULL)
Definition Unit.cpp:4463
Aura * GetAura(uint32 spellId, uint64 casterGUID=0, uint64 itemCasterGUID=0, uint32 reqEffMask=0) const
void DealSpellDamage(SpellNonMeleeDamage *damageInfo, bool durabilityLoss)
bool HasAura(uint32 spellId, uint64 casterGUID=0, uint64 itemCasterGUID=0, uint32 reqEffMask=0) const
void SendSpellNonMeleeDamageLog(SpellNonMeleeDamage *log)
Definition Unit.cpp:1766
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
bool isDead() const
Definition Unit.h:2040
Map * GetMap() const
Definition Object.h:740
InstanceScript * GetInstanceScript()
Definition Object.cpp:1612
bool IsWithinLOSInMap(WorldObject const *obj) const
Definition Object.cpp:1656
void UpdateGroundPositionZ(float x, float y, float &z) const
Definition Object.cpp:1978
GameObject * SummonGameObject(uint32 entry, float x, float y, float z, float ang, float rotation0, float rotation1, float rotation2, float rotation3, uint32 respawnTime)
Definition Object.cpp:2729
bool OnCheck(Player *, Unit *target) OVERRIDE
bool OnTrigger(Player *player, AreaTriggerEntry const *) OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
AuraScript * GetAuraScript() const OVERRIDE
SpellScript * GetSpellScript() const OVERRIDE
SpellScript * GetSpellScript() const OVERRIDE
PrepareSpellScript(spell_rimefang_icy_blast_SpellScript)
SpellScript * GetSpellScript() const OVERRIDE
AuraScript * GetAuraScript() const OVERRIDE
SpellScript * GetSpellScript() const OVERRIDE
PrepareAuraScript(spell_sindragosa_ice_tomb_AuraScript)
PrepareSpellScript(spell_sindragosa_ice_tomb_SpellScript)
AuraScript * GetAuraScript() const OVERRIDE
SpellScript * GetSpellScript() const OVERRIDE
PrepareSpellScript(spell_sindragosa_icy_grip_SpellScript)
SpellScript * GetSpellScript() const OVERRIDE
void OnRemove(AuraEffect const *aurEff, AuraEffectHandleModes)
AuraScript * GetAuraScript() const OVERRIDE
SpellScript * GetSpellScript() const OVERRIDE
PrepareSpellScript(spell_sindragosa_s_fury_SpellScript)
SpellScript * GetSpellScript() const OVERRIDE
SpellScript * GetSpellScript() const OVERRIDE
@ NPC_FROST_BOMB
@ NPC_SINDRAGOSA
@ NPC_ICE_TOMB
@ NPC_FROSTWARDEN_HANDLER
@ NPC_FROSTWING_WHELP
CreatureAI * GetIcecrownCitadelAI(Creature *creature)
@ ACTION_START_FROSTWYRM
@ ACTION_TRIGGER_ASPHYXIATION
@ LIGHT_S_HAMMER_TELEPORT
#define ICCScriptName
@ SPELL_UNSATED_CRAVING
@ SPELL_SHADOWS_FATE
@ GO_ICE_BLOCK
@ DATA_HEROIC_ATTEMPTS
@ DATA_SINDRAGOSA_FROSTWYRMS
@ DATA_SINDRAGOSA
@ DATA_SPINESTALKER
void RandomResizeList(std::list< T > &list, uint32 size)
Definition Containers.h:19
C::value_type const & SelectRandomContainerElement(C const &container)
Definition Containers.h:48
@ NPC_ICY_BLAST
@ DATA_RIMEFANG
float m_positionZ
Definition Object.h:289
float GetPositionZ() const
Definition Object.h:330
float GetOrientation() const
Definition Object.h:331
float GetPositionX() const
Definition Object.h:328
void GetPosition(float &x, float &y) const
Definition Object.h:333
float GetPositionY() const
Definition Object.h:329
void Relocate(float x, float y)
Definition Object.h:302
void SetCombatMovement(bool allowMovement)
Creature * me
bool HealthAbovePct(uint32 pct) const
const T & RAID_MODE(const T &normal10, const T &normal25) const
ScriptedAI(Creature *creature)
bool Is25ManRaid() const
void AttackStart(Unit *) OVERRIDE
void DamageTaken(Unit *, uint32 &) OVERRIDE
void KilledUnit(Unit *victim) OVERRIDE
void MovementInform(uint32 type, uint32 point) OVERRIDE
void EnterCombat(Unit *victim) OVERRIDE
void SpellHitTarget(Unit *target, SpellInfo const *spell) OVERRIDE
void DoAction(int32 action) OVERRIDE
void JustSummoned(Creature *summon) OVERRIDE
uint32 GetData(uint32 type) const OVERRIDE
void SummonedCreatureDespawn(Creature *summon) OVERRIDE
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void SetGUID(uint64 guid, int32 type) OVERRIDE
void DoAction(int32 action) OVERRIDE
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void JustDied(Unit *) OVERRIDE
npc_ice_tombAI(Creature *creature)
void DoAction(int32 action) OVERRIDE
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void EnterCombat(Unit *) OVERRIDE
void MovementInform(uint32 type, uint32 point) OVERRIDE
npc_rimefangAI(Creature *creature)
void JustDied(Unit *) OVERRIDE
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void SetData(uint32 type, uint32 data) OVERRIDE
uint32 GetData(uint32 type) const OVERRIDE
void MovementInform(uint32 type, uint32 point) OVERRIDE
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void DoAction(int32 action) OVERRIDE