Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
blackrock_depths.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 "ScriptMgr.h"
7#include "ScriptedCreature.h"
8#include "ScriptedEscortAI.h"
9#include "ScriptedGossip.h"
10#include "blackrock_depths.h"
11#include "Player.h"
12#include "WorldSession.h"
13
14//go_shadowforge_brazier
16{
17public:
18 go_shadowforge_brazier() : GameObjectScript("go_shadowforge_brazier") { }
19
20 bool OnGossipHello(Player* /*player*/, GameObject* go) OVERRIDE
21 {
22 if (InstanceScript* instance = go->GetInstanceScript())
23 {
24 if (instance->GetData(TYPE_LYCEUM) == IN_PROGRESS)
25 instance->SetData(TYPE_LYCEUM, DONE);
26 else
27 instance->SetData(TYPE_LYCEUM, IN_PROGRESS);
28 // If used brazier open linked doors (North or South)
29 if (go->GetGUID() == instance->GetData64(DATA_SF_BRAZIER_N))
30 instance->HandleGameObject(instance->GetData64(DATA_GOLEM_DOOR_N), true);
31 else if (go->GetGUID() == instance->GetData64(DATA_SF_BRAZIER_S))
32 instance->HandleGameObject(instance->GetData64(DATA_GOLEM_DOOR_S), true);
33 }
34 return false;
35 }
36};
37
38// npc_grimstone
40{
42 NPC_THELDREN = 16059,
43
44 //4 or 6 in total? 1+2+1 / 2+2+2 / 3+3. Depending on this, code should be changed.
46};
47
49{
50 8925, // Dredge Worm
51 8926, // Deep Stinger
52 8927, // Dark Screecher
53 8928, // Burrowing Thundersnout
54 8933, // Cave Creeper
55 8932, // Borer Beetle
56};
57
59{
60 9027, // Gorosh
61 9028, // Grizzle
62 9029, // Eviscerator
63 9030, // Ok'thor
64 9031, // Anub'shiah
65 9032, // Hedrum
66};
67
69{
70public:
71 at_ring_of_law() : AreaTriggerScript("at_ring_of_law") { }
72
73 bool OnTrigger(Player* player, const AreaTriggerEntry* /*at*/) OVERRIDE
74 {
75 if (InstanceScript* instance = player->GetInstanceScript())
76 {
77 if (instance->GetData(TYPE_RING_OF_LAW) == IN_PROGRESS || instance->GetData(TYPE_RING_OF_LAW) == DONE)
78 return false;
79
80 instance->SetData(TYPE_RING_OF_LAW, IN_PROGRESS);
81 player->SummonCreature(NPC_GRIMSTONE, 625.559f, -205.618f, -52.735f, 2.609f, TempSummonType::TEMPSUMMON_DEAD_DESPAWN, 0);
82
83 return false;
84 }
85 return false;
86 }
87};
88
89// npc_grimstone
99
102{
103public:
104 npc_grimstone() : CreatureScript("npc_grimstone") { }
105
107 {
108 return new npc_grimstoneAI(creature);
109 }
110
112 {
113 npc_grimstoneAI(Creature* creature) : npc_escortAI(creature)
114 {
115 instance = creature->GetInstanceScript();
116 MobSpawnId = rand()%6;
117 }
118
120
123
127
130
132
134 {
136
137 EventPhase = 0;
138 Event_Timer = 1000;
139
140 MobCount = 0;
141 MobDeath_Timer = 0;
142
143 for (uint8 i = 0; i < MAX_NPC_AMOUNT; ++i)
144 RingMobGUID[i] = 0;
145
146 RingBossGUID = 0;
147
148 CanWalk = false;
149 }
150
153 {
154 if (Creature* tmp = me->SummonCreature(RingMob[MobSpawnId], 608.960f, -235.322f, -53.907f, 1.857f, TempSummonType::TEMPSUMMON_DEAD_DESPAWN, 0))
155 RingMobGUID[MobCount] = tmp->GetGUID();
156
157 ++MobCount;
158
160 MobDeath_Timer = 2500;
161 }
162
165 {
166 if (Creature* tmp = me->SummonCreature(RingBoss[rand()%6], 644.300f, -175.989f, -53.739f, 3.418f, TempSummonType::TEMPSUMMON_DEAD_DESPAWN, 0))
167 RingBossGUID = tmp->GetGUID();
168
169 MobDeath_Timer = 2500;
170 }
171
173 {
174 switch (waypointId)
175 {
176 case 0:
178 CanWalk = false;
179 Event_Timer = 5000;
180 break;
181 case 1:
183 CanWalk = false;
184 Event_Timer = 5000;
185 break;
186 case 2:
187 CanWalk = false;
188 break;
189 case 3:
191 break;
192 case 4:
194 CanWalk = false;
195 Event_Timer = 5000;
196 break;
197 case 5:
198 if (instance)
199 {
201 instance->SetData(TYPE_RING_OF_LAW, DONE);
202 SF_LOG_DEBUG("scripts", "npc_grimstone: event reached end and set complete.");
203 }
204 break;
205 }
206 }
207
208 void HandleGameObject(uint32 id, bool open)
209 {
210 instance->HandleGameObject(instance->GetData64(id), open);
211 }
212
214 {
215 if (!instance)
216 return;
217
218 if (MobDeath_Timer)
219 {
220 if (MobDeath_Timer <= diff)
221 {
222 MobDeath_Timer = 2500;
223
224 if (RingBossGUID)
225 {
227 if (boss && !boss->IsAlive() && boss->isDead())
228 {
229 RingBossGUID = 0;
230 Event_Timer = 5000;
231 MobDeath_Timer = 0;
232 return;
233 }
234 return;
235 }
236
237 for (uint8 i = 0; i < MAX_NPC_AMOUNT; ++i)
238 {
240 if (mob && !mob->IsAlive() && mob->isDead())
241 {
242 RingMobGUID[i] = 0;
243 --MobCount;
244
245 //seems all are gone, so set timer to continue and discontinue this
246 if (!MobCount)
247 {
248 Event_Timer = 5000;
249 MobDeath_Timer = 0;
250 }
251 }
252 }
253 } else MobDeath_Timer -= diff;
254 }
255
256 if (Event_Timer)
257 {
258 if (Event_Timer <= diff)
259 {
260 switch (EventPhase)
261 {
262 case 0:
265 Start(false, false);
266 CanWalk = true;
267 Event_Timer = 0;
268 break;
269 case 1:
270 CanWalk = true;
271 Event_Timer = 0;
272 break;
273 case 2:
274 Event_Timer = 2000;
275 break;
276 case 3:
278 Event_Timer = 3000;
279 break;
280 case 4:
281 CanWalk = true;
282 me->SetVisible(false);
284 Event_Timer = 8000;
285 break;
286 case 5:
289 Event_Timer = 8000;
290 break;
291 case 6:
293 Event_Timer = 0;
294 break;
295 case 7:
296 me->SetVisible(true);
299 CanWalk = true;
300 Event_Timer = 0;
301 break;
302 case 8:
304 Event_Timer = 5000;
305 break;
306 case 9:
307 me->SetVisible(false);
309 Event_Timer = 0;
310 break;
311 case 10:
312 //if quest, complete
316 CanWalk = true;
317 Event_Timer = 0;
318 break;
319 }
320 ++EventPhase;
321 } else Event_Timer -= diff;
322 }
323
324 if (CanWalk)
326 }
327 };
328};
329
330// npc_phalanx
337
339{
340public:
341 npc_phalanx() : CreatureScript("npc_phalanx") { }
342
344 {
345 return new npc_phalanxAI(creature);
346 }
347
348 struct npc_phalanxAI : public ScriptedAI
349 {
350 npc_phalanxAI(Creature* creature) : ScriptedAI(creature) { }
351
355
357 {
358 ThunderClap_Timer = 12000;
360 MightyBlow_Timer = 15000;
361 }
362
364 {
365 //Return since we have no target
366 if (!UpdateVictim())
367 return;
368
369 //ThunderClap_Timer
370 if (ThunderClap_Timer <= diff)
371 {
373 ThunderClap_Timer = 10000;
374 } else ThunderClap_Timer -= diff;
375
376 //FireballVolley_Timer
377 if (HealthBelowPct(51))
378 {
379 if (FireballVolley_Timer <= diff)
380 {
382 FireballVolley_Timer = 15000;
383 } else FireballVolley_Timer -= diff;
384 }
385
386 //MightyBlow_Timer
387 if (MightyBlow_Timer <= diff)
388 {
390 MightyBlow_Timer = 10000;
391 } else MightyBlow_Timer -= diff;
392
394 }
395 };
396};
397
398// npc_kharan_mighthammer
400{
403};
404
405#define GOSSIP_ITEM_KHARAN_1 "I need to know where the princess are, Kharan!"
406#define GOSSIP_ITEM_KHARAN_2 "All is not lost, Kharan!"
407#define GOSSIP_ITEM_KHARAN_3 "Gor'shak is my friend, you can trust me."
408#define GOSSIP_ITEM_KHARAN_4 "Not enough, you need to tell me more."
409#define GOSSIP_ITEM_KHARAN_5 "So what happened?"
410#define GOSSIP_ITEM_KHARAN_6 "Continue..."
411#define GOSSIP_ITEM_KHARAN_7 "So you suspect that someone on the inside was involved? That they were tipped off?"
412#define GOSSIP_ITEM_KHARAN_8 "Continue with your story please."
413#define GOSSIP_ITEM_KHARAN_9 "Indeed."
414#define GOSSIP_ITEM_KHARAN_10 "The door is open, Kharan. You are a free man."
415
417{
418public:
419 npc_kharan_mighthammer() : CreatureScript("npc_kharan_mighthammer") { }
420
421 bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) OVERRIDE
422 {
423 player->PlayerTalkClass->ClearMenus();
424 switch (action)
425 {
428 player->SEND_GOSSIP_MENU(2475, creature->GetGUID());
429 break;
432 player->SEND_GOSSIP_MENU(2476, creature->GetGUID());
433 break;
434
437 player->SEND_GOSSIP_MENU(2477, creature->GetGUID());
438 break;
441 player->SEND_GOSSIP_MENU(2478, creature->GetGUID());
442 break;
445 player->SEND_GOSSIP_MENU(2479, creature->GetGUID());
446 break;
449 player->SEND_GOSSIP_MENU(2480, creature->GetGUID());
450 break;
453 player->SEND_GOSSIP_MENU(2481, creature->GetGUID());
454 break;
457 player->SEND_GOSSIP_MENU(2482, creature->GetGUID());
458 break;
460 player->CLOSE_GOSSIP_MENU();
461 if (player->GetTeam() == HORDE)
462 player->AreaExploredOrEventHappens(QUEST_4001);
463 else
464 player->AreaExploredOrEventHappens(QUEST_4342);
465 break;
466 }
467 return true;
468 }
469
470 bool OnGossipHello(Player* player, Creature* creature) OVERRIDE
471 {
472 if (creature->IsQuestGiver())
473 player->PrepareQuestMenu(creature->GetGUID());
474
475 if (player->GetQuestStatus(QUEST_4001) == QUEST_STATUS_INCOMPLETE)
477
478 if (player->GetQuestStatus(4342) == QUEST_STATUS_INCOMPLETE)
480
481 if (player->GetTeam() == HORDE)
482 player->SEND_GOSSIP_MENU(2473, creature->GetGUID());
483 else
484 player->SEND_GOSSIP_MENU(2474, creature->GetGUID());
485
486 return true;
487 }
488};
489
490// npc_lokhtos_darkbargainer
496
501
506
507#define GOSSIP_ITEM_SHOW_ACCESS "Show me what I have access to, Lothos."
508#define GOSSIP_ITEM_GET_CONTRACT "Get Thorium Brotherhood Contract"
509
511{
512public:
513 npc_lokhtos_darkbargainer() : CreatureScript("npc_lokhtos_darkbargainer") { }
514
515 bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) OVERRIDE
516 {
517 player->PlayerTalkClass->ClearMenus();
518 if (action == GOSSIP_ACTION_INFO_DEF + 1)
519 {
520 player->CLOSE_GOSSIP_MENU();
521 player->CastSpell(player, SPELL_CREATE_THORIUM_BROTHERHOOD_CONTRACT_DND, false);
522 }
523 if (action == GOSSIP_ACTION_TRADE)
524 player->GetSession()->SendListInventory(creature->GetGUID());
525
526 return true;
527 }
528
529 bool OnGossipHello(Player* player, Creature* creature) OVERRIDE
530 {
531 if (creature->IsQuestGiver())
532 player->PrepareQuestMenu(creature->GetGUID());
533
534 if (creature->IsVendor() && player->GetReputationRank(59) >= REP_FRIENDLY)
536
537 if (player->GetQuestRewardStatus(QUEST_A_BINDING_CONTRACT) != 1 &&
538 !player->HasItemCount(ITEM_THRORIUM_BROTHERHOOD_CONTRACT, 1, true) &&
539 player->HasItemCount(ITEM_SULFURON_INGOT))
540 {
542 }
543
544 if (player->GetReputationRank(59) < REP_FRIENDLY)
545 player->SEND_GOSSIP_MENU(3673, creature->GetGUID());
546 else
547 player->SEND_GOSSIP_MENU(3677, creature->GetGUID());
548
549 return true;
550 }
551};
552
553// npc_dughal_stormwing
555{
557};
558
559#define SAY_DUGHAL_FREE "Thank you, $N! I'm free!!!"
560#define GOSSIP_DUGHAL "You're free, Dughal! Get out of here!"
561
562/*
563class npc_dughal_stormwing : public CreatureScript
564{
565public:
566 npc_dughal_stormwing() : CreatureScript("npc_dughal_stormwing") { }
567
568 CreatureAI* GetAI(Creature* creature) const OVERRIDE
569 {
570 npc_dughal_stormwingAI* dughal_stormwingAI = new npc_dughal_stormwingAI(creature);
571
572 dughal_stormwingAI->AddWaypoint(0, 280.42f, -82.86f, -77.12f, 0);
573 dughal_stormwingAI->AddWaypoint(1, 287.64f, -87.01f, -76.79f, 0);
574 dughal_stormwingAI->AddWaypoint(2, 354.63f, -64.95f, -67.53f, 0);
575
576 return dughal_stormwingAI;
577 }
578
579 bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) OVERRIDE
580 {
581 player->PlayerTalkClass->ClearMenus();
582 if (action == GOSSIP_ACTION_INFO_DEF + 1)
583 {
584 player->CLOSE_GOSSIP_MENU();
585 CAST_AI(npc_escort::npc_escortAI, (creature->AI()))->Start(false, true, player->GetGUID());
586 creature->RemoveFlag(UNIT_FIELD_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
587 instance->SetData(DATA_QUEST_JAIL_BREAK, ENCOUNTER_STATE_IN_PROGRESS);
588 }
589 return true;
590 }
591
592 bool OnGossipHello(Player* player, Creature* creature) OVERRIDE
593 {
594 if (player->GetQuestStatus(QUEST_JAIL_BREAK) == QUEST_STATUS_INCOMPLETE && instance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_IN_PROGRESS)
595 {
596 player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_DUGHAL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
597 player->SEND_GOSSIP_MENU(2846, creature->GetGUID());
598 }
599 return true;
600 }
601
602 struct npc_dughal_stormwingAI : public npc_escortAI
603 {
604 npc_dughal_stormwingAI(Creature* creature) : npc_escortAI(creature) { }
605
606 void WaypointReached(uint32 waypointId) OVERRIDE
607 {
608 switch (waypointId)
609 {
610 case 0:
611 me->Say(SAY_DUGHAL_FREE, LANG_UNIVERSAL, PlayerGUID);
612 break;
613 case 1:
614 instance->SetData(DATA_DUGHAL, ENCOUNTER_STATE_OBJECTIVE_COMPLETED);
615 break;
616 case 2:
617 me->SetVisible(false);
618 me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
619 me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
620 instance->SetData(DATA_DUGHAL, ENCOUNTER_STATE_ENDED);
621 break;
622 }
623 }
624
625 void EnterCombat(Unit* who) OVERRIDE { }
626 void Reset() OVERRIDE { }
627
628 void JustDied(Unit* killer) OVERRIDE
629 {
630 if (IsBeingEscorted && killer == me)
631 {
632 me->SetVisible(false);
633 me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
634 me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
635 instance->SetData(DATA_DUGHAL, ENCOUNTER_STATE_ENDED);
636 }
637 }
638
639 void UpdateAI(uint32 diff) OVERRIDE
640 {
641 if (instance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_NOT_STARTED) return;
642 if ((instance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_IN_PROGRESS || instance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_FAILED || instance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_ENDED)&& instance->GetData(DATA_DUGHAL) == ENCOUNTER_STATE_ENDED)
643 {
644 me->SetVisible(false);
645 me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
646 me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
647 }
648 else
649 {
650 me->SetVisible(true);
651 me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
652 me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
653 }
654 npc_escortAI::UpdateAI(diff);
655 }
656 };
657};
658
659 */
660
661// npc_marshal_windsor
662#define SAY_WINDSOR_AGGRO1 "You locked up the wrong Marshal. Prepare to be destroyed!"
663#define SAY_WINDSOR_AGGRO2 "I bet you're sorry now, aren't you !?!!"
664#define SAY_WINDSOR_AGGRO3 "You better hold me back $N or they are going to feel some prison house beatings."
665#define SAY_WINDSOR_1 "Let's get a move on. My gear should be in the storage area up this way..."
666#define SAY_WINDSOR_4_1 "Check that cell, $N. If someone is alive in there, we need to get them out."
667#define SAY_WINDSOR_4_2 "Get him out of there!"
668#define SAY_WINDSOR_4_3 "Good work! We're almost there, $N. This way."
669#define SAY_WINDSOR_6 "This is it, $N. My stuff should be in that room. Cover me, I'm going in!"
670#define SAY_WINDSOR_9 "Ah, there it is!"
671
676
677/*
678Player* playerStart;
679class npc_marshal_windsor : public CreatureScript
680{
681public:
682 npc_marshal_windsor() : CreatureScript("npc_marshal_windsor") { }
683
684 CreatureAI* GetAI(Creature* creature) const OVERRIDE
685 {
686 npc_marshal_windsorAI* marshal_windsorAI = new npc_marshal_windsorAI(creature);
687
688 marshal_windsorAI->AddWaypoint(0, 316.336f, -225.528f, -77.7258f, 7000);
689 marshal_windsorAI->AddWaypoint(1, 316.336f, -225.528f, -77.7258f, 2000);
690 marshal_windsorAI->AddWaypoint(2, 322.96f, -207.13f, -77.87f, 0);
691 marshal_windsorAI->AddWaypoint(3, 281.05f, -172.16f, -75.12f, 0);
692 marshal_windsorAI->AddWaypoint(4, 272.19f, -139.14f, -70.61f, 0);
693 marshal_windsorAI->AddWaypoint(5, 283.62f, -116.09f, -70.21f, 0);
694 marshal_windsorAI->AddWaypoint(6, 296.18f, -94.30f, -74.08f, 0);
695 marshal_windsorAI->AddWaypoint(7, 294.57f, -93.11f, -74.08f, 0);
696 marshal_windsorAI->AddWaypoint(8, 314.31f, -74.31f, -76.09f, 0);
697 marshal_windsorAI->AddWaypoint(9, 360.22f, -62.93f, -66.77f, 0);
698 marshal_windsorAI->AddWaypoint(10, 383.38f, -69.40f, -63.25f, 0);
699 marshal_windsorAI->AddWaypoint(11, 389.99f, -67.86f, -62.57f, 0);
700 marshal_windsorAI->AddWaypoint(12, 400.98f, -72.01f, -62.31f, 0);
701 marshal_windsorAI->AddWaypoint(13, 404.22f, -62.30f, -63.50f, 2300);
702 marshal_windsorAI->AddWaypoint(14, 404.22f, -62.30f, -63.50f, 1500);
703 marshal_windsorAI->AddWaypoint(15, 407.65f, -51.86f, -63.96f, 0);
704 marshal_windsorAI->AddWaypoint(16, 403.61f, -51.71f, -63.92f, 1000);
705 marshal_windsorAI->AddWaypoint(17, 403.61f, -51.71f, -63.92f, 2000);
706 marshal_windsorAI->AddWaypoint(18, 403.61f, -51.71f, -63.92f, 1000);
707 marshal_windsorAI->AddWaypoint(19, 403.61f, -51.71f, -63.92f, 0);
708
709 return marshal_windsorAI;
710 }
711
712 bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) OVERRIDE
713 {
714 if (quest->GetQuestId() == 4322)
715 {
716 PlayerStart = player;
717 if (instance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_NOT_STARTED)
718 {
719 CAST_AI(npc_escort::npc_escortAI, (creature->AI()))->Start(true, false, player->GetGUID());
720 instance->SetData(DATA_QUEST_JAIL_BREAK, ENCOUNTER_STATE_IN_PROGRESS);
721 creature->setFaction(11);
722 }
723 }
724 return false;
725 }
726
727 struct npc_marshal_windsorAI : public npc_escortAI
728 {
729 npc_marshal_windsorAI(Creature* creature) : npc_escortAI(creature)
730 {
731 instance = creature->GetInstanceScript();
732 }
733
734 void WaypointReached(uint32 waypointId) OVERRIDE
735 {
736 switch (waypointId)
737 {
738 case 1:
739 me->Say(SAY_WINDSOR_1, LANG_UNIVERSAL, PlayerGUID);
740 break;
741 case 7:
742 me->HandleEmoteCommand(EMOTE_STATE_POINT);
743 me->Say(SAY_WINDSOR_4_1, LANG_UNIVERSAL, PlayerGUID);
744 IsOnHold = true;
745 break;
746 case 10:
747 me->setFaction(534);
748 break;
749 case 12:
750 me->Say(SAY_WINDSOR_6, LANG_UNIVERSAL, PlayerGUID);
751 instance->SetData(DATA_SUPPLY_ROOM, ENCOUNTER_STATE_IN_PROGRESS);
752 break;
753 case 13:
754 me->HandleEmoteCommand(EMOTE_STATE_USESTANDING);//EMOTE_STATE_WORK
755 break;
756 case 14:
757 instance->SetData(DATA_GATE_SR, 0);
758 me->setFaction(11);
759 break;
760 case 16:
761 me->Say(SAY_WINDSOR_9, LANG_UNIVERSAL, PlayerGUID);
762 break;
763 case 17:
764 me->HandleEmoteCommand(EMOTE_STATE_USESTANDING);//EMOTE_STATE_WORK
765 break;
766 case 18:
767 instance->SetData(DATA_GATE_SC, 0);
768 break;
769 case 19:
770 me->SetVisible(false);
771 me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
772 me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
773 me->SummonCreature(NPC_REGINALD_WINDSOR, 403.61f, -51.71f, -63.92f, 3.600434f, TEMPSUMMON_DEAD_DESPAWN, 0);
774 instance->SetData(DATA_SUPPLY_ROOM, ENCOUNTER_STATE_ENDED);
775 break;
776 }
777 }
778
779 void EnterCombat(Unit* who) OVERRIDE
780 {
781 switch (urand(0, 2))
782 {
783 case 0:
784 me->Say(SAY_WINDSOR_AGGRO1, LANG_UNIVERSAL, PlayerGUID);
785 break;
786 case 1:
787 me->Say(SAY_WINDSOR_AGGRO2, LANG_UNIVERSAL, PlayerGUID);
788 break;
789 case 2:
790 me->Say(SAY_WINDSOR_AGGRO3, LANG_UNIVERSAL, PlayerGUID);
791 break;
792 }
793 }
794
795 void Reset() OVERRIDE { }
796
797 void JustDied(Unit* slayer) OVERRIDE
798 {
799 instance->SetData(DATA_QUEST_JAIL_BREAK, ENCOUNTER_STATE_FAILED);
800 }
801
802 void UpdateAI(uint32 diff) OVERRIDE
803 {
804 if (instance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_NOT_STARTED)
805 return;
806
807 if (instance->GetData(DATA_DUGHAL) == ENCOUNTER_STATE_OBJECTIVE_COMPLETED)
808 SetEscortPaused(false);
809
810 if (!instance->GetData(DATA_GATE_D) && instance->GetData(DATA_DUGHAL) == ENCOUNTER_STATE_NOT_STARTED)
811 {
812 me->Say(SAY_WINDSOR_4_2, LANG_UNIVERSAL, PlayerGUID);
813 instance->SetData(DATA_DUGHAL, ENCOUNTER_STATE_BEFORE_START);
814 }
815 if (instance->GetData(DATA_DUGHAL) == ENCOUNTER_STATE_OBJECTIVE_COMPLETED)
816 {
817 me->Say(SAY_WINDSOR_4_3, LANG_UNIVERSAL, PlayerGUID);
818 instance->SetData(DATA_DUGHAL, ENCOUNTER_STATE_ENDED);
819 }
820 if ((instance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_IN_PROGRESS || instance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_FAILED || instance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_ENDED)&& instance->GetData(DATA_SUPPLY_ROOM) == ENCOUNTER_STATE_ENDED)
821 {
822 me->SetVisible(false);
823 me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
824 me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
825 }
826 else
827 {
828 me->SetVisible(true);
829 me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
830 me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
831 }
832 npc_escortAI::UpdateAI(diff);
833 }
834 };
835};
836
837 */
838
839// npc_marshal_reginald_windsor
840#define SAY_REGINALD_WINDSOR_0_1 "Can you feel the power, $N??? It's time to ROCK!"
841#define SAY_REGINALD_WINDSOR_0_2 "Now we just have to free Tobias and we can get out of here. This way!"
842#define SAY_REGINALD_WINDSOR_5_1 "Open it."
843#define SAY_REGINALD_WINDSOR_5_2 "I never did like those two. Let's get moving."
844#define SAY_REGINALD_WINDSOR_7_1 "Open it and be careful this time!"
845#define SAY_REGINALD_WINDSOR_7_2 "That intolerant dirtbag finally got what was coming to him. Good riddance!"
846#define SAY_REGINALD_WINDSOR_7_3 "Alright, let's go."
847#define SAY_REGINALD_WINDSOR_13_1 "Open it. We need to hurry up. I can smell those Dark Irons coming a mile away and I can tell you one thing, they're COMING!"
848#define SAY_REGINALD_WINDSOR_13_2 "Administering fists of fury on Crest Killer!"
849#define SAY_REGINALD_WINDSOR_13_3 "He has to be in the last cell. Unless... they killed him."
850#define SAY_REGINALD_WINDSOR_14_1 "Get him out of there!"
851#define SAY_REGINALD_WINDSOR_14_2 "Excellent work, $N. Let's find the exit. I think I know the way. Follow me!"
852#define SAY_REGINALD_WINDSOR_20_1 "We made it!"
853#define SAY_REGINALD_WINDSOR_20_2 "Meet me at Maxwell's encampment. We'll go over the next stages of the plan there and figure out a way to decode my tablets without the decryption ring."
854
860
861/*
862int wp = 0;
863class npc_marshal_reginald_windsor : public CreatureScript
864{
865public:
866 npc_marshal_reginald_windsor() : CreatureScript("npc_marshal_reginald_windsor") { }
867
868 CreatureAI* GetAI(Creature* creature) const OVERRIDE
869 {
870 npc_marshal_reginald_windsorAI* marshal_reginald_windsorAI = new npc_marshal_reginald_windsorAI(creature);
871
872 marshal_reginald_windsorAI->AddWaypoint(0, 403.61f, -52.71f, -63.92f, 4000);
873 marshal_reginald_windsorAI->AddWaypoint(1, 403.61f, -52.71f, -63.92f, 4000);
874 marshal_reginald_windsorAI->AddWaypoint(2, 406.33f, -54.87f, -63.95f, 0);
875 marshal_reginald_windsorAI->AddWaypoint(3, 407.99f, -73.91f, -62.26f, 0);
876 marshal_reginald_windsorAI->AddWaypoint(4, 557.03f, -119.71f, -61.83f, 0);
877 marshal_reginald_windsorAI->AddWaypoint(5, 573.40f, -124.39f, -65.07f, 0);
878 marshal_reginald_windsorAI->AddWaypoint(6, 593.91f, -130.29f, -69.25f, 0);
879 marshal_reginald_windsorAI->AddWaypoint(7, 593.21f, -132.16f, -69.25f, 0);
880 marshal_reginald_windsorAI->AddWaypoint(8, 593.21f, -132.16f, -69.25f, 3000);
881 marshal_reginald_windsorAI->AddWaypoint(9, 622.81f, -135.55f, -71.92f, 0);
882 marshal_reginald_windsorAI->AddWaypoint(10, 634.68f, -151.29f, -70.32f, 0);
883 marshal_reginald_windsorAI->AddWaypoint(11, 635.06f, -153.25f, -70.32f, 0);
884 marshal_reginald_windsorAI->AddWaypoint(12, 635.06f, -153.25f, -70.32f, 3000);
885 marshal_reginald_windsorAI->AddWaypoint(13, 635.06f, -153.25f, -70.32f, 1500);
886 marshal_reginald_windsorAI->AddWaypoint(14, 655.25f, -172.39f, -73.72f, 0);
887 marshal_reginald_windsorAI->AddWaypoint(15, 654.79f, -226.30f, -83.06f, 0);
888 marshal_reginald_windsorAI->AddWaypoint(16, 622.85f, -268.85f, -83.96f, 0);
889 marshal_reginald_windsorAI->AddWaypoint(17, 579.45f, -275.56f, -80.44f, 0);
890 marshal_reginald_windsorAI->AddWaypoint(18, 561.19f, -266.85f, -75.59f, 0);
891 marshal_reginald_windsorAI->AddWaypoint(19, 547.91f, -253.92f, -70.34f, 0);
892 marshal_reginald_windsorAI->AddWaypoint(20, 549.20f, -252.40f, -70.34f, 0);
893 marshal_reginald_windsorAI->AddWaypoint(21, 549.20f, -252.40f, -70.34f, 4000);
894 marshal_reginald_windsorAI->AddWaypoint(22, 555.33f, -269.16f, -74.40f, 0);
895 marshal_reginald_windsorAI->AddWaypoint(23, 554.31f, -270.88f, -74.40f, 0);
896 marshal_reginald_windsorAI->AddWaypoint(24, 554.31f, -270.88f, -74.40f, 4000);
897 marshal_reginald_windsorAI->AddWaypoint(25, 536.10f, -249.60f, -67.47f, 0);
898 marshal_reginald_windsorAI->AddWaypoint(26, 520.94f, -216.65f, -59.28f, 0);
899 marshal_reginald_windsorAI->AddWaypoint(27, 505.99f, -148.74f, -62.17f, 0);
900 marshal_reginald_windsorAI->AddWaypoint(28, 484.21f, -56.24f, -62.43f, 0);
901 marshal_reginald_windsorAI->AddWaypoint(29, 470.39f, -6.01f, -70.10f, 0);
902 marshal_reginald_windsorAI->AddWaypoint(30, 451.27f, 30.85f, -70.07f, 0);
903 marshal_reginald_windsorAI->AddWaypoint(31, 452.45f, 29.85f, -70.37f, 1500);
904 marshal_reginald_windsorAI->AddWaypoint(32, 452.45f, 29.85f, -70.37f, 7000);
905 marshal_reginald_windsorAI->AddWaypoint(33, 452.45f, 29.85f, -70.37f, 10000);
906 marshal_reginald_windsorAI->AddWaypoint(34, 451.27f, 31.85f, -70.07f, 0);
907
908 return marshal_reginald_windsorAI;
909 }
910
911 struct npc_marshal_reginald_windsorAI : public npc_escortAI
912 {
913 npc_marshal_reginald_windsorAI(Creature* creature) : npc_escortAI(creature)
914 {
915 }
916
917 void WaypointReached(uint32 waypointId) OVERRIDE
918 {
919 wp = waypointId;
920 switch (waypointId)
921 {
922 case 0:
923 me->setFaction(11);
924 me->Say(SAY_REGINALD_WINDSOR_0_1, LANG_UNIVERSAL, PlayerGUID);
925 break;
926 case 1:
927 me->Say(SAY_REGINALD_WINDSOR_0_2, LANG_UNIVERSAL, PlayerGUID);
928 break;
929 case 7:
930 me->HandleEmoteCommand(EMOTE_STATE_POINT);
931 me->Say(SAY_REGINALD_WINDSOR_5_1, LANG_UNIVERSAL, PlayerGUID);
932 IsOnHold=true;
933 break;
934 case 8:
935 me->Say(SAY_REGINALD_WINDSOR_5_2, LANG_UNIVERSAL, PlayerGUID);
936 break;
937 case 11:
938 me->HandleEmoteCommand(EMOTE_STATE_POINT);
939 me->Say(SAY_REGINALD_WINDSOR_7_1, LANG_UNIVERSAL, PlayerGUID);
940 IsOnHold=true;
941 break;
942 case 12:
943 me->Say(SAY_REGINALD_WINDSOR_7_2, LANG_UNIVERSAL, PlayerGUID);
944 break;
945 case 13:
946 me->Say(SAY_REGINALD_WINDSOR_7_3, LANG_UNIVERSAL, PlayerGUID);
947 break;
948 case 20:
949 me->HandleEmoteCommand(EMOTE_STATE_POINT);
950 me->Say(SAY_REGINALD_WINDSOR_13_1, LANG_UNIVERSAL, PlayerGUID);
951 IsOnHold=true;
952 break;
953 case 21:
954 me->Say(SAY_REGINALD_WINDSOR_13_3, LANG_UNIVERSAL, PlayerGUID);
955 break;
956 case 23:
957 me->HandleEmoteCommand(EMOTE_STATE_POINT);
958 me->Say(SAY_REGINALD_WINDSOR_14_1, LANG_UNIVERSAL, PlayerGUID);
959 IsOnHold=true;
960 break;
961 case 24:
962 me->Say(SAY_REGINALD_WINDSOR_14_2, LANG_UNIVERSAL, PlayerGUID);
963 break;
964 case 31:
965 me->Say(SAY_REGINALD_WINDSOR_20_1, LANG_UNIVERSAL, PlayerGUID);
966 break;
967 case 32:
968 me->Say(SAY_REGINALD_WINDSOR_20_2, LANG_UNIVERSAL, PlayerGUID);
969 PlayerStart->GroupEventHappens(QUEST_JAIL_BREAK, me);
970 instance->SetData(DATA_SHILL, ENCOUNTER_STATE_ENDED);
971 break;
972 }
973 }
974
975 void MoveInLineOfSight(Unit* who) OVERRIDE
976
977 {
978 if (HasEscortState(STATE_ESCORT_ESCORTING))
979 return;
980
981 if (Player* player = who->ToPlayer())
982 {
983 if (player->GetQuestStatus(4322) == QUEST_STATUS_INCOMPLETE)
984 {
985 float Radius = 10.0f;
986 if (me->IsWithinDistInMap(who, Radius))
987 {
988 SetEscortPaused(false);
989 Start(true, false, who->GetGUID());
990 }
991 }
992 }
993 }
994
995 void EnterCombat(Unit* who) OVERRIDE
996 {
997 switch (urand(0, 2))
998 {
999 case 0:
1000 me->Say(SAY_WINDSOR_AGGRO1, LANG_UNIVERSAL, PlayerGUID);
1001 break;
1002 case 1:
1003 me->Say(SAY_WINDSOR_AGGRO2, LANG_UNIVERSAL, PlayerGUID);
1004 break;
1005 case 2:
1006 me->Say(SAY_WINDSOR_AGGRO3, LANG_UNIVERSAL, PlayerGUID);
1007 break;
1008 }
1009 }
1010 void Reset() OVERRIDE { }
1011
1012 void JustDied(Unit* slayer) OVERRIDE
1013 {
1014 instance->SetData(DATA_QUEST_JAIL_BREAK, ENCOUNTER_STATE_FAILED);
1015 }
1016
1017 void UpdateAI(uint32 diff) OVERRIDE
1018 {
1019 if (instance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_NOT_STARTED)
1020 return;
1021
1022 if (wp == 7)
1023 {
1024 if (!instance->GetData(DATA_GATE_J) && instance->GetData(DATA_JAZ) == ENCOUNTER_STATE_NOT_STARTED)
1025 {
1026 instance->SetData(DATA_NPC_JAZ, 1);
1027 instance->SetData(DATA_JAZ, ENCOUNTER_STATE_IN_PROGRESS);
1028 }
1029 if (instance->GetData(DATA_NPC_JAZ) && instance->GetData(DATA_NPC_OGRABISI) && instance->GetData(DATA_JAZ) == ENCOUNTER_STATE_IN_PROGRESS)
1030 {
1031 SetEscortPaused(false);
1032 instance->SetData(DATA_JAZ, ENCOUNTER_STATE_ENDED);
1033 }
1034 }
1035 else if (wp == 11)
1036 {
1037 if (!instance->GetData(DATA_GATE_S) && instance->GetData(DATA_SHILL) == ENCOUNTER_STATE_NOT_STARTED)
1038 {
1039 instance->SetData(DATA_NPC_SHILL, 1);
1040 instance->SetData(DATA_SHILL, ENCOUNTER_STATE_IN_PROGRESS);
1041 }
1042 if (instance->GetData(DATA_NPC_SHILL) && instance->GetData(DATA_SHILL) == ENCOUNTER_STATE_IN_PROGRESS)
1043 {
1044 instance->SetData(DATA_SHILL, ENCOUNTER_STATE_ENDED);
1045 SetEscortPaused(false);
1046 }
1047 }
1048 else if (wp == 20)
1049 {
1050 if (!instance->GetData(DATA_GATE_C) && instance->GetData(DATA_CREST) == ENCOUNTER_STATE_NOT_STARTED)
1051 {
1052 instance->SetData(DATA_NPC_CREST, 1);
1053 me->Say(SAY_REGINALD_WINDSOR_13_2, LANG_UNIVERSAL, PlayerGUID);
1054 instance->SetData(DATA_CREST, ENCOUNTER_STATE_IN_PROGRESS);
1055 }
1056 if (instance->GetData(DATA_NPC_CREST) && instance->GetData(DATA_CREST) == ENCOUNTER_STATE_IN_PROGRESS)
1057 {
1058 SetEscortPaused(false);
1059 instance->SetData(DATA_CREST, ENCOUNTER_STATE_ENDED);
1060 }
1061 }
1062 if (instance->GetData(DATA_TOBIAS) == ENCOUNTER_STATE_OBJECTIVE_COMPLETED) SetEscortPaused(false);
1063 npc_escortAI::UpdateAI(diff);
1064 }
1065 };
1066};
1067*/
1068
1069// npc_tobias_seecher
1070#define SAY_TOBIAS_FREE "Thank you! I will run for safety immediately!"
1071
1072/*
1073class npc_tobias_seecher : public CreatureScript
1074{
1075public:
1076 npc_tobias_seecher() : CreatureScript("npc_tobias_seecher") { }
1077
1078 CreatureAI* GetAI(Creature* creature) const OVERRIDE
1079 {
1080 npc_tobias_seecherAI* tobias_seecherAI = new npc_tobias_seecherAI(creature);
1081
1082 tobias_seecherAI->AddWaypoint(0, 549.21f, -281.07f, -75.27f);
1083 tobias_seecherAI->AddWaypoint(1, 554.39f, -267.39f, -73.68f);
1084 tobias_seecherAI->AddWaypoint(2, 533.59f, -249.38f, -67.04f);
1085 tobias_seecherAI->AddWaypoint(3, 519.44f, -217.02f, -59.34f);
1086 tobias_seecherAI->AddWaypoint(4, 506.55f, -153.49f, -62.34f);
1087
1088 return tobias_seecherAI;
1089 }
1090
1091 bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) OVERRIDE
1092 {
1093 player->PlayerTalkClass->ClearMenus();
1094 if (action == GOSSIP_ACTION_INFO_DEF + 1)
1095 {
1096 player->CLOSE_GOSSIP_MENU();
1097 CAST_AI(npc_escort::npc_escortAI, (creature->AI()))->Start(false, true, player->GetGUID());
1098 creature->RemoveFlag(UNIT_FIELD_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
1099 instance->SetData(DATA_TOBIAS, ENCOUNTER_STATE_IN_PROGRESS);
1100 }
1101 return true;
1102 }
1103
1104 bool OnGossipHello(Player* player, Creature* creature) OVERRIDE
1105 {
1106 if (player->GetQuestStatus(QUEST_JAIL_BREAK) == QUEST_STATUS_INCOMPLETE && instance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_IN_PROGRESS)
1107 {
1108 player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Get out of here, Tobias, you're free!", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
1109 player->SEND_GOSSIP_MENU(2847, creature->GetGUID());
1110 }
1111 return true;
1112 }
1113
1114 struct npc_tobias_seecherAI : public npc_escortAI
1115 {
1116 npc_tobias_seecherAI(Creature* creature) : npc_escortAI(creature) { }
1117
1118 void EnterCombat(Unit* who) OVERRIDE { }
1119 void Reset() OVERRIDE { }
1120
1121 void JustDied(Unit* killer) OVERRIDE
1122 {
1123 if (IsBeingEscorted && killer == me)
1124 {
1125 me->SetVisible(false);
1126 me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
1127 me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
1128 instance->SetData(DATA_TOBIAS, ENCOUNTER_STATE_ENDED);
1129 }
1130 }
1131
1132 void WaypointReached(uint32 waypointId) OVERRIDE
1133 {
1134 switch (waypointId)
1135 {
1136 case 0:
1137 me->Say(SAY_TOBIAS_FREE, LANG_UNIVERSAL, PlayerGUID);
1138 break;
1139 case 2:
1140 instance->SetData(DATA_TOBIAS, ENCOUNTER_STATE_OBJECTIVE_COMPLETED);
1141 break;
1142 case 4:
1143 me->SetVisible(false);
1144 me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
1145 me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
1146 instance->SetData(DATA_TOBIAS, ENCOUNTER_STATE_ENDED);
1147 break;
1148 }
1149 }
1150
1151 void UpdateAI(uint32 diff) OVERRIDE
1152 {
1153 if (instance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_NOT_STARTED)
1154 return;
1155
1156 if ((instance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_IN_PROGRESS || instance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_FAILED || instance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_ENDED)&& instance->GetData(DATA_TOBIAS) == ENCOUNTER_STATE_ENDED)
1157 {
1158 me->SetVisible(false);
1159 me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
1160 me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
1161 }
1162 else
1163 {
1164 me->SetVisible(true);
1165 me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
1166 me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
1167 }
1168 npc_escortAI::UpdateAI(diff);
1169 }
1170 };
1171};
1172
1173*/
1174
1175// npc_rocknot
1177{
1179};
1180
1182{
1184};
1185
1187{
1189};
1190
1192{
1193public:
1194 npc_rocknot() : CreatureScript("npc_rocknot") { }
1195
1196 bool OnQuestReward(Player* /*player*/, Creature* creature, Quest const* quest, uint32 /*item*/) OVERRIDE
1197 {
1198 InstanceScript* instance = creature->GetInstanceScript();
1199 if (!instance)
1200 return true;
1201
1202 if (instance->GetData(TYPE_BAR) == DONE || instance->GetData(TYPE_BAR) == SPECIAL)
1203 return true;
1204
1205 if (quest->GetQuestId() == QUEST_ALE)
1206 {
1207 if (instance->GetData(TYPE_BAR) != IN_PROGRESS)
1208 instance->SetData(TYPE_BAR, IN_PROGRESS);
1209
1210 instance->SetData(TYPE_BAR, SPECIAL);
1211
1212 //keep track of amount in instance script, returns SPECIAL if amount ok and event in progress
1213 if (instance->GetData(TYPE_BAR) == SPECIAL)
1214 {
1215 creature->AI()->Talk(SAY_GOT_BEER);
1216 creature->CastSpell(creature, SPELL_DRUNKEN_RAGE, false);
1217
1218 if (npc_escortAI* escortAI = CAST_AI(npc_rocknot::npc_rocknotAI, creature->AI()))
1219 escortAI->Start(false, false);
1220 }
1221 }
1222
1223 return true;
1224 }
1225
1227 {
1228 return new npc_rocknotAI(creature);
1229 }
1230
1232 {
1233 npc_rocknotAI(Creature* creature) : npc_escortAI(creature)
1234 {
1235 instance = creature->GetInstanceScript();
1236 }
1237
1239
1242
1244 {
1246 return;
1247
1248 BreakKeg_Timer = 0;
1249 BreakDoor_Timer = 0;
1250 }
1251
1252 void DoGo(uint32 id, uint32 state)
1253 {
1254 if (GameObject* go = instance->instance->GetGameObject(instance->GetData64(id)))
1255 go->SetGoState((GOState)state);
1256 }
1257
1259 {
1260 if (!instance)
1261 return;
1262
1263 switch (waypointId)
1264 {
1265 case 1:
1266 me->HandleEmoteCommand(EMOTE_ONESHOT_KICK);
1267 break;
1268 case 2:
1269 me->HandleEmoteCommand(EMOTE_ONESHOT_ATTACK_UNARMED);
1270 break;
1271 case 3:
1272 me->HandleEmoteCommand(EMOTE_ONESHOT_ATTACK_UNARMED);
1273 break;
1274 case 4:
1275 me->HandleEmoteCommand(EMOTE_ONESHOT_KICK);
1276 break;
1277 case 5:
1278 me->HandleEmoteCommand(EMOTE_ONESHOT_KICK);
1279 BreakKeg_Timer = 2000;
1280 break;
1281 }
1282 }
1283
1285 {
1286 if (!instance)
1287 return;
1288
1289 if (BreakKeg_Timer)
1290 {
1291 if (BreakKeg_Timer <= diff)
1292 {
1294 BreakKeg_Timer = 0;
1295 BreakDoor_Timer = 1000;
1296 } else BreakKeg_Timer -= diff;
1297 }
1298
1299 if (BreakDoor_Timer)
1300 {
1301 if (BreakDoor_Timer <= diff)
1302 {
1304 DoGo(DATA_GO_BAR_KEG_TRAP, 0); //doesn't work very well, leaving code here for future
1305 //spell by trap has effect61, this indicate the bar go hostile
1306
1307 if (Unit* tmp = Unit::GetUnit(*me, instance->GetData64(DATA_PHALANX)))
1308 tmp->setFaction(14);
1309
1310 //for later, this event(s) has alot more to it.
1311 //optionally, DONE can trigger bar to go hostile.
1312 instance->SetData(TYPE_BAR, DONE);
1313
1314 BreakDoor_Timer = 0;
1315 } else BreakDoor_Timer -= diff;
1316 }
1317
1319 }
1320 };
1321};
1322
1324{
1326 new at_ring_of_law();
1327 new npc_grimstone();
1328 new npc_phalanx();
1331 new npc_rocknot();
1332 // Fix us
1333 /*new npc_dughal_stormwing();
1334 new npc_tobias_seecher();
1335 new npc_marshal_windsor();
1336 new npc_marshal_reginald_windsor();
1337 */
1338}
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
GOState
Definition GameObject.h:575
@ GOSSIP_ICON_CHAT
Definition GossipDef.h:46
@ GOSSIP_ICON_VENDOR
Definition GossipDef.h:47
@ IN_PROGRESS
@ DONE
@ SPECIAL
#define SF_LOG_DEBUG(filterType__,...)
Definition Log.h:134
@ TEMPSUMMON_DEAD_DESPAWN
Definition Object.h:74
@ QUEST_STATUS_INCOMPLETE
Definition QuestDef.h:89
#define CAST_AI(a, b)
@ STATE_ESCORT_ESCORTING
@ GOSSIP_SENDER_MAIN
@ GOSSIP_ACTION_TRADE
@ GOSSIP_ACTION_INFO_DEF
@ EMOTE_ONESHOT_KICK
@ EMOTE_ONESHOT_ATTACK_UNARMED
@ HORDE
@ REP_FRIENDLY
@ UNIT_FLAG_NON_ATTACKABLE
Definition Unit.h:626
@ UNIT_FIELD_FLAGS
GrimstoneTexts
@ SAY_TEXT4
@ SAY_TEXT3
@ SAY_TEXT6
@ SAY_TEXT2
@ SAY_TEXT5
@ SAY_TEXT1
@ SAY_GOT_BEER
#define GOSSIP_ITEM_KHARAN_2
#define GOSSIP_ITEM_KHARAN_7
void AddSC_blackrock_depths()
@ ITEM_THRORIUM_BROTHERHOOD_CONTRACT
@ ITEM_SULFURON_INGOT
@ NPC_REGINALD_WINDSOR
@ MAX_NPC_AMOUNT
@ NPC_THELDREN
@ NPC_GRIMSTONE
#define GOSSIP_ITEM_KHARAN_3
#define GOSSIP_ITEM_KHARAN_6
@ QUEST_A_BINDING_CONTRACT
@ SPELL_MIGHTYBLOW
@ SPELL_FIREBALLVOLLEY
@ SPELL_THUNDERCLAP
#define GOSSIP_ITEM_KHARAN_8
#define GOSSIP_ITEM_KHARAN_4
@ QUEST_JAIL_BREAK
#define GOSSIP_ITEM_KHARAN_1
#define GOSSIP_ITEM_SHOW_ACCESS
@ QUEST_4342
@ QUEST_4001
#define GOSSIP_ITEM_KHARAN_5
uint32 RingMob[]
MarshalReginaldWindor
@ NPC_SHILL_DINGER
@ NPC_CREST_KILLER
#define GOSSIP_ITEM_KHARAN_10
@ SPELL_DRUNKEN_RAGE
#define GOSSIP_ITEM_KHARAN_9
uint32 RingBoss[]
#define GOSSIP_ITEM_GET_CONTRACT
@ SPELL_CREATE_THORIUM_BROTHERHOOD_CONTRACT_DND
@ DATA_PHALANX
@ TYPE_RING_OF_LAW
@ TYPE_BAR
@ DATA_GO_BAR_KEG
@ TYPE_LYCEUM
@ DATA_ARENA3
@ DATA_ARENA2
@ DATA_GOLEM_DOOR_S
@ DATA_GOLEM_DOOR_N
@ DATA_SF_BRAZIER_N
@ DATA_ARENA4
@ DATA_GO_BAR_KEG_TRAP
@ DATA_ARENA1
@ DATA_SF_BRAZIER_S
@ DATA_GO_BAR_DOOR
@ SPELL_THUNDERCLAP
AreaTriggerScript(const char *name)
void Talk(uint8 id, WorldObject const *whisperTarget=NULL)
bool UpdateVictim()
CreatureScript(const char *name)
GameObjectScript(const char *name)
void DoMeleeAttackIfReady()
Definition UnitAI.cpp:28
void DoCastVictim(uint32 spellId, bool triggered=false)
Definition UnitAI.cpp:168
Definition Unit.h:1367
bool IsAlive() const
Definition Unit.h:2032
static Creature * GetCreature(WorldObject &object, uint64 guid)
Definition Unit.cpp:4905
static Unit * GetUnit(WorldObject &object, uint64 guid)
Definition Unit.cpp:4895
bool isDead() const
Definition Unit.h:2040
InstanceScript * GetInstanceScript()
Definition Object.cpp:1612
virtual uint32 GetData(uint32) const
Definition ZoneScript.h:36
virtual void SetData(uint32, uint32)
Definition ZoneScript.h:37
bool OnTrigger(Player *player, const AreaTriggerEntry *) OVERRIDE
bool OnGossipHello(Player *, GameObject *go) OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
bool OnGossipSelect(Player *player, Creature *creature, uint32, uint32 action) OVERRIDE
bool OnGossipHello(Player *player, Creature *creature) OVERRIDE
bool OnGossipHello(Player *player, Creature *creature) OVERRIDE
bool OnGossipSelect(Player *player, Creature *creature, uint32, uint32 action) OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
bool OnQuestReward(Player *, Creature *creature, Quest const *quest, uint32) OVERRIDE
Creature * me
bool HealthBelowPct(uint32 pct) const
ScriptedAI(Creature *creature)
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
bool HasEscortState(uint32 escortState) const
npc_escortAI(Creature *creature)
void Start(bool isActiveAttacker=true, bool run=false, uint64 playerGUID=0, Quest const *quest=NULL, bool instantRespawn=false, bool canLoopPath=false, bool resetWaypoints=true)
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void WaypointReached(uint32 waypointId) OVERRIDE
void HandleGameObject(uint32 id, bool open)
npc_phalanxAI(Creature *creature)
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void WaypointReached(uint32 waypointId) OVERRIDE
npc_rocknotAI(Creature *creature)
void DoGo(uint32 id, uint32 state)
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================