TrinityCore
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
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 "Map.h"
21#include "MotionMaster.h"
22#include "ObjectAccessor.h"
23#include "ObjectMgr.h"
24#include "Player.h"
25#include "ScriptedEscortAI.h"
26#include "SpellAuras.h"
27#include "SpellScript.h"
28#include "Vehicle.h"
29#include "GameObject.h"
30
31/*######
32## npc_engineer_helice
33######*/
34
36{
37 // Spells
41
42 // Yells
50
51 // Quests
52 QUEST_DISASTER = 12688
53};
54
56{
57 npc_engineer_helice(Creature* creature) : EscortAI(creature) { }
58
59 void WaypointReached(uint32 waypointId, uint32 /*pathId*/) override
60 {
61 switch (waypointId)
62 {
63 case 0:
65 break;
66 case 1:
69 break;
70 case 7:
72 break;
73 case 8:
75 break;
76 case 9:
78 break;
79 case 13:
80 if (Player* player = GetPlayerForEscort())
81 {
82 player->GroupEventHappens(QUEST_DISASTER, me);
84 }
85 break;
86 default:
87 break;
88 }
89 }
90
91 void JustDied(Unit* /*killer*/) override
92 {
94 {
95 if (Player* player = GetPlayerForEscort())
96 player->FailQuest(QUEST_DISASTER);
97 }
98 }
99
100 void OnQuestAccept(Player* player, Quest const* quest) override
101 {
102 if (quest->GetQuestId() == QUEST_DISASTER)
103 {
105
106 Start(false, false, player->GetGUID());
107 Talk(SAY_WP_1);
108 }
109 }
110};
111
113{
115
116 static constexpr uint32 SPAWN_GROUP_FLAMES = 67;
117
118 bool Validate(SpellInfo const* /*spellInfo*/) override
119 {
121 }
122
124 {
125 if (Unit* target = GetHitUnit())
126 {
127 target->CastSpell(target, SPELL_EXPLOSION);
128
129 std::vector<WorldObject*> flames;
130 target->GetMap()->SpawnGroupSpawn(SPAWN_GROUP_FLAMES, false, false, &flames);
131 target->GetMap()->SetSpawnGroupInactive(SPAWN_GROUP_FLAMES);
132 for (WorldObject* flame : flames)
133 {
134 if (GameObject* flame_go = flame->ToGameObject())
135 flame_go->DespawnOrUnsummon(20s);
136 }
137 }
138 }
139
141 {
142 if (Creature* caster = GetCaster()->ToCreature())
143 caster->AI()->Talk(EngineerHelice::SAY_WP_4);
144 }
145
146 void Register() override
147 {
150 }
151};
152
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
341 QuestStatusMap::const_iterator itr = player->getQuestStatusMap().find(QUEST_TASTE_TEST);
342 if (itr->second.Status != QUEST_STATUS_INCOMPLETE)
343 return;
344
345 for (uint8 i = 0; i < 3; ++i)
346 {
347 if (uint32(quest->RequiredNpcOrGo[i]) != me->GetEntry())
348 continue;
349
350 if (itr->second.CreatureOrGOCount[i] != 0)
351 continue;
352
353 player->KilledMonsterCredit(me->GetEntry());
354 sayStep = 1;
355 break;
356 }
357 }
358
359private:
366};
367
368/*######
369## Quest The Lifewarden's Wrath
370######*/
371
373{
374 NPC_PRESENCE = 28563, // Freya's Presence
375 NPC_SABOTEUR = 28538, // Cultist Saboteur
376 NPC_SERVANT = 28320, // Servant of Freya
377
379
385};
386
387// 51957 - Call of the Lifewarden
389{
391
393 {
394 PreventHitDefaultEffect(effIndex);
395
396 if (Unit* caster = GetCaster())
397 {
398 if (Creature* presence = caster->FindNearestCreature(NPC_PRESENCE, 50.0f))
399 {
400 presence->AI()->Talk(WHISPER_ACTIVATE, caster);
401 presence->CastSpell(presence, SPELL_FREYA_DUMMY, true); // will target plants
402 // Freya Dummy could be scripted with the following code
403
404 // Revive plants
405 std::list<Creature*> servants;
407 for (std::list<Creature*>::iterator itr = servants.begin(); itr != servants.end(); ++itr)
408 {
409 // Couldn't find a spell that does this
410 if ((*itr)->isDead())
411 (*itr)->Respawn(true);
412
413 (*itr)->CastSpell(*itr, SPELL_FREYA_DUMMY_TRIGGER, true);
414 (*itr)->CastSpell(*itr, SPELL_LASHER_EMERGE, false);
415 (*itr)->CastSpell(*itr, SPELL_WILD_GROWTH, false);
416
417 if (Unit* target = (*itr)->SelectNearestTarget(150.0f))
418 (*itr)->AI()->AttackStart(target);
419 }
420
421 // Kill nearby enemies
422 std::list<Creature*> saboteurs;
423 caster->GetCreatureListWithEntryInGrid(saboteurs, NPC_SABOTEUR, 200.0f);
424 for (std::list<Creature*>::iterator itr = saboteurs.begin(); itr != saboteurs.end(); ++itr)
425 if ((*itr)->IsAlive())
426 // Lifeforce has a cast duration, it should be cast at all saboteurs one by one
427 presence->CastSpell((*itr), SPELL_LIFEFORCE, false);
428 }
429 }
430 }
431
432 void Register() override
433 {
435 }
436};
437
438/*######
439## Quest Kick, What Kick? (12589)
440######*/
441
443{
445 NPC_APPLE = 28053,
446 NPC_DROSTAN = 28328,
447 NPC_CRUNCHY = 28346,
449
455
459
463};
464
465// 51330 - Shoot RJR
467{
469
471 {
472 if (Unit* target = GetExplTargetUnit())
473 if (target->GetEntry() == NPC_LUCKY_WILHELM)
474 return SPELL_CAST_OK;
475
478 }
479
480 void HandleDummy(SpellEffIndex /*effIndex*/)
481 {
482 uint32 roll = urand(1, 100);
483
484 uint8 ev;
485 if (roll <= 50)
486 ev = EVENT_MISS;
487 else if (roll <= 83)
488 ev = EVENT_HIT;
489 else
490 ev = EVENT_MISS_BIRD;
491
492 Unit* shooter = GetCaster();
493 Creature* wilhelm = GetHitUnit()->ToCreature();
494 Creature* apple = shooter->FindNearestCreature(NPC_APPLE, 30);
495 Creature* drostan = shooter->FindNearestCreature(NPC_DROSTAN, 30);
496
497 if (!wilhelm || !apple || !drostan)
498 return;
499
500 switch (ev)
501 {
502 case EVENT_MISS_BIRD:
503 {
504 Creature* crunchy = shooter->FindNearestCreature(NPC_CRUNCHY, 30);
505 Creature* bird = shooter->FindNearestCreature(NPC_THICKBIRD, 30);
506
507 if (bird && crunchy)
508 {
509 shooter->CastSpell(bird, SPELL_MISS_BIRD_APPLE);
510 bird->CastSpell(bird, SPELL_BIRD_FALL);
511 wilhelm->AI()->Talk(SAY_WILHELM_MISS);
512 drostan->AI()->Talk(SAY_DROSTAN_REPLY_MISS);
513
514 bird->KillSelf();
515 crunchy->GetMotionMaster()->MovePoint(0, bird->GetPositionX(), bird->GetPositionY(),
516 bird->GetMap()->GetWaterOrGroundLevel(bird->GetPhaseMask(), bird->GetPositionX(), bird->GetPositionY(), bird->GetPositionZ()));
518 break;
519 }
520 [[fallthrough]];
521 }
522 case EVENT_MISS:
523 {
524 shooter->CastSpell(wilhelm, SPELL_MISS_APPLE);
525 wilhelm->AI()->Talk(SAY_WILHELM_MISS);
526 drostan->AI()->Talk(SAY_DROSTAN_REPLY_MISS);
527 break;
528 }
529 case EVENT_HIT:
530 {
531 shooter->CastSpell(apple, SPELL_HIT_APPLE);
532 apple->CastSpell(apple, SPELL_APPLE_FALL);
533 wilhelm->AI()->Talk(SAY_WILHELM_HIT);
534 if (Player* player = shooter->ToPlayer())
535 player->KilledMonsterCredit(NPC_APPLE);
536 break;
537 }
538 }
539 }
540
541 void Register() override
542 {
545 }
546};
547
548/*######
549## Quest: Song of Wind and Water ID: 12726
550######*/
551/*This quest precisly needs core script since battle vehicles are not well integrated with SAI,
552may be easily converted to SAI when they get.*/
554{
555 // Spells
558 // NPCs
560 NPC_HAIPHOON_AIR = 28985
562
563struct npc_haiphoon : public VehicleAI
564{
565 npc_haiphoon(Creature* creature) : VehicleAI(creature) { }
566
567 void SpellHitTarget(WorldObject* target, SpellInfo const* spellInfo) override
568 {
569 if (target == me)
570 return;
571
573 {
575 }
577 {
579 }
580 }
581};
582
584{
587 SPELL_DEATHBOLT = 51855
589
590// 51854 - Deathbolt
592{
594
595 bool Validate(SpellInfo const* /*spellInfo*/) override
596 {
597 return ValidateSpellInfo(
598 {
602 });
603 }
604
606 {
607 Unit* caster = GetCaster();
608 Unit* target = GetHitUnit();
609
610 if (target->HasAura(SPELL_FREYAS_WARD))
611 target->CastSpell(caster, SPELL_SEVENFOLD_RETRIBUTION, true);
612 else
613 caster->CastSpell(target, SPELL_DEATHBOLT, true);
614 }
615
616 void Register() override
617 {
619 }
620};
621
622/*######
623## Quest 12683: Burning to Help
624######*/
625
627{
628 SPELL_HYDRA_SPUTUM = 52307
630
631// 52308 - Take Sputum Sample
633{
635
636 bool Validate(SpellInfo const* spellInfo) override
637 {
638 return ValidateSpellInfo(
639 {
640 uint32(spellInfo->GetEffect(EFFECT_0).CalcValue()),
641 uint32(spellInfo->GetEffect(EFFECT_1).CalcValue())
642 });
643 }
644
646 {
647 if (!GetCaster()->HasAura(uint32(GetEffectInfo(EFFECT_1).CalcValue())))
649
650 return SPELL_CAST_OK;
651 }
652
653 void HandleDummy(SpellEffIndex /*effIndex*/)
654 {
656 }
657
658 void Register() override
659 {
662 }
663};
664
665// 52306 - Sputum Collected
667{
669
670 bool Validate(SpellInfo const* /*spellInfo*/) override
671 {
673 }
674
675 void HandleScript(SpellEffIndex /*effIndex*/)
676 {
678 }
679
680 void Register() override
681 {
683 }
684};
685
686/*######
687## Quest 12735: A Cleansing Song
688######*/
689
691{
695
700
701// 52941 - Song of Cleansing
703{
705
706 bool Validate(SpellInfo const* /*spellInfo*/) override
707 {
708 return ValidateSpellInfo(
709 {
713 });
714 }
715
716 void HandleScript(SpellEffIndex /*effIndex*/)
717 {
718 Unit* caster = GetCaster();
719 switch (caster->GetAreaId())
720 {
722 caster->CastSpell(caster, SPELL_SUMMON_SPIRIT_ATHA);
723 break;
726 break;
728 caster->CastSpell(caster, SPELL_SUMMON_SPIRIT_KOOSU);
729 break;
730 default:
731 break;
732 }
733 }
734
735 void Register() override
736 {
738 }
739};
740
741/*######
742## Quest 12741: Strength of the Tempest
743######*/
744
746{
749
750// 53062 - Lightning Strike
752{
754
755 bool Validate(SpellInfo const* /*spellInfo*/) override
756 {
758 }
759
760 void HandleScript(SpellEffIndex /*effIndex*/)
761 {
763 }
764
765 void Register() override
766 {
768 }
769};
770
771/*######
772## Quest 12521: Where in the World is Hemet Nesingwary?
773######*/
774
775// 51071 - Flight to Sholazar (Missile Warning)
777{
779
780 bool Validate(SpellInfo const* spellInfo) override
781 {
782 return sObjectMgr->GetBroadcastText(uint32(spellInfo->GetEffect(EFFECT_0).CalcValue()));
783 }
784
785 void HandleScript(SpellEffIndex /*effIndex*/)
786 {
787 // 51076 (triggers 51071) is Area Aura - Party and applies on player too (no aura in sniffs on player)
788 // That makes both player and creature say
789 if (Creature* caster = GetCaster()->ToCreature())
790 caster->Unit::Say(uint32(GetEffectValue()), caster);
791 }
792
793 void Register() override
794 {
796 }
797};
798
800{
814}
uint8_t uint8
Definition: Define.h:135
int8_t int8
Definition: Define.h:131
uint16_t uint16
Definition: Define.h:134
uint32_t uint32
Definition: Define.h:133
#define sObjectMgr
Definition: ObjectMgr.h:1723
#define PET_FOLLOW_ANGLE
Definition: PetDefines.h:86
#define PET_FOLLOW_DIST
Definition: PetDefines.h:85
@ QUEST_STATUS_INCOMPLETE
Definition: QuestDef.h:107
uint32 urand(uint32 min, uint32 max)
Definition: Random.cpp:42
#define RegisterCreatureAI(ai_name)
Definition: ScriptMgr.h:1140
#define RegisterSpellScript(spell_script)
Definition: ScriptMgr.h:1129
@ STATE_ESCORT_ESCORTING
SpellEffIndex
Definition: SharedDefines.h:30
@ EFFECT_1
Definition: SharedDefines.h:32
@ EFFECT_0
Definition: SharedDefines.h:31
@ SPELL_EFFECT_DUMMY
@ SPELL_EFFECT_SCRIPT_EFFECT
@ SPELL_EFFECT_SEND_EVENT
@ SPELL_CUSTOM_ERROR_MUST_TARGET_WILHELM
@ FACTION_ESCORTEE_N_NEUTRAL_PASSIVE
SpellCastResult
@ SPELL_FAILED_CASTER_AURASTATE
@ SPELL_FAILED_CUSTOM_ERROR
@ SPELL_CAST_OK
#define SpellCheckCastFn(F)
Definition: SpellScript.h:370
#define SpellEffectFn(F, I, N)
Definition: SpellScript.h:384
#define SpellHitFn(F)
Definition: SpellScript.h:396
void Talk(uint8 id, WorldObject const *whisperTarget=nullptr)
Definition: CreatureAI.cpp:48
Creature *const me
Definition: CreatureAI.h:81
bool UpdateEntry(uint32 entry, CreatureData const *data=nullptr, bool updateLevel=true)
Definition: Creature.cpp:540
CreatureAI * AI() const
Definition: Creature.h:154
float GetWaterOrGroundLevel(uint32 phasemask, float x, float y, float z, float *ground=nullptr, bool swim=false, float collisionHeight=2.03128f) const
Definition: Map.cpp:2458
void MovePoint(uint32 id, Position const &pos, bool generatePath=true, Optional< float > finalOrient={})
void MoveFollow(Unit *target, float dist, ChaseAngle angle, MovementSlot slot=MOTION_SLOT_ACTIVE)
void Clear()
Definition: ObjectGuid.h:151
static Creature * ToCreature(Object *o)
Definition: Object.h:185
static GameObject * ToGameObject(Object *o)
Definition: Object.h:197
uint32 GetEntry() const
Definition: Object.h:80
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:77
static Player * ToPlayer(Object *o)
Definition: Object.h:179
Definition: Player.h:915
void KilledMonsterCredit(uint32 entry, ObjectGuid guid=ObjectGuid::Empty)
Definition: Player.cpp:16273
QuestStatusMap & getQuestStatusMap()
Definition: Player.h:1408
void GroupEventHappens(uint32 questId, WorldObject const *pEventObject)
Definition: Player.cpp:16165
int32 RequiredNpcOrGo[QUEST_OBJECTIVES_COUNT]
Definition: QuestDef.h:308
uint32 GetQuestId() const
Definition: QuestDef.h:229
int32 CalcValue(WorldObject const *caster=nullptr, int32 const *basePoints=nullptr) const
Definition: SpellInfo.cpp:433
uint32 Id
Definition: SpellInfo.h:293
SpellEffectInfo const & GetEffect(SpellEffIndex index) const
Definition: SpellInfo.h:487
HookList< CheckCastHandler > OnCheckCast
Definition: SpellScript.h:369
Unit * GetCaster() const
HookList< HitHandler > AfterHit
Definition: SpellScript.h:394
HookList< EffectHandler > OnEffectHit
Definition: SpellScript.h:381
void PreventHitDefaultEffect(SpellEffIndex effIndex)
Unit * GetHitUnit() const
int32 GetEffectValue() const
SpellEffectInfo const & GetEffectInfo() const
HookList< EffectHandler > OnEffectHitTarget
Definition: SpellScript.h:382
void SetCustomCastResultMessage(SpellCustomErrors result)
Unit * GetExplTargetUnit() const
SpellCastResult DoCast(uint32 spellId)
Definition: UnitAI.cpp:114
Definition: Unit.h:769
void KillSelf(bool durabilityLoss=true)
Definition: Unit.h:1021
void SetFaction(uint32 faction) override
Definition: Unit.h:972
MotionMaster * GetMotionMaster()
Definition: Unit.h:1667
void SetFacingToObject(WorldObject const *object, bool force=true)
Definition: Unit.cpp:13300
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition: Unit.cpp:4531
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:3780
uint32 GetPhaseMask() const
Definition: Object.h:368
Map * GetMap() const
Definition: Object.h:449
void GetCreatureListWithEntryInGrid(Container &creatureContainer, uint32 entry, float maxSearchRange=250.0f) const
Definition: Object.cpp:3152
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition: Object.cpp:2831
float GetDistance2d(WorldObject const *obj) const
Definition: Object.cpp:1134
Creature * FindNearestCreature(uint32 entry, float range, bool alive=true) const
Definition: Object.cpp:2099
Player * GetCharmerOrOwnerPlayerOrPlayerItself() const
Definition: Object.cpp:2202
uint32 GetAreaId() const
Definition: Object.h:374
static bool ValidateSpellInfo(std::initializer_list< uint32 > spellIds)
Definition: SpellScript.h:145
PrepareSpellScript(spell_q12589_shoot_rjr)
void HandleDummy(SpellEffIndex)
void HandleScriptEffect(SpellEffIndex)
PrepareSpellScript(spell_q12611_deathbolt)
bool Validate(SpellInfo const *) override
PrepareSpellScript(spell_q12620_the_lifewarden_wrath)
void HandleSendEvent(SpellEffIndex effIndex)
PrepareSpellScript(spell_q12688_detonate_1)
static constexpr uint32 SPAWN_GROUP_FLAMES
bool Validate(SpellInfo const *) override
void HandleDummyEffect(SpellEffIndex)
static constexpr uint32 SPAWN_GROUP_FLAMES
PrepareSpellScript(spell_q12688_detonate_2)
bool Validate(SpellInfo const *) override
void HandleDummyEffect(SpellEffIndex)
PrepareSpellScript(spell_sholazar_flight_to_sholazar)
bool Validate(SpellInfo const *spellInfo) override
PrepareSpellScript(spell_sholazar_lightning_strike)
bool Validate(SpellInfo const *) override
PrepareSpellScript(spell_sholazar_song_of_cleansing)
bool Validate(SpellInfo const *) override
PrepareSpellScript(spell_sholazar_sputum_collected)
bool Validate(SpellInfo const *) override
PrepareSpellScript(spell_sholazar_take_sputum_sample)
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)
bool HasEscortState(uint32 escortState)
void Start(bool isActiveAttacker=true, bool run=false, ObjectGuid playerGUID=ObjectGuid::Empty, Quest const *quest=nullptr, bool instantRespawn=false, bool canLoopPath=false, bool resetWaypoints=true)
Player * GetPlayerForEscort()
float GetPositionZ() const
Definition: Position.h:81
float GetOrientation() const
Definition: Position.h:82
float GetPositionX() const
Definition: Position.h:79
float GetPositionY() const
Definition: Position.h:80
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
@ 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