TrinityCore
Loading...
Searching...
No Matches
chapter1.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 "CreatureAIImpl.h"
19#include "ScriptMgr.h"
20#include "CharmInfo.h"
21#include "CombatAI.h"
22#include "CreatureTextMgr.h"
23#include "G3DPosition.hpp"
24#include "GameObject.h"
25#include "GameObjectAI.h"
26#include "Log.h"
27#include "Map.h"
28#include "MotionMaster.h"
29#include "MoveSplineInit.h"
30#include "ObjectAccessor.h"
31#include "ObjectMgr.h"
32#include "PassiveAI.h"
33#include "Player.h"
34#include "ScriptedCreature.h"
35#include "ScriptedGossip.h"
36#include "SpellMgr.h"
37#include "SpellScript.h"
38#include "SpellInfo.h"
39#include "TemporarySummon.h"
40#include "Vehicle.h"
41
42/*######
43##Quest 12848
44######*/
45
46#define GCD_CAST 1
47
66
75
80
82{
83 191577,
84 191580,
85 191581,
86 191582,
87 191583,
88 191584,
89 191585,
90 191586,
91 191587,
92 191588,
93 191589,
94 191590
95};
96
98{
99 29519,
100 29520,
101 29565,
102 29566,
103 29567
104};
105
107{
108public:
109 npc_unworthy_initiate() : CreatureScript("npc_unworthy_initiate") { }
110
112 {
114 {
115 Initialize();
119
120 wait_timer = 0;
121 anchorX = 0.f;
122 anchorY = 0.f;
123 }
124
126 {
129 }
130
136
138
139 void Reset() override
140 {
141 Initialize();
142 events.Reset();
144 me->SetImmuneToPC(true);
146 me->LoadEquipment(0, true);
147 }
148
156
157 void MovementInform(uint32 type, uint32 id) override
158 {
159 if (type != POINT_MOTION_TYPE)
160 return;
161
162 if (id == 1)
163 {
164 wait_timer = 5000;
165 me->LoadEquipment(1);
167
169 Talk(SAY_EVENT_ATTACK, starter);
170
172 }
173 }
174
175 void EventStart(Creature* anchor, Player* target)
176 {
177 wait_timer = 5000;
179
182
183 float z;
184 anchor->GetContactPoint(me, anchorX, anchorY, z, 1.0f);
185
186 playerGUID = target->GetGUID();
187 Talk(SAY_EVENT_START, target);
188 }
189
190 void UpdateAI(uint32 diff) override
191 {
192 switch (phase)
193 {
194 case PHASE_CHAINED:
195 if (!anchorGUID)
196 {
197 if (Creature* anchor = me->FindNearestCreature(29521, 30))
198 {
199 anchor->AI()->SetGUID(me->GetGUID(), DATA_PRISONER_GUID);
200 anchor->CastSpell(me, SPELL_SOUL_PRISON_CHAIN, true);
201 anchorGUID = anchor->GetGUID();
202 }
203 else
204 TC_LOG_ERROR("scripts", "npc_unworthy_initiateAI: unable to find anchor!");
205
206 float dist = 99.0f;
207 GameObject* prison = nullptr;
208
209 for (uint8 i = 0; i < 12; ++i)
210 {
211 if (GameObject* temp_prison = me->FindNearestGameObject(acherus_soul_prison[i], 30))
212 {
213 if (me->IsWithinDist(temp_prison, dist, false))
214 {
215 dist = me->GetDistance2d(temp_prison);
216 prison = temp_prison;
217 }
218 }
219 }
220
221 if (prison)
222 prison->ResetDoorOrButton();
223 else
224 TC_LOG_ERROR("scripts", "npc_unworthy_initiateAI: unable to find prison!");
225 }
226 break;
227 case PHASE_TO_EQUIP:
228 if (wait_timer)
229 {
230 if (wait_timer > diff)
231 wait_timer -= diff;
232 else
233 {
235 //TC_LOG_DEBUG("scripts", "npc_unworthy_initiateAI: move to {} {} {}", anchorX, anchorY, me->GetPositionZ());
237 wait_timer = 0;
238 }
239 }
240 break;
241 case PHASE_TO_ATTACK:
242 if (wait_timer)
243 {
244 if (wait_timer > diff)
245 wait_timer -= diff;
246 else
247 {
249 me->SetImmuneToPC(false);
252
254 AttackStart(target);
255 wait_timer = 0;
256 }
257 }
258 break;
259 case PHASE_ATTACKING:
260 if (!UpdateVictim())
261 return;
262
263 events.Update(diff);
264
265 while (uint32 eventId = events.ExecuteEvent())
266 {
267 switch (eventId)
268 {
269 case EVENT_ICY_TOUCH:
273 break;
278 break;
283 break;
284 case EVENT_DEATH_COIL:
288 break;
289 }
290 }
291 break;
292 default:
293 break;
294 }
295 }
296 };
297
298 CreatureAI* GetAI(Creature* creature) const override
299 {
300 return new npc_unworthy_initiateAI(creature);
301 }
302};
303
305{
306public:
307 npc_unworthy_initiate_anchor() : CreatureScript("npc_unworthy_initiate_anchor") { }
308
309 CreatureAI* GetAI(Creature* creature) const override
310 {
311 return new npc_unworthy_initiate_anchorAI(creature);
312 }
313
315 {
317
319
320 void SetGUID(ObjectGuid const& guid, int32 id) override
321 {
322 if (id != DATA_PRISONER_GUID)
323 return;
324
325 prisonerGUID = guid;
326 }
327
328 ObjectGuid GetGUID(int32 /*id*/) const override
329 {
330 return prisonerGUID;
331 }
332 };
333};
334
336{
337 public:
338 go_acherus_soul_prison() : GameObjectScript("go_acherus_soul_prison") { }
339
341 {
343
344 bool OnGossipHello(Player* player) override
345 {
346 if (Creature* anchor = me->FindNearestCreature(29521, 15))
347 {
348 ObjectGuid prisonerGUID = anchor->AI()->GetGUID(DATA_PRISONER_GUID);
349 if (!prisonerGUID.IsEmpty())
350 if (Creature* prisoner = ObjectAccessor::GetCreature(*player, prisonerGUID))
351 ENSURE_AI(npc_unworthy_initiate::npc_unworthy_initiateAI, prisoner->AI())->EventStart(anchor, player);
352 }
353
354 return false;
355 }
356 };
357
358 GameObjectAI* GetAI(GameObject* go) const override
359 {
360 return new go_acherus_soul_prisonAI(go);
361 }
362};
363
364// 51519 - Death Knight Initiate Visual
366{
368 {
369 Creature* target = GetHitCreature();
370 if (!target)
371 return;
372
373 uint32 spellId;
374 switch (target->GetDisplayId())
375 {
376 case 25369: spellId = 51552; break; // bloodelf female
377 case 25373: spellId = 51551; break; // bloodelf male
378 case 25363: spellId = 51542; break; // draenei female
379 case 25357: spellId = 51541; break; // draenei male
380 case 25361: spellId = 51537; break; // dwarf female
381 case 25356: spellId = 51538; break; // dwarf male
382 case 25372: spellId = 51550; break; // forsaken female
383 case 25367: spellId = 51549; break; // forsaken male
384 case 25362: spellId = 51540; break; // gnome female
385 case 25359: spellId = 51539; break; // gnome male
386 case 25355: spellId = 51534; break; // human female
387 case 25354: spellId = 51520; break; // human male
388 case 25360: spellId = 51536; break; // nightelf female
389 case 25358: spellId = 51535; break; // nightelf male
390 case 25368: spellId = 51544; break; // orc female
391 case 25364: spellId = 51543; break; // orc male
392 case 25371: spellId = 51548; break; // tauren female
393 case 25366: spellId = 51547; break; // tauren male
394 case 25370: spellId = 51545; break; // troll female
395 case 25365: spellId = 51546; break; // troll male
396 default: return;
397 }
398
399 target->CastSpell(target, spellId, GetSpell());
400 target->LoadEquipment();
401 }
402
407};
408
409/*######
410## npc_eye_of_acherus
411######*/
412
431
432G3D::Vector3 const EyeOfAcherusPath[] =
433{
434 { 2361.21f, -5660.45f, 496.744f },
435 { 2341.571f, -5672.797f, 538.3942f },
436 { 1957.4f, -5844.1f, 273.867f },
437 { 1758.01f, -5876.79f, 166.867f }
438};
439
441{
443 {
444 creature->SetDisplayFromModel(0);
445 creature->SetReactState(REACT_PASSIVE);
446 if (creature->GetCharmInfo())
448 }
449
456
465
466 void UpdateAI(uint32 diff) override
467 {
468 _events.Update(diff);
469
470 while (uint32 eventId = _events.ExecuteEvent())
471 {
472 switch (eventId)
473 {
475 if (Unit* owner = me->GetCharmerOrOwner())
478 break;
479 case EVENT_UNROOT:
483 break;
485 {
486 std::function<void(Movement::MoveSplineInit&)> initializer = [=, me = me](Movement::MoveSplineInit& init)
487 {
488 init.MovebyPath(EyeOfAcherusPath);
489 init.SetFly();
490 if (Unit* owner = me->GetCharmerOrOwner())
491 init.SetVelocity(owner->GetSpeed(MOVE_RUN));
492 };
493
495 break;
496 }
501 if (Unit* owner = me->GetCharmerOrOwner())
503 break;
504 default:
505 break;
506 }
507 }
508 }
509
510 void MovementInform(uint32 movementType, uint32 pointId) override
511 {
512 if (movementType != POINT_MOTION_TYPE)
513 return;
514
515 switch (pointId)
516 {
517 case POINT_NEW_AVALON:
520 break;
521 default:
522 break;
523 }
524 }
525
526private:
528};
529
530/*######
531## npc_death_knight_initiate
532######*/
533
535{
536 SPELL_DUEL = 52996,
537 //SPELL_DUEL_TRIGGERED = 52990,
541};
542
544{
546};
547
549{
552
564
566{
567public:
568 npc_death_knight_initiate() : CreatureScript("npc_death_knight_initiate") { }
569
571 {
573 {
574 Initialize();
575 }
576
578 {
580 m_uiDuelTimer = 5000;
581 m_bIsDuelInProgress = false;
582 lose = false;
583 }
584
585 bool lose;
589
590 void Reset() override
591 {
592 Initialize();
593
597 }
598
599 void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
600 {
601 if (!m_bIsDuelInProgress && spellInfo->Id == SPELL_DUEL)
602 {
603 m_uiDuelerGUID = caster->GetGUID();
604 Talk(SAY_DUEL, caster);
605 m_bIsDuelInProgress = true;
606 }
607 }
608
609 void DamageTaken(Unit* pDoneBy, uint32 &uiDamage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
610 {
611 if (m_bIsDuelInProgress && pDoneBy && pDoneBy->IsControlledByPlayer())
612 {
613 if (pDoneBy->GetGUID() != m_uiDuelerGUID && pDoneBy->GetOwnerGUID() != m_uiDuelerGUID) // other players cannot help
614 uiDamage = 0;
615 else if (uiDamage >= me->GetHealth())
616 {
617 uiDamage = 0;
618
619 if (!lose)
620 {
621 pDoneBy->RemoveGameObject(SPELL_DUEL_FLAG, true);
622 pDoneBy->AttackStop();
623 me->CastSpell(pDoneBy, SPELL_DUEL_VICTORY, true);
624 lose = true;
625 me->CastSpell(me, SPELL_GROVEL, true);
627 }
628 }
629 }
630 }
631
632 void UpdateAI(uint32 uiDiff) override
633 {
634 if (!UpdateVictim())
635 {
637 {
638 if (m_uiDuelTimer <= uiDiff)
639 {
641
643 AttackStart(unit);
644 }
645 else
646 m_uiDuelTimer -= uiDiff;
647 }
648 return;
649 }
650
652 {
653 if (lose)
654 {
655 if (!me->HasAura(SPELL_GROVEL))
657 return;
658 }
660 {
661 me->EnsureVictim()->CastSpell(me->GetVictim(), SPELL_GROVEL, true); // beg
664 return;
665 }
666 }
667
669
670 CombatAI::UpdateAI(uiDiff);
671 }
672
673 bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
674 {
675 uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
676 ClearGossipMenuFor(player);
677 if (action == GOSSIP_ACTION_INFO_DEF)
678 {
679 CloseGossipMenuFor(player);
680
681 if (player->IsInCombat() || me->IsInCombat())
682 return true;
683
685 return true;
686
687 me->SetImmuneToPC(false);
689
690 player->CastSpell(me, SPELL_DUEL, false);
691 player->CastSpell(player, SPELL_DUEL_FLAG, true);
692 }
693 return true;
694 }
695
696 bool OnGossipHello(Player* player) override
697 {
698 uint32 gossipMenuId = player->GetGossipMenuForSource(me);
699 InitGossipMenuFor(player, gossipMenuId);
701 {
702 if (player->HealthBelowPct(10))
703 return true;
704
705 if (player->IsInCombat() || me->IsInCombat())
706 return true;
707
709 SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
710 }
711 return true;
712 }
713
714 void WaypointPathEnded(uint32 /*nodeId*/, uint32 pathId) override
715 {
716 switch (pathId)
717 {
727 break;
728 default:
729 break;
730 }
731 }
732 };
733
734 CreatureAI* GetAI(Creature* creature) const override
735 {
736 return new npc_death_knight_initiateAI(creature);
737 }
738};
739
740/*######
741## npc_dark_rider_of_acherus
742######*/
743
754
756{
758
759 void JustAppeared() override
760 {
761 if (TempSummon* summon = me->ToTempSummon())
762 _horseGUID = summon->GetSummonerGUID();
763
765 }
766
767 void Reset() override
768 {
769 _events.Reset();
770 }
771
772 void UpdateAI(uint32 diff) override
773 {
774 _events.Update(diff);
775
776 while (uint32 eventId = _events.ExecuteEvent())
777 {
778 switch (eventId)
779 {
783 me->GetMotionMaster()->MoveChase(horse);
785 break;
789 DoCast(horse, SPELL_DESPAWN_HORSE, true);
791 break;
792 case EVENT_END_SCRIPT:
794 break;
795 default:
796 break;
797 }
798 }
799 }
800
801 void SpellHitTarget(WorldObject* target, SpellInfo const* spellInfo) override
802 {
803 if (spellInfo->Id == SPELL_DESPAWN_HORSE && target->GetGUID() == _horseGUID)
804 if (Creature* creature = target->ToCreature())
805 creature->DespawnOrUnsummon(2s);
806 }
807
808private:
811};
812
813/*######
814## npc_salanar_the_horseman
815######*/
816
827
829{
830public:
831 npc_salanar_the_horseman() : CreatureScript("npc_salanar_the_horseman") { }
832
834 {
836
837 void MoveInLineOfSight(Unit* who) override
838 {
840
841 if (who->GetTypeId() == TYPEID_UNIT && who->IsVehicle() && me->IsWithinDistInMap(who, 5.0f))
842 {
843 if (Unit* charmer = who->GetCharmer())
844 {
845 if (Player* player = charmer->ToPlayer())
846 {
847 if (player->GetQuestStatus(QUEST_INTO_REALM_OF_SHADOWS) == QUEST_STATUS_INCOMPLETE)
848 {
849 player->GroupEventHappens(QUEST_INTO_REALM_OF_SHADOWS, me);
851 charmer->RemoveAurasDueToSpell(SPELL_EFFECT_OVERTAKE);
852 if (Creature* creature = who->ToCreature())
853 {
854 creature->DespawnOrUnsummon();
855 //creature->Respawn(true);
856 }
857 }
858
859 player->RemoveAurasDueToSpell(SPELL_REALM_OF_SHADOWS);
860 }
861 }
862 }
863 }
864 };
865
866 CreatureAI* GetAI(Creature* creature) const override
867 {
868 return new npc_salanar_the_horsemanAI(creature);
869 }
870};
871
873{
874 SEAT_ID_0 = 0
876
877// 52265 - Repo
879{
880 void AfterApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
881 {
882 Creature* creature = GetTarget()->ToCreature();
883 if (!creature)
884 return;
885
886 if (Vehicle* vehicleKit = creature->GetVehicleKit())
887 if (Unit* passenger = vehicleKit->GetPassenger(SEAT_ID_0))
888 GetCaster()->EngageWithTarget(passenger);
889
890 creature->DespawnOrUnsummon(1s);
891 }
892
897};
898
899// 52264 - Deliver Stolen Horse
925
926/*######
927## npc_ros_dark_rider
928######*/
929
931{
932public:
933 npc_ros_dark_rider() : CreatureScript("npc_ros_dark_rider") { }
934
935 CreatureAI* GetAI(Creature* creature) const override
936 {
937 return new npc_ros_dark_riderAI(creature);
938 }
939
941 {
942 npc_ros_dark_riderAI(Creature* creature) : ScriptedAI(creature) { }
943
944 void JustEngagedWith(Unit* /*who*/) override
945 {
946 me->ExitVehicle();
947 }
948
949 void Reset() override
950 {
951 Creature* deathcharger = me->FindNearestCreature(28782, 30);
952 if (!deathcharger)
953 return;
954
955 deathcharger->RestoreFaction();
957 deathcharger->SetUninteractible(true);
958 if (!me->GetVehicle() && deathcharger->IsVehicle() && deathcharger->GetVehicleKit()->HasEmptySeat(0))
959 me->EnterVehicle(deathcharger);
960 }
961
962 void JustDied(Unit* killer) override
963 {
964 Creature* deathcharger = me->FindNearestCreature(28782, 30);
965 if (!deathcharger || !killer)
966 return;
967
968 if (killer->GetTypeId() == TYPEID_PLAYER && deathcharger->GetTypeId() == TYPEID_UNIT && deathcharger->IsVehicle())
969 {
971 deathcharger->SetUninteractible(false);
973 }
974 }
975 };
976
977};
978
979// correct way: 52312 52314 52555 ...
981{
983
984 NPC_GHOULS = 28845,
985 NPC_GHOSTS = 28846,
986};
987
989{
990public:
991 npc_dkc1_gothik() : CreatureScript("npc_dkc1_gothik") { }
992
993 CreatureAI* GetAI(Creature* creature) const override
994 {
995 return new npc_dkc1_gothikAI(creature);
996 }
997
999 {
1000 npc_dkc1_gothikAI(Creature* creature) : ScriptedAI(creature) { }
1001
1002 void MoveInLineOfSight(Unit* who) override
1003
1004 {
1006
1007 if (who->GetEntry() == NPC_GHOULS && me->IsWithinDistInMap(who, 10.0f))
1008 {
1009 if (Unit* owner = who->GetOwner())
1010 {
1011 if (Player* player = owner->ToPlayer())
1012 {
1013 Creature* creature = who->ToCreature();
1014 if (player->GetQuestStatus(12698) == QUEST_STATUS_INCOMPLETE)
1015 creature->CastSpell(owner, 52517, true);
1016
1018 // stand next to Gothik and be commanded into the pit
1019 // and dig into the ground.
1020 creature->DespawnOrUnsummon();
1021
1022 if (player->GetQuestStatus(12698) == QUEST_STATUS_COMPLETE)
1023 owner->RemoveAllMinionsByEntry(NPC_GHOSTS);
1024 }
1025 }
1026 }
1027 }
1028 };
1029
1030};
1031
1033{
1035 {
1037 }
1038
1039 void JustAppeared() override
1040 {
1042
1043 if (urand(0, 1))
1044 if (Unit* owner = me->GetOwner())
1045 Talk(SAY_LINE_0, owner);
1046 }
1047
1048 void FindMinions(Unit* owner)
1049 {
1050 std::list<TempSummon*> MinionList;
1051 owner->GetAllMinionsByEntry(MinionList, NPC_GHOULS);
1052
1053 if (!MinionList.empty())
1054 {
1055 for (Creature* creature : MinionList)
1056 {
1057 if (creature->GetOwner()->GetGUID() == me->GetOwner()->GetGUID())
1058 {
1059 if (creature->IsInCombat() && creature->getAttackerForHelper())
1060 {
1061 AttackStart(creature->getAttackerForHelper());
1062 }
1063 }
1064 }
1065 }
1066 }
1067
1068 void UpdateAI(uint32 /*diff*/) override
1069 {
1070 if (!me->IsInCombat())
1071 {
1072 if (Unit* owner = me->GetOwner())
1073 {
1074 Player* plrOwner = owner->ToPlayer();
1075 if (plrOwner && plrOwner->IsInCombat())
1076 {
1077 Unit* newTarget = plrOwner->getAttackerForHelper();
1078 if (newTarget && newTarget->GetEntry() == NPC_GHOSTS)
1079 AttackStart(newTarget);
1080 else
1081 FindMinions(owner);
1082 }
1083 }
1084 }
1085
1086 if (!UpdateVictim())
1087 return;
1088 }
1089
1090 bool CanAIAttack(Unit const* target) const override
1091 {
1092 return target->GetEntry() == NPC_GHOSTS;
1093 }
1094};
1095
1101
1102// 52479 - Gift of the Harvester
1104{
1105 bool Validate(SpellInfo const* /*spell*/) override
1106 {
1107 return ValidateSpellInfo(
1108 {
1111 });
1112 }
1113
1115 {
1116 Unit* originalCaster = GetOriginalCaster();
1117 Unit* target = GetHitUnit();
1118
1119 if (originalCaster && target)
1120 originalCaster->CastSpell(target, RAND(SPELL_GHOUL_TRANFORM, SPELL_GHOST_TRANSFORM), true);
1121 }
1122
1127};
1128
1129/*######
1130## Quest 12842: Runeforging: Preparation For Battle
1131######*/
1132
1138
1139/* 53343 - Rune of Razorice
1140 53344 - Rune of the Fallen Crusader
1141 62158 - Rune of the Stoneskin Gargoyle
1142 326805 - Rune of Sanguination
1143 326855 - Rune of Spellwarding
1144 326911 - Rune of Hysteria
1145 326977 - Rune of Unending Thirst
1146 327082 - Rune of the Apocalypse */
1148{
1149 bool Validate(SpellInfo const* /*spellInfo*/) override
1150 {
1152 sObjectMgr->GetQuestTemplate(QUEST_RUNEFORGING);
1153 }
1154
1155 void HandleDummy(SpellEffIndex /*effIndex*/)
1156 {
1157 if (Player* caster = GetCaster()->ToPlayer())
1158 if (caster->GetQuestStatus(QUEST_RUNEFORGING) == QUEST_STATUS_INCOMPLETE)
1159 caster->CastSpell(caster, SPELL_RUNEFORGING_CREDIT);
1160 }
1161
1166};
1167
1169{
1211};
1212
1213// 29102 - Hearthglen Crusader
1214// 29103 - Tirisfal Crusader
1216{
1218 {
1219 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(creature->m_spells[0], creature->GetMap()->GetDifficultyID());
1220 if (!spellInfo)
1221 return;
1222
1223 auto [minRange, maxRange] = spellInfo->GetMinMaxRange(false);
1224 _minimumRange = minRange;
1225
1226 if (!_minimumRange)
1228 creature->m_CombatDistance = maxRange;
1229 creature->m_SightDistance = creature->m_CombatDistance;
1230 }
1231
1232 void AttackStart(Unit* who) override
1233 {
1234 if (!who)
1235 return;
1236
1238 {
1239 if (me->Attack(who, true) && !who->IsFlying())
1240 me->GetMotionMaster()->MoveChase(who);
1241 }
1242 else
1243 {
1244 if (me->Attack(who, false) && !who->IsFlying())
1246 }
1247
1248 if (who->IsFlying())
1250 }
1251
1252 void UpdateAI(uint32 /*diff*/) override
1253 {
1254 if (!UpdateVictim())
1255 return;
1256
1259 }
1260
1261 void WaypointPathEnded(uint32 /*nodeId*/, uint32 pathId) override
1262 {
1263 switch (pathId)
1264 {
1306 me->DespawnOrUnsummon(1s);
1307 break;
1308 default:
1309 break;
1310 }
1311 }
1312
1313private:
1315};
1316
First const & RAND(First const &first, Second const &second, Rest const &... rest)
uint8_t uint8
Definition Define.h:156
int32_t int32
Definition Define.h:150
uint32_t uint32
Definition Define.h:154
#define TC_LOG_ERROR(filterType__, message__,...)
Definition Log.h:190
@ MOTION_PRIORITY_NORMAL
@ POINT_MOTION_TYPE
#define MELEE_RANGE
@ TYPEID_UNIT
Definition ObjectGuid.h:43
@ TYPEID_PLAYER
Definition ObjectGuid.h:44
#define sObjectMgr
Definition ObjectMgr.h:1885
@ QUEST_STATUS_INCOMPLETE
Definition QuestDef.h:150
@ QUEST_STATUS_COMPLETE
Definition QuestDef.h:148
uint32 urand(uint32 min, uint32 max)
Definition Random.cpp:42
#define RegisterCreatureAI(ai_name)
Definition ScriptMgr.h:1392
#define RegisterSpellScript(spell_script)
Definition ScriptMgr.h:1383
void AddGossipItemFor(Player *player, GossipOptionNpc optionNpc, std::string text, uint32 sender, uint32 action)
void SendGossipMenuFor(Player *player, uint32 npcTextID, ObjectGuid const &guid)
void ClearGossipMenuFor(Player *player)
void InitGossipMenuFor(Player *player, uint32 menuId)
void CloseGossipMenuFor(Player *player)
@ GOSSIP_SENDER_MAIN
@ GOSSIP_ACTION_INFO_DEF
SpellEffIndex
@ EFFECT_1
@ EFFECT_0
@ SPELL_EFFECT_DUMMY
@ SPELL_EFFECT_SCRIPT_EFFECT
@ SPELL_EFFECT_KILL_CREDIT2
@ FACTION_SCARLET_CRUSADE_2
@ FACTION_UNDEAD_SCOURGE_2
@ FACTION_FRIENDLY
@ FACTION_MONSTER
@ FACTION_CREATURE
AuraEffectHandleModes
@ AURA_EFFECT_HANDLE_REAL
@ SPELL_AURA_DUMMY
#define sSpellMgr
Definition SpellMgr.h:812
#define SpellEffectFn(F, I, N)
#define AuraEffectApplyFn(F, I, N, M)
#define ENSURE_AI(a, b)
Definition UnitAI.h:30
@ MOVE_RUN
@ REACT_DEFENSIVE
@ REACT_PASSIVE
@ REACT_AGGRESSIVE
@ UNIT_STAND_STATE_KNEEL
Definition UnitDefines.h:50
@ UNIT_STAND_STATE_STAND
Definition UnitDefines.h:42
@ UNIT_NPC_FLAG_SPELLCLICK
DamageEffectType
@ UNIT_FLAG_CAN_SWIM
G3D::Vector3 const EyeOfAcherusPath[]
Definition chapter1.cpp:432
Says_VBM
Definition chapter1.cpp:544
@ SAY_DUEL
Definition chapter1.cpp:545
GiftOfTheHarvester
@ SPELL_GHOUL_TRANFORM
@ SPELL_GHOST_TRANSFORM
HorseSeats
Definition chapter1.cpp:873
@ SEAT_ID_0
Definition chapter1.cpp:874
#define GCD_CAST
Definition chapter1.cpp:46
void AddSC_the_scarlet_enclave_c1()
Paths_VBN
Definition chapter1.cpp:554
@ PATH_DEATH_KNIGHT_INITIATE3
Definition chapter1.cpp:557
@ PATH_DEATH_KNIGHT_INITIATE8
Definition chapter1.cpp:562
@ PATH_DEATH_KNIGHT_INITIATE4
Definition chapter1.cpp:558
@ PATH_DEATH_KNIGHT_INITIATE7
Definition chapter1.cpp:561
@ PATH_DEATH_KNIGHT_INITIATE5
Definition chapter1.cpp:559
@ PATH_DEATH_KNIGHT_INITIATE6
Definition chapter1.cpp:560
@ PATH_DEATH_KNIGHT_INITIATE2
Definition chapter1.cpp:556
@ PATH_DEATH_KNIGHT_INITIATE
Definition chapter1.cpp:555
Misc_VBN
Definition chapter1.cpp:549
@ QUEST_DEATH_CHALLENGE
Definition chapter1.cpp:550
Spells_DKI
Definition chapter1.cpp:535
@ SPELL_DUEL_FLAG
Definition chapter1.cpp:539
@ SPELL_GROVEL
Definition chapter1.cpp:540
@ SPELL_DUEL
Definition chapter1.cpp:536
@ SPELL_DUEL_VICTORY
Definition chapter1.cpp:538
Runeforging
@ QUEST_RUNEFORGING
@ SPELL_RUNEFORGING_CREDIT
SalanarTheHorseman
Definition chapter1.cpp:818
@ SALANAR_SAY
Definition chapter1.cpp:819
@ SPELL_EFFECT_STOLEN_HORSE
Definition chapter1.cpp:821
@ QUEST_INTO_REALM_OF_SHADOWS
Definition chapter1.cpp:820
@ SPELL_REALM_OF_SHADOWS
Definition chapter1.cpp:825
@ SPELL_DELIVER_STOLEN_HORSE
Definition chapter1.cpp:822
@ SPELL_CALL_DARK_RIDER
Definition chapter1.cpp:823
@ SPELL_EFFECT_OVERTAKE
Definition chapter1.cpp:824
UnworthyInitiatePhase
Definition chapter1.cpp:68
@ PHASE_TO_ATTACK
Definition chapter1.cpp:72
@ PHASE_EQUIPING
Definition chapter1.cpp:71
@ PHASE_TO_EQUIP
Definition chapter1.cpp:70
@ PHASE_CHAINED
Definition chapter1.cpp:69
@ PHASE_ATTACKING
Definition chapter1.cpp:73
TheGiftThatKeepsOnGiving
Definition chapter1.cpp:981
@ SAY_LINE_0
Definition chapter1.cpp:982
@ NPC_GHOSTS
Definition chapter1.cpp:985
@ NPC_GHOULS
Definition chapter1.cpp:984
EyeOfAcherusMisc
Definition chapter1.cpp:414
@ SPELL_EYE_OF_ACHERUS_VISUAL
Definition chapter1.cpp:416
@ SAY_LAUNCH_TOWARDS_DESTINATION
Definition chapter1.cpp:426
@ EVENT_GRANT_CONTROL
Definition chapter1.cpp:424
@ SPELL_THE_EYE_OF_ACHERUS
Definition chapter1.cpp:415
@ EVENT_LAUNCH_TOWARDS_DESTINATION
Definition chapter1.cpp:423
@ SPELL_ROOT_SELF
Definition chapter1.cpp:419
@ EVENT_ANNOUNCE_LAUNCH_TO_DESTINATION
Definition chapter1.cpp:421
@ SAY_EYE_UNDER_CONTROL
Definition chapter1.cpp:427
@ SPELL_EYE_OF_ACHERUS_FLIGHT_BOOST
Definition chapter1.cpp:417
@ SPELL_EYE_OF_ACHERUS_FLIGHT
Definition chapter1.cpp:418
@ POINT_NEW_AVALON
Definition chapter1.cpp:429
@ EVENT_UNROOT
Definition chapter1.cpp:422
uint32 acherus_soul_prison[12]
Definition chapter1.cpp:81
uint32 acherus_unworthy_initiate[5]
Definition chapter1.cpp:97
DarkRiderOfAcherus
Definition chapter1.cpp:745
@ SAY_DARK_RIDER
Definition chapter1.cpp:746
@ SPELL_DESPAWN_HORSE
Definition chapter1.cpp:752
@ EVENT_DESPAWN_HORSE
Definition chapter1.cpp:749
@ EVENT_START_MOVING
Definition chapter1.cpp:748
@ EVENT_END_SCRIPT
Definition chapter1.cpp:750
UnworthyInitiateData
Definition chapter1.cpp:77
@ DATA_PRISONER_GUID
Definition chapter1.cpp:78
HearthglenCrusaderPaths
@ PATH_HEARTHGLEN_CRUSADER_DESPAWN12
@ PATH_HEARTHGLEN_CRUSADER_DESPAWN3
@ PATH_HEARTHGLEN_CRUSADER_DESPAWN16
@ PATH_HEARTHGLEN_CRUSADER_DESPAWN26
@ PATH_HEARTHGLEN_CRUSADER_DESPAWN15
@ PATH_HEARTHGLEN_CRUSADER_DESPAWN28
@ PATH_HEARTHGLEN_CRUSADER_DESPAWN29
@ PATH_HEARTHGLEN_CRUSADER_DESPAWN
@ PATH_HEARTHGLEN_CRUSADER_DESPAWN17
@ PATH_HEARTHGLEN_CRUSADER_DESPAWN24
@ PATH_HEARTHGLEN_CRUSADER_DESPAWN6
@ PATH_HEARTHGLEN_CRUSADER_DESPAWN8
@ PATH_HEARTHGLEN_CRUSADER_DESPAWN34
@ PATH_HEARTHGLEN_CRUSADER_DESPAWN22
@ PATH_HEARTHGLEN_CRUSADER_DESPAWN30
@ PATH_HEARTHGLEN_CRUSADER_DESPAWN7
@ PATH_HEARTHGLEN_CRUSADER_DESPAWN31
@ PATH_HEARTHGLEN_CRUSADER_DESPAWN25
@ PATH_HEARTHGLEN_CRUSADER_DESPAWN5
@ PATH_HEARTHGLEN_CRUSADER_DESPAWN11
@ PATH_HEARTHGLEN_CRUSADER_DESPAWN10
@ PATH_HEARTHGLEN_CRUSADER_DESPAWN41
@ PATH_HEARTHGLEN_CRUSADER_DESPAWN14
@ PATH_HEARTHGLEN_CRUSADER_DESPAWN33
@ PATH_HEARTHGLEN_CRUSADER_DESPAWN20
@ PATH_HEARTHGLEN_CRUSADER_DESPAWN19
@ PATH_HEARTHGLEN_CRUSADER_DESPAWN4
@ PATH_HEARTHGLEN_CRUSADER_DESPAWN18
@ PATH_HEARTHGLEN_CRUSADER_DESPAWN37
@ PATH_HEARTHGLEN_CRUSADER_DESPAWN21
@ PATH_HEARTHGLEN_CRUSADER_DESPAWN9
@ PATH_HEARTHGLEN_CRUSADER_DESPAWN39
@ PATH_HEARTHGLEN_CRUSADER_DESPAWN36
@ PATH_HEARTHGLEN_CRUSADER_DESPAWN27
@ PATH_HEARTHGLEN_CRUSADER_DESPAWN40
@ PATH_HEARTHGLEN_CRUSADER_DESPAWN32
@ PATH_HEARTHGLEN_CRUSADER_DESPAWN13
@ PATH_HEARTHGLEN_CRUSADER_DESPAWN38
@ PATH_HEARTHGLEN_CRUSADER_DESPAWN2
@ PATH_HEARTHGLEN_CRUSADER_DESPAWN23
@ PATH_HEARTHGLEN_CRUSADER_DESPAWN35
UnworthyInitiate
Definition chapter1.cpp:49
@ SPELL_DEATH_COIL
Definition chapter1.cpp:56
@ SPELL_PLAGUE_STRIKE
Definition chapter1.cpp:54
@ EVENT_PLAGUE_STRIKE
Definition chapter1.cpp:62
@ SPELL_BLOOD_STRIKE
Definition chapter1.cpp:55
@ SAY_EVENT_START
Definition chapter1.cpp:58
@ SAY_EVENT_ATTACK
Definition chapter1.cpp:59
@ SPELL_DK_INITIATE_VISUAL
Definition chapter1.cpp:51
@ EVENT_ICY_TOUCH
Definition chapter1.cpp:61
@ EVENT_BLOOD_STRIKE
Definition chapter1.cpp:63
@ SPELL_ICY_TOUCH
Definition chapter1.cpp:53
@ SPELL_SOUL_PRISON_CHAIN
Definition chapter1.cpp:50
@ EVENT_DEATH_COIL
Definition chapter1.cpp:64
HookList< EffectApplyHandler > AfterEffectApply
Unit * GetCaster() const
Unit * GetTarget() const
ObjectGuid const & GetGUID() const
Definition BaseEntity.h:163
TypeID GetTypeId() const
Definition BaseEntity.h:166
void Reset() override
Definition CombatAI.cpp:62
void UpdateAI(uint32 diff) override
Definition CombatAI.cpp:91
virtual void MoveInLineOfSight(Unit *)
virtual void EnterEvadeMode(EvadeReason why=EvadeReason::Other)
virtual void JustAppeared()
bool UpdateVictim()
void AttackStart(Unit *victim) override
== Triggered Actions Requested ==================
Creature *const me
Definition CreatureAI.h:63
int8 GetOriginalEquipmentId() const
Definition Creature.h:254
void SetImmuneToPC(bool apply) override
Definition Creature.h:184
uint32 m_spells[MAX_CREATURE_SPELLS]
Definition Creature.h:324
void LoadEquipment(int8 id=1, bool force=false)
void SetDisplayFromModel(uint32 modelIdx)
void SetReactState(ReactStates st)
Definition Creature.h:174
float m_SightDistance
Definition Creature.h:427
void SetCurrentEquipmentId(uint8 id)
Definition Creature.h:256
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
float m_CombatDistance
Definition Creature.h:427
void SetTarget(ObjectGuid const &guid) override
void ExitVehicle(Position const *exitPosition=nullptr) override
uint8 GetCurrentEquipmentId() const
Definition Creature.h:255
uint32 ExecuteEvent()
Definition EventMap.cpp:77
void Update(uint32 time)
Definition EventMap.h:61
void DelayEvents(Milliseconds delay)
Definition EventMap.cpp:100
void ScheduleEvent(uint32 eventId, Milliseconds time, uint32 group=0, uint8 phase=0)
Definition EventMap.cpp:40
void Reset()
Definition EventMap.cpp:25
GameObject *const me
void ResetDoorOrButton()
Difficulty GetDifficultyID() const
Definition Map.h:360
void LaunchMoveSpline(std::function< void(Movement::MoveSplineInit &init)> &&initializer, uint32 id=0, MovementGeneratorPriority priority=MOTION_PRIORITY_NORMAL, MovementGeneratorType type=EFFECT_MOTION_TYPE, Scripting::v2::ActionResultSetter< MovementStopReason > &&scriptResult={})
void MoveChase(Unit *target, Optional< ChaseRange > dist={}, Optional< ChaseAngle > angle={})
void MovePoint(uint32 id, Position const &pos, bool generatePath=true, Optional< float > finalOrient={}, Optional< float > speed={}, MovementWalkRunSpeedSelectionMode speedSelectionMode=MovementWalkRunSpeedSelectionMode::Default, Optional< float > closeEnoughDistance={}, Optional< MovementFadeObject > fadeObject={}, Scripting::v2::ActionResultSetter< MovementStopReason > &&scriptResult={})
bool IsEmpty() const
Definition ObjectGuid.h:362
void Clear()
Definition ObjectGuid.h:329
Player * ToPlayer()
Definition Object.h:126
uint32 GetEntry() const
Definition Object.h:89
Creature * ToCreature()
Definition Object.h:121
QuestStatus GetQuestStatus(uint32 quest_id) const
Definition Player.cpp:15962
uint32 GetGossipTextId(uint32 menuId, WorldObject *source)
Definition Player.cpp:14269
std::unique_ptr< PlayerMenu > PlayerTalkClass
Definition Player.h:2570
uint32 GetGossipMenuForSource(WorldObject const *source) const
Definition Player.cpp:14291
SpellRange GetMinMaxRange(bool positive=false, WorldObject const *caster=nullptr, Spell *spell=nullptr) const
uint32 const Id
Definition SpellInfo.h:328
static bool ValidateSpellInfo(std::initializer_list< uint32 > spellIds)
Creature * GetHitCreature() const
Unit * GetCaster() const
HookList< EffectHandler > OnEffectHit
Unit * GetHitUnit() const
HookList< EffectHandler > OnEffectHitTarget
Spell * GetSpell() const
Unit * GetOriginalCaster() const
bool DoSpellAttackIfReady(uint32 spellId)
Definition UnitAI.cpp:61
SpellCastResult DoCastSelf(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.h:160
SpellCastResult DoCastVictim(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.cpp:180
SpellCastResult DoCast(uint32 spellId)
Definition UnitAI.cpp:89
Definition Unit.h:635
void EnterVehicle(Unit *base, int8 seatId=-1)
Definition Unit.cpp:12749
bool IsVehicle() const
Definition Unit.h:754
Vehicle * GetVehicle() const
Definition Unit.h:1784
void RemoveGameObject(GameObject *gameObj, bool del)
Definition Unit.cpp:5378
void SetStandState(UnitStandStateType state, uint32 animKitID=0)
Definition Unit.cpp:10731
void RestoreFaction()
Definition Unit.cpp:12048
bool IsWithinCombatRange(Unit const *obj, float dist2compare) const
Definition Unit.cpp:670
void SetFaction(uint32 faction) override
Definition Unit.h:872
ObjectGuid GetOwnerGUID() const override
Definition Unit.h:1191
Unit * GetCharmer() const
Definition Unit.h:1209
Unit * getAttackerForHelper() const
Definition Unit.cpp:5830
MotionMaster * GetMotionMaster()
Definition Unit.h:1723
bool IsFullHealth() const
Definition Unit.h:791
void RemoveNpcFlag(NPCFlags flags)
Definition Unit.h:998
TempSummon * ToTempSummon()
Definition Unit.h:1828
CharmInfo * GetCharmInfo()
Definition Unit.h:1242
void SetUninteractible(bool apply)
Definition Unit.cpp:8564
Unit * EnsureVictim() const
Definition Unit.h:728
Unit * GetCharmerOrOwner() const
Definition Unit.h:1221
uint32 GetDisplayId() const
Definition Unit.h:1610
bool Attack(Unit *victim, bool meleeAttack)
Definition Unit.cpp:5853
uint64 GetHealth() const
Definition Unit.h:788
void SetNpcFlag(NPCFlags flags)
Definition Unit.h:997
void EngageWithTarget(Unit *who)
Definition Unit.cpp:8494
void GetAllMinionsByEntry(std::list< TempSummon * > &Minions, uint32 entry)
Definition Unit.cpp:6420
Unit * GetVictim() const
Definition Unit.h:726
bool HealthBelowPct(float pct) const
Definition Unit.h:792
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
Definition Unit.cpp:4804
bool IsControlledByPlayer() const
Definition Unit.h:1214
void SetUnitFlag(UnitFlags flags)
Definition Unit.h:846
bool IsFlying() const
Definition Unit.h:1807
Vehicle * GetVehicleKit() const
Definition Unit.h:1782
bool AttackStop()
Definition Unit.cpp:5965
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint32 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:3974
bool IsInCombat() const
Definition Unit.h:1058
void RemoveUnitFlag(UnitFlags flags)
Definition Unit.h:847
bool HasEmptySeat(int8 seatId) const
Checks if vehicle's seat specified by 'seatId' is empty.
Definition Vehicle.cpp:282
GameObject * FindNearestGameObject(uint32 entry, float range, bool spawnedOnly=true) const
Definition Object.cpp:1539
Map * GetMap() const
Definition Object.h:411
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition Object.cpp:2217
Unit * GetOwner() const
Definition Object.cpp:1598
float GetDistance2d(WorldObject const *obj) const
Definition Object.cpp:450
void GetContactPoint(WorldObject const *obj, float &x, float &y, float &z, float distance2d=CONTACT_DISTANCE) const
Definition Object.cpp:2776
Creature * FindNearestCreature(uint32 entry, float range, bool alive=true) const
Definition Object.cpp:1517
bool IsWithinDistInMap(WorldObject const *obj, float dist2compare, bool is3D=true, bool incOwnRadius=true, bool incTargetRadius=true) const
Definition Object.cpp:501
bool IsWithinDist(WorldObject const *obj, float dist2compare, bool is3D=true, bool incOwnRadius=true, bool incTargetRadius=true) const
Definition Object.cpp:496
GameObjectAI * GetAI(GameObject *go) const override
Definition chapter1.cpp:358
CreatureAI * GetAI(Creature *creature) const override
Definition chapter1.cpp:734
CreatureAI * GetAI(Creature *creature) const override
Definition chapter1.cpp:993
CreatureAI * GetAI(Creature *creature) const override
Definition chapter1.cpp:935
CreatureAI * GetAI(Creature *creature) const override
Definition chapter1.cpp:866
CreatureAI * GetAI(Creature *creature) const override
Definition chapter1.cpp:309
CreatureAI * GetAI(Creature *creature) const override
Definition chapter1.cpp:298
bool Validate(SpellInfo const *) override
void HandleDummy(SpellEffIndex)
void HandleScriptEffect(SpellEffIndex)
Definition chapter1.cpp:367
void HandleScriptEffect(SpellEffIndex)
Definition chapter1.cpp:907
void Register() override
Definition chapter1.cpp:920
bool Validate(SpellInfo const *) override
Definition chapter1.cpp:902
void HandleScriptEffect(SpellEffIndex)
bool Validate(SpellInfo const *) override
void AfterApply(AuraEffect const *, AuraEffectHandleModes)
Definition chapter1.cpp:880
void Register() override
Definition chapter1.cpp:893
TC_GAME_API Unit * GetUnit(WorldObject const &, 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 InitPossessCreateSpells()
Definition CharmInfo.cpp:74
constexpr float GetPositionZ() const
Definition Position.h:89
void AttackStart(Unit *) override
== Triggered Actions Requested ==================
bool OnGossipHello(Player *player) override
Definition chapter1.cpp:344
void UpdateAI(uint32 diff) override
Definition chapter1.cpp:772
npc_dark_rider_of_acherus(Creature *creature)
Definition chapter1.cpp:757
void Reset() override
Definition chapter1.cpp:767
void JustAppeared() override
Definition chapter1.cpp:759
void SpellHitTarget(WorldObject *target, SpellInfo const *spellInfo) override
Definition chapter1.cpp:801
void DamageTaken(Unit *pDoneBy, uint32 &uiDamage, DamageEffectType, SpellInfo const *) override
Definition chapter1.cpp:609
bool OnGossipSelect(Player *player, uint32, uint32 gossipListId) override
Definition chapter1.cpp:673
void SpellHit(WorldObject *caster, SpellInfo const *spellInfo) override
Definition chapter1.cpp:599
void WaypointPathEnded(uint32, uint32 pathId) override
Definition chapter1.cpp:714
npc_dkc1_gothikAI(Creature *creature)
void MoveInLineOfSight(Unit *who) override
void UpdateAI(uint32 diff) override
Definition chapter1.cpp:466
npc_eye_of_acherus(Creature *creature)
Definition chapter1.cpp:442
void MovementInform(uint32 movementType, uint32 pointId) override
Definition chapter1.cpp:510
void OnCharmed(bool apply) override
Definition chapter1.cpp:457
void InitializeAI() override
Definition chapter1.cpp:450
void WaypointPathEnded(uint32, uint32 pathId) override
npc_hearthglen_crusader(Creature *creature)
void UpdateAI(uint32) override
void AttackStart(Unit *who) override
== Triggered Actions Requested ==================
void JustDied(Unit *killer) override
Definition chapter1.cpp:962
bool CanAIAttack(Unit const *target) const override
void UpdateAI(uint32) override
npc_scarlet_ghoul(Creature *creature)
void JustAppeared() override
void FindMinions(Unit *owner)
void EventStart(Creature *anchor, Player *target)
Definition chapter1.cpp:175
void MovementInform(uint32 type, uint32 id) override
Definition chapter1.cpp:157
void SetGUID(ObjectGuid const &guid, int32 id) override
Definition chapter1.cpp:320