TrinityCore
Loading...
Searching...
No Matches
zone_storm_peaks.cpp
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#include "ScriptMgr.h"
19#include "CombatAI.h"
20#include "GameObject.h"
21#include "MotionMaster.h"
22#include "ObjectAccessor.h"
23#include "ObjectMgr.h"
24#include "Player.h"
25#include "ScriptedEscortAI.h"
26#include "ScriptedGossip.h"
27#include "SpellAuraEffects.h"
28#include "SpellHistory.h"
29#include "SpellScript.h"
30#include "TemporarySummon.h"
31#include "Vehicle.h"
32#include "WorldSession.h"
33
34/*######
35## npc_brunnhildar_prisoner
36######*/
37
46
48{
50 {
51 Initialize();
52 }
53
55 {
56 freed = false;
57 }
58
59 bool freed;
60
61 void Reset() override
62 {
63 Initialize();
65 }
66
67 void JustAppeared() override
68 {
69 Reset();
70 }
71
72 void UpdateAI(uint32 /*diff*/) override
73 {
74 if (!freed)
75 return;
76
77 if (!me->GetVehicle())
79 }
80
81 void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
82 {
83 Unit* unitCaster = caster->ToUnit();
84 if (!unitCaster)
85 return;
86
87 if (spellInfo->Id != SPELL_ICE_LANCE)
88 return;
89
90 if (unitCaster->GetVehicleKit()->GetAvailableSeatCount() != 0)
91 {
93 me->CastSpell(unitCaster, SPELL_RIDE_DRAKE, true);
95 freed = true;
96 }
97 }
98};
99
100// 55048 - Free Brunnhildar Prisoner
120
121/*######
122## npc_freed_protodrake
123######*/
124
140
142{
143 npc_freed_protodrake(Creature* creature) : VehicleAI(creature) { }
144
146
147 void Reset() override
148 {
150 }
151
152 void MovementInform(uint32 type, uint32 id) override
153 {
154 if (type != WAYPOINT_MOTION_TYPE)
155 return;
156
157 if (id == 15)
158 // drake reached village
160 }
161
162 void UpdateAI(uint32 diff) override
163 {
165 events.Update(diff);
166
167 switch (events.ExecuteEvent())
168 {
169 case EVENT_CHECK_AREA:
171 {
172 if (Vehicle* vehicle = me->GetVehicleKit())
173 if (Unit* passenger = vehicle->GetPassenger(0))
174 {
175 Talk(TEXT_EMOTE, passenger);
176 me->GetMotionMaster()->MovePath(NPC_DRAKE << 3, false);
177 }
178 }
179 else
181 break;
183 if (Vehicle* vehicle = me->GetVehicleKit())
184 if (Unit* player = vehicle->GetPassenger(0))
185 if (player->GetTypeId() == TYPEID_PLAYER)
186 {
187 // for each prisoner on drake, give credit
188 for (uint8 i = 1; i < 4; ++i)
189 if (Unit* prisoner = me->GetVehicleKit()->GetPassenger(i))
190 {
191 if (prisoner->GetTypeId() != TYPEID_UNIT)
192 return;
193 prisoner->CastSpell(player, SPELL_KILL_CREDIT_PRISONER, true);
194 prisoner->CastSpell(prisoner, SPELL_SUMMON_LIBERATED, true);
195 prisoner->ExitVehicle();
196 }
198 player->ExitVehicle();
199 }
200 break;
201 }
202 }
203};
204
205static constexpr uint32 PATH_ESCORT_ICEFANG = 236818;
206
207struct npc_icefang : public EscortAI
208{
209 npc_icefang(Creature* creature) : EscortAI(creature) { }
210
211 void AttackStart(Unit* /*who*/) override { }
212 void JustEngagedWith(Unit* /*who*/) override { }
213 void EnterEvadeMode(EvadeReason /*why*/) override { }
214
215 void PassengerBoarded(Unit* who, int8 /*seatId*/, bool apply) override
216 {
217 if (who->GetTypeId() == TYPEID_PLAYER)
218 {
219 if (apply)
220 {
222 Start(false, who->GetGUID());
223 }
224 }
225 }
226
227 void JustDied(Unit* /*killer*/) override { }
228 void OnCharmed(bool /*isNew*/) override { }
229
230 void UpdateAI(uint32 diff) override
231 {
232 EscortAI::UpdateAI(diff);
233
234 if (!UpdateVictim())
235 return;
236 }
237};
238
240{
243
245{
246public:
248
249 void PassengerBoarded(Unit* who, int8 /*seat*/, bool apply) override
250 {
251 if (apply)
252 return;
253
256 }
257
258 void UpdateAI(uint32 diff) override
259 {
262 Vehicle* _vehicleKit = me->GetVehicleKit();
263 if (_accessoryRespawnTimer && _accessoryRespawnTimer <= diff && _vehicleKit)
264 {
265 _vehicleKit->InstallAllAccessories(true);
267 }
268 else
270 }
271
272private:
274};
275
276/*#####
277# npc_brann_bronzebeard for Quest 13285 "Forging the Keystone"
278#####*/
279
313
315{
317 {
318 objectCounter = 0;
319 }
320
321 void Reset() override
322 {
323 for (ObjectGuid& guid : objectGUID)
324 guid.Clear();
325
328 objectCounter = 0;
329 }
330
331 bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override
332 {
333 CloseGossipMenuFor(player);
334 playerGUID = player->GetGUID();
336 return false;
337 }
338
339 void UpdateAI(uint32 diff) override
340 {
341 events.Update(diff);
342
343 while (uint32 eventId = events.ExecuteEvent())
344 {
345 switch (eventId)
346 {
347 case EVENT_SCRIPT_1:
349 Talk(SAY_BRANN_1, player);
351 if (Creature* voice = me->SummonCreature(NPC_A_DISTANT_VOICE, 7863.43f, -1396.585f, 1538.076f, 2.949606f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 49s))
352 voiceGUID = voice->GetGUID();
354 break;
355 case EVENT_SCRIPT_2:
356 me->SetWalk(true);
357 me->GetMotionMaster()->MovePoint(0, 7861.488f, -1396.376f, 1534.059f, false);
359 break;
360 case EVENT_SCRIPT_3:
363 break;
364 case EVENT_SCRIPT_4:
367 {
368 voice->CastSpell(voice, SPELL_RESURRECTION);
370 voice->AI()->Talk(SAY_VOICE_1, player);
371 }
372 if (GameObject* go = me->SummonGameObject(OBJECT_TOL_SIGNAL_1, 7860.273f, -1383.622f, 1538.302f, -1.658062f, QuaternionData(0.f, 0.f, -0.737277f, 0.6755905f), 0s))
373 objectGUID[objectCounter++] = go->GetGUID();
375 break;
376 case EVENT_SCRIPT_5:
379 voice->AI()->Talk(SAY_VOICE_2, player);
380 if (GameObject* go = me->SummonGameObject(OBJECT_TOL_SIGNAL_2, 7875.67f, -1387.266f, 1538.323f, -2.373644f, QuaternionData(0.f, 0.f, -0.9271832f, 0.3746083f), 0s))
381 objectGUID[objectCounter++] = go->GetGUID();
383 break;
384 case EVENT_SCRIPT_6:
387 voice->AI()->Talk(SAY_VOICE_3, player);
388 if (GameObject* go = me->SummonGameObject(OBJECT_TOL_SIGNAL_3, 7879.212f, -1401.175f, 1538.279f, 2.967041f, QuaternionData(0.f, 0.f, 0.9961939f, 0.08716504f), 0s))
389 objectGUID[objectCounter++] = go->GetGUID();
391 break;
392 case EVENT_SCRIPT_7:
395 voice->AI()->Talk(SAY_VOICE_4, player);
396 if (GameObject* go = me->SummonGameObject(OBJECT_TOL_SIGNAL_4, 7868.944f, -1411.18f, 1538.213f, 2.111848f, QuaternionData(0.f, 0.f, 0.8703556f, 0.4924237f), 0s))
397 objectGUID[objectCounter++] = go->GetGUID();
399 break;
400 case EVENT_SCRIPT_8:
403 voice->AI()->Talk(SAY_VOICE_5, player);
404 if (GameObject* go = me->SummonGameObject(OBJECT_TOL_SIGNAL_5, 7855.11f, -1406.839f, 1538.42f, 1.151916f, QuaternionData(0.f, 0.f, 0.5446386f, 0.8386708f), 0s))
405 objectGUID[objectCounter] = go->GetGUID();
407 break;
408 case EVENT_SCRIPT_9:
410 voice->CastSpell(voice, SPELL_RESURRECTION);
412 break;
413 case EVENT_SCRIPT_10:
415 {
416 Talk(SAY_BRANN_2, player);
417 player->KilledMonsterCredit(me->GetEntry());
418 }
420 break;
421 case EVENT_SCRIPT_11:
422 me->SetFacingTo(2.932153f);
424 Talk(SAY_BRANN_3, player);
425
426 for (uint8 i = 0; i < 5; ++i)
428 go->Delete();
429
431 break;
432 case EVENT_SCRIPT_12:
434 me->SetWalk(false);
435 me->GetMotionMaster()->MovePoint(0, 7799.908f, -1413.561f, 1534.829f, false);
437 break;
438 case EVENT_SCRIPT_13:
440 break;
441 }
442 }
443 }
444
445private:
451};
452
453/*#####
454# Quest 13003 Thrusting Hodir's Spear
455#####*/
456
511
519
521{
522 npc_wild_wyrm(Creature* creature) : VehicleAI(creature)
523 {
524 Initialize();
525 }
526
532
534 {
536 for (uint8 i = 0; i < ControllableSpellsCount; ++i)
538 }
539
540 void Reset() override
541 {
542 Initialize();
543
546
548
549 me->SetImmuneToPC(false);
550 }
551
552 void DoAction(int32 action) override
553 {
555 if (!player)
556 return;
557
558 switch (action)
559 {
561 Talk(SAY_SWIPE, player);
562 break;
564 Talk(SAY_DODGED, player);
565 break;
567 Talk(SAY_GRIP_WARN, player);
568 break;
569 case ACTION_GRIP_LOST:
572 break;
574 Talk(SAY_STRIKE_MISS, player);
575 break;
576 default:
577 break;
578 }
579 }
580
581 void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
582 {
583 if (!_playerGuid.IsEmpty() || spellInfo->Id != SPELL_SPEAR_OF_HODIR)
584 return;
585
586 _playerGuid = caster->GetGUID();
588 me->SetImmuneToPC(true);
589
591 }
592
593 void MovementInform(uint32 type, uint32 id) override
594 {
595 if (type != POINT_MOTION_TYPE && type != EFFECT_MOTION_TYPE)
596 return;
597
598 switch (id)
599 {
601 {
603 if (!player)
604 return;
605
608 break;
609 }
610 case POINT_FALL:
612 me->KillSelf();
613 break;
614 default:
615 break;
616 }
617 }
618
619 void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
620 {
621 if (damage >= me->GetHealth())
622 {
623 damage = me->GetHealth() - 1;
624
625 if (_phase == PHASE_DEAD)
626 return;
627
630 .Async([this]
631 {
633
635 player->VehicleSpellInitialize();
636
639
642
644
646 });
647 }
648 }
649
650 void PassengerBoarded(Unit* passenger, int8 seatId, bool apply) override
651 {
652 if (!apply || passenger->GetGUID() != _playerGuid)
653 return;
654
655 if (seatId != SEAT_INITIAL)
656 return;
657
658 me->CastSpell(nullptr, SPELL_GRIP, CastSpellExtraArgs().AddSpellMod(SPELLVALUE_AURA_STACK, 50));
660
661 _scheduler.Async([this]
662 {
663 me->GetMotionMaster()->MovePath(PATH_WILD_WYRM, true);
664 })
665 .Schedule(Milliseconds(500), [this](TaskContext context)
666 {
667 if (_phase == PHASE_MOUTH)
668 return;
669
670 if (me->HealthBelowPct(25))
671 {
672 _phase = PHASE_MOUTH;
673 context.Async([this]
674 {
675 InitSpellsForPhase();
676 DoCastAOE(SPELL_LOW_HEALTH_TRIGGER, true);
677 me->RemoveAurasDueToSpell(SPELL_CLAW_SWIPE_PERIODIC);
678 me->RemoveAurasDueToSpell(SPELL_GRIP);
679
680 if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGuid))
681 Talk(SAY_PHASE_2, player);
682
683 DoCastAOE(SPELL_EJECT_PASSENGER_1, true);
684 DoCastAOE(SPELL_JAWS_OF_DEATH_PERIODIC);
685 DoCastAOE(SPELL_FLY_STATE_VISUAL);
686 });
687 return;
688 }
689
690 context.Repeat();
691 });
692 }
693
694 bool EvadeCheck() const
695 {
696 Player* player = ObjectAccessor::GetPlayer(*me, _playerGuid);
697 if (!player)
698 return false;
699
700 switch (_phase)
701 {
702 case PHASE_INITIAL:
703 case PHASE_MOUTH:
704 if (!player->IsAlive())
705 return false;
706 break;
707 case PHASE_DEAD:
708 break;
709 default:
710 ABORT();
711 break;
712 }
713
714 return true;
715 }
716
717 void UpdateAI(uint32 diff) override
718 {
719 if (!_playerGuid)
720 {
721 if (UpdateVictim())
722 DoMeleeAttackIfReady();
723 return;
724 }
725
726 if (_playerCheckTimer <= diff)
727 {
728 if (!EvadeCheck())
729 EnterEvadeMode(EVADE_REASON_NO_HOSTILES);
730
731 _playerCheckTimer = 1 * IN_MILLISECONDS;
732 }
733 else
734 _playerCheckTimer -= diff;
735
736 _scheduler.Update(diff);
737 }
738
739private:
744};
745
746/*#####
747# Quest 13010 Krolmir, Hammer of Storms
748#####*/
749
783
784// 61319 - Jokkum Scriptcast
786{
788
789 bool Validate(SpellInfo const* /*spellInfo*/) override
790 {
792 }
793
794 void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
795 {
796 if (Unit* target = GetTarget())
797 target->CastSpell(target, SPELL_JOKKUM_SUMMON, true);
798 }
799
804};
805
806// 56650 - Player Cast Veranus Summon
808{
810
811 bool Validate(SpellInfo const* /*spellInfo*/) override
812 {
814 }
815
816 void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
817 {
818 if (Unit* target = GetTarget())
819 target->CastSpell(target, SPELL_SUMMON_VERANUS_AND_THORIM, true);
820 }
821
826};
827
829{
830 SPELL_DESPAWN_RIFT = 61665
832
833// 56763 - Close Rift
835{
837
838 bool Validate(SpellInfo const* /*spell*/) override
839 {
841 }
842
843 void HandlePeriodic(AuraEffect const* /* aurEff */)
844 {
845 if (++_counter == 5)
846 GetTarget()->CastSpell(nullptr, SPELL_DESPAWN_RIFT, true);
847 }
848
853
854private:
856};
857
858// 56689 - Grip
859class spell_grip : public AuraScript
860{
862
863 void DummyTick(AuraEffect const* /*aurEff*/)
864 {
865 ++_tickNumber;
866
867 // each 15 ticks stack reduction increases by 2 (increases by 1 at each 7th and 15th tick)
868 // except for the first 15 ticks that remove 1 stack each
869 uint32 const period = ((_tickNumber - 1) % 15) + 1;
870 uint32 const sequence = (_tickNumber - 1) / 15;
871
872 uint32 stacksToRemove;
873 if (sequence == 0)
874 stacksToRemove = 1;
875 else
876 {
877 stacksToRemove = sequence * 2;
878 if (period > 7)
879 ++stacksToRemove;
880 }
881
882 // while we could do ModStackAmount(-stacksToRemove), this is how it's done in sniffs :)
883 for (uint32 i = 0; i < stacksToRemove; ++i)
885
886 if (GetStackAmount() < 15 && !_warning)
887 {
888 _warning = true;
890 }
891 else if (GetStackAmount() > 30)
892 _warning = false;
893 }
894
895 void HandleDrop(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
896 {
897 if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE)
898 return;
899
901 }
902
909
910 // tick number in the AuraEffect gets reset each time we stack the aura, so keep track of it locally
912
913 bool _warning = false;
914};
915
916// 60533 - Grab On
918{
920
921 void HandleScript(SpellEffIndex /*effIndex*/)
922 {
923 if (Aura* grip = GetCaster()->GetAura(SPELL_GRIP, GetCaster()->GetGUID()))
924 grip->ModStackAmount(GetEffectValue(), AURA_REMOVE_BY_DEFAULT, false);
925 }
926
931};
932
933// 56690 - Thrust Spear
934// 60586 - Mighty Spear Thrust
935template <int8 StacksToLose>
937{
939
940 void HandleScript(SpellEffIndex /*effIndex*/)
941 {
942 if (Aura* grip = GetCaster()->GetAura(SPELL_GRIP))
943 grip->ModStackAmount(-StacksToLose, AURA_REMOVE_BY_EXPIRE);
944 }
945
950};
951
952// 60596 - Low Health Trigger
954{
956
957 bool Validate(SpellInfo const* spellInfo) override
958 {
959 return ValidateSpellInfo({ static_cast<uint32>(spellInfo->GetEffect(EFFECT_0).CalcValue()) });
960 }
961
962 void HandleScript(SpellEffIndex /*effIndex*/)
963 {
964 GetHitUnit()->CastSpell(nullptr, GetEffectValue(), true);
965 }
966
971};
972
973// 60776 - Claw Swipe
974// 60864 - Jaws of Death
989
990// 56705 - Claw Swipe
992{
994
995 void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
996 {
998 }
999
1000 void OnRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
1001 {
1002 if (Vehicle* vehicle = GetTarget()->GetVehicleKit())
1003 {
1004 if (Unit* player = vehicle->GetPassenger(SEAT_INITIAL))
1005 {
1006 if (player->HasAura(SPELL_DODGE_CLAWS))
1007 {
1009 return;
1010 }
1011 }
1012 }
1013
1014 GetTarget()->CastSpell(nullptr, aurEff->GetAmount(), false);
1015 }
1016
1022};
1023
1024// 60587 - Fatal Strike
1026{
1028
1029 bool Validate(SpellInfo const* /*spellInfo*/) override
1030 {
1032 }
1033
1034 void HandleDummy(SpellEffIndex /*effIndex*/)
1035 {
1036 int32 chance = 0;
1037 if (AuraEffect const* aurEff = GetCaster()->GetAuraEffect(SPELL_PRY_JAWS_OPEN, EFFECT_0))
1038 chance = aurEff->GetAmount();
1039
1040 if (!roll_chance_i(chance))
1041 {
1043 return;
1044 }
1045
1047 }
1048
1053};
1054
1055// 56672 - Player Mount Wyrm
1057{
1059
1060 bool Validate(SpellInfo const* /*spellInfo*/) override
1061 {
1063 }
1064
1065 void HandleDummy(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
1066 {
1067 GetTarget()->CastSpell(nullptr, SPELL_FIGHT_WYRM, true);
1068 }
1069
1074};
1075
1076/*######
1077## Quest 12987: Mounting Hodir's Helm
1078######*/
1079
1086
1087// 56278 - Read Pronouncement
1089{
1091
1092 bool Validate(SpellInfo const* /*spellInfo*/) override
1093 {
1094 return sObjectMgr->GetBroadcastText(TEXT_PRONOUNCEMENT_1) &&
1095 sObjectMgr->GetBroadcastText(TEXT_PRONOUNCEMENT_2) &&
1096 sObjectMgr->GetCreatureTemplate(NPC_HODIRS_HELM_KC);
1097 }
1098
1099 void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
1100 {
1101 if (Player* target = GetTarget()->ToPlayer())
1102 {
1103 target->Unit::Whisper(TEXT_PRONOUNCEMENT_1, target, true);
1104 target->KilledMonsterCredit(NPC_HODIRS_HELM_KC);
1105 target->Unit::Whisper(TEXT_PRONOUNCEMENT_2, target, true);
1106 }
1107 }
1108
1113};
1114
1115/*######
1116## Quest 13011: Jormuttar is Soo Fat...
1117######*/
1118
1125
1126// 56565 - Bear Flank Master
1146
1147// 56569 - Bear Flank Fail
1149{
1151
1152 bool Validate(SpellInfo const* /*spellInfo*/) override
1153 {
1154 return sObjectMgr->GetBroadcastText(TEXT_CARVE_FAIL);
1155 }
1156
1157 void AfterApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
1158 {
1159 if (Player* target = GetTarget()->ToPlayer())
1160 target->Unit::Whisper(TEXT_CARVE_FAIL, target, true);
1161 }
1162
1167};
1168
1169/*######
1170## Quest 12828: Ample Inspiration
1171######*/
1172
1183
1184// 54581 - Mammoth Explosion Spell Spawner
1221
1222// 54892 - Unstable Explosive Detonation
1224{
1226
1227 bool Validate(SpellInfo const* /*spellInfo*/) override
1228 {
1229 return sObjectMgr->GetItemTemplate(ITEM_EXPLOSIVE_DEVICE);
1230 }
1231
1232 void HandleScript(SpellEffIndex /*effIndex*/)
1233 {
1234 if (Player* caster = GetCaster()->ToPlayer())
1235 caster->DestroyItemCount(ITEM_EXPLOSIVE_DEVICE, 1, true);
1236 }
1237
1242};
1243
1244/*######
1245## Quest 12915: Mending Fences
1246######*/
1247
1252
1253// 55512 - Call of Earth
1255{
1257
1258 bool Validate(SpellInfo const* /*spellInfo*/) override
1259 {
1261 }
1262
1263 void HandleScript(SpellEffIndex /*effIndex*/)
1264 {
1265 uint8 count = urand(2, 6);
1266 for (uint8 i = 0; i < count; i++)
1268 }
1269
1274};
1275
1276/*######
1277## Quest 12851: Bearly Hanging On
1278######*/
1279
1289
1290// 54798 - FLAMING Arrow Triggered Effect
1292{
1294
1295 void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
1296 {
1297 if (Unit* caster = GetCaster())
1298 {
1299 Unit* target = GetTarget();
1300 // Already in fire
1301 if (target->HasAura(SPELL_ABLAZE))
1302 return;
1303
1304 if (Player* player = caster->GetCharmerOrOwnerPlayerOrPlayerItself())
1305 {
1306 switch (target->GetEntry())
1307 {
1308 case NPC_FROSTWORG:
1309 target->CastSpell(player, SPELL_FROSTWORG_CREDIT, true);
1310 target->CastSpell(target, SPELL_IMMOLATION, true);
1311 target->CastSpell(target, SPELL_ABLAZE, true);
1312 break;
1313 case NPC_FROSTGIANT:
1314 target->CastSpell(player, SPELL_FROSTGIANT_CREDIT, true);
1315 target->CastSpell(target, SPELL_IMMOLATION, true);
1316 target->CastSpell(target, SPELL_ABLAZE, true);
1317 break;
1318 }
1319 }
1320 }
1321 }
1322
1327};
1328
1329/*######
1330## Quest 12920: Catching up with Brann
1331######*/
1332
1338
1339// 61122 - Contact Brann
1341{
1343
1344 bool Validate(SpellInfo const* /*spellInfo*/) override
1345 {
1347 }
1348
1349 void HandleScript(SpellEffIndex /*effIndex*/)
1350 {
1351 Unit* caster = GetCaster();
1352 caster->CastSpell(caster, SPELL_DESPAWN_BRANN);
1353 caster->CastSpell(caster, SPELL_CONTACT_BRANN);
1354 }
1355
1360};
1361
1363{
1371
1378 RegisterSpellScriptWithArgs(spell_loosen_grip<15>, "spell_mighty_spear_thrust");
1392}
@ IN_MILLISECONDS
Definition Common.h:35
@ MINUTE
Definition Common.h:29
uint8_t uint8
Definition Define.h:135
int8_t int8
Definition Define.h:131
int32_t int32
Definition Define.h:129
uint32_t uint32
Definition Define.h:133
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
Definition Duration.h:24
#define ABORT
Definition Errors.h:74
#define ASSERT
Definition Errors.h:68
@ WAYPOINT_MOTION_TYPE
@ POINT_MOTION_TYPE
@ EFFECT_MOTION_TYPE
@ TEMPSUMMON_TIMED_OR_DEAD_DESPAWN
@ TYPEID_UNIT
Definition ObjectGuid.h:38
@ TYPEID_PLAYER
Definition ObjectGuid.h:39
#define sObjectMgr
Definition ObjectMgr.h:1721
uint32 urand(uint32 min, uint32 max)
Definition Random.cpp:42
bool roll_chance_i(int chance)
Definition Random.h:59
#define RegisterCreatureAI(ai_name)
Definition ScriptMgr.h:1139
#define RegisterSpellScript(spell_script)
Definition ScriptMgr.h:1128
#define RegisterSpellScriptWithArgs(spell_script, script_name,...)
Definition ScriptMgr.h:1127
void CloseGossipMenuFor(Player *player)
SpellEffIndex
@ EFFECT_1
@ EFFECT_0
@ SPELL_EFFECT_DUMMY
@ SPELL_EFFECT_SCRIPT_EFFECT
@ SPELL_EFFECT_SCHOOL_DAMAGE
@ EMOTE_STATE_WORK_MINING
@ EMOTE_ONESHOT_NONE
@ AURA_REMOVE_BY_DEFAULT
@ AURA_REMOVE_BY_EXPIRE
AuraEffectHandleModes
@ AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK
@ AURA_EFFECT_HANDLE_REAL
@ SPELL_AURA_DUMMY
@ SPELL_AURA_PERIODIC_DUMMY
@ SPELL_AURA_NONE
@ SPELL_AURA_PERIODIC_TRIGGER_SPELL
@ SPELLVALUE_AURA_STACK
#define SpellEffectFn(F, I, N)
#define AuraEffectPeriodicFn(F, I, N)
#define AuraEffectApplyFn(F, I, N, M)
#define AuraEffectRemoveFn(F, I, N, M)
@ UNIT_NPC_FLAG_GOSSIP
@ UNIT_NPC_FLAG_NONE
@ UNIT_NPC_FLAG_QUESTGIVER
DamageEffectType
Definition Unit.h:352
int32 GetAmount() const
AuraApplication const * GetTargetApplication() const
HookList< EffectApplyHandler > AfterEffectRemove
HookList< EffectPeriodicHandler > OnEffectPeriodic
HookList< EffectApplyHandler > AfterEffectApply
Unit * GetCaster() const
Unit * GetTarget() const
uint8 GetStackAmount() const
HookList< EffectApplyHandler > OnEffectApply
bool ModStackAmount(int32 num, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
bool UpdateVictim()
Creature *const me
Definition CreatureAI.h:82
virtual void EnterEvadeMode(EvadeReason why=EVADE_REASON_OTHER)
void SetImmuneToPC(bool apply) override
Definition Creature.h:129
uint32 m_spells[MAX_CREATURE_SPELLS]
Definition Creature.h:229
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
void DisappearAndDie()
Definition Creature.h:73
void Update(uint32 time)
Definition EventMap.h:67
EventId ExecuteEvent()
Definition EventMap.cpp:73
void ScheduleEvent(EventId eventId, Milliseconds time, GroupIndex group=0u, PhaseIndex phase=0u)
Definition EventMap.cpp:36
void MovePoint(uint32 id, Position const &pos, bool generatePath=true, Optional< float > finalOrient={})
void MovePath(uint32 pathId, bool repeatable)
void MoveFall(uint32 id=0)
bool IsEmpty() const
Definition ObjectGuid.h:172
void Clear()
Definition ObjectGuid.h:150
static Unit * ToUnit(Object *o)
Definition Object.h:192
TypeID GetTypeId() const
Definition Object.h:93
uint32 GetEntry() const
Definition Object.h:81
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:78
uint32 Id
Definition SpellInfo.h:289
SpellEffectInfo const & GetEffect(SpellEffIndex index) const
Definition SpellInfo.h:483
void SetEffectValue(int32 value)
Unit * GetCaster() const
HookList< EffectHandler > OnEffectHit
Unit * GetHitUnit() const
int32 GetEffectValue() const
HookList< EffectHandler > OnEffectHitTarget
HookList< EffectHandler > OnEffectLaunchTarget
TaskContext & Repeat(std::chrono::duration< _Rep, _Period > const &duration)
TaskScheduler & CancelAll()
TaskScheduler & Async(std::function< void()> const &callable)
virtual void DoAction(int32)
Definition UnitAI.h:154
SpellCastResult DoCastAOE(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.h:243
SpellCastResult DoCast(uint32 spellId)
Definition UnitAI.cpp:106
Definition Unit.h:769
Vehicle * GetVehicle() const
Definition Unit.h:1737
void KillSelf(bool durabilityLoss=true)
Definition Unit.h:1023
MotionMaster * GetMotionMaster()
Definition Unit.h:1667
bool IsAlive() const
Definition Unit.h:1234
void RemoveNpcFlag(NPCFlags flags)
Definition Unit.h:1098
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition Unit.cpp:4535
UnitAI * GetAI() const
Definition Unit.h:800
void SetEmoteState(Emote emote)
Definition Unit.h:967
bool HealthBelowPct(int32 pct) const
Definition Unit.h:917
uint32 GetHealth() const
Definition Unit.h:913
bool SetWalk(bool enable)
Definition Unit.cpp:13268
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:3784
void SetFacingTo(float ori, bool force=true, uint32 movementId=EVENT_FACE)
Definition Unit.cpp:13250
Vehicle * GetVehicleKit() const
Definition Unit.h:1735
void ReplaceAllNpcFlags(NPCFlags flags)
Definition Unit.h:1099
uint8 GetAvailableSeatCount() const
Gets the available seat count.
Definition Vehicle.cpp:689
Unit * GetPassenger(int8 seatId) const
Gets a passenger on specified seat.
Definition Vehicle.cpp:296
void InstallAllAccessories(bool evading)
Definition Vehicle.cpp:84
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition Object.cpp:2832
TempSummon * SummonCreature(uint32 entry, Position const &pos, TempSummonType despawnType=TEMPSUMMON_MANUAL_DESPAWN, Milliseconds despawnTime=0s, uint32 vehId=0, uint32 spellId=0, ObjectGuid privateObjectOwner=ObjectGuid::Empty)
Definition Object.cpp:1992
GameObject * SummonGameObject(uint32 entry, Position const &pos, QuaternionData const &rot, Seconds respawnTime, GOSummonType summonType=GO_SUMMON_TIMED_OR_CORPSE_DESPAWN)
Definition Object.cpp:2015
Player * GetCharmerOrOwnerPlayerOrPlayerItself() const
Definition Object.cpp:2203
uint32 GetAreaId() const
Definition Object.h:374
static bool ValidateSpellInfo(std::initializer_list< uint32 > spellIds)
void PassengerBoarded(Unit *who, int8, bool apply) override
== Fields =======================================
npc_hyldsmeet_protodrake(Creature *creature)
void UpdateAI(uint32 diff) override
void OnRemove(AuraEffect const *aurEff, AuraEffectHandleModes)
PrepareAuraScript(spell_claw_swipe_check)
void OnApply(AuraEffect const *, AuraEffectHandleModes)
bool Validate(SpellInfo const *) override
void HandlePeriodic(AuraEffect const *)
PrepareAuraScript(spell_close_rift)
void Register() override
PrepareSpellScript(spell_fatal_strike)
bool Validate(SpellInfo const *) override
void HandleDummy(SpellEffIndex)
void Register() override
void HandleScript(SpellEffIndex)
PrepareSpellScript(spell_grab_on)
PrepareAuraScript(spell_grip)
void HandleDrop(AuraEffect const *, AuraEffectHandleModes)
void DummyTick(AuraEffect const *)
void Register() override
PrepareSpellScript(spell_jaws_of_death_claw_swipe_pct_damage)
void OnApply(AuraEffect const *, AuraEffectHandleModes)
bool Validate(SpellInfo const *) override
PrepareAuraScript(spell_jokkum_scriptcast)
void HandleScript(SpellEffIndex)
PrepareSpellScript(spell_loosen_grip)
void Register() override
bool Validate(SpellInfo const *spellInfo) override
PrepareSpellScript(spell_low_health_trigger)
void HandleScript(SpellEffIndex)
bool Validate(SpellInfo const *) override
void HandleDummy(AuraEffect const *, AuraEffectHandleModes)
PrepareAuraScript(spell_player_mount_wyrm)
void AfterApply(AuraEffect const *, AuraEffectHandleModes)
bool Validate(SpellInfo const *) override
PrepareAuraScript(spell_storm_peaks_bear_flank_fail)
bool Validate(SpellInfo const *) override
PrepareSpellScript(spell_storm_peaks_bear_flank_master)
bool Validate(SpellInfo const *) override
PrepareSpellScript(spell_storm_peaks_call_of_earth)
bool Validate(SpellInfo const *) override
PrepareSpellScript(spell_storm_peaks_contact_brann)
PrepareAuraScript(spell_storm_peaks_flaming_arrow_triggered_effect)
void HandleEffectApply(AuraEffect const *, AuraEffectHandleModes)
bool Validate(SpellInfo const *) override
PrepareSpellScript(spell_storm_peaks_free_brunnhildar_prisoner)
bool Validate(SpellInfo const *) override
PrepareSpellScript(spell_storm_peaks_mammoth_explosion_master)
void OnApply(AuraEffect const *, AuraEffectHandleModes)
bool Validate(SpellInfo const *) override
PrepareAuraScript(spell_storm_peaks_read_pronouncement)
PrepareSpellScript(spell_storm_peaks_unstable_explosive_detonation)
bool Validate(SpellInfo const *) override
PrepareAuraScript(spell_veranus_summon)
void OnApply(AuraEffect const *, AuraEffectHandleModes)
TC_GAME_API GameObject * GetGameObject(WorldObject const &u, ObjectGuid const &guid)
TC_GAME_API Player * GetPlayer(Map const *, ObjectGuid const &guid)
TC_GAME_API Creature * GetCreature(WorldObject const &u, ObjectGuid const &guid)
void Start(bool isActiveAttacker=true, ObjectGuid playerGUID=ObjectGuid::Empty, Quest const *quest=nullptr, bool instantRespawn=false, bool canLoopPath=false)
void LoadPath(uint32 pathId)
void UpdateAI(uint32 diff) override
void UpdateAI(uint32 diff) override
Definition CombatAI.cpp:279
bool OnGossipSelect(Player *player, uint32, uint32) override
void UpdateAI(uint32 diff) override
npc_brann_bronzebeard_keystone(Creature *creature)
npc_brunnhildar_prisoner(Creature *creature)
void SpellHit(WorldObject *caster, SpellInfo const *spellInfo) override
void UpdateAI(uint32) override
void UpdateAI(uint32 diff) override
void MovementInform(uint32 type, uint32 id) override
npc_freed_protodrake(Creature *creature)
void AttackStart(Unit *) override
npc_icefang(Creature *creature)
void EnterEvadeMode(EvadeReason) override
void JustEngagedWith(Unit *) override
void JustDied(Unit *) override
void PassengerBoarded(Unit *who, int8, bool apply) override
== Fields =======================================
void OnCharmed(bool) override
void UpdateAI(uint32 diff) override
bool EvadeCheck() const
void Reset() override
void PassengerBoarded(Unit *passenger, int8 seatId, bool apply) override
== Fields =======================================
void SpellHit(WorldObject *caster, SpellInfo const *spellInfo) override
npc_wild_wyrm(Creature *creature)
void DamageTaken(Unit *, uint32 &damage, DamageEffectType, SpellInfo const *) override
TaskScheduler _scheduler
void UpdateAI(uint32 diff) override
void MovementInform(uint32 type, uint32 id) override
void DoAction(int32 action) override
FreedProtoDrake
@ EVENT_CHECK_AREA
@ AREA_VALLEY_OF_ANCIENT_WINTERS
@ TEXT_EMOTE
@ SPELL_SUMMON_LIBERATED
@ NPC_DRAKE
@ SPELL_KILL_CREDIT_PRISONER
@ SPELL_KILL_CREDIT_DRAKE
@ EVENT_REACHED_HOME
@ SPELL_MAMMOTH_SUMMON_OBJECT_1
@ SPELL_SUMMON_MAIN_MAMMOTH_MEAT
@ ITEM_EXPLOSIVE_DEVICE
@ SPELL_MAMMOTH_SUMMON_OBJECT_2
@ SPELL_QUIET_SUICIDE
@ SPELL_MAMMOTH_SUMMON_OBJECT_3
uint8 const ControllableSpellsCount
BrunnhildarPrisoner
@ SPELL_FREE_PRISONER
@ SPELL_ICE_PRISON
@ SPELL_ICE_LANCE
@ SPELL_SHARD_IMPACT
@ SPELL_RIDE_DRAKE
@ PHASE_INITIAL
@ SEAT_INITIAL
@ POINT_START_FIGHT
@ PHASE_DEAD
@ SAY_DODGED
@ SPELL_MIGHTY_SPEAR_THRUST
@ SPELL_FLY_STATE_VISUAL
@ SPELL_FATAL_STRIKE
@ PHASE_MOUTH
@ SPELL_EJECT_PASSENGER_1
@ PHASE_MAX
@ SAY_STRIKE_MISS
@ SPELL_JAWS_OF_DEATH_PERIODIC
@ ACTION_GRIP_FAILING
@ SPELL_FALLING_DRAGON_FEIGN_DEATH
@ SPELL_CLAW_SWIPE_DAMAGE
@ ACTION_FATAL_STRIKE_MISS
@ SAY_PHASE_2
@ SPELL_GRIP
@ SPELL_DODGE_CLAWS
@ SPELL_CLAW_SWIPE_PERIODIC
@ ACTION_GRIP_LOST
@ ACTION_CLAW_SWIPE_DODGE
@ SPELL_THRUST_SPEAR
@ SAY_GRIP_WARN
@ ACTION_CLAW_SWIPE_WARN
@ SPELL_WYRM_KILL_CREDIT
@ SPELL_PLAYER_MOUNT_WYRM
@ PATH_WILD_WYRM
@ SPELL_SPEAR_OF_HODIR
@ SPELL_LOW_HEALTH_TRIGGER
@ SPELL_FIGHT_WYRM
@ SPELL_EJECT_ALL_PASSENGERS
@ POINT_FALL
@ SAY_SWIPE
@ SPELL_PRY_JAWS_OPEN
@ SPELL_FULL_HEAL_MANA
@ SPELL_FATAL_STRIKE_DAMAGE
@ SPELL_GRAB_ON
@ SEAT_MOUTH
@ SPELL_DESPAWN_RIFT
@ NPC_HYLDSMEET_DRAKERIDER
@ SPELL_IMMOLATION
@ SPELL_ABLAZE
@ SPELL_FROSTGIANT_CREDIT
@ SPELL_FROSTWORG_CREDIT
@ NPC_FROSTGIANT
@ NPC_FROSTWORG
BrannBronzebeard
@ EVENT_SCRIPT_8
@ EVENT_SCRIPT_7
@ NPC_A_DISTANT_VOICE
@ EVENT_SCRIPT_1
@ SAY_BRANN_3
@ OBJECT_TOL_SIGNAL_1
@ SAY_VOICE_1
@ OBJECT_TOL_SIGNAL_3
@ SPELL_RESURRECTION
@ SAY_VOICE_2
@ EVENT_SCRIPT_9
@ SAY_VOICE_5
@ EVENT_SCRIPT_13
@ EVENT_SCRIPT_5
@ SAY_BRANN_1
@ EVENT_SCRIPT_3
@ SAY_VOICE_3
@ OBJECT_TOL_SIGNAL_2
@ EVENT_SCRIPT_4
@ SAY_VOICE_4
@ EVENT_SCRIPT_10
@ EVENT_SCRIPT_11
@ EVENT_SCRIPT_2
@ EVENT_SCRIPT_6
@ SAY_BRANN_2
@ NPC_BRANN_BRONZEBEARD
@ OBJECT_TOL_SIGNAL_5
@ OBJECT_TOL_SIGNAL_4
@ EVENT_SCRIPT_12
CatchingUpWithBrann
@ SPELL_CONTACT_BRANN
@ SPELL_DESPAWN_BRANN
void AddSC_storm_peaks()
uint32 const WyrmControlSpells[PHASE_MAX][ControllableSpellsCount]
@ SPELL_SUMMON_EARTHEN
MountingHodirsHelm
@ TEXT_PRONOUNCEMENT_1
@ TEXT_PRONOUNCEMENT_2
@ NPC_HODIRS_HELM_KC
JokkumScriptcast
@ EVENT_KROLMIR_4
@ SPELL_SUMMON_VERANUS_AND_THORIM
@ EVENT_KROLMIR_2
@ NPC_KINGJOKKUM
@ SAY_JOKKUM_7
@ SAY_JOKKUM_2
@ EVENT_KROLMIR_8
@ EVENT_KROLMIR_7
@ SPELL_JOKKUM_SUMMON
@ SAY_HOLD_ON
@ NPC_THORIM
@ SAY_JOKKUM_8
@ SAY_JOKKUM_3
@ SAY_THORIM_2
@ SPELL_JOKKUM_KILL_CREDIT
@ SPELL_PLAYER_CAST_VERANUS_SUMMON
@ SAY_THORIM_4
@ SAY_THORIM_1
@ EVENT_KROLMIR_5
@ EVENT_KROLMIR_1
@ PATH_JOKKUM_END
@ SAY_THORIM_3
@ SAY_JOKKUM_4
@ EVENT_KROLMIR_3
@ EVENT_KROLMIR_9
@ SAY_JOKKUM_5
@ SAY_JOKKUM_1
@ PATH_JOKKUM
@ SAY_JOKKUM_6
@ EVENT_KROLMIR_6
static constexpr uint32 PATH_ESCORT_ICEFANG
JormuttarIsSooFat
@ SPELL_BEAR_FLANK_FAIL
@ TEXT_CARVE_FAIL
@ SPELL_CREATE_BEAR_FLANK