TrinityCore
zone_sholazar_basin.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 "DB2Stores.h"
21#include "Map.h"
22#include "MotionMaster.h"
23#include "ObjectAccessor.h"
24#include "ObjectMgr.h"
25#include "Player.h"
26#include "ScriptedEscortAI.h"
27#include "SpellAuras.h"
28#include "SpellScript.h"
29#include "Vehicle.h"
30#include "GameObject.h"
31
32/*######
33## npc_engineer_helice
34######*/
35
37{
38 // Spells
42
43 // Yells
51
52 // Quests
54
56};
57
59{
60 npc_engineer_helice(Creature* creature) : EscortAI(creature) { }
61
62 void WaypointReached(uint32 waypointId, uint32 /*pathId*/) override
63 {
64 switch (waypointId)
65 {
66 case 0:
68 break;
69 case 1:
72 break;
73 case 7:
75 break;
76 case 8:
78 break;
79 case 9:
81 break;
82 case 13:
83 if (Player* player = GetPlayerForEscort())
84 {
85 player->GroupEventHappens(QUEST_DISASTER, me);
87 }
88 break;
89 default:
90 break;
91 }
92 }
93
94 void JustDied(Unit* /*killer*/) override
95 {
97 {
98 if (Player* player = GetPlayerForEscort())
99 player->FailQuest(QUEST_DISASTER);
100 }
101 }
102
103 void OnQuestAccept(Player* player, Quest const* quest) override
104 {
105 if (quest->GetQuestId() == QUEST_DISASTER)
106 {
108
110 Start(false, player->GetGUID());
111 Talk(SAY_WP_1);
112 }
113 }
114};
115
117{
118 static constexpr uint32 SPAWN_GROUP_FLAMES = 67;
119
120 bool Validate(SpellInfo const* /*spellInfo*/) override
121 {
123 }
124
126 {
127 if (Unit* target = GetHitUnit())
128 {
129 target->CastSpell(target, SPELL_EXPLOSION);
130
131 std::vector<WorldObject*> flames;
132 target->GetMap()->SpawnGroupSpawn(SPAWN_GROUP_FLAMES, false, false, &flames);
133 target->GetMap()->SetSpawnGroupInactive(SPAWN_GROUP_FLAMES);
134 for (WorldObject* flame : flames)
135 {
136 if (GameObject* flame_go = flame->ToGameObject())
137 flame_go->DespawnOrUnsummon(20s);
138 }
139 }
140 }
141
143 {
144 if (Creature* caster = GetCaster()->ToCreature())
145 caster->AI()->Talk(EngineerHelice::SAY_WP_4);
146 }
147
148 void Register() override
149 {
152 }
153};
154
156{
157 static constexpr uint32 SPAWN_GROUP_FLAMES = 68;
158
159 bool Validate(SpellInfo const* /*spellInfo*/) override
160 {
162 }
163
165 {
166 if (Unit* target = GetHitUnit())
167 {
168 target->CastSpell(target, SPELL_EXPLOSION);
169
170 std::vector<WorldObject*> flames;
171 target->GetMap()->SpawnGroupSpawn(SPAWN_GROUP_FLAMES, false, false, &flames);
172 target->GetMap()->SetSpawnGroupInactive(SPAWN_GROUP_FLAMES);
173 for (WorldObject* flame : flames)
174 {
175 if (GameObject* flame_go = flame->ToGameObject())
176 flame_go->DespawnOrUnsummon(20s);
177 }
178 }
179 }
180
181 void Register() override
182 {
184 }
185};
186
187/*#####
188## npc_jungle_punch_target
189#####*/
190
192{
193 SPELL_OFFER = 51962,
195
199
200 SAY_HEMET_4 = 3, // unused
201 SAY_HEMET_5 = 4 // unused
203
205{
207
209
211
213
219
221{
223 {
224 Initialize();
225 }
226
228 {
229 sayTimer = 3500;
230 sayStep = 0;
231 timer = 0;
232 phase = 0;
235 }
236
237 void Reset() override
238 {
239 Initialize();
240 }
241
242 void MoveInLineOfSight(Unit* who) override
243 {
244 if (!phase && who && who->GetDistance2d(me) < 10.0f)
245 if (Player* player = who->ToPlayer())
246 if (player->GetQuestStatus(QUEST_THE_MIGHTY_HEMET_NESINGWARY) == QUEST_STATUS_INCOMPLETE)
247 {
248 playerGUID = player->GetGUID();
249 if (Aura* orphanOut = player->GetAura(SPELL_ORPHAN_OUT))
250 if (orphanOut->GetCaster() && orphanOut->GetCaster()->GetEntry() == ORPHAN_WOLVAR)
251 {
252 orphanGUID = orphanOut->GetCaster()->GetGUID();
253 phase = 1;
254 }
255 }
256 }
257
258 void proceedCwEvent(const uint32 diff)
259 {
260 if (timer <= diff)
261 {
264
265 if (!orphan || !player)
266 {
267 Reset();
268 return;
269 }
270
271 switch (phase)
272 {
273 case 1:
274 orphan->GetMotionMaster()->MovePoint(0, me->GetPositionX() + std::cos(me->GetOrientation()) * 5, me->GetPositionY() + std::sin(me->GetOrientation()) * 5, me->GetPositionZ());
275 orphan->AI()->Talk(TEXT_WOLVAR_ORPHAN_6);
276 timer = 5000;
277 break;
278 case 2:
279 orphan->SetFacingToObject(me);
280 orphan->AI()->Talk(TEXT_WOLVAR_ORPHAN_7);
281 timer = 5000;
282 break;
283 case 3:
285 timer = 5000;
286 break;
287 case 4:
288 orphan->AI()->Talk(TEXT_WOLVAR_ORPHAN_8);
289 timer = 5000;
290 break;
291 case 5:
292 orphan->AI()->Talk(TEXT_WOLVAR_ORPHAN_9);
293 timer = 5000;
294 break;
295 case 6:
298 Reset();
299 return;
300 }
301 ++phase;
302 }
303 else
304 timer -= diff;
305 }
306
307 void UpdateAI(uint32 diff) override
308 {
309 if (phase)
310 proceedCwEvent(diff);
311
312 if (!sayStep)
313 return;
314
315 if (sayTimer < diff)
316 {
318 sayTimer = 3000;
319 sayStep++;
320
321 if (sayStep > 3) // end
322 sayStep = 0;
323 }
324 else
325 sayTimer -= diff;
326 }
327
328 void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
329 {
330 if (spellInfo->Id != SPELL_OFFER)
331 return;
332
333 Player* player = caster->ToPlayer();
334 if (!player)
335 return;
336
337 Quest const* quest = sObjectMgr->GetQuestTemplate(QUEST_TASTE_TEST);
338 if (!quest)
339 return;
340
342 return;
343
344 for (uint32 i = 0; i < quest->Objectives.size(); ++i)
345 {
346 if (uint32(quest->Objectives[i].ObjectID) != me->GetEntry())
347 continue;
348
349 if (player->GetQuestObjectiveData(quest->Objectives[i]) != 0)
350 continue;
351
352 player->KilledMonsterCredit(me->GetEntry());
353 sayStep = 1;
354 break;
355 }
356 }
357
358private:
365};
366
367/*######
368## Quest The Lifewarden's Wrath
369######*/
370
372{
373 NPC_PRESENCE = 28563, // Freya's Presence
374 NPC_SABOTEUR = 28538, // Cultist Saboteur
375 NPC_SERVANT = 28320, // Servant of Freya
376
378
384};
385
386// 51957 - Call of the Lifewarden
388{
390 {
391 PreventHitDefaultEffect(effIndex);
392
393 if (Unit* caster = GetCaster())
394 {
395 if (Creature* presence = caster->FindNearestCreature(NPC_PRESENCE, 50.0f))
396 {
397 presence->AI()->Talk(WHISPER_ACTIVATE, caster);
398 presence->CastSpell(presence, SPELL_FREYA_DUMMY, true); // will target plants
399 // Freya Dummy could be scripted with the following code
400
401 // Revive plants
402 std::list<Creature*> servants;
404 for (std::list<Creature*>::iterator itr = servants.begin(); itr != servants.end(); ++itr)
405 {
406 // Couldn't find a spell that does this
407 if ((*itr)->isDead())
408 (*itr)->Respawn(true);
409
410 (*itr)->CastSpell(*itr, SPELL_FREYA_DUMMY_TRIGGER, true);
411 (*itr)->CastSpell(*itr, SPELL_LASHER_EMERGE, false);
412 (*itr)->CastSpell(*itr, SPELL_WILD_GROWTH, false);
413
414 if (Unit* target = (*itr)->SelectNearestTarget(150.0f))
415 (*itr)->AI()->AttackStart(target);
416 }
417
418 // Kill nearby enemies
419 std::list<Creature*> saboteurs;
420 caster->GetCreatureListWithEntryInGrid(saboteurs, NPC_SABOTEUR, 200.0f);
421 for (std::list<Creature*>::iterator itr = saboteurs.begin(); itr != saboteurs.end(); ++itr)
422 if ((*itr)->IsAlive())
423 // Lifeforce has a cast duration, it should be cast at all saboteurs one by one
424 presence->CastSpell((*itr), SPELL_LIFEFORCE, false);
425 }
426 }
427 }
428
429 void Register() override
430 {
432 }
433};
434
435/*######
436## Quest Kick, What Kick? (12589)
437######*/
438
440{
442 NPC_APPLE = 28053,
443 NPC_DROSTAN = 28328,
444 NPC_CRUNCHY = 28346,
446
452
456
460};
461
462// 51330 - Shoot RJR
464{
466 {
467 if (Unit* target = GetExplTargetUnit())
468 if (target->GetEntry() == NPC_LUCKY_WILHELM)
469 return SPELL_CAST_OK;
470
473 }
474
475 void HandleDummy(SpellEffIndex /*effIndex*/)
476 {
477 uint32 roll = urand(1, 100);
478
479 uint8 ev;
480 if (roll <= 50)
481 ev = EVENT_MISS;
482 else if (roll <= 83)
483 ev = EVENT_HIT;
484 else
485 ev = EVENT_MISS_BIRD;
486
487 Unit* shooter = GetCaster();
488 Creature* wilhelm = GetHitUnit()->ToCreature();
489 Creature* apple = shooter->FindNearestCreature(NPC_APPLE, 30);
490 Creature* drostan = shooter->FindNearestCreature(NPC_DROSTAN, 30);
491
492 if (!wilhelm || !apple || !drostan)
493 return;
494
495 switch (ev)
496 {
497 case EVENT_MISS_BIRD:
498 {
499 Creature* crunchy = shooter->FindNearestCreature(NPC_CRUNCHY, 30);
500 Creature* bird = shooter->FindNearestCreature(NPC_THICKBIRD, 30);
501
502 if (bird && crunchy)
503 {
504 shooter->CastSpell(bird, SPELL_MISS_BIRD_APPLE);
505 bird->CastSpell(bird, SPELL_BIRD_FALL);
506 wilhelm->AI()->Talk(SAY_WILHELM_MISS);
507 drostan->AI()->Talk(SAY_DROSTAN_REPLY_MISS);
508
509 bird->KillSelf();
510 crunchy->GetMotionMaster()->MovePoint(0, bird->GetPositionX(), bird->GetPositionY(),
511 bird->GetMap()->GetWaterOrGroundLevel(bird->GetPhaseShift(), bird->GetPositionX(), bird->GetPositionY(), bird->GetPositionZ()));
513 break;
514 }
515 [[fallthrough]];
516 }
517 case EVENT_MISS:
518 {
519 shooter->CastSpell(wilhelm, SPELL_MISS_APPLE);
520 wilhelm->AI()->Talk(SAY_WILHELM_MISS);
521 drostan->AI()->Talk(SAY_DROSTAN_REPLY_MISS);
522 break;
523 }
524 case EVENT_HIT:
525 {
526 shooter->CastSpell(apple, SPELL_HIT_APPLE);
527 apple->CastSpell(apple, SPELL_APPLE_FALL);
528 wilhelm->AI()->Talk(SAY_WILHELM_HIT);
529 if (Player* player = shooter->ToPlayer())
530 player->KilledMonsterCredit(NPC_APPLE);
531 break;
532 }
533 }
534 }
535
536 void Register() override
537 {
540 }
541};
542
543/*######
544## Quest: Song of Wind and Water ID: 12726
545######*/
546/*This quest precisly needs core script since battle vehicles are not well integrated with SAI,
547may be easily converted to SAI when they get.*/
549{
550 // Spells
553 // NPCs
555 NPC_HAIPHOON_AIR = 28985
557
558struct npc_haiphoon : public VehicleAI
559{
560 npc_haiphoon(Creature* creature) : VehicleAI(creature) { }
561
562 void SpellHitTarget(WorldObject* target, SpellInfo const* spellInfo) override
563 {
564 if (target == me)
565 return;
566
568 {
570 }
572 {
574 }
575 }
576};
577
579{
582 SPELL_DEATHBOLT = 51855
584
585// 51854 - Deathbolt
587{
588 bool Validate(SpellInfo const* /*spellInfo*/) override
589 {
590 return ValidateSpellInfo(
591 {
595 });
596 }
597
599 {
600 Unit* caster = GetCaster();
601 Unit* target = GetHitUnit();
602
603 if (target->HasAura(SPELL_FREYAS_WARD))
604 target->CastSpell(caster, SPELL_SEVENFOLD_RETRIBUTION, true);
605 else
606 caster->CastSpell(target, SPELL_DEATHBOLT, true);
607 }
608
609 void Register() override
610 {
612 }
613};
614
615/*######
616## Quest 12683: Burning to Help
617######*/
618
620{
621 SPELL_HYDRA_SPUTUM = 52307
623
624// 52308 - Take Sputum Sample
626{
627 bool Validate(SpellInfo const* spellInfo) override
628 {
629 return ValidateSpellEffect({ { spellInfo->Id, EFFECT_1 } }) && ValidateSpellInfo(
630 {
631 uint32(spellInfo->GetEffect(EFFECT_0).CalcValue()),
632 uint32(spellInfo->GetEffect(EFFECT_1).CalcValue())
633 });
634 }
635
637 {
638 if (!GetCaster()->HasAura(uint32(GetEffectInfo(EFFECT_1).CalcValue())))
640
641 return SPELL_CAST_OK;
642 }
643
644 void HandleDummy(SpellEffIndex /*effIndex*/)
645 {
647 }
648
649 void Register() override
650 {
653 }
654};
655
656// 52306 - Sputum Collected
658{
659 bool Validate(SpellInfo const* /*spellInfo*/) override
660 {
662 }
663
664 void HandleScript(SpellEffIndex /*effIndex*/)
665 {
667 }
668
669 void Register() override
670 {
672 }
673};
674
675/*######
676## Quest 12735: A Cleansing Song
677######*/
678
680{
684
689
690// 52941 - Song of Cleansing
692{
693 bool Validate(SpellInfo const* /*spellInfo*/) override
694 {
695 return ValidateSpellInfo(
696 {
700 });
701 }
702
703 void HandleScript(SpellEffIndex /*effIndex*/)
704 {
705 Unit* caster = GetCaster();
706 switch (caster->GetAreaId())
707 {
709 caster->CastSpell(caster, SPELL_SUMMON_SPIRIT_ATHA);
710 break;
713 break;
715 caster->CastSpell(caster, SPELL_SUMMON_SPIRIT_KOOSU);
716 break;
717 default:
718 break;
719 }
720 }
721
722 void Register() override
723 {
725 }
726};
727
728/*######
729## Quest 12741: Strength of the Tempest
730######*/
731
733{
736
737// 53062 - Lightning Strike
739{
740 bool Validate(SpellInfo const* /*spellInfo*/) override
741 {
743 }
744
745 void HandleScript(SpellEffIndex /*effIndex*/)
746 {
748 }
749
750 void Register() override
751 {
753 }
754};
755
756/*######
757## Quest 12521: Where in the World is Hemet Nesingwary?
758######*/
759
760// 51071 - Flight to Sholazar (Missile Warning)
762{
763 bool Validate(SpellInfo const* spellInfo) override
764 {
765 return sBroadcastTextStore.LookupEntry(uint32(spellInfo->GetEffect(EFFECT_0).CalcValue()));
766 }
767
768 void HandleScript(SpellEffIndex /*effIndex*/)
769 {
770 // 51076 (triggers 51071) is Area Aura - Party and applies on player too (no aura in sniffs on player)
771 // That makes both player and creature say
772 if (Creature* caster = GetCaster()->ToCreature())
773 caster->Unit::Say(uint32(GetEffectValue()), caster);
774 }
775
776 void Register() override
777 {
779 }
780};
781
783{
797}
DB2Storage< BroadcastTextEntry > sBroadcastTextStore("BroadcastText.db2", &BroadcastTextLoadInfo::Instance)
uint8_t uint8
Definition: Define.h:144
int8_t int8
Definition: Define.h:140
uint16_t uint16
Definition: Define.h:143
uint32_t uint32
Definition: Define.h:142
#define sObjectMgr
Definition: ObjectMgr.h:1946
#define PET_FOLLOW_ANGLE
Definition: PetDefines.h:98
#define PET_FOLLOW_DIST
Definition: PetDefines.h:97
@ QUEST_STATUS_INCOMPLETE
Definition: QuestDef.h:145
uint32 urand(uint32 min, uint32 max)
Definition: Random.cpp:42
#define RegisterCreatureAI(ai_name)
Definition: ScriptMgr.h:1380
#define RegisterSpellScript(spell_script)
Definition: ScriptMgr.h:1369
@ STATE_ESCORT_ESCORTING
SpellEffIndex
Definition: SharedDefines.h:29
@ EFFECT_1
Definition: SharedDefines.h:31
@ EFFECT_0
Definition: SharedDefines.h:30
@ SPELL_EFFECT_DUMMY
@ SPELL_EFFECT_SCRIPT_EFFECT
@ SPELL_EFFECT_SEND_EVENT
@ SPELL_CUSTOM_ERROR_MUST_TARGET_WILHELM
SpellCastResult
@ SPELL_FAILED_CASTER_AURASTATE
@ SPELL_FAILED_CUSTOM_ERROR
@ SPELL_CAST_OK
@ FACTION_ESCORTEE_N_NEUTRAL_PASSIVE
#define SpellCheckCastFn(F)
Definition: SpellScript.h:830
#define SpellEffectFn(F, I, N)
Definition: SpellScript.h:842
#define SpellHitFn(F)
Definition: SpellScript.h:854
void Talk(uint8 id, WorldObject const *whisperTarget=nullptr)
Definition: CreatureAI.cpp:56
Creature *const me
Definition: CreatureAI.h:61
bool UpdateEntry(uint32 entry, CreatureData const *data=nullptr, bool updateLevel=true)
Definition: Creature.cpp:577
CreatureAI * AI() const
Definition: Creature.h:214
float GetWaterOrGroundLevel(PhaseShift const &phaseShift, float x, float y, float z, float *ground=nullptr, bool swim=false, float collisionHeight=2.03128f)
Definition: Map.cpp:1777
void MovePoint(uint32 id, Position const &pos, bool generatePath=true, Optional< float > finalOrient={}, Optional< float > speed={}, MovementWalkRunSpeedSelectionMode speedSelectionMode=MovementWalkRunSpeedSelectionMode::Default, Optional< float > closeEnoughDistance={})
void MoveFollow(Unit *target, float dist, ChaseAngle angle, Optional< Milliseconds > duration={}, MovementSlot slot=MOTION_SLOT_ACTIVE)
void Clear()
Definition: ObjectGuid.h:286
static Creature * ToCreature(Object *o)
Definition: Object.h:219
static GameObject * ToGameObject(Object *o)
Definition: Object.h:231
uint32 GetEntry() const
Definition: Object.h:161
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:159
static Player * ToPlayer(Object *o)
Definition: Object.h:213
void KilledMonsterCredit(uint32 entry, ObjectGuid guid=ObjectGuid::Empty)
Definition: Player.cpp:16680
void GroupEventHappens(uint32 questId, WorldObject const *pEventObject)
Definition: Player.cpp:16598
int32 GetQuestObjectiveData(uint32 questId, uint32 objectiveId) const
Definition: Player.cpp:16492
QuestStatus GetQuestStatus(uint32 quest_id) const
Definition: Player.cpp:16050
QuestObjectives Objectives
Definition: QuestDef.h:702
uint32 GetQuestId() const
Definition: QuestDef.h:587
int32 CalcValue(WorldObject const *caster=nullptr, int32 const *basePoints=nullptr, Unit const *target=nullptr, float *variance=nullptr, uint32 castItemId=0, int32 itemLevel=-1) const
Definition: SpellInfo.cpp:495
uint32 const Id
Definition: SpellInfo.h:325
SpellEffectInfo const & GetEffect(SpellEffIndex index) const
Definition: SpellInfo.h:577
static bool ValidateSpellInfo(std::initializer_list< uint32 > spellIds)
Definition: SpellScript.h:162
static bool ValidateSpellEffect(std::initializer_list< std::pair< uint32, SpellEffIndex > > effects)
Definition: SpellScript.h:173
HookList< CheckCastHandler > OnCheckCast
Definition: SpellScript.h:829
Unit * GetCaster() const
HookList< HitHandler > AfterHit
Definition: SpellScript.h:852
HookList< EffectHandler > OnEffectHit
Definition: SpellScript.h:839
void PreventHitDefaultEffect(SpellEffIndex effIndex)
Unit * GetHitUnit() const
int32 GetEffectValue() const
SpellEffectInfo const & GetEffectInfo() const
HookList< EffectHandler > OnEffectHitTarget
Definition: SpellScript.h:840
void SetCustomCastResultMessage(SpellCustomErrors result)
Unit * GetExplTargetUnit() const
SpellCastResult DoCast(uint32 spellId)
Definition: UnitAI.cpp:89
Definition: Unit.h:627
void SetFaction(uint32 faction) override
Definition: Unit.h:859
MotionMaster * GetMotionMaster()
Definition: Unit.h:1652
void SetFacingToObject(WorldObject const *object, bool force=true)
Definition: Unit.cpp:12671
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
Definition: Unit.cpp:4664
void KillSelf(bool durabilityLoss=true, bool skipSettingDeathState=false)
Definition: Unit.h:921
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint32 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:3831
Map * GetMap() const
Definition: Object.h:624
void GetCreatureListWithEntryInGrid(Container &creatureContainer, uint32 entry, float maxSearchRange=250.0f) const
Definition: Object.cpp:3312
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition: Object.cpp:2896
PhaseShift & GetPhaseShift()
Definition: Object.h:523
float GetDistance2d(WorldObject const *obj) const
Definition: Object.cpp:1096
Creature * FindNearestCreature(uint32 entry, float range, bool alive=true) const
Definition: Object.cpp:2148
Player * GetCharmerOrOwnerPlayerOrPlayerItself() const
Definition: Object.cpp:2252
uint32 GetAreaId() const
Definition: Object.h:546
void HandleDummy(SpellEffIndex)
void HandleScriptEffect(SpellEffIndex)
bool Validate(SpellInfo const *) override
void HandleSendEvent(SpellEffIndex effIndex)
static constexpr uint32 SPAWN_GROUP_FLAMES
bool Validate(SpellInfo const *) override
void HandleDummyEffect(SpellEffIndex)
static constexpr uint32 SPAWN_GROUP_FLAMES
bool Validate(SpellInfo const *) override
void HandleDummyEffect(SpellEffIndex)
bool Validate(SpellInfo const *spellInfo) override
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *spellInfo) override
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)
bool HasEscortState(uint32 escortState)
void LoadPath(uint32 pathId)
Player * GetPlayerForEscort()
constexpr float GetPositionX() const
Definition: Position.h:76
constexpr float GetPositionY() const
Definition: Position.h:77
constexpr float GetOrientation() const
Definition: Position.h:79
constexpr float GetPositionZ() const
Definition: Position.h:78
npc_engineer_helice(Creature *creature)
void OnQuestAccept(Player *player, Quest const *quest) override
void WaypointReached(uint32 waypointId, uint32) override
void JustDied(Unit *) override
npc_haiphoon(Creature *creature)
void SpellHitTarget(WorldObject *target, SpellInfo const *spellInfo) override
void SpellHit(WorldObject *caster, SpellInfo const *spellInfo) override
void proceedCwEvent(const uint32 diff)
void UpdateAI(uint32 diff) override
npc_jungle_punch_target(Creature *creature)
void MoveInLineOfSight(Unit *who) override
@ NPC_PRESENCE
@ WHISPER_ACTIVATE
@ SPELL_LASHER_EMERGE
@ SPELL_WILD_GROWTH
@ SPELL_FREYA_DUMMY
@ SPELL_FREYA_DUMMY_TRIGGER
@ NPC_SABOTEUR
@ SPELL_LIFEFORCE
@ SPELL_EXPLOSION
@ SPELL_DETONATE_1
@ SPELL_DETONATE_2
@ PATH_ESCORT_HELICE
@ QUEST_DISASTER
@ SAY_HEMET_HADRIUS_TAMARA_1
@ SAY_HEMET_HADRIUS_TAMARA_3
@ QUEST_TASTE_TEST
@ SAY_HEMET_HADRIUS_TAMARA_2
NesingwaryChildrensWeek
@ QUEST_THE_MIGHTY_HEMET_NESINGWARY
@ TEXT_WOLVAR_ORPHAN_6
@ TEXT_WOLVAR_ORPHAN_7
@ ORPHAN_WOLVAR
@ TEXT_NESINGWARY_1
@ TEXT_WOLVAR_ORPHAN_8
@ SPELL_ORPHAN_OUT
@ TEXT_WOLVAR_ORPHAN_9
void AddSC_sholazar_basin()
@ SPELL_HYDRA_SPUTUM
@ SPELL_FREYAS_WARD
@ SPELL_SEVENFOLD_RETRIBUTION
@ SPELL_DEATHBOLT
StrengthOfTheTempest
@ SPELL_CREATE_POWER_OF_THE_TEMPEST
SongOfWindAndWater
@ SPELL_DEVOUR_WIND
@ NPC_HAIPHOON_AIR
@ NPC_HAIPHOON_WATER
@ SPELL_DEVOUR_WATER
@ SPELL_BIRD_FALL
@ SPELL_MISS_APPLE
@ SAY_DROSTAN_REPLY_MISS
@ SPELL_MISS_BIRD_APPLE
@ SAY_WILHELM_HIT
@ NPC_LUCKY_WILHELM
@ SPELL_APPLE_FALL
@ SAY_WILHELM_MISS
@ EVENT_MISS_BIRD
@ NPC_THICKBIRD
@ SPELL_HIT_APPLE
@ AREA_BITTERTIDE_LAKE
@ SPELL_SUMMON_SPIRIT_HAKHALAN
@ SPELL_SUMMON_SPIRIT_ATHA
@ AREA_RIVERS_HEART
@ SPELL_SUMMON_SPIRIT_KOOSU
@ AREA_WINTERGRASP_RIVER