Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
trial_of_the_crusader.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//Known Bugs:
7// - Need better implementation of Gossip and correct gossip text and option
8
9#include "ScriptMgr.h"
10#include "ScriptedCreature.h"
11#include "ScriptedGossip.h"
13#include "Player.h"
14
70
78
88
90{
92};
93
95{
96 public:
97 npc_announcer_toc10() : CreatureScript("npc_announcer_toc10") { }
98
100 {
102 {
103 }
104
113
114 void AttackStart(Unit* /*who*/) OVERRIDE { }
115 };
116
117 bool OnGossipHello(Player* player, Creature* creature) OVERRIDE
118 {
119 InstanceScript* instance = creature->GetInstanceScript();
120 if (!instance)
121 return true;
122
123 char const* _message = "We are ready!";
124
125 if (player->IsInCombat() || instance->IsEncounterInProgress() || instance->GetData(TYPE_EVENT))
126 return true;
127
128 uint8 i = 0;
129 for (; i < NUM_MESSAGES; ++i)
130 {
131 if ((!_GossipMessage[i].state && instance->GetBossState(_GossipMessage[i].encounter) != DONE)
132 || (_GossipMessage[i].state && instance->GetBossState(_GossipMessage[i].encounter) == DONE))
133 {
134 player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, _message, GOSSIP_SENDER_MAIN, _GossipMessage[i].id);
135 break;
136 }
137 }
138
139 if (i >= NUM_MESSAGES)
140 return false;
141
142 player->SEND_GOSSIP_MENU(_GossipMessage[i].msgnum, creature->GetGUID());
143 return true;
144 }
145
146 bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 /*action*/) OVERRIDE
147 {
148 player->PlayerTalkClass->ClearMenus();
149 player->CLOSE_GOSSIP_MENU();
150 InstanceScript* instance = creature->GetInstanceScript();
151 if (!instance)
152 return true;
153
154 if (instance->GetBossState(BOSS_BEASTS) != DONE)
155 {
156 instance->SetData(TYPE_EVENT, 110);
159 }
160 else if (instance->GetBossState(BOSS_JARAXXUS) != DONE)
161 {
162 // if Jaraxxus is spawned, but the raid wiped
163 if (Creature* jaraxxus = Unit::GetCreature(*player, instance->GetData64(NPC_JARAXXUS)))
164 {
165 jaraxxus->RemoveAurasDueToSpell(SPELL_JARAXXUS_CHAINS);
166 jaraxxus->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
167 jaraxxus->SetReactState(REACT_DEFENSIVE);
168 jaraxxus->SetInCombatWithZone();
169 }
170 else
171 {
172 instance->SetData(TYPE_EVENT, 1010);
174 }
175 }
176 else if (instance->GetBossState(BOSS_CRUSADERS) != DONE)
177 {
178 if (player->GetTeam() == ALLIANCE)
179 instance->SetData(TYPE_EVENT, 3000);
180 else
181 instance->SetData(TYPE_EVENT, 3001);
183 }
184 else if (instance->GetBossState(BOSS_VALKIRIES) != DONE)
185 {
186 instance->SetData(TYPE_EVENT, 4000);
188 }
189 else if (instance->GetBossState(BOSS_LICH_KING) != DONE)
190 {
192 floor->SetDestructibleState(GO_DESTRUCTIBLE_DAMAGED);
193
194 creature->CastSpell(creature, SPELL_CORPSE_TELEPORT, false);
195 creature->CastSpell(creature, SPELL_DESTROY_FLOOR_KNOCKUP, false);
196
197 Creature* anubArak = Unit::GetCreature(*creature, instance->GetData64(NPC_ANUBARAK));
198 if (!anubArak || !anubArak->IsAlive())
199 anubArak = creature->SummonCreature(NPC_ANUBARAK, AnubarakLoc[0].GetPositionX(), AnubarakLoc[0].GetPositionY(), AnubarakLoc[0].GetPositionZ(), 3, TempSummonType::TEMPSUMMON_CORPSE_TIMED_DESPAWN, DESPAWN_TIME);
200
202
203 if (creature->IsVisible())
204 creature->SetVisible(false);
205 }
206 creature->RemoveFlag(UNIT_FIELD_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
207 return true;
208 }
209
211 {
212 return new npc_announcer_toc10AI(creature);
213 }
214};
215
217{
218 public:
219 boss_lich_king_toc() : CreatureScript("boss_lich_king_toc") { }
220
222 {
224 {
225 _instance = creature->GetInstanceScript();
226 }
227
229 {
230 _updateTimer = 0;
231 me->SetReactState(REACT_PASSIVE);
232 if (Creature* summoned = me->SummonCreature(NPC_TRIGGER, ToCCommonLoc[2].GetPositionX(), ToCCommonLoc[2].GetPositionY(), ToCCommonLoc[2].GetPositionZ(), 5, TempSummonType::TEMPSUMMON_TIMED_DESPAWN, 1*MINUTE*IN_MILLISECONDS))
233 {
234 summoned->CastSpell(summoned, 51807, false);
235 summoned->SetDisplayId(summoned->GetCreatureTemplate()->Modelid2);
236 }
237 if (_instance)
238 _instance->SetBossState(BOSS_LICH_KING, IN_PROGRESS);
239 me->SetWalk(true);
240 }
241
243 {
244 if (uiType != POINT_MOTION_TYPE || !_instance)
245 return;
246
247 switch (uiId)
248 {
249 case 0:
250 _instance->SetData(TYPE_EVENT, 5030);
251 break;
252 case 1:
253 _instance->SetData(TYPE_EVENT, 5050);
254 break;
255 default:
256 break;
257 }
258 }
259
261 {
262 if (!_instance)
263 return;
264
266 return;
267
269 if (_updateTimer <= uiDiff)
270 {
271 switch (_instance->GetData(TYPE_EVENT))
272 {
273 case 5010:
276 me->GetMotionMaster()->MovePoint(0, LichKingLoc[0]);
277 _instance->SetData(TYPE_EVENT, 5020);
278 break;
279 case 5030:
283 _instance->SetData(TYPE_EVENT, 5040);
284 break;
285 case 5040:
287 me->GetMotionMaster()->MovePoint(1, LichKingLoc[1]);
289 _instance->SetData(TYPE_EVENT, 0);
290 break;
291 case 5050:
292 me->HandleEmoteCommand(EMOTE_ONESHOT_EXCLAMATION);
294 _instance->SetData(TYPE_EVENT, 5060);
295 break;
296 case 5060:
298 me->HandleEmoteCommand(EMOTE_ONESHOT_KNEEL);
299 _updateTimer = 2500;
300 _instance->SetData(TYPE_EVENT, 5070);
301 break;
302 case 5070:
303 me->CastSpell(me, 68198, false);
304 _updateTimer = 1500;
305 _instance->SetData(TYPE_EVENT, 5080);
306 break;
307 case 5080:
308 {
310 {
311 go->SetDisplayId(DISPLAYID_DESTROYED_FLOOR);
313 go->SetGoState(GOState::GO_STATE_ACTIVE);
314 }
315
316 me->CastSpell(me, SPELL_CORPSE_TELEPORT, false);
317 me->CastSpell(me, SPELL_DESTROY_FLOOR_KNOCKUP, false);
318
319 _instance->SetBossState(BOSS_LICH_KING, DONE);
320 Creature* temp = Unit::GetCreature(*me, _instance->GetData64(NPC_ANUBARAK));
321 if (!temp || !temp->IsAlive())
322 temp = me->SummonCreature(NPC_ANUBARAK, AnubarakLoc[0].GetPositionX(), AnubarakLoc[0].GetPositionY(), AnubarakLoc[0].GetPositionZ(), 3, TempSummonType::TEMPSUMMON_CORPSE_TIMED_DESPAWN, DESPAWN_TIME);
323
324 _instance->SetData(TYPE_EVENT, 0);
325
326 me->DespawnOrUnsummon();
328 break;
329 }
330 default:
331 break;
332 }
333 }
334 else
335 _updateTimer -= uiDiff;
336
338 }
339
340 private:
343 };
344
346 {
347 return new boss_lich_king_tocAI(creature);
348 }
349};
350
352{
353 public:
354 npc_fizzlebang_toc() : CreatureScript("npc_fizzlebang_toc") { }
355
357 {
359 {
360 _instance = me->GetInstanceScript();
361 }
362
363 void JustDied(Unit* killer) OVERRIDE
364 {
365 Talk(SAY_STAGE_1_06, killer);
366 _instance->SetData(TYPE_EVENT, 1180);
367 if (Creature* temp = Unit::GetCreature(*me, _instance->GetData64(NPC_JARAXXUS)))
368 {
370 temp->SetReactState(REACT_AGGRESSIVE);
371 temp->SetInCombatWithZone();
372 }
373 }
374
376 {
377 me->SetWalk(true);
378 _portalGUID = 0;
379 me->GetMotionMaster()->MovePoint(1, ToCCommonLoc[10].GetPositionX(), ToCCommonLoc[10].GetPositionY()-60, ToCCommonLoc[10].GetPositionZ());
380 }
381
383 {
384 if (uiType != POINT_MOTION_TYPE)
385 return;
386
387 switch (uiId)
388 {
389 case 1:
390 me->SetWalk(false);
391 if (_instance)
392 {
393 _instance->DoUseDoorOrButton(_instance->GetData64(GO_MAIN_GATE_DOOR));
394 _instance->SetData(TYPE_EVENT, 1120);
396 }
397 break;
398 default:
399 break;
400 }
401 }
402
404 {
405 _summons.Summon(summoned);
406 }
407
409 {
410 if (!_instance)
411 return;
412
413 if (_instance->GetData(TYPE_EVENT_NPC) != NPC_FIZZLEBANG)
414 return;
415
417 if (_updateTimer <= uiDiff)
418 {
419 switch (_instance->GetData(TYPE_EVENT))
420 {
421 case 1110:
422 _instance->SetData(TYPE_EVENT, 1120);
424 break;
425 case 1120:
427 _instance->SetData(TYPE_EVENT, 1130);
429 break;
430 case 1130:
431 me->GetMotionMaster()->MovementExpired();
433 me->HandleEmoteCommand(EMOTE_ONESHOT_SPELL_CAST_OMNI);
434 if (Unit* pTrigger = me->SummonCreature(NPC_TRIGGER, ToCCommonLoc[1].GetPositionX(), ToCCommonLoc[1].GetPositionY(), ToCCommonLoc[1].GetPositionZ(), 4.69494f, TempSummonType::TEMPSUMMON_MANUAL_DESPAWN))
435 {
436 _triggerGUID = pTrigger->GetGUID();
437 pTrigger->SetObjectScale(2.0f);
438 pTrigger->SetDisplayId(pTrigger->ToCreature()->GetCreatureTemplate()->Modelid1);
439 pTrigger->CastSpell(pTrigger, SPELL_WILFRED_PORTAL, false);
440 }
441 _instance->SetData(TYPE_EVENT, 1132);
443 break;
444 case 1132:
445 me->GetMotionMaster()->MovementExpired();
446 _instance->SetData(TYPE_EVENT, 1134);
448 break;
449 case 1134:
450 me->HandleEmoteCommand(EMOTE_ONESHOT_SPELL_CAST_OMNI);
451 if (Creature* pPortal = me->SummonCreature(NPC_WILFRED_PORTAL, ToCCommonLoc[1].GetPositionX(), ToCCommonLoc[1].GetPositionY(), ToCCommonLoc[1].GetPositionZ(), 4.71239f, TempSummonType::TEMPSUMMON_MANUAL_DESPAWN))
452 {
453 pPortal->SetReactState(REACT_PASSIVE);
454 pPortal->SetObjectScale(2.0f);
455 pPortal->CastSpell(pPortal, SPELL_WILFRED_PORTAL, false);
456 _portalGUID = pPortal->GetGUID();
457 }
459 _instance->SetData(TYPE_EVENT, 1135);
460 break;
461 case 1135:
462 _instance->SetData(TYPE_EVENT, 1140);
464 break;
465 case 1140:
467 if (Creature* temp = me->SummonCreature(NPC_JARAXXUS, ToCCommonLoc[1].GetPositionX(), ToCCommonLoc[1].GetPositionY(), ToCCommonLoc[1].GetPositionZ(), 5.0f, TempSummonType::TEMPSUMMON_CORPSE_TIMED_DESPAWN, DESPAWN_TIME))
468 {
470 temp->SetReactState(REACT_PASSIVE);
471 temp->GetMotionMaster()->MovePoint(0, ToCCommonLoc[1].GetPositionX(), ToCCommonLoc[1].GetPositionY()-10, ToCCommonLoc[1].GetPositionZ());
472 }
473 _instance->SetData(TYPE_EVENT, 1142);
475 break;
476 case 1142:
477 if (Creature* temp = Unit::GetCreature(*me, _instance->GetData64(NPC_JARAXXUS)))
478 temp->SetTarget(me->GetGUID());
479 if (Creature* pTrigger = Unit::GetCreature(*me, _triggerGUID))
480 pTrigger->DespawnOrUnsummon();
481 if (Creature* pPortal = Unit::GetCreature(*me, _portalGUID))
482 pPortal->DespawnOrUnsummon();
483 _instance->SetData(TYPE_EVENT, 1144);
485 break;
486 case 1144:
487 if (Creature* temp = Unit::GetCreature(*me, _instance->GetData64(NPC_JARAXXUS)))
488 temp->AI()->Talk(SAY_STAGE_1_05);
489 _instance->SetData(TYPE_EVENT, 1150);
491 break;
492 case 1150:
493 if (Creature* temp = Unit::GetCreature(*me, _instance->GetData64(NPC_JARAXXUS)))
494 {
495 //1-shot Fizzlebang
496 temp->CastSpell(me, 67888, false);
497 me->SetInCombatWith(temp);
498 temp->AddThreat(me, 1000.0f);
499 temp->AI()->AttackStart(me);
500 }
501 _instance->SetData(TYPE_EVENT, 1160);
503 break;
504 }
505 }
506 else
507 _updateTimer -= uiDiff;
509 }
510
511 private:
517 };
518
520 {
521 return new npc_fizzlebang_tocAI(creature);
522 }
523};
524
526{
527 public:
528 npc_tirion_toc() : CreatureScript("npc_tirion_toc") { }
529
531 {
532 npc_tirion_tocAI(Creature* creature) : ScriptedAI(creature)
533 {
534 _instance = me->GetInstanceScript();
535 }
536
537 void Reset() OVERRIDE { }
538
539 void AttackStart(Unit* /*who*/) OVERRIDE { }
540
542 {
543 if (!_instance)
544 return;
545
546 if (_instance->GetData(TYPE_EVENT_NPC) != NPC_TIRION)
547 return;
548
550 if (_updateTimer <= uiDiff)
551 {
552 switch (_instance->GetData(TYPE_EVENT))
553 {
554 case 110:
558 _instance->SetData(TYPE_EVENT, 120);
559 break;
560 case 140:
564 _instance->SetData(TYPE_EVENT, 150);
565 break;
566 case 150:
568 if (_instance->GetBossState(BOSS_BEASTS) != DONE)
569 {
570 _instance->DoUseDoorOrButton(_instance->GetData64(GO_MAIN_GATE_DOOR));
571
572 if (Creature* temp = me->SummonCreature(NPC_GORMOK, ToCSpawnLoc[0].GetPositionX(), ToCSpawnLoc[0].GetPositionY(), ToCSpawnLoc[0].GetPositionZ(), 5, TempSummonType::TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30*IN_MILLISECONDS))
573 {
574 temp->GetMotionMaster()->MovePoint(0, ToCCommonLoc[5].GetPositionX(), ToCCommonLoc[5].GetPositionY(), ToCCommonLoc[5].GetPositionZ());
576 temp->SetReactState(REACT_PASSIVE);
577 }
578 }
580 _instance->SetData(TYPE_EVENT, 155);
581 break;
582 case 155:
583 // keep the raid in combat for the whole encounter, pauses included
584 me->SetInCombatWithZone();
586 _instance->SetData(TYPE_EVENT, 160);
587 break;
588 case 200:
590 if (_instance->GetBossState(BOSS_BEASTS) != DONE)
591 {
592 _instance->DoUseDoorOrButton(_instance->GetData64(GO_MAIN_GATE_DOOR));
593 if (Creature* temp = me->SummonCreature(NPC_DREADSCALE, ToCSpawnLoc[1].GetPositionX(), ToCSpawnLoc[1].GetPositionY(), ToCSpawnLoc[1].GetPositionZ(), 5, TempSummonType::TEMPSUMMON_MANUAL_DESPAWN))
594 {
595 temp->GetMotionMaster()->MovePoint(0, ToCCommonLoc[5].GetPositionX(), ToCCommonLoc[5].GetPositionY(), ToCCommonLoc[5].GetPositionZ());
597 temp->SetReactState(REACT_PASSIVE);
598 }
599 }
601 _instance->SetData(TYPE_EVENT, 220);
602 break;
603 case 220:
604 _instance->SetData(TYPE_EVENT, 230);
605 break;
606 case 300:
608 if (_instance->GetBossState(BOSS_BEASTS) != DONE)
609 {
610 _instance->DoUseDoorOrButton(_instance->GetData64(GO_MAIN_GATE_DOOR));
611 if (Creature* temp = me->SummonCreature(NPC_ICEHOWL, ToCSpawnLoc[0].GetPositionX(), ToCSpawnLoc[0].GetPositionY(), ToCSpawnLoc[0].GetPositionZ(), 5, TempSummonType::TEMPSUMMON_DEAD_DESPAWN))
612 {
613 temp->GetMotionMaster()->MovePoint(2, ToCCommonLoc[5].GetPositionX(), ToCCommonLoc[5].GetPositionY(), ToCCommonLoc[5].GetPositionZ());
615 me->SetReactState(REACT_PASSIVE);
616 }
617 }
619 _instance->SetData(TYPE_EVENT, 315);
620 break;
621 case 315:
622 _instance->SetData(TYPE_EVENT, 320);
623 break;
624 case 400:
626 me->getThreatManager().clearReferences();
628 _instance->SetData(TYPE_EVENT, 0);
629 break;
630 case 666:
633 _instance->SetData(TYPE_EVENT, 0);
634 break;
635 case 1010:
638 _instance->DoUseDoorOrButton(_instance->GetData64(GO_MAIN_GATE_DOOR));
639 me->SummonCreature(NPC_FIZZLEBANG, ToCSpawnLoc[0].GetPositionX(), ToCSpawnLoc[0].GetPositionY(), ToCSpawnLoc[0].GetPositionZ(), 2, TempSummonType::TEMPSUMMON_CORPSE_TIMED_DESPAWN, DESPAWN_TIME);
640 _instance->SetData(TYPE_EVENT, 0);
641 break;
642 case 1180:
645 _instance->SetData(TYPE_EVENT, 0);
646 break;
647 case 2000:
650 _instance->SetData(TYPE_EVENT, 2010);
651 break;
652 case 2030:
655 _instance->SetData(TYPE_EVENT, 0);
656 break;
657 case 3000:
660 _instance->SetData(TYPE_EVENT, 3050);
661 break;
662 case 3001:
665 _instance->SetData(TYPE_EVENT, 3051);
666 break;
667 case 3060:
670 _instance->SetData(TYPE_EVENT, 3070);
671 break;
672 case 3061:
675 _instance->SetData(TYPE_EVENT, 3071);
676 break;
677 //Summoning crusaders
678 case 3091:
679 if (Creature* pChampionController = me->SummonCreature(NPC_CHAMPIONS_CONTROLLER, ToCCommonLoc[1]))
680 pChampionController->AI()->SetData(0, HORDE);
682 _instance->SetData(TYPE_EVENT, 3092);
683 break;
684 //Summoning crusaders
685 case 3090:
686 if (Creature* pChampionController = me->SummonCreature(NPC_CHAMPIONS_CONTROLLER, ToCCommonLoc[1]))
687 pChampionController->AI()->SetData(0, ALLIANCE);
689 _instance->SetData(TYPE_EVENT, 3092);
690 break;
691 case 3092:
692 if (Creature* pChampionController = Unit::GetCreature((*me), _instance->GetData64(NPC_CHAMPIONS_CONTROLLER)))
693 pChampionController->AI()->SetData(1, NOT_STARTED);
694 _instance->SetData(TYPE_EVENT, 3095);
695 break;
696 //Crusaders battle end
697 case 3100:
700 _instance->SetData(TYPE_EVENT, 0);
701 break;
702 case 4000:
705 _instance->SetData(TYPE_EVENT, 4010);
706 break;
707 case 4010:
709 if (Creature* temp = me->SummonCreature(NPC_LIGHTBANE, ToCSpawnLoc[1].GetPositionX(), ToCSpawnLoc[1].GetPositionY(), ToCSpawnLoc[1].GetPositionZ(), 5, TempSummonType::TEMPSUMMON_CORPSE_TIMED_DESPAWN, DESPAWN_TIME))
710 {
711 temp->SetVisible(false);
712 temp->SetReactState(REACT_PASSIVE);
713 temp->SummonCreature(NPC_LIGHT_ESSENCE, TwinValkyrsLoc[0].GetPositionX(), TwinValkyrsLoc[0].GetPositionY(), TwinValkyrsLoc[0].GetPositionZ());
714 temp->SummonCreature(NPC_LIGHT_ESSENCE, TwinValkyrsLoc[1].GetPositionX(), TwinValkyrsLoc[1].GetPositionY(), TwinValkyrsLoc[1].GetPositionZ());
715 }
716 if (Creature* temp = me->SummonCreature(NPC_DARKBANE, ToCSpawnLoc[2].GetPositionX(), ToCSpawnLoc[2].GetPositionY(), ToCSpawnLoc[2].GetPositionZ(), 5, TempSummonType::TEMPSUMMON_CORPSE_TIMED_DESPAWN, DESPAWN_TIME))
717 {
718 temp->SetVisible(false);
719 temp->SetReactState(REACT_PASSIVE);
720 temp->SummonCreature(NPC_DARK_ESSENCE, TwinValkyrsLoc[2].GetPositionX(), TwinValkyrsLoc[2].GetPositionY(), TwinValkyrsLoc[2].GetPositionZ());
721 temp->SummonCreature(NPC_DARK_ESSENCE, TwinValkyrsLoc[3].GetPositionX(), TwinValkyrsLoc[3].GetPositionY(), TwinValkyrsLoc[3].GetPositionZ());
722 }
724 _instance->SetData(TYPE_EVENT, 4015);
725 break;
726 case 4015:
727 _instance->DoUseDoorOrButton(_instance->GetData64(GO_MAIN_GATE_DOOR));
728 if (Creature* temp = Unit::GetCreature((*me), _instance->GetData64(NPC_LIGHTBANE)))
729 {
730 temp->GetMotionMaster()->MovePoint(1, ToCCommonLoc[8].GetPositionX(), ToCCommonLoc[8].GetPositionY(), ToCCommonLoc[8].GetPositionZ());
731 temp->SetVisible(true);
732 }
733 if (Creature* temp = Unit::GetCreature((*me), _instance->GetData64(NPC_DARKBANE)))
734 {
735 temp->GetMotionMaster()->MovePoint(1, ToCCommonLoc[9].GetPositionX(), ToCCommonLoc[9].GetPositionY(), ToCCommonLoc[9].GetPositionZ());
736 temp->SetVisible(true);
737 }
739 _instance->SetData(TYPE_EVENT, 4016);
740 break;
741 case 4016:
742 _instance->DoUseDoorOrButton(_instance->GetData64(GO_MAIN_GATE_DOOR));
743 _instance->SetData(TYPE_EVENT, 4017);
744 break;
745 case 4040:
747 _instance->SetData(TYPE_EVENT, 5000);
748 break;
749 case 5000:
752 _instance->SetData(TYPE_EVENT, 5005);
753 break;
754 case 5005:
756 _instance->SetData(TYPE_EVENT, 5010);
757 me->SummonCreature(NPC_LICH_KING_1, ToCCommonLoc[2].GetPositionX(), ToCCommonLoc[2].GetPositionY(), ToCCommonLoc[2].GetPositionZ(), 5);
758 break;
759 case 5020:
762 _instance->SetData(TYPE_EVENT, 0);
763 break;
764 case 6000:
765 me->SummonCreature(NPC_TIRION_FORDRING, EndSpawnLoc[0].GetPositionX(), EndSpawnLoc[0].GetPositionY(), EndSpawnLoc[0].GetPositionZ());
766 me->SummonCreature(NPC_ARGENT_MAGE, EndSpawnLoc[1].GetPositionX(), EndSpawnLoc[1].GetPositionY(), EndSpawnLoc[1].GetPositionZ());
767 me->SummonGameObject(GO_PORTAL_TO_DALARAN, EndSpawnLoc[2].GetPositionX(), EndSpawnLoc[2].GetPositionY(), EndSpawnLoc[2].GetPositionZ(), 5, 0, 0, 0, 0, 0);
769 _instance->SetData(TYPE_EVENT, 6005);
770 break;
771 case 6005:
772 if (Creature* tirionFordring = Unit::GetCreature((*me), _instance->GetData64(NPC_TIRION_FORDRING)))
773 tirionFordring->AI()->Talk(SAY_STAGE_4_06);
775 _instance->SetData(TYPE_EVENT, 6010);
776 break;
777 case 6010:
778 if (IsHeroic())
779 {
780 if (Creature* tirionFordring = Unit::GetCreature((*me), _instance->GetData64(NPC_TIRION_FORDRING)))
781 tirionFordring->AI()->Talk(SAY_STAGE_4_07);
783 _instance->SetBossState(BOSS_ANUBARAK, SPECIAL);
784 _instance->SetData(TYPE_EVENT, 6020);
785 }
786 else
787 _instance->SetData(TYPE_EVENT, 6030);
788 break;
789 case 6020:
790 me->DespawnOrUnsummon();
792 _instance->SetData(TYPE_EVENT, 6030);
793 break;
794 default:
795 break;
796 }
797 }
798 else
799 _updateTimer -= uiDiff;
801 }
802 private:
805 };
806
808 {
809 return new npc_tirion_tocAI(creature);
810 }
811};
812
814{
815 public:
816 npc_garrosh_toc() : CreatureScript("npc_garrosh_toc") { }
817
819 {
820 npc_garrosh_tocAI(Creature* creature) : ScriptedAI(creature)
821 {
822 _instance = me->GetInstanceScript();
823 }
824
825 void Reset() OVERRIDE { }
826
827 void AttackStart(Unit* /*who*/) OVERRIDE { }
828
830 {
831 if (!_instance)
832 return;
833
834 if (_instance->GetData(TYPE_EVENT_NPC) != NPC_GARROSH)
835 return;
836
838 if (_updateTimer <= uiDiff)
839 {
840 switch (_instance->GetData(TYPE_EVENT))
841 {
842 case 130:
846 _instance->SetData(TYPE_EVENT, 132);
847 break;
848 case 132:
851 _instance->SetData(TYPE_EVENT, 140);
852 break;
853 case 2010:
856 _instance->SetData(TYPE_EVENT, 2020);
857 break;
858 case 3050:
861 _instance->SetData(TYPE_EVENT, 3060);
862 break;
863 case 3070:
866 _instance->SetData(TYPE_EVENT, 3080);
867 break;
868 case 3081:
871 _instance->SetData(TYPE_EVENT, 3091);
872 break;
873 case 4030:
876 _instance->SetData(TYPE_EVENT, 4040);
877 break;
878 default:
879 break;
880 }
881 }
882 else
883 _updateTimer -= uiDiff;
885 }
886 private:
889 };
890
892 {
893 return new npc_garrosh_tocAI(creature);
894 }
895};
896
898{
899 public:
900 npc_varian_toc() : CreatureScript("npc_varian_toc") { }
901
903 {
904 npc_varian_tocAI(Creature* creature) : ScriptedAI(creature)
905 {
906 _instance = me->GetInstanceScript();
907 }
908
909 void Reset() OVERRIDE { }
910
911 void AttackStart(Unit* /*who*/) OVERRIDE { }
912
914 {
915 if (!_instance)
916 return;
917
918 if (_instance->GetData(TYPE_EVENT_NPC) != NPC_VARIAN)
919 return;
920
922 if (_updateTimer <= uiDiff)
923 {
924 switch (_instance->GetData(TYPE_EVENT))
925 {
926 case 120:
930 _instance->SetData(TYPE_EVENT, 122);
931 break;
932 case 122:
935 _instance->SetData(TYPE_EVENT, 130);
936 break;
937 case 2020:
940 _instance->SetData(TYPE_EVENT, 2030);
941 break;
942 case 3051:
945 _instance->SetData(TYPE_EVENT, 3061);
946 break;
947 case 3071:
950 _instance->SetData(TYPE_EVENT, 3081);
951 break;
952 case 3080:
955 _instance->SetData(TYPE_EVENT, 3090);
956 break;
957 case 4020:
960 _instance->SetData(TYPE_EVENT, 4040);
961 break;
962 default:
963 break;
964 }
965 }
966 else
967 _updateTimer -= uiDiff;
969 }
970 private:
973 };
974
976 {
977 return new npc_varian_tocAI(creature);
978 }
979};
980
982{
983 new boss_lich_king_toc();
985 new npc_fizzlebang_toc();
986 new npc_tirion_toc();
987 new npc_garrosh_toc();
988 new npc_varian_toc();
989}
@ IN_MILLISECONDS
Definition Common.h:125
@ MINUTE
Definition Common.h:119
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
@ GO_STATE_ACTIVE
Definition GameObject.h:576
@ GOSSIP_ICON_CHAT
Definition GossipDef.h:46
@ IN_PROGRESS
@ DONE
@ SPECIAL
@ NOT_STARTED
@ POINT_MOTION_TYPE
@ TEMPSUMMON_MANUAL_DESPAWN
Definition Object.h:75
@ TEMPSUMMON_TIMED_DESPAWN
Definition Object.h:70
@ TEMPSUMMON_DEAD_DESPAWN
Definition Object.h:74
@ TEMPSUMMON_CORPSE_TIMED_DESPAWN
Definition Object.h:73
Creature * GetClosestCreatureWithEntry(WorldObject *source, uint32 entry, float maxSearchRange, bool alive)
@ GOSSIP_SENDER_MAIN
@ GOSSIP_ACTION_INFO_DEF
@ EMOTE_ONESHOT_KNEEL
@ EMOTE_ONESHOT_EXCLAMATION
@ EMOTE_ONESHOT_SPELL_CAST_OMNI
@ EMOTE_STATE_TALK
@ EMOTE_STATE_NONE
@ EMOTE_ONESHOT_NONE
@ EMOTE_ONESHOT_TALK
@ GO_DESTRUCTIBLE_DAMAGED
@ ALLIANCE
@ HORDE
@ GO_FLAG_NODESPAWN
@ GO_FLAG_DAMAGED
@ UNIT_NPC_FLAG_GOSSIP
Definition Unit.h:687
@ REACT_DEFENSIVE
Definition Unit.h:1157
@ REACT_PASSIVE
Definition Unit.h:1156
@ REACT_AGGRESSIVE
Definition Unit.h:1158
@ UNIT_FLAG_NON_ATTACKABLE
Definition Unit.h:626
@ UNIT_FLAG_NOT_SELECTABLE
Definition Unit.h:650
@ UNIT_FIELD_NPC_FLAGS
@ UNIT_FIELD_FLAGS
@ UNIT_FIELD_NPC_EMOTESTATE
@ GAMEOBJECT_FIELD_FLAGS
@ NPC_ANUBARAK
Definition azjol_nerub.h:30
void Talk(uint8 id, WorldObject const *whisperTarget=NULL)
CreatureScript(const char *name)
static GameObject * GetGameObject(WorldObject &object, uint64 guid)
virtual bool SetBossState(uint32 id, EncounterState state)
EncounterState GetBossState(uint32 id) const
virtual bool IsEncounterInProgress() const
Definition Unit.h:1367
bool IsAlive() const
Definition Unit.h:2032
static Creature * GetCreature(WorldObject &object, uint64 guid)
Definition Unit.cpp:4905
InstanceScript * GetInstanceScript()
Definition Object.cpp:1612
TempSummon * SummonCreature(uint32 id, Position const &pos, TempSummonType spwtype=TempSummonType::TEMPSUMMON_MANUAL_DESPAWN, uint32 despwtime=0, uint32 vehId=0) const
Definition Object.cpp:2703
virtual uint32 GetData(uint32) const
Definition ZoneScript.h:36
virtual void SetData(uint32, uint32)
Definition ZoneScript.h:37
virtual uint64 GetData64(uint32) const
Definition ZoneScript.h:32
CreatureAI * GetAI(Creature *creature) const OVERRIDE
bool OnGossipSelect(Player *player, Creature *creature, uint32, uint32) OVERRIDE
bool OnGossipHello(Player *player, Creature *creature) 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
@ TYPE_EVENT
Definition gnomeregan.h:26
@ NPC_TRIGGER
AnnouncerMessages msgnum
bool IsHeroic() const
Creature * me
ScriptedAI(Creature *creature)
void UpdateAI(uint32 uiDiff) OVERRIDE
== Triggered Actions Requested ==================
void MovementInform(uint32 uiType, uint32 uiId) OVERRIDE
void JustSummoned(Creature *summoned) OVERRIDE
void MovementInform(uint32 uiType, uint32 uiId) OVERRIDE
void UpdateAI(uint32 uiDiff) OVERRIDE
== Triggered Actions Requested ==================
void UpdateAI(uint32 uiDiff) OVERRIDE
== Triggered Actions Requested ==================
void UpdateAI(uint32 uiDiff) OVERRIDE
== Triggered Actions Requested ==================
void UpdateAI(uint32 uiDiff) OVERRIDE
== Triggered Actions Requested ==================
static _Messages _GossipMessage[]
void AddSC_trial_of_the_crusader()
@ DISPLAYID_DESTROYED_FLOOR
const Position ToCSpawnLoc[]
@ SPELL_DESTROY_FLOOR_KNOCKUP
@ SPELL_JARAXXUS_CHAINS
@ SPELL_CORPSE_TELEPORT
@ SPELL_WILFRED_PORTAL
@ GO_PORTAL_TO_DALARAN
@ GO_ARGENT_COLISEUM_FLOOR
@ GO_MAIN_GATE_DOOR
@ NPC_CHAMPIONS_CONTROLLER
@ NPC_ARGENT_MAGE
@ NPC_WILFRED_PORTAL
@ NPC_LIGHT_ESSENCE
@ NPC_DARK_ESSENCE
@ NPC_LICH_KING_1
@ NPC_TIRION_FORDRING
const Position EndSpawnLoc[]
const Position ToCCommonLoc[]
const Position AnubarakLoc[]
const Position LichKingLoc[]
const Position TwinValkyrsLoc[]
@ BOSS_CRUSADERS
@ BOSS_LICH_KING
@ BOSS_VALKIRIES
@ TYPE_EVENT_NPC
@ TYPE_NORTHREND_BEASTS
@ BOSS_JARAXXUS
@ BOSS_ANUBARAK
@ TYPE_EVENT_TIMER