/*
* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see .
*/
#include "CreatureAIImpl.h"
#include "GameObject.h"
#include "MotionMaster.h"
#include "Player.h"
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "Spell.h"
#include "SpellAuraEffects.h"
#include "SpellInfo.h"
#include "SpellScript.h"
#include "ScriptedGossip.h"
#include "PassiveAI.h"
#include "ObjectAccessor.h"
namespace Scripts::Kalimdor::Durotar
{
namespace Spells
{
// All Aboard!
static constexpr uint32 PhasePlayer = 130750;
// Into the Mists
static constexpr uint32 TeleportTimer = 132034;
static constexpr uint32 TeleportPlayerToCrashSite = 102930;
}
/*######
## Quest 37446: Lazy Peons
## npc_lazy_peon
######*/
enum LazyPeonYells
{
SAY_SPELL_HIT = 0
};
enum LazyPeon
{
QUEST_LAZY_PEONS = 37446,
GO_LUMBERPILE = 175784,
SPELL_BUFF_SLEEP = 17743,
SPELL_AWAKEN_PEON = 19938
};
class npc_lazy_peon : public CreatureScript
{
public:
npc_lazy_peon() : CreatureScript("npc_lazy_peon") { }
CreatureAI* GetAI(Creature* creature) const override
{
return new npc_lazy_peonAI(creature);
}
struct npc_lazy_peonAI : public ScriptedAI
{
npc_lazy_peonAI(Creature* creature) : ScriptedAI(creature)
{
Initialize();
}
void Initialize()
{
RebuffTimer = 0;
work = false;
}
uint32 RebuffTimer;
bool work;
void Reset() override
{
Initialize();
}
void MovementInform(uint32 /*type*/, uint32 id) override
{
if (id == 1)
work = true;
}
void SpellHit(WorldObject* caster, SpellInfo const* spell) override
{
if (spell->Id != SPELL_AWAKEN_PEON)
return;
Player* player = caster->ToPlayer();
if (player && player->GetQuestStatus(QUEST_LAZY_PEONS) == QUEST_STATUS_INCOMPLETE)
{
player->KilledMonsterCredit(me->GetEntry(), me->GetGUID());
Talk(SAY_SPELL_HIT, caster);
me->RemoveAllAuras();
if (GameObject* Lumberpile = me->FindNearestGameObject(GO_LUMBERPILE, 20))
me->GetMotionMaster()->MovePoint(1, Lumberpile->GetPositionX()-1, Lumberpile->GetPositionY(), Lumberpile->GetPositionZ());
}
}
void UpdateAI(uint32 diff) override
{
if (work == true)
me->HandleEmoteCommand(EMOTE_ONESHOT_WORK_CHOPWOOD);
if (RebuffTimer <= diff)
{
DoCast(me, SPELL_BUFF_SLEEP);
RebuffTimer = 300000; //Rebuff agian in 5 minutes
}
else
RebuffTimer -= diff;
if (!UpdateVictim())
return;
}
};
};
enum VoodooSpells
{
SPELL_BREW = 16712, // Special Brew
SPELL_GHOSTLY = 16713, // Ghostly
SPELL_HEX1 = 16707, // Hex
SPELL_HEX2 = 16708, // Hex
SPELL_HEX3 = 16709, // Hex
SPELL_GROW = 16711, // Grow
SPELL_LAUNCH = 16716, // Launch (Whee!)
};
// 17009 - Voodoo
class spell_voodoo : public SpellScript
{
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo({ SPELL_BREW, SPELL_GHOSTLY, SPELL_HEX1, SPELL_HEX2, SPELL_HEX3, SPELL_GROW, SPELL_LAUNCH });
}
void HandleDummy(SpellEffIndex /*effIndex*/)
{
uint32 spellid = RAND(SPELL_BREW, SPELL_GHOSTLY, RAND(SPELL_HEX1, SPELL_HEX2, SPELL_HEX3), SPELL_GROW, SPELL_LAUNCH);
if (Unit* target = GetHitUnit())
GetCaster()->CastSpell(target, spellid, false);
}
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_voodoo::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
enum Mithaka
{
DATA_SHIP_DOCKED = 1,
GOSSIP_MENU_MITHAKA = 23225,
GOSSIP_TEXT_MITHAKA = 35969
};
struct npc_mithaka : ScriptedAI
{
npc_mithaka(Creature* creature) : ScriptedAI(creature), _shipInPort(false) { }
void SetData(uint32 /*type*/, uint32 data) override
{
if (data == DATA_SHIP_DOCKED)
_shipInPort = true;
else
_shipInPort = false;
}
bool OnGossipHello(Player* player) override
{
InitGossipMenuFor(player, GOSSIP_MENU_MITHAKA);
if (!_shipInPort)
AddGossipItemFor(player, GOSSIP_MENU_MITHAKA, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
SendGossipMenuFor(player, GOSSIP_TEXT_MITHAKA, me->GetGUID());
return true;
}
private:
bool _shipInPort;
};
// Echo Isles
// 91404 - Summon Zuni (Lvl 1)
class spell_durotar_summon_zuni : public SpellScript
{
void SetDest(SpellDestination& dest)
{
dest.Relocate({ -1173.4531f, -5266.401f, 0.85905945f, 0.0f });
}
void Register() override
{
OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_durotar_summon_zuni::SetDest, EFFECT_0, TARGET_DEST_NEARBY_ENTRY);
}
};
enum TikiTargetData
{
SPELL_ARCANE_MISSILES_TRAINER = 83470,
SPELL_TIKI_TARGET_VISUAL_1 = 71064,
SPELL_TIKI_TARGET_VISUAL_2 = 71065,
SPELL_TIKI_TARGET_VISUAL_3 = 71066,
SPELL_TIKI_TARGET_DEATH = 71240
};
uint32 const TiKiTargetMask[3] = { SPELL_TIKI_TARGET_VISUAL_1, SPELL_TIKI_TARGET_VISUAL_2, SPELL_TIKI_TARGET_VISUAL_3 };
struct npc_durotar_tiki_target : public ScriptedAI
{
npc_durotar_tiki_target(Creature* creature) : ScriptedAI(creature), _credited(false) { }
void JustAppeared() override
{
me->SetReactState(REACT_PASSIVE);
DoCastSelf(TiKiTargetMask[urand(0, 2)]);
DoCastSelf(SPELL_ARCANE_MISSILES_TRAINER);
}
void DamageTaken(Unit* attacker, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
{
if (me->GetHealth() <= damage)
{
damage = 0;
me->SetHealth(1);
if (!_credited)
{
_credited = true;
DoCastSelf(SPELL_TIKI_TARGET_DEATH);
if (Player* player = attacker->ToPlayer())
player->KilledMonsterCredit(me->GetEntry());
me->DespawnOrUnsummon(2s, 13s);
}
}
}
private:
bool _credited;
};
enum DarkspearJailorData
{
ACTION_EVENT_COMPLETE = 1,
ACTION_MOVE_TO_PRISONER = 1,
EVENT_PLAYER_ACCEPT_CHALLENGE = 1,
EVENT_WALK_BACK_TO_HOME = 2,
GOSSIP_JAILOR_EVENT_NOT_READY = 10973,
GOSSIP_JAILOR_EVENT_READY = 10974,
GOSSIP_EVENT_IN_PROGRESS_ID = 10973,
TEXT_GOSSIP_EVENT_IN_PROGRESS = 15252,
NPC_DARKSPEAR_JAILOR = 39062,
NPC_CAPTIVE_SPITESCALE_SCOUT = 38142,
PATH_CAGE_ONE = 30915500,
PATH_HOME_ONE = 30915501,
PATH_CAGE_TWO = 30908200,
PATH_HOME_TWO = 30908201,
SAY_GET_IN_THE_PIT = 0,
SPELL_ACTIVATE_DNT = 227105,
};
// 39062 - Darkspear Jailor
struct npc_darkspear_jailor : public ScriptedAI
{
npc_darkspear_jailor(Creature* creature) : ScriptedAI(creature), _eventInProgress(false), _pathCage(0), _pathHome(0) { }
void JustAppeared() override
{
me->SetGossipMenuId(GOSSIP_JAILOR_EVENT_READY);
if (me->HasStringId("darkspear_jailor_one"))
{
_pathCage = PATH_CAGE_ONE;
_pathHome = PATH_HOME_ONE;
}
else if (me->HasStringId("darkspear_jailor_two"))
{
_pathCage = PATH_CAGE_TWO;
_pathHome = PATH_HOME_TWO;
}
}
void DoAction(int32 param) override
{
if (param == ACTION_EVENT_COMPLETE)
{
_eventInProgress = false;
me->SetGossipMenuId(GOSSIP_JAILOR_EVENT_READY);
}
}
void WaypointPathEnded(uint32 /*nodeId*/, uint32 pathId) override
{
if (pathId == _pathCage)
{
me->HandleEmoteCommand(EMOTE_ONESHOT_USE_STANDING);
me->CastSpell(me, SPELL_ACTIVATE_DNT);
_events.ScheduleEvent(EVENT_WALK_BACK_TO_HOME, 1s);
}
}
bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override
{
CloseGossipMenuFor(player);
player->KilledMonsterCredit(NPC_DARKSPEAR_JAILOR);
Talk(SAY_GET_IN_THE_PIT, player);
_eventInProgress = true;
me->SetGossipMenuId(GOSSIP_JAILOR_EVENT_NOT_READY);
_events.ScheduleEvent(EVENT_PLAYER_ACCEPT_CHALLENGE, 2s);
return true;
}
void UpdateAI(uint32 diff) override
{
_events.Update(diff);
while (uint32 eventId = _events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_PLAYER_ACCEPT_CHALLENGE:
me->GetMotionMaster()->MovePath(_pathCage, false);
break;
case EVENT_WALK_BACK_TO_HOME:
if (Creature* scout = me->FindNearestCreature(NPC_CAPTIVE_SPITESCALE_SCOUT, 5.0f, true))
scout->AI()->DoAction(ACTION_MOVE_TO_PRISONER);
me->GetMotionMaster()->MovePath(_pathHome, false);
break;
default:
break;
}
}
if (!UpdateVictim())
return;
}
private:
EventMap _events;
bool _eventInProgress;
uint32 _pathCage;
uint32 _pathHome;
};
enum CaptiveSpitescaleScoutData
{
EVENT_UPDATE_JAILOR_GOSSIP = 1,
EVENT_TALK_TO_PLAYER = 2,
EVENT_DESPAWN_OUT_OF_COMBAT = 3,
EVENT_CAST_FROSTSHOCK = 4,
POINT_PRISONER_POSITION = 0,
SAY_SEND_YOU_TO_YOUR_DEATH = 0,
SPELL_FROST_SHOCK = 15089
};
Position const PrisonerPositionOne = { -1142.49f, -5415.59f, 10.597655f };
Position const PrisonerPositionTwo = { -1149.03f, -5526.18f, 8.1045685f };
// 38142 - Captive Spitescale Scout
struct npc_captive_spitescale_scout : public ScriptedAI
{
npc_captive_spitescale_scout(Creature* creature) : ScriptedAI(creature) { }
void JustAppeared() override
{
_events.ScheduleEvent(EVENT_UPDATE_JAILOR_GOSSIP, 2s);
}
void JustDied(Unit* /*killer*/) override
{
me->SetImmuneToPC(true);
me->DespawnOrUnsummon(10s, 7s);
}
void EnterEvadeMode(EvadeReason /*why*/) override
{
me->DespawnOrUnsummon(0s, 2s);
}
void JustEngagedWith(Unit* /*who*/) override
{
_events.CancelEvent(EVENT_DESPAWN_OUT_OF_COMBAT);
_events.ScheduleEvent(EVENT_CAST_FROSTSHOCK, 2s, 4s);
}
void DoAction(int32 param) override
{
if (param == ACTION_MOVE_TO_PRISONER)
{
me->SetWalk(true);
if (me->HasStringId("captive_spitescale_scout_one"))
me->GetMotionMaster()->MovePoint(POINT_PRISONER_POSITION, PrisonerPositionOne);
else if (me->HasStringId("captive_spitescale_scout_two"))
me->GetMotionMaster()->MovePoint(POINT_PRISONER_POSITION, PrisonerPositionTwo);
}
}
void MovementInform(uint32 type, uint32 id) override
{
if (type == POINT_MOTION_TYPE && id == POINT_PRISONER_POSITION)
{
_events.ScheduleEvent(EVENT_TALK_TO_PLAYER, 1s);
_events.ScheduleEvent(EVENT_DESPAWN_OUT_OF_COMBAT, 100s);
}
}
void UpdateAI(uint32 diff) override
{
_events.Update(diff);
while (uint32 eventId = _events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_UPDATE_JAILOR_GOSSIP:
if (Creature* jailer = me->FindNearestCreature(NPC_DARKSPEAR_JAILOR, 25.0f, true))
jailer->AI()->DoAction(ACTION_EVENT_COMPLETE);
break;
case EVENT_TALK_TO_PLAYER:
Talk(SAY_SEND_YOU_TO_YOUR_DEATH);
me->SetImmuneToPC(false);
break;
case EVENT_DESPAWN_OUT_OF_COMBAT:
me->DespawnOrUnsummon(0s, 2s);
break;
case EVENT_CAST_FROSTSHOCK:
DoCastVictim(SPELL_FROST_SHOCK);
break;
default:
break;
}
}
if (!UpdateVictim())
return;
}
private:
EventMap _events;
ObjectGuid _jailorGUID;
};
enum ProvingPitData
{
EVENT_MOVE_TO_PIT = 1,
EVENT_MOVE_HOME = 2,
GOSSIP_MENU_ARCANE_MOMENTUN = 20690,
GOSSIP_OPTION_TRAIN_MOMENTUM = 0,
GOSSIP_OPTION_UNTRAIN_MOMENTUM = 1,
NPC_TRAINER_NORTET = 38037, // Warrior Trainer
NPC_TRAINER_TUNARI = 38245, // Priest Trainer
NPC_TRAINER_SERATHA = 38246, // Mage Trainer
NPC_TRAINER_LEGATI = 38244, // Rogue Trainer
NPC_TRAINER_NEKALI = 38242, // Shaman Trainer
NPC_TRAINER_ERTEZZA = 38247, // Hunter Trainer
NPC_TRAINER_ZENTABRA = 38243, // Druid Trainer
NPC_TRAINER_VOLDREKA = 42618, // Warlock Trainer
NPC_TRAINER_ZABRAX = 63310, // Monk Trainer
QUEST_PROVING_PIT_WARRIOR = 24642,
QUEST_PROVING_PIT_PRIEST = 24786,
QUEST_PROVING_PIT_MAGE = 24754,
QUEST_PROVING_PIT_ROGUE = 24774,
QUEST_PROVING_PIT_SHAMAN = 24762,
QUEST_PROVING_PIT_HUNTER = 24780,
QUEST_PROVING_PIT_DRUID = 24768,
QUEST_PROVING_PIT_WARLOCK = 26276,
QUEST_PROVING_PIT_MONK = 31161,
SPELL_LEARN_ARCANE_MOMENTUM = 232062,
SPELL_UNLEARN_ARCANE_MOMENTUM = 232063,
SAY_NOT_BAD = 0,
SAY_WELL_DONE = 1,
POINT_INITIAL_HOME = 1,
};
// Path point to proving pit fo trainers
Position const EchoIslandTrainersPitPoints[9] =
{
{ -1158.99f, -5421.14f, 13.218976f, 0.2094395f }, // Nortet Pit
{ -1137.0f, -5528.23f, 11.979752f, 3.1764990f }, // Tunari Pit
{ -1145.95f, -5543.13f, 12.48863f, 1.7278759f }, // Seratha Pit
{ -1146.67f, -5430.05f, 13.596256f, 1.4835298f }, // Legati Pit
{ -1152.22f, -5407.6f, 13.263395f, 4.904375f }, // Nekali Pit
{ -1136.46f, -5525.13f, 11.99673f, 3.3161256f }, // Ertezza Pit
{ -1158.81f, -5533.08f, 11.939185f, 0.3141593f }, // Zentabra Pit
{ -1149.92f, -5407.46f, 13.235063f, 4.956735f }, // Voldreka Pit
{ -1151.54f, -5429.86f, 13.29182f, 1.256637f } // Zabrax Pit
};
template
struct npc_echo_isles_class_trainer : public ScriptedAI
{
npc_echo_isles_class_trainer(Creature* creature) : ScriptedAI(creature), _canMoveToPit(true) { }
void JustAppeared() override
{
_initialHomePosition = me->GetPosition();
}
void MovementInform(uint32 type, uint32 id) override
{
if (type == POINT_MOTION_TYPE && id == POINT_INITIAL_HOME)
_canMoveToPit = true;
}
void OnQuestAccept(Player* /*player*/, Quest const* quest) override
{
if (quest->GetQuestId() == QuestID)
{
if (_canMoveToPit)
{
_events.ScheduleEvent(EVENT_MOVE_TO_PIT, 2s);
_canMoveToPit = false;
}
}
}
void OnQuestReward(Player* /*player*/, Quest const* quest, LootItemType /*type*/, uint32 /*opt*/) override
{
if (quest->GetQuestId() == QuestID)
_events.RescheduleEvent(EVENT_MOVE_HOME, 60s);
}
bool OnGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
{
// Use by Mage
if (menuId == GOSSIP_MENU_ARCANE_MOMENTUN)
{
CloseGossipMenuFor(player);
switch (gossipListId)
{
case GOSSIP_OPTION_TRAIN_MOMENTUM:
player->CastSpell(player, SPELL_LEARN_ARCANE_MOMENTUM);
break;
case GOSSIP_OPTION_UNTRAIN_MOMENTUM:
player->CastSpell(player, SPELL_UNLEARN_ARCANE_MOMENTUM);
break;
default:
break;
}
return true;
}
return false;
}
void UpdateAI(uint32 diff) override
{
_events.Update(diff);
while (uint32 eventId = _events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_MOVE_TO_PIT:
me->SetWalk(true);
me->GetMotionMaster()->MovePoint(0, EchoIslandTrainersPitPoints[PitPos], true, EchoIslandTrainersPitPoints[PitPos].GetOrientation());
_events.ScheduleEvent(EVENT_MOVE_HOME, 300s);
break;
case EVENT_MOVE_HOME:
me->SetWalk(true);
me->GetMotionMaster()->MovePoint(POINT_INITIAL_HOME, _initialHomePosition, true, _initialHomePosition.GetOrientation());
break;
default:
break;
}
}
if (!UpdateVictim())
return;
}
private:
EventMap _events;
bool _canMoveToPit;
Position _initialHomePosition;
};
// 24639 - The Basics: Hitting Things (Warrior)
// 24783 - The Basics: Hitting Things (Priest)
// 24751 - The Basics: Hitting Things (Mage)
// 24771 - The Basics: Hitting Things (Rogue)
// 24759 - The Basics: Hitting Things (Shaman)
// 24777 - The Basics: Hitting Things (Hunter)
// 24765 - The Basics: Hitting Things (Druid)
// 26273 - The Basics: Hitting Things (Warlock)
// 31158 - The Basics: Hitting Things (Monk)
template
class quest_the_basics_hitting_things : public QuestScript
{
public:
quest_the_basics_hitting_things(char const* scriptName) : QuestScript(scriptName) { }
void OnQuestStatusChange(Player* player, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus newStatus) override
{
if (newStatus == QUEST_STATUS_COMPLETE)
{
if (Creature* creature = player->FindNearestCreature(TrainerEntry, 50.0f, true))
creature->AI()->Talk(SAY_NOT_BAD, player);
}
}
};
// 24642 - Proving Pit (Warrior)
// 24786 - Proving Pit (Priest)
// 24754 - Proving Pit (Mage)
// 24774 - Proving Pit (Rogue)
// 24762 - Proving Pit (Shaman)
// 24780 - Proving Pit (Hunter)
// 24768 - Proving Pit (Druid)
// 26276 - Proving Pit (Warlock)
// 31161 - Proving Pit (Monk)
template
class quest_proving_pit : public QuestScript
{
public:
quest_proving_pit(char const* scriptName) : QuestScript(scriptName) { }
void OnQuestStatusChange(Player* player, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus newStatus) override
{
if (newStatus == QUEST_STATUS_COMPLETE)
{
if (Creature* creature = player->FindNearestCreature(TrainerId, 50.0f, true))
creature->AI()->Talk(SAY_WELL_DONE, player);
}
}
};
enum VoljinVisionData
{
EVENT_VOLJIN_VISION_SCRIPT_1 = 1,
EVENT_VOLJIN_VISION_SCRIPT_2 = 2,
EVENT_VOLJIN_VISION_SCRIPT_3 = 3,
EVENT_VOLJIN_VISION_SCRIPT_4 = 4,
EVENT_VOLJIN_VISION_SCRIPT_5 = 5,
EVENT_VOLJIN_VISION_SCRIPT_6 = 6,
EVENT_VOLJIN_VISION_SCRIPT_7 = 7,
EVENT_VOLJIN_VISION_SCRIPT_8 = 8,
EVENT_VOLJIN_VISION_SCRIPT_9 = 9,
EVENT_VOLJIN_VISION_SCRIPT_10 = 10,
EVENT_VOLJIN_VISION_SCRIPT_11 = 11,
EVENT_VOLJIN_VISION_SCRIPT_12 = 12,
EVENT_VOLJIN_VISION_SCRIPT_13 = 13,
EVENT_VOLJIN_VISION_SCRIPT_14 = 14,
EVENT_VOLJIN_VISION_SCRIPT_15 = 15,
EVENT_VOLJIN_VISION_SCRIPT_16 = 16,
EVENT_VOLJIN_VISION_SCRIPT_17 = 17,
EVENT_VOLJIN_VISION_SCRIPT_18 = 18,
EVENT_VOLJIN_VISION_SCRIPT_19 = 19,
EVENT_VOLJIN_VISION_SCRIPT_20 = 20,
EVENT_VOLJIN_VISION_SCRIPT_21 = 21,
EVENT_VOLJIN_VISION_SCRIPT_22 = 22,
GOSSIP_MENU_GARROSH_VISION = 11112,
GOSSIP_MENU_THRALL_VISION = 11127,
GOSSIP_MENU_VISION_IN_PROGRESS = 11126,
QUEST_MORE_THAN_EXPECTED_WARRIOR = 24643,
QUEST_MORE_THAN_EXPECTED_MAGE = 24755,
QUEST_MORE_THAN_EXPECTED_SHAMAN = 24763,
QUEST_MORE_THAN_EXPECTED_ROGUE = 24775,
QUEST_MORE_THAN_EXPECTED_HUNTER = 24781,
QUEST_MORE_THAN_EXPECTED_PRIEST = 24787,
QUEST_MORE_THAN_EXPECTED_DRUID = 24769,
QUEST_MORE_THAN_EXPECTED_WARLOCK = 26277,
QUEST_MORE_THAN_EXPECTED_MONK = 31163,
QUEST_AN_ANCIENT_ENEMY = 24814,
SAY_GORROSH_VISION_SCRIPT_TEXT_0 = 0,
SAY_GORROSH_VISION_SCRIPT_TEXT_1 = 1,
SAY_GORROSH_VISION_SCRIPT_TEXT_2 = 2,
SAY_GORROSH_VISION_SCRIPT_TEXT_3 = 3,
SAY_GORROSH_VISION_SCRIPT_TEXT_4 = 4,
SAY_VOLJIN_VISION_SCRIPT_TEXT_0 = 0,
SAY_VOLJIN_VISION_SCRIPT_TEXT_1 = 1,
SAY_VOLJIN_VISION_SCRIPT_TEXT_2 = 2,
SAY_VOLJIN_VISION_SCRIPT_TEXT_3 = 3,
SAY_VOLJIN_VISION_SCRIPT_TEXT_4 = 4,
SAY_VOLJIN_VISION_SCRIPT_TEXT_5 = 5,
SAY_VOLJIN_VISION_SCRIPT_TEXT_6 = 6,
SAY_THRALL_VISION_SCRIPT_TEXT_0 = 0,
SAY_THRALL_VISION_SCRIPT_TEXT_1 = 1,
SAY_THRALL_VISION_SCRIPT_TEXT_2 = 2,
SAY_THRALL_VISION_SCRIPT_TEXT_3 = 3,
SAY_THRALL_VISION_SCRIPT_TEXT_4 = 4,
SAY_THRALL_VISION_SCRIPT_TEXT_5 = 5,
SAY_THRALL_VISION_SCRIPT_TEXT_6 = 6,
SAY_THRALL_VISION_SCRIPT_TEXT_7 = 7,
SAY_VOLJIN_SCRIPT_TEXT_0 = 0,
SAY_VOLJIN_SCRIPT_TEXT_1 = 1,
SAY_VOLJIN_SCRIPT_TEXT_2 = 2,
SAY_VOLJIN_SCRIPT_TEXT_3 = 3,
SAY_VOLJIN_SCRIPT_TEXT_4 = 4,
SAY_VOLJIN_SCRIPT_TEXT_5 = 5,
SAY_VOLJIN_SCRIPT_TEXT_6 = 6,
SAY_VOLJIN_SCRIPT_TEXT_7 = 7,
SAY_VOLJIN_SCRIPT_TEXT_8 = 8,
SAY_VOLJIN_SCRIPT_TEXT_9 = 9,
SAY_VOLJIN_SCRIPT_TEXT_10 = 10,
SAY_VOLJIN_SCRIPT_TEXT_11 = 11,
SAY_VOLJIN_SCRIPT_TEXT_12 = 12,
SAY_VOLJIN_SCRIPT_TEXT_13 = 13,
SAY_VOLJIN_SCRIPT_TEXT_14 = 14,
SPELL_RITES_OF_VISION = 73169,
SPELL_VOLJINS_VISION_SMOKE = 73158,
SPELL_GENERIC_QUEST_INVISIBILITY_1 = 49414,
SPELL_GENERIC_QUEST_INVISIBILITY_2 = 49415,
SPELL_GENERIC_QUEST_INVISIBILITY_8 = 78718,
};
// 38966 - Vol'jin (specific script for guid 309032)
struct npc_voljin_garrosh_vision : public ScriptedAI
{
npc_voljin_garrosh_vision(Creature* creature) : ScriptedAI(creature), _scriptRunning(false) { }
void JustAppeared() override
{
me->SetGossipMenuId(GOSSIP_MENU_GARROSH_VISION);
Creature* garrosh = me->FindNearestCreatureWithOptions(10.0f, { .StringId = "vision_of_garrosh", .IgnorePhases = true });
Creature* voljin = me->FindNearestCreatureWithOptions(10.0f, { .StringId = "vision_of_voljin", .IgnorePhases = true });
Creature* bunny = me->FindNearestCreatureWithOptions(10.0f, { .StringId = "vision_brazier_bunny_garrosh", .IgnorePhases = true });
GameObject* brazier = me->FindNearestGameObjectWithOptions(10.0f, { .StringId = "vision_brazier_garrosh_voljin", .IgnorePhases = true });
if (!garrosh || !voljin || !bunny || !brazier)
return;
_garroshGUID = garrosh->GetGUID();
_voljinGUID = voljin->GetGUID();
_bunnyGUID = bunny->GetGUID();
_brazierGUID = brazier->GetGUID();
}
void OnQuestReward(Player* /*player*/, Quest const* quest, LootItemType /*type*/, uint32 /*opt*/) override
{
if (_scriptRunning)
return;
switch (quest->GetQuestId())
{
case QUEST_MORE_THAN_EXPECTED_WARRIOR:
case QUEST_MORE_THAN_EXPECTED_MAGE:
case QUEST_MORE_THAN_EXPECTED_SHAMAN:
case QUEST_MORE_THAN_EXPECTED_ROGUE:
case QUEST_MORE_THAN_EXPECTED_HUNTER:
case QUEST_MORE_THAN_EXPECTED_PRIEST:
case QUEST_MORE_THAN_EXPECTED_DRUID:
case QUEST_MORE_THAN_EXPECTED_WARLOCK:
case QUEST_MORE_THAN_EXPECTED_MONK:
_scriptRunning = true;
_events.ScheduleEvent(EVENT_VOLJIN_VISION_SCRIPT_1, 0s);
break;
default:
break;
}
}
bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override
{
CloseGossipMenuFor(player);
_events.ScheduleEvent(EVENT_VOLJIN_VISION_SCRIPT_1, 0s);
_scriptRunning = true;
return false;
}
void UpdateAI(uint32 diff) override
{
if (!_scriptRunning)
return;
_events.Update(diff);
while (uint32 eventId = _events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_VOLJIN_VISION_SCRIPT_1:
{
me->SetGossipMenuId(GOSSIP_MENU_VISION_IN_PROGRESS);
_events.ScheduleEvent(EVENT_VOLJIN_VISION_SCRIPT_2, 0s);
break;
}
case EVENT_VOLJIN_VISION_SCRIPT_2:
{
me->SetFacingTo(3.97935f);
Talk(SAY_VOLJIN_SCRIPT_TEXT_0);
_events.ScheduleEvent(EVENT_VOLJIN_VISION_SCRIPT_3, 3s);
break;
}
case EVENT_VOLJIN_VISION_SCRIPT_3:
{
DoCastSelf(SPELL_RITES_OF_VISION);
if (Creature* bunny = ObjectAccessor::GetCreature(*me, _bunnyGUID))
bunny->AI()->DoCastSelf(SPELL_VOLJINS_VISION_SMOKE);
if (GameObject* brazier = ObjectAccessor::GetGameObject(*me, _brazierGUID))
brazier->SetGoState(GO_STATE_ACTIVE);
_events.ScheduleEvent(EVENT_VOLJIN_VISION_SCRIPT_4, 4s);
break;
}
case EVENT_VOLJIN_VISION_SCRIPT_4:
{
if (Creature* garrosh = ObjectAccessor::GetCreature(*me, _garroshGUID))
{
garrosh->AI()->DoCastSelf(SPELL_GENERIC_QUEST_INVISIBILITY_1);
garrosh->RemoveAura(SPELL_GENERIC_QUEST_INVISIBILITY_8);
}
_events.ScheduleEvent(EVENT_VOLJIN_VISION_SCRIPT_5, 1s);
break;
}
case EVENT_VOLJIN_VISION_SCRIPT_5:
{
if (Creature* garrosh = ObjectAccessor::GetCreature(*me, _garroshGUID))
garrosh->AI()->Talk(SAY_GORROSH_VISION_SCRIPT_TEXT_0);
_events.ScheduleEvent(EVENT_VOLJIN_VISION_SCRIPT_6, 7s);
break;
}
case EVENT_VOLJIN_VISION_SCRIPT_6:
{
if (Creature* voljin = ObjectAccessor::GetCreature(*me, _voljinGUID))
{
voljin->AI()->DoCastSelf(SPELL_GENERIC_QUEST_INVISIBILITY_1);
voljin->RemoveAura(SPELL_GENERIC_QUEST_INVISIBILITY_8);
}
_events.ScheduleEvent(EVENT_VOLJIN_VISION_SCRIPT_7, 4s);
break;
}
case EVENT_VOLJIN_VISION_SCRIPT_7:
{
if (Creature* voljin = ObjectAccessor::GetCreature(*me, _voljinGUID))
voljin->AI()->Talk(SAY_VOLJIN_VISION_SCRIPT_TEXT_0);
_events.ScheduleEvent(EVENT_VOLJIN_VISION_SCRIPT_8, 11s);
break;
}
case EVENT_VOLJIN_VISION_SCRIPT_8:
{
if (Creature* voljin = ObjectAccessor::GetCreature(*me, _voljinGUID))
voljin->AI()->Talk(SAY_VOLJIN_VISION_SCRIPT_TEXT_1);
_events.ScheduleEvent(EVENT_VOLJIN_VISION_SCRIPT_9, 6s);
break;
}
case EVENT_VOLJIN_VISION_SCRIPT_9:
{
if (Creature* garrosh = ObjectAccessor::GetCreature(*me, _garroshGUID))
garrosh->AI()->Talk(SAY_GORROSH_VISION_SCRIPT_TEXT_1);
_events.ScheduleEvent(EVENT_VOLJIN_VISION_SCRIPT_10, 11s);
break;
}
case EVENT_VOLJIN_VISION_SCRIPT_10:
{
if (Creature* voljin = ObjectAccessor::GetCreature(*me, _voljinGUID))
voljin->AI()->Talk(SAY_VOLJIN_VISION_SCRIPT_TEXT_2);
_events.ScheduleEvent(EVENT_VOLJIN_VISION_SCRIPT_11, 11s);
break;
}
case EVENT_VOLJIN_VISION_SCRIPT_11:
{
if (Creature* garrosh = ObjectAccessor::GetCreature(*me, _garroshGUID))
garrosh->AI()->Talk(SAY_GORROSH_VISION_SCRIPT_TEXT_2);
_events.ScheduleEvent(EVENT_VOLJIN_VISION_SCRIPT_12, 16s);
break;
}
case EVENT_VOLJIN_VISION_SCRIPT_12:
{
if (Creature* voljin = ObjectAccessor::GetCreature(*me, _voljinGUID))
voljin->AI()->Talk(SAY_VOLJIN_VISION_SCRIPT_TEXT_3);
_events.ScheduleEvent(EVENT_VOLJIN_VISION_SCRIPT_13, 16s);
break;
}
case EVENT_VOLJIN_VISION_SCRIPT_13:
{
if (Creature* voljin = ObjectAccessor::GetCreature(*me, _voljinGUID))
voljin->AI()->Talk(SAY_VOLJIN_VISION_SCRIPT_TEXT_4);
_events.ScheduleEvent(EVENT_VOLJIN_VISION_SCRIPT_14, 15s);
break;
}
case EVENT_VOLJIN_VISION_SCRIPT_14:
{
if (Creature* voljin = ObjectAccessor::GetCreature(*me, _voljinGUID))
voljin->AI()->Talk(SAY_VOLJIN_VISION_SCRIPT_TEXT_5);
_events.ScheduleEvent(EVENT_VOLJIN_VISION_SCRIPT_15, 17s);
break;
}
case EVENT_VOLJIN_VISION_SCRIPT_15:
{
if (Creature* garrosh = ObjectAccessor::GetCreature(*me, _garroshGUID))
garrosh->AI()->Talk(SAY_GORROSH_VISION_SCRIPT_TEXT_3);
_events.ScheduleEvent(EVENT_VOLJIN_VISION_SCRIPT_16, 3s);
break;
}
case EVENT_VOLJIN_VISION_SCRIPT_16:
{
if (Creature* garrosh = ObjectAccessor::GetCreature(*me, _garroshGUID))
garrosh->AI()->Talk(SAY_GORROSH_VISION_SCRIPT_TEXT_4);
_events.ScheduleEvent(EVENT_VOLJIN_VISION_SCRIPT_17, 3s);
break;
}
case EVENT_VOLJIN_VISION_SCRIPT_17:
{
if (Creature* voljin = ObjectAccessor::GetCreature(*me, _voljinGUID))
voljin->AI()->Talk(SAY_VOLJIN_VISION_SCRIPT_TEXT_6);
_events.ScheduleEvent(EVENT_VOLJIN_VISION_SCRIPT_18, 9s);
break;
}
case EVENT_VOLJIN_VISION_SCRIPT_18:
{
me->RemoveAura(SPELL_RITES_OF_VISION);
if (Creature* garrosh = ObjectAccessor::GetCreature(*me, _garroshGUID))
{
garrosh->AI()->DoCastSelf(SPELL_GENERIC_QUEST_INVISIBILITY_8);
garrosh->RemoveAura(SPELL_GENERIC_QUEST_INVISIBILITY_1);
}
if (Creature* voljin = ObjectAccessor::GetCreature(*me, _voljinGUID))
{
voljin->AI()->DoCastSelf(SPELL_GENERIC_QUEST_INVISIBILITY_8);
voljin->RemoveAura(SPELL_GENERIC_QUEST_INVISIBILITY_1);
}
if (Creature* bunny = ObjectAccessor::GetCreature(*me, _bunnyGUID))
bunny->RemoveAura(SPELL_VOLJINS_VISION_SMOKE);
if (GameObject* brazier = ObjectAccessor::GetGameObject(*me, _brazierGUID))
brazier->SetGoState(GO_STATE_READY);
_events.ScheduleEvent(EVENT_VOLJIN_VISION_SCRIPT_19, 2s);
break;
}
case EVENT_VOLJIN_VISION_SCRIPT_19:
{
me->SetFacingTo(0.837758f);
Talk(SAY_VOLJIN_SCRIPT_TEXT_1);
_events.ScheduleEvent(EVENT_VOLJIN_VISION_SCRIPT_20, 9s);
break;
}
case EVENT_VOLJIN_VISION_SCRIPT_20:
{
Talk(SAY_VOLJIN_SCRIPT_TEXT_2);
_events.ScheduleEvent(EVENT_VOLJIN_VISION_SCRIPT_21, 16s);
break;
}
case EVENT_VOLJIN_VISION_SCRIPT_21:
{
Talk(SAY_VOLJIN_SCRIPT_TEXT_3);
_events.ScheduleEvent(EVENT_VOLJIN_VISION_SCRIPT_22, 8s);
break;
}
case EVENT_VOLJIN_VISION_SCRIPT_22:
{
me->SetGossipMenuId(GOSSIP_MENU_GARROSH_VISION);
_scriptRunning = false;
break;
}
default:
break;
}
}
}
private:
EventMap _events;
bool _scriptRunning;
ObjectGuid _garroshGUID;
ObjectGuid _voljinGUID;
ObjectGuid _bunnyGUID;
ObjectGuid _brazierGUID;
};
// 38966 - Vol'jin (specific script for guid 3000469)
struct npc_voljin_thrall_vision : public ScriptedAI
{
npc_voljin_thrall_vision(Creature* creature) : ScriptedAI(creature), _scriptRunning(false) { }
void JustAppeared() override
{
me->SetGossipMenuId(GOSSIP_MENU_THRALL_VISION);
Creature* thrall = me->FindNearestCreatureWithOptions(10.0f, { .StringId = "vision_of_thrall", .IgnorePhases = true });
Creature* bunny = me->FindNearestCreatureWithOptions(10.0f, { .StringId = "vision_brazier_bunny_thrall", .IgnorePhases = true });
GameObject* brazier = me->FindNearestGameObjectWithOptions(10.0f, { .StringId = "vision_brazier_thrall", .IgnorePhases = true });
if (!thrall || !bunny || !brazier)
return;
_thrallGUID = thrall->GetGUID();
_bunnyGUID = bunny->GetGUID();
_brazierGUID = brazier->GetGUID();
}
void OnQuestReward(Player* /*player*/, Quest const* quest, LootItemType /*type*/, uint32 /*opt*/) override
{
if (_scriptRunning)
return;
if (quest->GetQuestId() == QUEST_AN_ANCIENT_ENEMY)
{
_scriptRunning = true;
_events.ScheduleEvent(EVENT_VOLJIN_VISION_SCRIPT_1, 0s);
}
}
bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override
{
_events.ScheduleEvent(EVENT_VOLJIN_VISION_SCRIPT_1, 0s);
CloseGossipMenuFor(player);
_scriptRunning = true;
return false;
}
void UpdateAI(uint32 diff) override
{
if (!_scriptRunning)
return;
_events.Update(diff);
while (uint32 eventId = _events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_VOLJIN_VISION_SCRIPT_1:
{
me->SetGossipMenuId(GOSSIP_MENU_VISION_IN_PROGRESS);
_events.ScheduleEvent(EVENT_VOLJIN_VISION_SCRIPT_2, 0s);
break;
}
case EVENT_VOLJIN_VISION_SCRIPT_2:
{
Talk(SAY_VOLJIN_SCRIPT_TEXT_4);
_events.ScheduleEvent(EVENT_VOLJIN_VISION_SCRIPT_3, 9s);
break;
}
case EVENT_VOLJIN_VISION_SCRIPT_3:
{
Talk(SAY_VOLJIN_SCRIPT_TEXT_5);
_events.ScheduleEvent(EVENT_VOLJIN_VISION_SCRIPT_4, 8s);
break;
}
case EVENT_VOLJIN_VISION_SCRIPT_4:
{
Talk(SAY_VOLJIN_SCRIPT_TEXT_6);
_events.ScheduleEvent(EVENT_VOLJIN_VISION_SCRIPT_5, 7s);
break;
}
case EVENT_VOLJIN_VISION_SCRIPT_5:
{
DoCastSelf(SPELL_RITES_OF_VISION);
me->SetFacingTo(3.97935f);
if (Creature* bunny = ObjectAccessor::GetCreature(*me, _bunnyGUID))
bunny->AI()->DoCastSelf(SPELL_VOLJINS_VISION_SMOKE);
if (GameObject* brazier = ObjectAccessor::GetGameObject(*me, _brazierGUID))
brazier->SetGoState(GO_STATE_ACTIVE);
if (Creature* thrall = ObjectAccessor::GetCreature(*me, _thrallGUID))
{
thrall->AI()->DoCastSelf(SPELL_GENERIC_QUEST_INVISIBILITY_2);
thrall->RemoveAura(SPELL_GENERIC_QUEST_INVISIBILITY_8);
}
_events.ScheduleEvent(EVENT_VOLJIN_VISION_SCRIPT_6, 5s);
break;
}
case EVENT_VOLJIN_VISION_SCRIPT_6:
{
if (Creature* thrall = ObjectAccessor::GetCreature(*me, _thrallGUID))
thrall->AI()->Talk(SAY_THRALL_VISION_SCRIPT_TEXT_0);
_events.ScheduleEvent(EVENT_VOLJIN_VISION_SCRIPT_7, 4s);
break;
}
case EVENT_VOLJIN_VISION_SCRIPT_7:
{
Talk(SAY_VOLJIN_SCRIPT_TEXT_7);
_events.ScheduleEvent(EVENT_VOLJIN_VISION_SCRIPT_8, 6s);
break;
}
case EVENT_VOLJIN_VISION_SCRIPT_8:
{
if (Creature* thrall = ObjectAccessor::GetCreature(*me, _thrallGUID))
thrall->AI()->Talk(SAY_THRALL_VISION_SCRIPT_TEXT_1);
_events.ScheduleEvent(EVENT_VOLJIN_VISION_SCRIPT_9, 11s);
break;
}
case EVENT_VOLJIN_VISION_SCRIPT_9:
{
Talk(SAY_VOLJIN_SCRIPT_TEXT_8);
_events.ScheduleEvent(EVENT_VOLJIN_VISION_SCRIPT_10, 18s);
break;
}
case EVENT_VOLJIN_VISION_SCRIPT_10:
{
if (Creature* thrall = ObjectAccessor::GetCreature(*me, _thrallGUID))
thrall->AI()->Talk(SAY_THRALL_VISION_SCRIPT_TEXT_2);
_events.ScheduleEvent(EVENT_VOLJIN_VISION_SCRIPT_11, 6s);
break;
}
case EVENT_VOLJIN_VISION_SCRIPT_11:
{
if (Creature* thrall = ObjectAccessor::GetCreature(*me, _thrallGUID))
thrall->AI()->Talk(SAY_THRALL_VISION_SCRIPT_TEXT_3);
_events.ScheduleEvent(EVENT_VOLJIN_VISION_SCRIPT_12, 12s);
break;
}
case EVENT_VOLJIN_VISION_SCRIPT_12:
{
if (Creature* thrall = ObjectAccessor::GetCreature(*me, _thrallGUID))
thrall->AI()->Talk(SAY_THRALL_VISION_SCRIPT_TEXT_4);
_events.ScheduleEvent(EVENT_VOLJIN_VISION_SCRIPT_13, 18s);
break;
}
case EVENT_VOLJIN_VISION_SCRIPT_13:
{
if (Creature* thrall = ObjectAccessor::GetCreature(*me, _thrallGUID))
thrall->AI()->Talk(SAY_THRALL_VISION_SCRIPT_TEXT_5);
_events.ScheduleEvent(EVENT_VOLJIN_VISION_SCRIPT_14, 17s);
break;
}
case EVENT_VOLJIN_VISION_SCRIPT_14:
{
if (Creature* thrall = ObjectAccessor::GetCreature(*me, _thrallGUID))
thrall->AI()->Talk(SAY_THRALL_VISION_SCRIPT_TEXT_6);
_events.ScheduleEvent(EVENT_VOLJIN_VISION_SCRIPT_15, 9s);
break;
}
case EVENT_VOLJIN_VISION_SCRIPT_15:
{
Talk(SAY_VOLJIN_SCRIPT_TEXT_9);
_events.ScheduleEvent(EVENT_VOLJIN_VISION_SCRIPT_16, 11s);
break;
}
case EVENT_VOLJIN_VISION_SCRIPT_16:
{
if (Creature* thrall = ObjectAccessor::GetCreature(*me, _thrallGUID))
thrall->AI()->Talk(SAY_THRALL_VISION_SCRIPT_TEXT_7);
_events.ScheduleEvent(EVENT_VOLJIN_VISION_SCRIPT_17, 6s);
break;
}
case EVENT_VOLJIN_VISION_SCRIPT_17:
{
me->RemoveAura(SPELL_RITES_OF_VISION);
me->SetFacingTo(0.837758f);
if (Creature* thrall = ObjectAccessor::GetCreature(*me, _thrallGUID))
{
thrall->AI()->DoCastSelf(SPELL_GENERIC_QUEST_INVISIBILITY_8);
thrall->RemoveAura(SPELL_GENERIC_QUEST_INVISIBILITY_2);
}
if (Creature* bunny = ObjectAccessor::GetCreature(*me, _bunnyGUID))
bunny->RemoveAura(SPELL_VOLJINS_VISION_SMOKE);
if (GameObject* brazier = ObjectAccessor::GetGameObject(*me, _brazierGUID))
brazier->SetGoState(GO_STATE_READY);
Talk(SAY_VOLJIN_SCRIPT_TEXT_10);
_events.ScheduleEvent(EVENT_VOLJIN_VISION_SCRIPT_18, 8s);
break;
}
case EVENT_VOLJIN_VISION_SCRIPT_18:
{
Talk(SAY_VOLJIN_SCRIPT_TEXT_11);
_events.ScheduleEvent(EVENT_VOLJIN_VISION_SCRIPT_19, 9s);
break;
}
case EVENT_VOLJIN_VISION_SCRIPT_19:
{
Talk(SAY_VOLJIN_SCRIPT_TEXT_12);
_events.ScheduleEvent(EVENT_VOLJIN_VISION_SCRIPT_20, 17s);
break;
}
case EVENT_VOLJIN_VISION_SCRIPT_20:
{
Talk(SAY_VOLJIN_SCRIPT_TEXT_13);
_events.ScheduleEvent(EVENT_VOLJIN_VISION_SCRIPT_21, 11s);
break;
}
case EVENT_VOLJIN_VISION_SCRIPT_21:
{
Talk(SAY_VOLJIN_SCRIPT_TEXT_14);
_events.ScheduleEvent(EVENT_VOLJIN_VISION_SCRIPT_22, 11s);
break;
}
case EVENT_VOLJIN_VISION_SCRIPT_22:
{
me->SetGossipMenuId(GOSSIP_MENU_THRALL_VISION);
_scriptRunning = false;
break;
}
default:
break;
}
}
}
private:
EventMap _events;
bool _scriptRunning;
ObjectGuid _thrallGUID;
ObjectGuid _bunnyGUID;
ObjectGuid _brazierGUID;
};
// 8595 - Hellscream's Fist Gunship
class at_hellscreams_fist_gunship : public AreaTriggerScript
{
public:
at_hellscreams_fist_gunship() : AreaTriggerScript("at_hellscreams_fist_gunship") { }
bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override
{
player->CastSpell(nullptr, Spells::PhasePlayer, CastSpellExtraArgsInit{
.TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR,
});
return true;
}
bool OnExit(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override
{
player->RemoveAurasDueToSpell(Spells::PhasePlayer);
return true;
}
};
// 130810 - Teleport Prep
class spell_teleport_prep_horde : public SpellScript
{
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo({
Spells::TeleportTimer
});
}
void HandleHitTarget(SpellEffIndex /*effIndex*/) const
{
Unit* hitUnit = GetHitUnit();
hitUnit->CancelMountAura();
hitUnit->CastSpell(nullptr, Spells::TeleportTimer, CastSpellExtraArgsInit{
.TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR,
.TriggeringSpell = GetSpell()
});
}
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_teleport_prep_horde::HandleHitTarget, EFFECT_0, SPELL_EFFECT_APPLY_AURA);
}
};
// 132034 - Teleport Timer
class spell_teleport_timer_horde : public AuraScript
{
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo({
Spells::TeleportPlayerToCrashSite
});
}
void HandleAfterEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) const
{
Unit* target = GetTarget();
target->CancelTravelShapeshiftForm();
target->CastSpell(nullptr, Spells::TeleportPlayerToCrashSite, CastSpellExtraArgsInit{
.TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR
});
}
void Register() override
{
AfterEffectRemove += AuraEffectRemoveFn(spell_teleport_timer_horde::HandleAfterEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
}
};
}
void AddSC_durotar()
{
using namespace Scripts::Kalimdor::Durotar;
new npc_lazy_peon();
RegisterSpellScript(spell_voodoo);
RegisterCreatureAI(npc_mithaka);
// Echo Isles
RegisterSpellScript(spell_durotar_summon_zuni);
RegisterCreatureAI(npc_durotar_tiki_target);
RegisterCreatureAI(npc_darkspear_jailor);
RegisterCreatureAI(npc_captive_spitescale_scout);
new GenericCreatureScript>("npc_nortet");
new GenericCreatureScript>("npc_tunari");
new GenericCreatureScript>("npc_seratha");
new GenericCreatureScript>("npc_legati");
new GenericCreatureScript>("npc_nekali");
new GenericCreatureScript>("npc_ertezza");
new GenericCreatureScript>("npc_zentabra");
new GenericCreatureScript>("npc_voldreka");
new GenericCreatureScript>("npc_zabrax");
new quest_the_basics_hitting_things("quest_the_basics_hitting_things_warrior");
new quest_the_basics_hitting_things("quest_the_basics_hitting_things_priest");
new quest_the_basics_hitting_things("quest_the_basics_hitting_things_mage");
new quest_the_basics_hitting_things("quest_the_basics_hitting_things_rogue");
new quest_the_basics_hitting_things("quest_the_basics_hitting_things_shaman");
new quest_the_basics_hitting_things("quest_the_basics_hitting_things_hunter");
new quest_the_basics_hitting_things("quest_the_basics_hitting_things_druid");
new quest_the_basics_hitting_things("quest_the_basics_hitting_things_warlock");
new quest_the_basics_hitting_things("quest_the_basics_hitting_things_monk");
new quest_proving_pit("quest_proving_pit_warrior");
new quest_proving_pit("quest_proving_pit_priest");
new quest_proving_pit("quest_proving_pit_mage");
new quest_proving_pit("quest_proving_pit_rogue");
new quest_proving_pit("quest_proving_pit_shaman");
new quest_proving_pit("quest_proving_pit_hunter");
new quest_proving_pit("quest_proving_pit_druid");
new quest_proving_pit("quest_proving_pit_warlock");
new quest_proving_pit("quest_proving_pit_monk");
RegisterCreatureAI(npc_voljin_garrosh_vision);
RegisterCreatureAI(npc_voljin_thrall_vision);
// AreaTriggers
new at_hellscreams_fist_gunship();
// Spells
RegisterSpellScript(spell_teleport_prep_horde);
RegisterSpellScript(spell_teleport_timer_horde);
}