Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
zone_zuldrak.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 "ScriptedGossip.h"
9#include "ScriptedEscortAI.h"
10#include "Player.h"
11#include "SpellInfo.h"
12#include "SpellScript.h"
13#include "SpellAuras.h"
14#include "SpellAuraEffects.h"
15#include "Vehicle.h"
16
17/*####
18## npc_drakuru_shackles
19####*/
20
30
32{
33public:
34 npc_drakuru_shackles() : CreatureScript("npc_drakuru_shackles") { }
35
37 {
38 npc_drakuru_shacklesAI(Creature* creature) : ScriptedAI(creature) { }
39
41 {
42 _rageclawGUID = 0;
44
45 float x, y, z;
46 me->GetClosePoint(x, y, z, me->GetObjectSize() / 3, 0.1f);
47
48 if (Unit* summon = me->SummonCreature(NPC_RAGECLAW, x, y, z, 0, TempSummonType::TEMPSUMMON_DEAD_DESPAWN, 1000))
49 {
50 _rageclawGUID = summon->GetGUID();
52 }
53 }
54
56 {
58 // pointer check not needed
59 me->SetInFront(rageclaw);
60 rageclaw->SetInFront(me);
61
62 DoCast(rageclaw, SPELL_LEFT_CHAIN, true);
63 DoCast(rageclaw, SPELL_RIGHT_CHAIN, true);
64 }
65
67 {
68 if (!who)
69 return;
70
72 // pointer check not needed
73 DoCast(rageclaw, SPELL_FREE_RAGECLAW, true);
74
75 me->setDeathState(DeathState::DEAD);
76 }
77
78 void SpellHit(Unit* caster, const SpellInfo* spell) OVERRIDE
79 {
80 if (spell->Id == SPELL_UNLOCK_SHACKLE)
81 {
82 Player* player = caster->ToPlayer();
83 if (!player)
84 return;
85
87 {
88 if (Creature* rageclaw = Unit::GetCreature(*me, _rageclawGUID))
89 {
90 UnlockRageclaw(caster);
91 player->KilledMonster(rageclaw->GetCreatureTemplate(), _rageclawGUID);
92 me->DespawnOrUnsummon();
93 }
94 else
95 me->setDeathState(DeathState::JUST_DIED);
96 }
97 }
98 }
99
100 private:
102 };
103
105 {
106 return new npc_drakuru_shacklesAI(creature);
107 }
108};
109
110/*####
111## npc_captured_rageclaw
112####*/
113
115{
117 SPELL_KNEEL = 39656,
119};
120
122{
123public:
124 npc_captured_rageclaw() : CreatureScript("npc_captured_rageclaw") { }
125
127 {
128 npc_captured_rageclawAI(Creature* creature) : ScriptedAI(creature) { }
129
131 {
132 me->setFaction(35);
133 DoCast(me, SPELL_KNEEL, true); // Little Hack for kneel - Thanks Illy :P
134 }
135
137
138
139 void SpellHit(Unit* /*caster*/, const SpellInfo* spell) OVERRIDE
140 {
141 if (spell->Id == SPELL_FREE_RAGECLAW)
142 {
143 me->RemoveAurasDueToSpell(SPELL_LEFT_CHAIN);
144 me->RemoveAurasDueToSpell(SPELL_RIGHT_CHAIN);
145 me->RemoveAurasDueToSpell(SPELL_KNEEL);
146 me->setFaction(me->GetCreatureTemplate()->faction_H);
147 DoCast(me, SPELL_UNSHACKLED, true);
149 me->GetMotionMaster()->MoveRandom(10);
150 me->DespawnOrUnsummon(10000);
151 }
152 }
153 };
154
156 {
157 return new npc_captured_rageclawAI(creature);
158 }
159};
160
161/*####
162## npc_gurgthock
163####*/
164
166{
173
176 NPC_YGGDRAS = 30014,
178 NPC_AZ_BARIN = 30026, // air
179 NPC_DUKE_SINGEN = 30019, // fire
180 NPC_ERATHIUS = 30025, // earth
181 NPC_GARGORAL = 30024, // water
186
197
200
201 SPELL_CRASHING_WAVE = 55909, // water
202 SPELL_SHOCKWAVE = 55918, // earth
203 SPELL_BLAST_OF_AIR = 55912, // air
204 SPELL_MAGMA_WAVE = 55916, // fire
205
206 SPELL_ORB_OF_WATER = 55888, // fiend of water spell
207 SPELL_ORB_OF_STORMS = 55882, // fiend of air spell
208 SPELL_BOULDER = 55886, // fiend of earth spell
209 SPELL_ORB_OF_FLAME = 55872, // fiend of fire spell
210};
211
219
227
229{
230 {5754.692f, -2939.46f, 286.276123f, 5.156380f}, // stinkbeard || orinoko || korrak
231 {5762.054199f, -2954.385010f, 273.826955f, 5.108289f}, //yggdras
232 {5776.855f, -2989.77979f, 272.96814f, 5.194f} // elementals
233};
234
236{
237 {5722.487f, -3010.75f, 312.751648f, 0.478f}, // caster location
238 {5724.983f, -2969.89551f, 286.359619f, 0.478f},
239 {5733.76025f, -3000.34644f, 286.359619f, 0.478f},
240 {5739.8125f, -2981.524f, 290.7671f, 0.478f}, // caster location
241 {5742.101f, -2950.75586f, 286.2643f, 5.21f},
242 {5743.305f, -3011.29736f, 290.7671f, 0.478f}, // caster location
243 {5744.417f, -3025.528f, 286.35965f, 0.478f},
244 {5763.189f, -3029.67529f, 290.7671f, 0.478f},
245 {5769.401f, -2935.121f, 286.335754f, 5.21f},
246 {5793.061f, -2934.593f, 286.359619f, 3.53f},
247 {5797.32129f, -2955.26855f, 290.7671f, 3.53f}, // caster location
248 {5813.94531f, -2956.74683f, 286.359619f, 3.53f},
249 {5816.85547f, -2974.476f, 290.7671f, 3.53f}, // caster location
250 {5820.30859f, -3002.83716f, 290.7671f, 3.53f}, // caster location
251 {5828.50244f, -2981.737f, 286.359619f, 3.53f},
252 {5828.899f, -2960.15479f, 312.751648f, 3.53f}, // caster location
253};
254
256{
257public:
258 npc_gurgthock() : CreatureScript("npc_gurgthock") { }
259
261 {
262 npc_gurgthockAI(Creature* creature) : ScriptedAI(creature) { }
263
265 {
266 _summonGUID = 0;
267 _playerGUID = 0;
268
270 uiTimer = 0;
271 uiPhase = 0;
272 uiQuest = 0;
273 uiRemoveFlagTimer = 5000;
274
275 _bossRandom = 0;
276
277 _removeFlag = false;
278 }
279
280 void SetGUID(uint64 guid, int32 /*id*/) OVERRIDE
281 {
282 _playerGUID = guid;
283 }
284
285 void SetData(uint32 type, uint32 data) OVERRIDE
286 {
287 _removeFlag = true;
289
290 switch (type)
291 {
292 case 1:
293 switch (data)
294 {
297 uiPhase = 1;
298 uiTimer = 4000;
299 break;
302 uiPhase = 3;
303 uiTimer = 3000;
304 break;
307 uiPhase = 6;
308 uiTimer = 3000;
309 break;
311 uiTimer = 5000;
312 uiPhase = 7;
313 break;
315 uiTimer = 2000;
316 uiPhase = 12;
317 break;
318 }
319 break;
320 }
321 }
322
324 {
326
327 if (_removeFlag)
328 {
329 if (uiRemoveFlagTimer <= diff)
330 {
332 _removeFlag = false;
333
334 uiRemoveFlagTimer = 10000;
335 } else uiRemoveFlagTimer -= diff;
336 }
337
338 if (uiPhase)
339 {
340 if (uiTimer <= diff)
341 {
342 switch (uiPhase)
343 {
344 case 1:
346 _summonGUID = summon->GetGUID();
347 uiPhase = 2;
348 uiTimer = 4000;
349 break;
350 case 2:
351 if (Creature* summon = Unit::GetCreature(*me, _summonGUID))
352 summon->GetMotionMaster()->MoveJump(5776.319824f, -2981.005371f, 273.100037f, 10.0f, 20.0f);
353 uiPhase = 0;
354 _summonGUID = 0;
355 break;
356 case 3:
358 uiTimer = 3000;
359 uiPhase = 4;
360 break;
361 case 4:
363 _summonGUID = summon->GetGUID();
364 uiTimer = 3000;
365 uiPhase = 0;
366 break;
367 case 6:
369 uiTimer = 5000;
370 uiPhase = 9;
371 break;
372 case 7:
374 uiTimer = 3000;
375 uiPhase = 8;
376 break;
377 case 8:
379 uiTimer = 5000;
380 uiPhase = 11;
381 break;
382 case 9:
384 uiTimer = 10000;
385 uiPhase = 10;
386 break;
387 case 10:
390 uiPhase = 0;
391 break;
392 case 11:
393 if (Creature* creature = me->SummonCreature(NPC_STINKBEARD, SpawnPosition[0], TempSummonType::TEMPSUMMON_CORPSE_DESPAWN, 1000))
394 creature->AI()->Talk(SAY_STINKBEARD_SPAWN);
395 uiPhase = 0;
396 break;
397 case 12:
399 uiTimer = 5000;
400 uiPhase = 13;
401 break;
402 case 13:
404 uiTimer = 3000;
405 uiPhase = 14;
406 break;
407 case 14:
408 _bossRandom = std::rand() % 3;
409 if (Creature* creature = me->SummonCreature(Boss[_bossRandom].uiBoss, SpawnPosition[2], TempSummonType::TEMPSUMMON_CORPSE_DESPAWN, 1000))
410 creature->AI()->SetData(1, _bossRandom);
411 uiPhase = 0;
412 break;
413 }
414 }
415 else
416 uiTimer -= diff;
417 }
418 }
419
420 private:
425
430 };
431
432 bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) OVERRIDE
433 {
434 switch (quest->GetQuestId())
435 {
437 creature->AI()->SetData(1, quest->GetQuestId());
438 break;
440 creature->AI()->SetData(1, quest->GetQuestId());
441 break;
444 creature->AI()->SetData(1, quest->GetQuestId());
445 break;
447 creature->AI()->SetData(1, quest->GetQuestId());
448 break;
450 creature->AI()->SetData(1, quest->GetQuestId());
451 break;
452 }
453
454 creature->AI()->SetGUID(player->GetGUID());
455
456 return false;
457 }
458
460 {
461 return new npc_gurgthockAI(creature);
462 }
463};
464
465/*####
466## npc_orinoko_tuskbreaker
467####*/
468
479
481{
482public:
483 npc_orinoko_tuskbreaker() : CreatureScript("npc_orinoko_tuskbreaker") { }
484
486 {
488 {
490 me->SetReactState(REACT_PASSIVE);
491 }
492
494 {
495 _summoned = false;
496 _battleShout = false;
497 _fishyScent = false;
499 uiFishyScentTimer = 20000;
500 _whiskerGUID = 0;
501 _affectedGUID = 0;
502 }
503
505 {
506 if (Creature* whisker = me->GetCreature(*me, _whiskerGUID))
507 whisker->RemoveFromWorld();
508 }
509
510 void MovementInform(uint32 type, uint32 /*pointId*/) OVERRIDE
511 {
512 if (type != EFFECT_MOTION_TYPE)
513 return;
514
516 me->SetReactState(REACT_AGGRESSIVE);
517 me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation());
518 uiBattleShoutTimer = 7000;
519 }
520
522 {
523 DoCast(who, SPELL_IMPALE);
524 }
525
527 {
528 if (!UpdateVictim())
529 return;
530
531 if (!_battleShout && uiBattleShoutTimer <= diff)
532 {
534 _battleShout = true;
535 } else uiBattleShoutTimer -= diff;
536
537 if (uiFishyScentTimer <= diff)
538 {
539 if (Unit* affected = SelectTarget(SELECT_TARGET_RANDOM, 0))
540 {
541 DoCast(affected, SPELL_FISHY_SCENT);
542 _affectedGUID = affected->GetGUID();
543 }
544 uiFishyScentTimer = 20000;
545 } else uiFishyScentTimer -= diff;
546
547 if (!_summoned && !HealthAbovePct(50))
548 {
550 //DoCastVictim(SPELL_SUMMON_WHISKER); petai is not working correctly???
551
552 if (Creature* whisker = me->SummonCreature(NPC_WHISKER, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0, TempSummonType::TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 0))
553 _whiskerGUID = whisker->GetGUID();
554 _summoned = true;
555 }
556
558 }
559
561 {
562 switch (summon->GetEntry())
563 {
564 case NPC_WHISKER:
565 summon->AI()->AttackStart(me->GetVictim());
566 break;
568 if (Unit* affected = Unit::GetUnit(*me, _affectedGUID))
569 {
570 if (affected->IsAlive())
571 summon->AI()->AttackStart(affected);
572 }
573 break;
574 }
575 }
576
577 void JustDied(Unit* killer) OVERRIDE
578 {
579 if (_whiskerGUID)
580 if (Creature* whisker = me->GetCreature(*me, _whiskerGUID))
581 whisker->RemoveFromWorld();
582
583 if (killer->GetTypeId() == TypeID::TYPEID_PLAYER)
584 killer->GetCharmerOrOwnerPlayerOrPlayerItself()->GroupEventHappens(QUEST_AMPHITHEATER_ANGUISH_TUSKARRMAGEDDON, killer);
585 }
586
587 private:
595 };
596
598 {
599 return new npc_orinoko_tuskbreakerAI(creature);
600 }
601};
602
603/*####
604## npc_korrak_bloodrager
605####*/
606
608{
609 SPELL_GROW = 55948,
613};
614
616{
617public:
618 npc_korrak_bloodrager() : CreatureScript("npc_korrak_bloodrager") { }
619
621 {
623 {
624 Start(true, true, 0, NULL);
625 SetDespawnAtEnd(false);
626 }
627
629 {
631 me->SetReactState(REACT_PASSIVE);
632 _enrage = false;
633 _chargeTimer = 15000;
634 _uppercutTimer = 12000;
635 }
636
638 {
639 switch (waypointId)
640 {
641 case 6:
642 me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0);
644 me->SetReactState(REACT_AGGRESSIVE);
645 break;
646 }
647 }
648
649 void EnterCombat(Unit* /*who*/) OVERRIDE
650 {
652 }
653
655 {
657
658 if (!UpdateVictim())
659 return;
660
661 if (_uppercutTimer <= diff)
662 {
663 if (Unit* target = SelectTarget(SELECT_TARGET_NEAREST, 0))
664 DoCast(target, SPELL_UPPERCUT);
665 _uppercutTimer = 12000;
666 } else _uppercutTimer -= diff;
667
668 if (_chargeTimer <= diff)
669 {
670 if (Unit* target = SelectTarget(SELECT_TARGET_FARTHEST, 0))
671 DoCast(target, SPELL_CHARGE);
672 _chargeTimer = 15000;
673 } else _chargeTimer -= diff;
674
675 if (!_enrage && !HealthAbovePct(20))
676 {
678 _enrage = true;
679 }
681 }
682
683 void JustDied(Unit* killer) OVERRIDE
684 {
685 if (Player* player = killer->GetCharmerOrOwnerPlayerOrPlayerItself())
686 player->GroupEventHappens(QUEST_AMPHITHEATER_ANGUISH_KORRAK_BLOODRAGER, killer);
687 }
688 private:
692 };
693
695 {
696 return new npc_korrak_bloodragerAI(creature);
697 }
698};
699
700/*####
701## npc_yggdras
702####*/
703
710
712{
713public:
714 npc_yggdras() : CreatureScript("npc_yggdras") { }
715
716 struct npc_yggdrasAI : public ScriptedAI
717 {
718 npc_yggdrasAI(Creature* creature) : ScriptedAI(creature) { }
719
721 {
722 _cleaveTimer = 9000;
723 _corrodeFleshTimer = 6000;
724 }
725
727 {
728 if (!UpdateVictim())
729 return;
730
731 if (me->GetVictim()->GetPositionZ() >= 286.276f)
732 {
733 std::list<HostileReference*> t_list = me->getThreatManager().getThreatList();
734 for (std::list<HostileReference*>::const_iterator itr = t_list.begin(); itr!= t_list.end(); ++itr)
735 {
736 if (Unit* unit = Unit::GetUnit(*me, (*itr)->getUnitGuid()))
737 {
738 if (unit->GetPositionZ() <= 286.276f)
739 {
740 me->getThreatManager().resetAllAggro();
741 me->AddThreat(unit, 5.0f);
742 break;
743 }
745 }
746 }
747 }
748
749 if (_cleaveTimer <= diff)
750 {
752 _cleaveTimer = 9000;
753 } else _cleaveTimer -= diff;
754
755 if (_corrodeFleshTimer <= diff)
756 {
758 _corrodeFleshTimer = 6000;
759 } else _corrodeFleshTimer -= diff;
760
762 }
763
764 void JustDied(Unit* killer) OVERRIDE
765 {
766 if (Unit* summoner = me->ToTempSummon()->GetSummoner())
767 {
768 std::string sText = (std::string(killer->GetName()) + " has defeated Yg.. Yggg-really big worm!");
769 summoner->MonsterYell(sText.c_str(), Language::LANG_UNIVERSAL, 0);
770 }
771
772 if (Player* player = killer->GetCharmerOrOwnerPlayerOrPlayerItself())
773 {
774 player->GroupEventHappens(QUEST_AMPHITHEATER_ANGUISH_YGGDRAS_1, killer);
775 player->GroupEventHappens(QUEST_AMPHITHEATER_ANGUISH_YGGDRAS_2, killer);
776 }
777
778 for (uint8 i = 0; i < 3; ++i)
779 DoCast(killer, SPELL_JORMUNGAR_SPAWN, true);
780 }
781 private:
784 };
785
787 {
788 return new npc_yggdrasAI(creature);
789 }
790};
791
792/*####
793## npc_stinkbeard
794####*/
795
804
806{
807public:
808 npc_stinkbeard() : CreatureScript("npc_stinkbeard") { }
809
811 {
813 {
815 me->SetReactState(REACT_PASSIVE);
816 Start(true, true, 0, NULL);
817 SetDespawnAtEnd(false);
818 }
819
821 {
822 me->AddAura(SPELL_THUNDERBLADE, me);
823 uiKnockAwayTimer = 10000;
824 uiStinkyBeardTimer = 15000;
825 _enrage = false;
826 _thunderClap = false;
827 }
828
830 {
831 switch (waypointId)
832 {
833 case 7:
835 me->SetReactState(REACT_AGGRESSIVE);
836 me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation());
837 break;
838 }
839 }
840
842 {
844
845 if (!UpdateVictim())
846 return;
847
848 if (Unit* victim = me->GetVictim())
849 {
850 if (victim->GetPositionZ() >= 286.276f)
851 {
852 std::list<HostileReference*> t_list = me->getThreatManager().getThreatList();
853 for (std::list<HostileReference*>::const_iterator itr = t_list.begin(); itr!= t_list.end(); ++itr)
854 {
855 if (Unit* unit = Unit::GetUnit(*me, (*itr)->getUnitGuid()))
856 {
857 if (unit->GetPositionZ() <= 286.276f)
858 {
859 me->getThreatManager().resetAllAggro();
860 me->AddThreat(unit, 5.0f);
861 break;
862 }
864 }
865 }
866 }
867 }
868
869 if (_thunderClap && !HealthAbovePct(10))
870 {
872 _thunderClap = true;
873 }
874
875 if (uiKnockAwayTimer <= uiDiff)
876 {
877 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
878 {
879 if (target && target->IsAlive())
880 DoCast(target, SPELL_KNOCK_AWAY);
881 }
882 uiKnockAwayTimer = 10000;
883 } else uiKnockAwayTimer -= uiDiff;
884
885 if (uiStinkyBeardTimer <= uiDiff)
886 {
887 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
888 {
889 if (target && target->IsAlive())
890 DoCast(target, SPELL_STINKY_BEARD);
891 }
892 uiStinkyBeardTimer = 15000;
893 } else uiStinkyBeardTimer -= uiDiff;
894
895 if (!_enrage && !HealthAbovePct(20))
896 {
898 _enrage = true;
899 }
901 }
902
903 void JustDied(Unit* killer) OVERRIDE
904 {
905 if (Player* player = killer->GetCharmerOrOwnerPlayerOrPlayerItself())
906 player->GetCharmerOrOwnerPlayerOrPlayerItself()->GroupEventHappens(QUEST_AMPHITHEATER_ANGUISH_MAGNATAUR, killer);
907
908 std::string sText = ("And with AUTHORITY, " + std::string(killer->GetName()) + " dominates the magnataur lord! Stinkbeard's clan is gonna miss him back home in the Dragonblight!");
909 me->MonsterYell(sText.c_str(), Language::LANG_UNIVERSAL, 0);
910 }
911 private:
916 };
917
919 {
920 return new npc_stinkbeardAI(creature);
921 }
922};
923
924/*####
925## npc_elemental_lord
926####*/
927
929{
930public:
931 npc_elemental_lord() : CreatureScript("npc_elemental_lord") { }
932
934 {
935 npc_elemental_lordAI(Creature* creature) : ScriptedAI(creature) { }
936
937 std::list<uint64> SummonList;
938
940
943
945
947 {
948 uiBossRandom = 0;
949 uiSpellInfo = 0;
950 uiElementalSpellTimer = std::rand() % 8000 + 5000;
951
952 bAddAttack = false;
953 }
954
955 void SetData(uint32 uiData, uint32 uiValue) OVERRIDE
956 {
957 if (uiData == 1)
958 {
959 uiBossRandom = uiValue;
960 SummonAdds();
961 }
962 }
963
965 {
966 if (!Boss[uiBossRandom].uiAdd)
967 return;
968
969 SummonList.clear();
970
971 for (uint8 uiI = 0; uiI < 16; uiI++)
972 {
973 if (Creature* summon = me->SummonCreature(Boss[uiBossRandom].uiAdd, AddSpawnPosition[uiI]))
974 {
975 summon->AI()->SetData(1, uiBossRandom);
976 SummonList.push_back(summon->GetGUID());
977 }
978 }
979 }
980
982 {
983 if (!SummonList.empty())
984 for (std::list<uint64>::const_iterator itr = SummonList.begin(); itr != SummonList.end(); ++itr)
985 {
986 if (Creature* temp = Unit::GetCreature(*me, *itr))
987 {
988 temp->m_CombatDistance = 100.0f; // ugly hack? we are not in a instance sorry. :(
989 temp->AI()->AttackStart(unit);
990 }
991 }
992 }
993
995 {
996 if (!UpdateVictim())
997 return;
998
999 if (me->GetVictim()->GetPositionZ() >= 286.276f)
1000 {
1001 std::list<HostileReference*> t_list = me->getThreatManager().getThreatList();
1002 for (std::list<HostileReference*>::const_iterator itr = t_list.begin(); itr!= t_list.end(); ++itr)
1003 {
1004 if (Unit* unit = Unit::GetUnit(*me, (*itr)->getUnitGuid()))
1005 {
1006 if (unit->GetPositionZ() <= 286.276f)
1007 {
1008 me->getThreatManager().resetAllAggro();
1009 me->AddThreat(unit, 5.0f);
1010 break;
1011 }
1013 }
1014 }
1015 }
1016
1017 if (uiElementalSpellTimer <= uiDiff)
1018 {
1019 DoCastVictim(Boss[uiBossRandom].uiSpell);
1020
1021 uiElementalSpellTimer = std::rand() % 8000 + 5000;
1022 } else uiElementalSpellTimer -= uiDiff;
1023
1024 if (!bAddAttack && !HealthAbovePct(20))
1025 {
1026 if (!SummonList.empty())
1027 for (std::list<uint64>::const_iterator itr = SummonList.begin(); itr != SummonList.end(); ++itr)
1028 {
1029 if (Creature* temp = Unit::GetCreature(*me, *itr))
1030 {
1031 if (temp->GetPositionZ() >= 287.00f)
1032 continue;
1033
1034 if (temp->GetVictim())
1035 temp->GetMotionMaster()->MoveChase(temp->GetVictim());
1036 }
1037 }
1038
1039 bAddAttack = true;
1040 }
1041
1043 }
1044
1045 void JustDied(Unit* killer) OVERRIDE
1046 {
1047 if (!SummonList.empty())
1048 for (std::list<uint64>::const_iterator itr = SummonList.begin(); itr != SummonList.end(); ++itr)
1049 if (Creature* temp = Unit::GetCreature(*me, *itr))
1050 temp->DespawnOrUnsummon();
1051
1052 if (Player* player = killer->GetCharmerOrOwnerPlayerOrPlayerItself())
1053 player->GetCharmerOrOwnerPlayerOrPlayerItself()->GroupEventHappens(QUEST_AMPHITHEATER_ANGUISH_FROM_BEYOND, killer);
1054
1055 std::string sText = (std::string(killer->GetName()) + " is victorious once more!");
1056
1057 if (Unit* summoner = me->ToTempSummon()->GetSummoner())
1058 summoner->MonsterYell(sText.c_str(), Language::LANG_UNIVERSAL, 0);
1059 }
1060 };
1061
1063 {
1064 return new npc_elemental_lordAI(creature);
1065 }
1066};
1067
1068/*####
1069## npc_fiend_elemental
1070####*/
1071
1073{
1074public:
1075 npc_fiend_elemental() : CreatureScript("npc_fiend_elemental") { }
1076
1078 {
1079 npc_fiend_elementalAI(Creature* creature) : ScriptedAI(creature) { }
1080
1082 {
1083 if (me->GetPositionZ() >= 287.0f)
1084 me->GetMotionMaster()->MoveIdle();
1085
1086 _spell = 0;
1087 _missleTimer = std::rand() % 7000 + 2000;
1088 }
1089
1091 {
1092 if (!who)
1093 return;
1094
1095 AttackStartNoMove(who);
1096 }
1097
1099 {
1100 if (Data == 1)
1101 _spell = Boss[Value].uiAddSpell;
1102 }
1103
1105 {
1106 if (!UpdateVictim())
1107 return;
1108
1109 if (me->GetPositionZ() >= 287.0f)
1110 {
1111 if (_missleTimer <= diff)
1112 {
1113 if (_spell) // Sometimes it is 0, why?
1114 DoCast(me, _spell); // this spell (what spell) is not supported ... YET!
1115 _missleTimer = std::rand() % 7000 + 2000;
1116 } else _missleTimer -= diff;
1117 }
1118
1120 }
1121
1122 private:
1125 };
1126
1128 {
1129 return new npc_fiend_elementalAI(creature);
1130 }
1131};
1132
1133/*####
1134## npc_released_offspring_harkoa
1135####*/
1136
1138{
1139public:
1140 npc_released_offspring_harkoa() : CreatureScript("npc_released_offspring_harkoa") { }
1141
1143 {
1145
1147 {
1148 float x, y, z;
1149 me->GetClosePoint(x, y, z, me->GetObjectSize() / 3, 25.0f);
1150 me->GetMotionMaster()->MovePoint(0, x, y, z);
1151 }
1152
1154 {
1155 if (Type != POINT_MOTION_TYPE)
1156 return;
1157 me->DespawnOrUnsummon();
1158 }
1159 };
1160
1162 {
1163 return new npc_released_offspring_harkoaAI(creature);
1164 }
1165};
1166
1167/*######
1168## npc_crusade_recruit
1169######*/
1170
1176
1182
1184{
1185public:
1186 npc_crusade_recruit() : CreatureScript("npc_crusade_recruit") { }
1187
1189 {
1190 npc_crusade_recruitAI(Creature* creature) : ScriptedAI(creature) { }
1191
1193 {
1196 _heading = me->GetOrientation();
1197 }
1198
1200 {
1201 _events.Update(diff);
1202
1203 while (uint32 eventId = _events.ExecuteEvent())
1204 {
1205 switch (eventId)
1206 {
1207 case EVENT_RECRUIT_1:
1211 _events.ScheduleEvent(EVENT_RECRUIT_2, 3000);
1212 break;
1213 case EVENT_RECRUIT_2:
1214 me->SetWalk(true);
1215 me->GetMotionMaster()->MovePoint(0, me->GetPositionX() + (cos(_heading) * 10), me->GetPositionY() + (sin(_heading) * 10), me->GetPositionZ());
1216 me->DespawnOrUnsummon(5000);
1217 break;
1218 default:
1219 break;
1220 }
1221 }
1222
1223 if (!UpdateVictim())
1224 return;
1225 }
1226
1227 void sGossipSelect(Player* player, uint32 /*sender*/, uint32 /*action*/) OVERRIDE
1228 {
1229 _events.ScheduleEvent(EVENT_RECRUIT_1, 100);
1230 player->CLOSE_GOSSIP_MENU();
1231 me->CastSpell(player, SPELL_QUEST_CREDIT, true);
1232 me->SetFacingToObject(player);
1233 }
1234
1235 private:
1237 float _heading; // Store creature heading
1238 };
1239
1241 {
1242 return new npc_crusade_recruitAI(creature);
1243 }
1244};
1245
1246/*######
1247## Quest 12916: Our Only Hope!
1248## go_scourge_enclosure
1249######*/
1250
1252{
1254 NPC_GYMER_DUMMY = 29928, // From quest template
1256};
1257
1259{
1260public:
1261 go_scourge_enclosure() : GameObjectScript("go_scourge_enclosure") { }
1262
1264 {
1265 go->UseDoorOrButton();
1266 if (player->GetQuestStatus(QUEST_OUR_ONLY_HOPE) == QUEST_STATUS_INCOMPLETE)
1267 {
1268 Creature* gymerDummy = go->FindNearestCreature(NPC_GYMER_DUMMY, 20.0f);
1269 if (gymerDummy)
1270 {
1271 player->KilledMonsterCredit(gymerDummy->GetEntry(), gymerDummy->GetGUID());
1272 gymerDummy->CastSpell(gymerDummy, SPELL_GYMER_LOCK_EXPLOSION, true);
1273 gymerDummy->DespawnOrUnsummon();
1274 }
1275 }
1276 return true;
1277 }
1278};
1279
1280/*######
1281## Quest: Troll Patrol: The Alchemist's Apprentice
1282######*/
1283
1285{
1286 // Creature
1288 // Item
1310 // Quest
1312 // Spells
1324 // Spell Fetch Easy
1336 // Spell Have Easy
1348 // Spell Fetch Medium
1354 // Spell Have Medium
1360 // Spell Fetch Hard
1366 // Spell Have Hard
1372 // Text
1378 // Text Easy
1390 // Text Medium
1396 // Text Hard
1402};
1403
1413
1415{
1416public:
1417 npc_alchemist_finklestein() : CreatureScript("npc_alchemist_finklestein") { }
1418
1420 {
1422
1424 {
1425 _events.ScheduleEvent(EVENT_TURN_TO_POT, std::rand() % 26000 + 15000);
1426 }
1427
1429 {
1430 if (type == 1 && data == 1)
1431 switch (_getingredienttry)
1432 {
1433 case 2:
1434 case 3:
1435 _events.ScheduleEvent(EVENT_EASY_123, 100);
1436 break;
1437 case 4:
1438 _events.ScheduleEvent(EVENT_MEDIUM_4, 100);
1439 break;
1440 case 5:
1441 _events.ScheduleEvent(EVENT_MEDIUM_5, 100);
1442 break;
1443 case 6:
1444 _events.ScheduleEvent(EVENT_HARD_6, 100);
1445 break;
1446 default:
1447 break;
1448 }
1449 }
1450
1452 {
1453 _events.Update(diff);
1454
1455 while (uint32 eventId = _events.ExecuteEvent())
1456 {
1457 switch (eventId)
1458 {
1459 case EVENT_TURN_TO_POT:
1460 me->SetFacingTo(6.230825f);
1462 _events.ScheduleEvent(EVENT_TURN_BACK, 11000);
1463 break;
1464 case EVENT_TURN_BACK:
1465 me->SetFacingTo(4.886922f);
1467 _events.ScheduleEvent(EVENT_TURN_TO_POT, std::rand() % 41000 + 25000);
1468 break;
1469 case EVENT_EASY_123:
1471 {
1472 Talk(SAY_EASY_123, player);
1475 }
1476 break;
1477 case EVENT_MEDIUM_4:
1479 {
1480 Talk(SAY_MEDIUM_4, player);
1483 }
1484 break;
1485 case EVENT_MEDIUM_5:
1487 {
1488 Talk(SAY_MEDIUM_5, player);
1491 }
1492 break;
1493 case EVENT_HARD_6:
1495 {
1496 Talk(SAY_HARD_6, player);
1499 }
1500 break;
1501 default:
1502 break;
1503 }
1504 }
1505 }
1506
1507 void sGossipSelect(Player* player, uint32 /*sender*/, uint32 /*action*/) OVERRIDE
1508 {
1509 player->CLOSE_GOSSIP_MENU();
1511 _playerGUID = player->GetGUID();
1513 _events.ScheduleEvent(EVENT_EASY_123, 100);
1514 }
1515
1516private:
1520 };
1521
1523 {
1524 return new npc_alchemist_finklesteinAI(creature);
1525 }
1526};
1527
1529{
1530public:
1531 go_finklesteins_cauldron() : GameObjectScript("go_finklesteins_cauldron") { }
1532
1534 {
1535 player->CastSpell(player, SPELL_POT_CHECK);
1536 return true;
1537 }
1538};
1539
1541{
1563};
1564
1565/*#####
1566# spell_random_ingredient_aura
1567#####*/
1568
1612
1613/*#####
1614# spell_random_ingredient
1615#####*/
1616
1618{
1619public:
1620 spell_random_ingredient() : SpellScriptLoader("spell_random_ingredient") { }
1621
1623 {
1625
1626 bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
1627 {
1628 if (!sSpellMgr->GetSpellInfo(SPELL_FETCH_KNOTROOT) || !sSpellMgr->GetSpellInfo(SPELL_FETCH_PICKLED_EAGLE_EGG) || !sSpellMgr->GetSpellInfo(SPELL_FETCH_SPECKLED_GUANO) ||
1632 !sSpellMgr->GetSpellInfo(SPELL_FETCH_PRISMATIC_MOJO) || !sSpellMgr->GetSpellInfo(SPELL_FETCH_RAPTOR_CLAW) || !sSpellMgr->GetSpellInfo(SPELL_FETCH_AMBERSEED) ||
1635 return false;
1636 return true;
1637 }
1638
1640 {
1641 if (Player* player = GetHitPlayer())
1642 {
1643 uint8 ingredient = 0;
1644
1645 switch (GetSpellInfo()->Id)
1646 {
1648 ingredient = std::rand() % 10;
1649 break;
1651 ingredient = std::rand() % 15 + 11;
1652 break;
1654 ingredient = std::rand() % 20 + 16;
1655 break;
1656 }
1657
1658 if (Creature* finklestein = GetClosestCreatureWithEntry(player, NPC_FINKLESTEIN, 25.0f))
1659 {
1660 finklestein->CastSpell(player, FetchIngredients[ingredient][0], true, NULL);
1661 finklestein->AI()->Talk(FetchIngredients[ingredient][3], player);
1662 }
1663 }
1664 }
1665
1670 };
1671
1676};
1677
1678/*#####
1679# spell_pot_check
1680#####*/
1681
1683{
1684public:
1685 spell_pot_check() : SpellScriptLoader("spell_pot_check") { }
1686
1688 {
1690
1691 bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
1692 {
1693 if (!sSpellMgr->GetSpellInfo(SPELL_FETCH_KNOTROOT) || !sSpellMgr->GetSpellInfo(SPELL_FETCH_PICKLED_EAGLE_EGG) || !sSpellMgr->GetSpellInfo(SPELL_FETCH_SPECKLED_GUANO) ||
1697 !sSpellMgr->GetSpellInfo(SPELL_FETCH_PRISMATIC_MOJO) || !sSpellMgr->GetSpellInfo(SPELL_FETCH_RAPTOR_CLAW) || !sSpellMgr->GetSpellInfo(SPELL_FETCH_AMBERSEED) ||
1700 !sSpellMgr->GetSpellInfo(SPELL_HAVE_KNOTROOT) || !sSpellMgr->GetSpellInfo(SPELL_HAVE_PICKLED_EAGLE_EGG) || !sSpellMgr->GetSpellInfo(SPELL_HAVE_SPECKLED_GUANO) ||
1704 !sSpellMgr->GetSpellInfo(SPELL_HAVE_PRISMATIC_MOJO) || !sSpellMgr->GetSpellInfo(SPELL_HAVE_RAPTOR_CLAW) || !sSpellMgr->GetSpellInfo(SPELL_HAVE_AMBERSEED) ||
1707 return false;
1708 return true;
1709 }
1710
1712 {
1713 if (Player* player = GetHitPlayer())
1714 {
1715 for (uint8 i = 0; i < 21; ++i)
1716 {
1717 if (player->HasAura(FetchIngredients[i][0]))
1718 {
1719 player->CastSpell(player, SPELL_THROW_INGREDIENT);
1720 player->RemoveAura(FetchIngredients[i][0]);
1721 if (player->HasAura(FetchIngredients[i][1]))
1722 {
1723 player->RemoveAura(FetchIngredients[i][1]);
1724 player->DestroyItemCount(FetchIngredients[i][2], 1, true);
1725 if (i < 15)
1726 {
1727 if (Creature* finklestein = GetClosestCreatureWithEntry(player, NPC_FINKLESTEIN, 25.0f))
1728 finklestein->AI()->SetData(1, 1);
1729 return;
1730 }
1731 else
1732 {
1734 {
1735 player->RemoveAura(SPELL_ALCHEMIST_APPRENTICE_INVISBUFF);
1736 player->CastSpell(player, SPELL_KILL_CREDIT);
1737 }
1738 }
1739 }
1740 else
1741 {
1742 RemoveItems(player);
1743 player->RemoveAura(SPELL_ALCHEMIST_APPRENTICE_INVISBUFF);
1744 if (Creature* finklestein = GetClosestCreatureWithEntry(player, NPC_FINKLESTEIN, 25.0f))
1745 finklestein->AI()->Talk(SAY_RUINED, player);
1746 return;
1747 }
1748 }
1749 }
1750 }
1751 }
1752
1753 void RemoveItems(Player* player)
1754 {
1755 for (uint8 i = 0; i < 21; ++i)
1756 if (player->HasItemCount(FetchIngredients[i][2], 1, true))
1757 player->DestroyItemCount(FetchIngredients[i][2], 1, true);
1758 }
1759
1764 };
1765
1767 {
1768 return new spell_pot_check_SpellScript();
1769 }
1770};
1771
1772/*#####
1773# spell_fetch_ingredient_aura
1774#####*/
1775
1777{
1778public:
1779 spell_fetch_ingredient_aura() : SpellScriptLoader("spell_fetch_ingredient_aura") { }
1780
1802
1807};
1808
1810{
1816};
1817
1819{
1820public:
1821 npc_storm_cloud() : CreatureScript("npc_storm_cloud") { }
1822
1824 {
1825 npc_storm_cloudAI(Creature* creature) : ScriptedAI(creature) { }
1826
1828 {
1829 me->CastSpell(me, STORM_VISUAL, true);
1830 }
1831
1833 {
1834 Reset();
1835 }
1836
1837 void SpellHit(Unit* caster, const SpellInfo* spell) OVERRIDE
1838 {
1839 if (spell->Id != GYMERS_GRAB)
1840 return;
1841
1842 if (Vehicle* veh = caster->GetVehicleKit())
1843 if (veh->GetAvailableSeatCount() != 0)
1844 {
1845 me->CastSpell(caster, RIDE_VEHICLE, true);
1846 me->CastSpell(caster, HEALING_WINDS, true);
1847 }
1848 }
1849 };
1850
1852 {
1853 return new npc_storm_cloudAI(creature);
1854 }
1855};
1856
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
@ POINT_MOTION_TYPE
@ EFFECT_MOTION_TYPE
@ TYPEID_PLAYER
Definition Object.h:55
@ TEMPSUMMON_CORPSE_DESPAWN
Definition Object.h:72
@ TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT
Definition Object.h:71
@ TEMPSUMMON_DEAD_DESPAWN
Definition Object.h:74
#define sObjectAccessor
@ QUEST_STATUS_INCOMPLETE
Definition QuestDef.h:89
Creature * GetClosestCreatureWithEntry(WorldObject *source, uint32 entry, float maxSearchRange, bool alive)
SpellEffIndex
@ EFFECT_0
@ EMOTE_STATE_COWER
@ EMOTE_STATE_NONE
@ EMOTE_ONESHOT_NONE
@ EMOTE_STATE_USE_STANDING_NO_SHEATHE
@ SPELL_EFFECT_SCRIPT_EFFECT
@ SPELL_AURA_DUMMY
@ SPELL_AURA_PERIODIC_DUMMY
AuraEffectHandleModes
@ AURA_EFFECT_HANDLE_REAL
#define sSpellMgr
Definition SpellMgr.h:744
#define SpellEffectFn(F, I, N)
#define AuraEffectPeriodicFn(F, I, N)
#define AuraEffectRemoveFn(F, I, N, M)
@ UNIT_NPC_FLAG_GOSSIP
Definition Unit.h:687
@ UNIT_NPC_FLAG_QUESTGIVER
Definition Unit.h:688
@ JUST_DIED
Definition Unit.h:504
@ AURA_REMOVE_BY_EXPIRE
Definition Unit.h:410
@ REACT_PASSIVE
Definition Unit.h:1156
@ REACT_AGGRESSIVE
Definition Unit.h:1158
@ UNIT_FLAG_NOT_SELECTABLE
Definition Unit.h:650
@ UNIT_FLAG_IMMUNE_TO_PC
Definition Unit.h:633
@ SELECT_TARGET_FARTHEST
Definition UnitAI.h:27
@ SELECT_TARGET_NEAREST
Definition UnitAI.h:26
@ SELECT_TARGET_RANDOM
Definition UnitAI.h:23
@ UNIT_FIELD_NPC_FLAGS
@ UNIT_FIELD_FLAGS
@ UNIT_FIELD_NPC_EMOTESTATE
@ SPELL_CLEAVE
@ SPELL_ENRAGE
@ SPELL_CHARGE
@ SPELL_KNOCK_AWAY
Definition boss_gyth.cpp:16
@ SPELL_KILL_CREDIT
@ SPELL_SHOCKWAVE
@ SPELL_THUNDERCLAP
AuraApplication const * GetTargetApplication() const
HookList< EffectPeriodicHandler > OnEffectPeriodic
SpellInfo const * GetSpellInfo() const
Unit * GetTarget() const
HookList< EffectApplyHandler > OnEffectRemove
void Talk(uint8 id, WorldObject const *whisperTarget=NULL)
bool UpdateVictim()
virtual void EnterEvadeMode()
void DespawnOrUnsummon(uint32 msTimeToDespawn=0)
CreatureScript(const char *name)
GameObjectScript(const char *name)
static Player * GetPlayer(WorldObject const &, uint64 guid)
uint64 GetGUID() const
Definition Object.h:119
Player * ToPlayer()
Definition Object.h:204
uint32 GetEntry() const
Definition Object.h:125
void KilledMonster(CreatureTemplate const *cInfo, uint64 guid)
bool HasItemCount(uint32 item, uint32 count=1, bool inBankAlso=false) const
void DestroyItemCount(uint32 item, uint32 count, bool update, bool unequip_check=false)
QuestStatus GetQuestStatus(uint32 quest_id) const
Player * GetHitPlayer()
SpellInfo const * GetSpellInfo()
HookList< EffectHandler > OnEffectHitTarget
SpellScriptLoader(const char *name)
void DoMeleeAttackIfReady()
Definition UnitAI.cpp:28
void DoCast(uint32 spellId)
Definition UnitAI.cpp:110
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)
Player * GetCharmerOrOwnerPlayerOrPlayerItself() const
Definition Unit.cpp:2355
bool HasAura(uint32 spellId, uint64 casterGUID=0, uint64 itemCasterGUID=0, uint32 reqEffMask=0) const
static Creature * GetCreature(WorldObject &object, uint64 guid)
Definition Unit.cpp:4905
static Unit * GetUnit(WorldObject &object, uint64 guid)
Definition Unit.cpp:4895
void SetInFront(WorldObject const *target)
Definition Unit.cpp:9108
Creature * FindNearestCreature(uint32 entry, float range, bool alive=true) const
Definition Object.cpp:2801
bool OnGossipHello(Player *player, GameObject *) OVERRIDE
bool OnGossipHello(Player *player, GameObject *go) 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
CreatureAI * GetAI(Creature *creature) const OVERRIDE
bool OnQuestAccept(Player *player, Creature *creature, Quest const *quest) 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
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
void OnRemove(AuraEffect const *, AuraEffectHandleModes)
AuraScript * GetAuraScript() const OVERRIDE
bool Validate(SpellInfo const *) OVERRIDE
PrepareSpellScript(spell_pot_check_SpellScript)
SpellScript * GetSpellScript() const OVERRIDE
PrepareSpellScript(spell_random_ingredient_SpellScript)
AuraScript * GetAuraScript() const OVERRIDE
SpellScript * GetSpellScript() const OVERRIDE
const Position SpawnPosition[]
Data
Definition molten_core.h:55
uint32 uiAddSpell
Creature * me
bool HealthAbovePct(uint32 pct) const
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void AttackStartNoMove(Unit *target)
ScriptedAI(Creature *creature)
void SetData(uint32 type, uint32 data) OVERRIDE
void sGossipSelect(Player *player, uint32, uint32) OVERRIDE
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void SpellHit(Unit *, const SpellInfo *spell) OVERRIDE
void sGossipSelect(Player *player, uint32, uint32) OVERRIDE
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void SpellHit(Unit *caster, const SpellInfo *spell) OVERRIDE
void SetData(uint32 uiData, uint32 uiValue) OVERRIDE
void UpdateAI(uint32 uiDiff) OVERRIDE
== Triggered Actions Requested ==================
void EnterEvadeMode() OVERRIDE
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
npc_escortAI(Creature *creature)
void SetDespawnAtEnd(bool despawn)
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 SetData(uint32 Data, uint32 Value) OVERRIDE
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void SetData(uint32 type, uint32 data) OVERRIDE
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void SetGUID(uint64 guid, int32) OVERRIDE
npc_gurgthockAI(Creature *creature)
void WaypointReached(uint32 waypointId) OVERRIDE
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void MovementInform(uint32 type, uint32) OVERRIDE
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void WaypointReached(uint32 waypointId) OVERRIDE
npc_stinkbeardAI(Creature *creature)
void UpdateAI(uint32 uiDiff) OVERRIDE
== Triggered Actions Requested ==================
void JustDied(Unit *killer) OVERRIDE
void SpellHit(Unit *caster, const SpellInfo *spell) OVERRIDE
npc_yggdrasAI(Creature *creature)
void JustDied(Unit *killer) OVERRIDE
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
@ SPELL_GROW
Rageclaw
@ SPELL_KNEEL
@ SAY_RAGECLAW
@ SPELL_UNSHACKLED
Gurgthock
@ NPC_FIEND_AIR
@ QUEST_AMPHITHEATER_ANGUISH_KORRAK_BLOODRAGER
@ QUEST_AMPHITHEATER_ANGUISH_YGGDRAS_2
@ SAY_QUEST_ACCEPT_MAGNATAUR
@ SPELL_MAGMA_WAVE
@ SPELL_ORB_OF_STORMS
@ SAY_QUEST_AMPHITHEATER_ANGUISH_YGGDRAS
@ SAY_GURGTHOCK_7
@ NPC_AZ_BARIN
@ NPC_ORINOKO_TUSKBREAKER
@ SAY_GURGTHOCK_9
@ EMOTE_YGGDRAS_SPAWN
@ NPC_FIEND_EARTH
@ NPC_GARGORAL
@ SAY_QUEST_ACCEPT_KORRAK_2
@ SAY_CALL_FOR_HELP
@ NPC_ERATHIUS
@ SAY_QUEST_ACCEPT_TUSKARRMAGEDON
@ SPELL_ORB_OF_FLAME
@ NPC_KORRAK_BLOODRAGER
@ QUEST_AMPHITHEATER_ANGUISH_MAGNATAUR
@ NPC_FIEND_WATER
@ SAY_QUEST_ACCEPT_KORRAK_1
@ NPC_STINKBEARD
@ QUEST_AMPHITHEATER_ANGUISH_TUSKARRMAGEDDON
@ SAY_GURGTHOCK_ELEMENTAL_SPAWN
@ NPC_YGGDRAS
@ SPELL_BLAST_OF_AIR
@ SAY_RECRUIT
@ NPC_DUKE_SINGEN
@ QUEST_AMPHITHEATER_ANGUISH_YGGDRAS_1
@ QUEST_AMPHITHEATER_ANGUISH_FROM_BEYOND
@ SPELL_CRASHING_WAVE
@ NPC_FIEND_FIRE
@ SAY_STINKBEARD_SPAWN
@ SPELL_ORB_OF_WATER
Finklestein
@ SPELL_HAVE_WITHERED_BATWING
@ SPELL_POT_CHECK
@ SPELL_FETCH_FROZEN_SPIDER_ICHOR
@ SAY_EASY_123
@ SPELL_FETCH_ICECROWN_BOTTLED_WATER
@ SPELL_RANDOM_INGREDIENT_HARD
@ SAY_PULVERIZED_GARGOYLE_TEETH
@ SPELL_FETCH_WASPS_WINGS
@ SPELL_HAVE_HAIRY_HERRING_HEAD
@ SPELL_HAVE_RAPTOR_CLAW
@ SPELL_HAVE_SPIKY_SPIDER_EGG
@ SAY_SEASONED_SLIDER_CIDER
@ SPELL_NEXT_INGREDIENT
@ ITEM_ICECROWN_BOTTLED_WATER
@ SPELL_HAVE_PRISMATIC_MOJO
@ SPELL_FETCH_AMBERSEED
@ ITEM_SHRUNKEN_DRAGONS_CLAW
@ ITEM_WITHERED_BATWING
@ SAY_RAPTOR_CLAW
@ ITEM_PUTRID_PIRATE_PERSPIRATION
@ SPELL_HAVE_MUDDY_MIRE_MAGGOT
@ SAY_MUDDY_MIRE_MAGGOT
@ ITEM_CRUSHED_BASILISK_CRYSTALS
@ SPELL_FETCH_MUDDY_MIRE_MAGGOT
@ SAY_HARD_6
@ ITEM_PULVERIZED_GARGOYLE_TEETH
@ SAY_SPIKY_SPIDER_EGG
@ SPELL_KILL_CREDIT
@ SPELL_HAVE_PUTRID_PIRATE_PERSPIRATION
@ SPELL_HAVE_SPECKLED_GUANO
@ SAY_PICKLED_EAGLE_EGG
@ ITEM_AMBERSEED
@ NPC_FINKLESTEIN
@ SPELL_FETCH_WITHERED_BATWING
@ SAY_CRYSTALLIZED_HOGSNOT
@ SPELL_HAVE_AMBERSEED
@ SPELL_RANDOM_INGREDIENT_HARD_AURA
@ ITEM_CRYSTALLIZED_HOGSNOT
@ SPELL_FETCH_RAPTOR_CLAW
@ SAY_AMBERSEED
@ SPELL_HAVE_CRUSHED_BASILISK_CRYSTALS
@ SAY_WITHERED_BATWING
@ SPELL_FETCH_CRYSTALLIZED_HOGSNOT
@ SAY_SHRUNKEN_DRAGONS_CLAW
@ SPELL_FETCH_PULVERIZED_GARGOYLE_TEETH
@ SPELL_FETCH_SPECKLED_GUANO
@ SPELL_HAVE_CRYSTALLIZED_HOGSNOT
@ SPELL_FETCH_TROLLBANE
@ SPELL_HAVE_TROLLBANE
@ SPELL_RANDOM_INGREDIENT_EASY
@ SPELL_RANDOM_INGREDIENT_MEDIUM
@ ITEM_SPECKLED_GUANO
@ SPELL_FETCH_KNOTROOT
@ SAY_CHILLED_SERPENT_MUCUS
@ SAY_PUTRID_PIRATE_PERSPIRATION
@ SAY_TROLLBANE
@ SPELL_FETCH_SEASONED_SLIDER_CIDER
@ SAY_WASPS_WINGS
@ SAY_CRUSHED_BASILISK_CRYSTALS
@ SPELL_HAVE_FROZEN_SPIDER_ICHOR
@ SAY_MEDIUM_5
@ SPELL_RANDOM_INGREDIENT_EASY_AURA
@ SPELL_HAVE_PULVERIZED_GARGOYLE_TEETH
@ ITEM_SPIKY_SPIDER_EGG
@ ITEM_CHILLED_SERPENT_MUCUS
@ ITEM_PICKLED_EAGLE_EGG
@ ITEM_FROZEN_SPIDER_ICHOR
@ SPELL_FETCH_CRUSHED_BASILISK_CRYSTALS
@ SPELL_FETCH_HAIRY_HERRING_HEAD
@ SPELL_ALCHEMIST_APPRENTICE_INVISBUFF
@ SAY_MEDIUM_4
@ ITEM_WASPS_WINGS
@ ITEM_MUDDY_MIRE_MAGGOT
@ SAY_KNOTROOT
@ SPELL_FETCH_SPIKY_SPIDER_EGG
@ SPELL_HAVE_SHRUNKEN_DRAGONS_CLAW
@ SAY_PRISMATIC_MOJO
@ ITEM_RAPTOR_CLAW
@ SPELL_HAVE_ICECROWN_BOTTLED_WATER
@ ITEM_SEASONED_SLIDER_CIDER
@ SPELL_FETCH_PICKLED_EAGLE_EGG
@ SPELL_HAVE_PICKLED_EAGLE_EGG
@ SPELL_FETCH_SHRUNKEN_DRAGONS_CLAW
@ SPELL_HAVE_WASPS_WINGS
@ SPELL_HAVE_CHILLED_SERPENT_MUCUS
@ SAY_ICECROWN_BOTTLED_WATER
@ QUEST_THE_ALCHEMIST_APPRENTICE_DAILY
@ SPELL_HAVE_KNOTROOT
@ SPELL_FETCH_CHILLED_SERPENT_MUCUS
@ SAY_RUINED
@ SPELL_FETCH_PRISMATIC_MOJO
@ SAY_SPECKLED_GUANO
@ ITEM_HAIRY_HERRING_HEAD
@ SPELL_RANDOM_INGREDIENT_MEDIUM_AURA
@ SAY_FROZEN_SPIDER_ICHOR
@ SPELL_HAVE_SEASONED_SLIDER_CIDER
@ SPELL_FETCH_PUTRID_PIRATE_PERSPIRATION
@ SPELL_THROW_INGREDIENT
@ ITEM_TROLLBANE
@ ITEM_PRISMATIC_MOJO
@ SAY_HAIRY_HERRING_HEAD
@ ITEM_KNOTROOT
KorrakBloodrager
@ SPELL_ENRAGE
@ SPELL_CHARGE
@ SPELL_UPPERCUT
@ SPELL_GROW
const Position SpawnPosition[]
Yggdras
@ SPELL_CLEAVE
@ SPELL_CORRODE_FLESH
@ SPELL_JORMUNGAR_SPAWN
CrusadeRecruit
@ SPELL_QUEST_CREDIT
@ QUEST_TROLL_PATROL_INTESTINAL_FORTITUDE
FinklesteinEvents
@ EVENT_HARD_6
@ EVENT_EASY_123
@ EVENT_MEDIUM_5
@ EVENT_MEDIUM_4
@ EVENT_TURN_BACK
@ EVENT_TURN_TO_POT
void AddSC_zuldrak()
StormCloud
@ STORM_VISUAL
@ GYMERS_GRAB
@ RIDE_VEHICLE
@ STORM_COULD
@ HEALING_WINDS
ScourgeEnclosure
@ QUEST_OUR_ONLY_HOPE
@ SPELL_GYMER_LOCK_EXPLOSION
@ NPC_GYMER_DUMMY
Stinkbeard
@ SPELL_THUNDERBLADE
@ SPELL_THUNDERCLAP
@ SPELL_KNOCK_AWAY
@ SPELL_ENRAGE_STINKBEARD
@ SPELL_STINKY_BEARD
CrusadeRecruitEvents
@ EVENT_RECRUIT_1
@ EVENT_RECRUIT_2
const Position AddSpawnPosition[]
static BossAndAdd Boss[]
OrinokoTuskbreaker
@ SPELL_BATTLE_SHOUT
@ SPELL_FISHY_SCENT
@ SPELL_SUMMON_WHISKER
@ NPC_HUNGRY_PENGUIN
@ NPC_WHISKER
@ SPELL_IMPALE
DrakuruShackles
@ SPELL_UNLOCK_SHACKLE
@ SPELL_RIGHT_CHAIN
@ SPELL_LEFT_CHAIN
@ SPELL_FREE_RAGECLAW
@ QUEST_TROLLS_IS_GONE_CRAZY
@ NPC_RAGECLAW
uint32 const FetchIngredients[21][4]