EverWrath/src/scripts/Northrend/zone_borean_tundra.cpp
sucofog a2170f218b Scripts/Northrend: fix event for quest A Suitable Test Subject (#700)
* Scripts/Northrend: talk event for quest A Suitable Test Subject

Ported from: fda99b2972

Credits to @Wyreth and Trinitycore

* [Fix] No newline at end of file
2017-10-29 10:23:55 +00:00

1390 lines
42 KiB
C++

/*
* Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
* Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
* Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*/
/* ScriptData
SDName: Borean_Tundra
SD%Complete: 100
SDComment: Quest support: 11708. Taxi vendors.
SDCategory: Borean Tundra
EndScriptData */
/* ContentData
npc_iruk
npc_corastrasza
npc_sinkhole_kill_credit
npc_khunok_the_behemoth
npc_nerubar_victim
npc_nesingwary_trapper
npc_lurgglbr
npc_nexus_drake_hatchling
EndContentData */
#include "ScriptMgr.h"
#include "ScriptPCH.h"
#include "ScriptedCreature.h"
#include "ScriptedGossip.h"
#include "ScriptedEscortAI.h"
#include "ScriptedFollowerAI.h"
#include "Player.h"
#include "SpellInfo.h"
#include "WorldSession.h"
// Ours
enum eDrakeHunt
{
SPELL_DRAKE_HATCHLING_SUBDUED = 46691,
SPELL_SUBDUED = 46675
};
class spell_q11919_q11940_drake_hunt : public SpellScriptLoader
{
public:
spell_q11919_q11940_drake_hunt() : SpellScriptLoader("spell_q11919_q11940_drake_hunt") { }
class spell_q11919_q11940_drake_hunt_AuraScript : public AuraScript
{
PrepareAuraScript(spell_q11919_q11940_drake_hunt_AuraScript)
bool Load()
{
return GetOwner()->GetTypeId() == TYPEID_UNIT;
}
void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE || !GetCaster())
return;
Creature* owner = GetOwner()->ToCreature();
owner->RemoveAllAurasExceptType(SPELL_AURA_DUMMY);
owner->CombatStop(true);
owner->DeleteThreatList();
owner->GetMotionMaster()->Clear(false);
owner->GetMotionMaster()->MoveFollow(GetCaster(), 4.0f, M_PI, MOTION_SLOT_ACTIVE);
owner->CastSpell(owner, SPELL_SUBDUED, true);
GetCaster()->CastSpell(GetCaster(), SPELL_DRAKE_HATCHLING_SUBDUED, true);
owner->setFaction(35);
owner->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
owner->DespawnOrUnsummon(3*MINUTE*IN_MILLISECONDS);
}
void Register()
{
AfterEffectRemove += AuraEffectRemoveFn(spell_q11919_q11940_drake_hunt_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
}
};
AuraScript* GetAuraScript() const
{
return new spell_q11919_q11940_drake_hunt_AuraScript();
}
};
// Theirs
/*######
## npc_sinkhole_kill_credit
######*/
enum Sinkhole
{
GO_EXPLOSIVES_CART = 188160,
NPC_SCOURGED_BURROWER = 26250,
QUEST_PLUG_THE_SINKHOLES = 11897,
SPELL_SET_CART = 46797,
SPELL_EXPLODE_CART = 46799,
SPELL_SUMMON_CART = 46798,
SPELL_SUMMON_WORM = 46800,
};
class npc_sinkhole_kill_credit : public CreatureScript
{
public:
npc_sinkhole_kill_credit() : CreatureScript("npc_sinkhole_kill_credit") { }
struct npc_sinkhole_kill_creditAI : public NullCreatureAI
{
npc_sinkhole_kill_creditAI(Creature* creature) : NullCreatureAI(creature){ }
uint32 phaseTimer;
uint8 phase;
uint64 casterGuid;
void Reset()
{
phaseTimer = 30000;
phase = 0;
casterGuid = 0;
}
void SpellHit(Unit* caster, const SpellInfo* spell)
{
if (phase || spell->Id != SPELL_SET_CART)
return;
Player* player = caster->ToPlayer();
if (player && player->GetQuestStatus(QUEST_PLUG_THE_SINKHOLES) == QUEST_STATUS_INCOMPLETE)
{
phase = 1;
phaseTimer = 0;
casterGuid = caster->GetGUID();
}
}
void UpdateAI(uint32 diff)
{
if (!phase)
return;
if (phaseTimer <= diff)
{
switch (phase)
{
case 1:
DoCast(me, SPELL_EXPLODE_CART, true);
DoCast(me, SPELL_SUMMON_CART, true);
if (GameObject* cart = me->FindNearestGameObject(GO_EXPLOSIVES_CART, 3.0f))
cart->SetUInt32Value(GAMEOBJECT_FACTION, 14);
phaseTimer = 3000;
phase = 2;
break;
case 2:
if (GameObject* cart = me->FindNearestGameObject(GO_EXPLOSIVES_CART, 3.0f))
cart->UseDoorOrButton();
DoCast(me, SPELL_EXPLODE_CART, true);
phaseTimer = 3000;
phase = 3;
break;
case 3:
DoCast(me, SPELL_EXPLODE_CART, true);
phaseTimer = 2000;
phase = 5; // @fixme: phase 4 is missing...
break;
case 5:
DoCast(me, SPELL_SUMMON_WORM, true);
if (Unit* worm = me->FindNearestCreature(NPC_SCOURGED_BURROWER, 3.0f))
{
worm->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
worm->HandleEmoteCommand(EMOTE_ONESHOT_EMERGE);
}
phaseTimer = 1000;
phase = 6;
break;
case 6:
DoCast(me, SPELL_EXPLODE_CART, true);
if (Unit* worm = me->FindNearestCreature(NPC_SCOURGED_BURROWER, 3.0f))
{
Unit::Kill(me, worm);
worm->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE);
}
phaseTimer = 2000;
phase = 7;
break;
case 7:
DoCast(me, SPELL_EXPLODE_CART, true);
if (Player* caster = ObjectAccessor::GetPlayer(*me, casterGuid))
caster->KilledMonster(me->GetCreatureTemplate(), me->GetGUID());
phaseTimer = 5000;
phase = 8;
break;
default:
CreatureAI::EnterEvadeMode();
break;
}
} else phaseTimer -= diff;
}
};
CreatureAI* GetAI(Creature* creature) const
{
return new npc_sinkhole_kill_creditAI(creature);
}
};
/*######
## npc_khunok_the_behemoth
######*/
enum Khunok
{
NPC_ORPHANED_MAMMOTH_CALF = 25861,
SPELL_MAMMOTH_CALF_ESCORT_CREDIT = 46231
};
class npc_khunok_the_behemoth : public CreatureScript
{
public:
npc_khunok_the_behemoth() : CreatureScript("npc_khunok_the_behemoth") { }
struct npc_khunok_the_behemothAI : public ScriptedAI
{
npc_khunok_the_behemothAI(Creature* creature) : ScriptedAI(creature) { }
void MoveInLineOfSight(Unit* who)
{
ScriptedAI::MoveInLineOfSight(who);
if (who->GetTypeId() != TYPEID_UNIT)
return;
if (who->GetEntry() == NPC_ORPHANED_MAMMOTH_CALF && me->IsWithinDistInMap(who, 10.0f))
{
if (Unit* owner = who->GetOwner())
{
if (owner->GetTypeId() == TYPEID_PLAYER)
{
owner->CastSpell(owner, SPELL_MAMMOTH_CALF_ESCORT_CREDIT, true);
who->ToCreature()->DespawnOrUnsummon();
}
}
}
}
};
CreatureAI* GetAI(Creature* creature) const
{
return new npc_khunok_the_behemothAI(creature);
}
};
/*######
## npc_corastrasza
######*/
#define GOSSIP_ITEM_C_1 "I... I think so..."
enum Corastrasza
{
SPELL_SUMMON_WYRMREST_SKYTALON = 61240,
SPELL_WYRMREST_SKYTALON_RIDE_PERIODIC = 61244,
QUEST_ACES_HIGH_DAILY = 13414,
QUEST_ACES_HIGH = 13413
};
class npc_corastrasza : public CreatureScript
{
public:
npc_corastrasza() : CreatureScript("npc_corastrasza") { }
bool OnGossipHello(Player* player, Creature* creature)
{
if (creature->IsQuestGiver())
player->PrepareQuestMenu(creature->GetGUID());
if (player->GetQuestStatus(QUEST_ACES_HIGH) == QUEST_STATUS_INCOMPLETE || player->GetQuestStatus(QUEST_ACES_HIGH_DAILY) == QUEST_STATUS_INCOMPLETE) //It's the same dragon for both quests.
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_C_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID());
return true;
}
bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 action)
{
player->PlayerTalkClass->ClearMenus();
if (action == GOSSIP_ACTION_INFO_DEF+1)
{
player->CLOSE_GOSSIP_MENU();
player->CastSpell(player, SPELL_SUMMON_WYRMREST_SKYTALON, true);
player->CastSpell(player, SPELL_WYRMREST_SKYTALON_RIDE_PERIODIC, true);
}
return true;
}
};
/*######
## npc_iruk
######*/
#define GOSSIP_ITEM_I "<Search corpse for Issliruk's Totem.>"
enum Iruk
{
QUEST_SPIRITS_WATCH_OVER_US = 11961,
SPELL_CREATURE_TOTEM_OF_ISSLIRUK = 46816,
GOSSIP_TEXT_I = 12585
};
class npc_iruk : public CreatureScript
{
public:
npc_iruk() : CreatureScript("npc_iruk") { }
bool OnGossipHello(Player* player, Creature* creature)
{
if (player->GetQuestStatus(QUEST_SPIRITS_WATCH_OVER_US) == QUEST_STATUS_INCOMPLETE)
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_I, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
player->PlayerTalkClass->SendGossipMenu(GOSSIP_TEXT_I, creature->GetGUID());
return true;
}
bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 action)
{
player->PlayerTalkClass->ClearMenus();
switch (action)
{
case GOSSIP_ACTION_INFO_DEF+1:
player->CastSpell(player, SPELL_CREATURE_TOTEM_OF_ISSLIRUK, true);
player->CLOSE_GOSSIP_MENU();
break;
}
return true;
}
};
/*######
## npc_nerubar_victim
######*/
enum Nerubar
{
NPC_WARSONG_PEON = 25270,
QUEST_TAKEN_BY_THE_SCOURGE = 11611,
SPELL_FREED_WARSONG_MAGE = 45526,
SPELL_FREED_WARSONG_SHAMAN = 45527,
SPELL_FREED_WARSONG_WARRIOR = 45514,
SPELL_FREED_WARSONG_PEON = 45532
};
const uint32 nerubarVictims[3] =
{
SPELL_FREED_WARSONG_MAGE, SPELL_FREED_WARSONG_SHAMAN, SPELL_FREED_WARSONG_WARRIOR
};
class npc_nerubar_victim : public CreatureScript
{
public:
npc_nerubar_victim() : CreatureScript("npc_nerubar_victim") { }
struct npc_nerubar_victimAI : public NullCreatureAI
{
npc_nerubar_victimAI(Creature* creature) : NullCreatureAI(creature) { }
void JustDied(Unit* killer)
{
Player* player = killer->ToPlayer();
if (!player)
return;
if (player->GetQuestStatus(QUEST_TAKEN_BY_THE_SCOURGE) == QUEST_STATUS_INCOMPLETE)
{
uint8 uiRand = urand(0, 99);
if (uiRand < 40)
{
player->CastSpell(me, SPELL_FREED_WARSONG_PEON, true);
player->KilledMonsterCredit(NPC_WARSONG_PEON, 0);
}
else if (uiRand < 80)
player->CastSpell(me, nerubarVictims[urand(0, 2)], true);
}
}
};
CreatureAI* GetAI(Creature* creature) const
{
return new npc_nerubar_victimAI(creature);
}
};
/*######
## npc_lurgglbr
######*/
enum Lurgglbr
{
QUEST_ESCAPE_WINTERFIN_CAVERNS = 11570,
GO_CAGE = 187369,
FACTION_ESCORTEE_A = 774,
FACTION_ESCORTEE_H = 775,
SAY_START_1 = 0,
SAY_START_2 = 1,
SAY_END_1 = 2,
SAY_END_2 = 3
};
class npc_lurgglbr : public CreatureScript
{
public:
npc_lurgglbr() : CreatureScript("npc_lurgglbr") { }
struct npc_lurgglbrAI : public npc_escortAI
{
npc_lurgglbrAI(Creature* creature) : npc_escortAI(creature){ }
uint32 IntroTimer;
uint32 IntroPhase;
void Reset()
{
if (!HasEscortState(STATE_ESCORT_ESCORTING))
{
IntroTimer = 0;
IntroPhase = 0;
}
}
void WaypointReached(uint32 waypointId)
{
switch (waypointId)
{
case 0:
IntroPhase = 1;
IntroTimer = 2000;
break;
case 41:
IntroPhase = 4;
IntroTimer = 2000;
break;
}
}
void UpdateAI(uint32 diff)
{
if (IntroPhase)
{
if (IntroTimer <= diff)
{
switch (IntroPhase)
{
case 1:
if (Player* player = GetPlayerForEscort())
Talk(SAY_START_1, player);
IntroPhase = 2;
IntroTimer = 7500;
break;
case 2:
Talk(SAY_START_2);
IntroPhase = 3;
IntroTimer = 7500;
break;
case 3:
me->SetReactState(REACT_AGGRESSIVE);
IntroPhase = 0;
IntroTimer = 0;
break;
case 4:
Talk(SAY_END_1);
IntroPhase = 5;
IntroTimer = 8000;
break;
case 5:
if (Player* player = GetPlayerForEscort())
Talk(SAY_END_2, player);
IntroPhase = 6;
IntroTimer = 2500;
break;
case 6:
if (Player* player = GetPlayerForEscort())
player->AreaExploredOrEventHappens(QUEST_ESCAPE_WINTERFIN_CAVERNS);
IntroPhase = 7;
IntroTimer = 2500;
break;
case 7:
me->DespawnOrUnsummon();
IntroPhase = 0;
IntroTimer = 0;
break;
}
} else IntroTimer -= diff;
}
npc_escortAI::UpdateAI(diff);
if (!UpdateVictim())
return;
}
};
CreatureAI* GetAI(Creature* creature) const
{
return new npc_lurgglbrAI(creature);
}
bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest)
{
if (quest->GetQuestId() == QUEST_ESCAPE_WINTERFIN_CAVERNS)
{
if (GameObject* go = creature->FindNearestGameObject(GO_CAGE, 5.0f))
go->UseDoorOrButton();
if (npc_escortAI* pEscortAI = CAST_AI(npc_lurgglbr::npc_lurgglbrAI, creature->AI()))
pEscortAI->Start(true, false, player->GetGUID());
creature->setFaction(player->GetTeamId() == TEAM_ALLIANCE ? FACTION_ESCORTEE_A : FACTION_ESCORTEE_H);
return true;
}
return false;
}
};
/*######
## npc_beryl_sorcerer
######*/
enum BerylSorcerer
{
NPC_BERYL_SORCERER = 25316,
NPC_CAPTURED_BERLY_SORCERER = 25474,
NPC_LIBRARIAN_DONATHAN = 25262,
SPELL_ARCANE_CHAINS = 45611,
SPELL_COSMETIC_CHAINS = 54324,
SPELL_COSMETIC_ENSLAVE_CHAINS_SELF = 45631
};
class npc_beryl_sorcerer : public CreatureScript
{
public:
npc_beryl_sorcerer() : CreatureScript("npc_beryl_sorcerer") { }
struct npc_beryl_sorcererAI : public FollowerAI
{
npc_beryl_sorcererAI(Creature* creature) : FollowerAI(creature) { }
bool bEnslaved;
void Reset()
{
me->UpdateEntry(NPC_BERYL_SORCERER);
me->SetReactState(REACT_AGGRESSIVE);
bEnslaved = false;
}
void EnterCombat(Unit* who)
{
if (me->IsValidAttackTarget(who))
AttackStart(who);
}
void SpellHit(Unit* pCaster, const SpellInfo* pSpell)
{
if (pSpell->Id == SPELL_ARCANE_CHAINS && pCaster->GetTypeId() == TYPEID_PLAYER && !HealthAbovePct(50) && !bEnslaved)
{
EnterEvadeMode(); //We make sure that the npc is not attacking the player!
me->SetReactState(REACT_PASSIVE);
StartFollow(pCaster->ToPlayer(), 0, NULL);
me->UpdateEntry(NPC_CAPTURED_BERLY_SORCERER, NULL, false);
DoCast(me, SPELL_COSMETIC_ENSLAVE_CHAINS_SELF, true);
me->DespawnOrUnsummon(45000);
if (Player* player = pCaster->ToPlayer())
player->KilledMonsterCredit(NPC_CAPTURED_BERLY_SORCERER, 0);
bEnslaved = true;
}
}
void MoveInLineOfSight(Unit* who)
{
FollowerAI::MoveInLineOfSight(who);
if (who->GetEntry() == NPC_LIBRARIAN_DONATHAN && me->IsWithinDistInMap(who, INTERACTION_DISTANCE))
{
SetFollowComplete();
me->DisappearAndDie();
}
}
void UpdateAI(uint32 /*diff*/)
{
if (!UpdateVictim())
return;
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI(Creature* creature) const
{
return new npc_beryl_sorcererAI(creature);
}
};
/*######
## npc_imprisoned_beryl_sorcerer
######*/
enum ImprisionedBerylSorcerer
{
SPELL_NEURAL_NEEDLE = 45634,
NPC_IMPRISONED_BERYL_SORCERER = 25478,
SAY_IMPRISIONED_BERYL_1 = 0,
SAY_IMPRISIONED_BERYL_2 = 1,
SAY_IMPRISIONED_BERYL_3 = 2,
SAY_IMPRISIONED_BERYL_4 = 3,
SAY_IMPRISIONED_BERYL_5 = 4,
SAY_IMPRISIONED_BERYL_6 = 5,
SAY_IMPRISIONED_BERYL_7 = 6
};
class npc_imprisoned_beryl_sorcerer : public CreatureScript
{
public:
npc_imprisoned_beryl_sorcerer() : CreatureScript("npc_imprisoned_beryl_sorcerer") { }
struct npc_imprisoned_beryl_sorcererAI : public ScriptedAI
{
npc_imprisoned_beryl_sorcererAI(Creature* creature) : ScriptedAI(creature) { }
uint32 rebuff;
void Reset()
{
if (me->GetReactState() != REACT_PASSIVE)
me->SetReactState(REACT_PASSIVE);
rebuff = 0;
// xinef: correct visuals
me->UpdatePosition(me->GetPositionX(), me->GetPositionY(), 150.517f, me->GetOrientation(), true);
me->SetStandState(UNIT_STAND_STATE_SIT_MEDIUM_CHAIR);
}
void UpdateAI(uint32 diff)
{
UpdateVictim();
if (rebuff <= diff)
{
if (!me->HasAura(SPELL_COSMETIC_ENSLAVE_CHAINS_SELF))
{
DoCast(me, SPELL_COSMETIC_ENSLAVE_CHAINS_SELF);
}
rebuff = 180000;
}
else
rebuff -= diff;
DoMeleeAttackIfReady();
}
void EnterCombat(Unit* /*who*/)
{
}
void SpellHit(Unit* unit, const SpellInfo* spell)
{
if (spell->Id == SPELL_NEURAL_NEEDLE && unit->GetTypeId() == TYPEID_PLAYER)
{
if (Player* player = unit->ToPlayer())
{
GotStinged(player->GetGUID());
}
}
}
void GotStinged(uint64 casterGUID)
{
if (Player* caster = ObjectAccessor::GetPlayer(*me, casterGUID))
{
uint32 step = caster->GetAuraCount(SPELL_NEURAL_NEEDLE) + 1;
switch (step)
{
case 1:
Talk(SAY_IMPRISIONED_BERYL_1);
break;
case 2:
Talk(SAY_IMPRISIONED_BERYL_2, caster);
break;
case 3:
Talk(SAY_IMPRISIONED_BERYL_3);
break;
case 4:
Talk(SAY_IMPRISIONED_BERYL_4);
break;
case 5:
Talk(SAY_IMPRISIONED_BERYL_5);
break;
case 6:
Talk(SAY_IMPRISIONED_BERYL_6, caster);
break;
case 7:
Talk(SAY_IMPRISIONED_BERYL_7);
caster->KilledMonsterCredit(NPC_IMPRISONED_BERYL_SORCERER, 0);
break;
}
}
}
};
CreatureAI* GetAI(Creature* creature) const
{
return new npc_imprisoned_beryl_sorcererAI(creature);
}
};
/*######
## npc_mootoo_the_younger
######*/
enum MootooTheYounger
{
SAY_1 = 0,
SAY_2 = 1,
SAY_3 = 2,
SAY_4 = 3,
SAY_5 = 4,
NPC_MOOTOO_THE_YOUNGER = 25504,
QUEST_ESCAPING_THE_MIST = 11664
};
class npc_mootoo_the_younger : public CreatureScript
{
public:
npc_mootoo_the_younger() : CreatureScript("npc_mootoo_the_younger") { }
bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest)
{
if (quest->GetQuestId() == QUEST_ESCAPING_THE_MIST)
{
creature->setFaction(player->GetTeamId() == TEAM_ALLIANCE ? FACTION_ESCORTEE_A : FACTION_ESCORTEE_H);
creature->SetStandState(UNIT_STAND_STATE_STAND);
creature->AI()->Talk(SAY_1, player);
CAST_AI(npc_escortAI, (creature->AI()))->Start(true, false, player->GetGUID());
}
return true;
}
struct npc_mootoo_the_youngerAI : public npc_escortAI
{
npc_mootoo_the_youngerAI(Creature* creature) : npc_escortAI(creature) { }
void Reset()
{
SetDespawnAtFar(false);
}
void JustDied(Unit* /*killer*/)
{
if (Player* player=GetPlayerForEscort())
player->FailQuest(QUEST_ESCAPING_THE_MIST);
}
void WaypointReached(uint32 waypointId)
{
Player* player = GetPlayerForEscort();
if (!player)
return;
switch (waypointId)
{
case 10:
me->HandleEmoteCommand(EMOTE_ONESHOT_EXCLAMATION);
Talk(SAY_2);
break;
case 12:
Talk(SAY_3);
me->HandleEmoteCommand(EMOTE_ONESHOT_LOOT);
break;
case 16:
Talk(SAY_4);
me->HandleEmoteCommand(EMOTE_ONESHOT_EXCLAMATION);
break;
case 20:
me->SetPhaseMask(1, true);
Talk(SAY_5);
me->HandleEmoteCommand(EMOTE_ONESHOT_EXCLAMATION);
player->GroupEventHappens(QUEST_ESCAPING_THE_MIST, me);
SetRun(true);
break;
}
}
};
CreatureAI* GetAI(Creature* creature) const
{
return new npc_mootoo_the_youngerAI(creature);
}
};
/*######
## npc_bonker_togglevolt
######*/
enum BonkerTogglevolt
{
NPC_BONKER_TOGGLEVOLT = 25589,
QUEST_GET_ME_OUTA_HERE = 11673,
SAY_BONKER_1 = 0,
SAY_BONKER_2 = 1
};
class npc_bonker_togglevolt : public CreatureScript
{
public:
npc_bonker_togglevolt() : CreatureScript("npc_bonker_togglevolt") { }
bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest)
{
if (quest->GetQuestId() == QUEST_GET_ME_OUTA_HERE)
{
creature->SetStandState(UNIT_STAND_STATE_STAND);
creature->AI()->Talk(SAY_BONKER_2, player);
CAST_AI(npc_escortAI, (creature->AI()))->Start(true, true, player->GetGUID());
}
return true;
}
struct npc_bonker_togglevoltAI : public npc_escortAI
{
npc_bonker_togglevoltAI(Creature* creature) : npc_escortAI(creature) { }
uint32 Bonker_agro;
void Reset()
{
Bonker_agro=0;
SetDespawnAtFar(false);
}
void JustDied(Unit* /*killer*/)
{
if (Player* player = GetPlayerForEscort())
player->FailQuest(QUEST_GET_ME_OUTA_HERE);
}
void UpdateEscortAI(uint32 /*diff*/)
{
if (GetAttack() && UpdateVictim())
{
if (Bonker_agro == 0)
{
Talk(SAY_BONKER_1);
Bonker_agro++;
}
DoMeleeAttackIfReady();
}
else Bonker_agro=0;
}
void WaypointReached(uint32 waypointId)
{
Player* player = GetPlayerForEscort();
if (!player)
return;
switch (waypointId)
{
case 29:
player->GroupEventHappens(QUEST_GET_ME_OUTA_HERE, me);
break;
}
}
};
CreatureAI* GetAI(Creature* creature) const
{
return new npc_bonker_togglevoltAI(creature);
}
};
/*######
## Help Those That Cannot Help Themselves, Quest 11876
######*/
enum Valiancekeepcannons
{
GO_VALIANCE_KEEP_CANNON_1 = 187560,
GO_VALIANCE_KEEP_CANNON_2 = 188692
};
class npc_valiance_keep_cannoneer : public CreatureScript
{
public:
npc_valiance_keep_cannoneer() : CreatureScript("npc_valiance_keep_cannoneer") { }
struct npc_valiance_keep_cannoneerAI : public ScriptedAI
{
npc_valiance_keep_cannoneerAI(Creature* creature) : ScriptedAI(creature) { }
uint32 uiTimer;
void Reset()
{
uiTimer = urand(13000, 18000);
}
void UpdateAI(uint32 diff)
{
if (uiTimer <= diff)
{
me->HandleEmoteCommand(EMOTE_ONESHOT_KNEEL);
GameObject* pCannon = me->FindNearestGameObject(GO_VALIANCE_KEEP_CANNON_1, 10);
if (!pCannon)
pCannon = me->FindNearestGameObject(GO_VALIANCE_KEEP_CANNON_2, 10);
if (pCannon)
pCannon->Use(me);
uiTimer = urand(13000, 18000);
}
else uiTimer -= diff;
if (!UpdateVictim())
return;
}
};
CreatureAI* GetAI(Creature* creature) const
{
return new npc_valiance_keep_cannoneerAI(creature);
}
};
/*******************************************************
* npc_warmage_coldarra
*******************************************************/
enum Spells
{
SPELL_TRANSITUS_SHIELD_BEAM = 48310
};
enum NPCs
{
NPC_TRANSITUS_SHIELD_DUMMY = 27306,
NPC_WARMAGE_HOLLISTER = 27906,
NPC_WARMAGE_CALANDRA = 27173,
NPC_WARMAGE_WATKINS = 27904
};
class npc_warmage_coldarra : public CreatureScript
{
public:
npc_warmage_coldarra() : CreatureScript("npc_warmage_coldarra") { }
struct npc_warmage_coldarraAI : public ScriptedAI
{
npc_warmage_coldarraAI(Creature* creature) : ScriptedAI(creature)
{
SetCombatMovement(false);
}
uint32 m_uiTimer; //Timer until recast
void Reset()
{
m_uiTimer = 0;
}
void EnterCombat(Unit* /*who*/) { }
void AttackStart(Unit* /*who*/) { }
void UpdateAI(uint32 uiDiff)
{
if (m_uiTimer <= uiDiff)
{
std::list<Creature*> orbList;
GetCreatureListWithEntryInGrid(orbList, me, NPC_TRANSITUS_SHIELD_DUMMY, 32.0f);
switch (me->GetEntry())
{
case NPC_WARMAGE_HOLLISTER:
{
if (!orbList.empty())
{
for (std::list<Creature*>::const_iterator itr = orbList.begin(); itr != orbList.end(); ++itr)
{
if (Creature* pOrb = *itr)
if (pOrb->GetPositionY() > 6680)
DoCast(pOrb, SPELL_TRANSITUS_SHIELD_BEAM);
}
}
m_uiTimer = urand(90000, 120000);
}
break;
case NPC_WARMAGE_CALANDRA:
{
if (!orbList.empty())
{
for (std::list<Creature*>::const_iterator itr = orbList.begin(); itr != orbList.end(); ++itr)
{
if (Creature* pOrb = *itr)
if ((pOrb->GetPositionY() < 6680) && (pOrb->GetPositionY() > 6630))
DoCast(pOrb, SPELL_TRANSITUS_SHIELD_BEAM);
}
}
m_uiTimer = urand(90000, 120000);
}
break;
case NPC_WARMAGE_WATKINS:
{
if (!orbList.empty())
{
for (std::list<Creature*>::const_iterator itr = orbList.begin(); itr != orbList.end(); ++itr)
{
if (Creature* pOrb = *itr)
if (pOrb->GetPositionY() < 6630)
DoCast(pOrb, SPELL_TRANSITUS_SHIELD_BEAM);
}
}
m_uiTimer = urand(90000, 120000);
}
break;
}
}
else m_uiTimer -= uiDiff;
ScriptedAI::UpdateAI(uiDiff);
if (!UpdateVictim())
return;
}
};
CreatureAI* GetAI(Creature* creature) const
{
return new npc_warmage_coldarraAI(creature);
}
};
/*######
## npc_hidden_cultist
######*/
enum HiddenCultist
{
SPELL_SHROUD_OF_THE_DEATH_CULTIST = 46077, //not working
SPELL_RIGHTEOUS_VISION = 46078, //player aura
QUEST_THE_HUNT_IS_ON = 11794,
GOSSIP_TEXT_SALTY_JOHN_THORPE = 12529,
GOSSIP_TEXT_GUARD_MITCHELSS = 12530,
GOSSIP_TEXT_TOM_HEGGER = 12528,
NPC_TOM_HEGGER = 25827,
NPC_SALTY_JOHN_THORPE = 25248,
NPC_GUARD_MITCHELLS = 25828,
SAY_HIDDEN_CULTIST_1 = 0,
SAY_HIDDEN_CULTIST_2 = 1,
SAY_HIDDEN_CULTIST_3 = 2,
SAY_HIDDEN_CULTIST_4 = 3
};
const char* GOSSIP_ITEM_TOM_HEGGER = "What do you know about the Cult of the Damned?";
const char* GOSSIP_ITEM_GUARD_MITCHELLS = "How long have you worked for the Cult of the Damned?";
const char* GOSSIP_ITEM_SALTY_JOHN_THORPE = "I have a reason to believe you're involved in the cultist activity";
class npc_hidden_cultist : public CreatureScript
{
public:
npc_hidden_cultist() : CreatureScript("npc_hidden_cultist") { }
struct npc_hidden_cultistAI : public ScriptedAI
{
npc_hidden_cultistAI(Creature* creature) : ScriptedAI(creature)
{
uiEmoteState = creature->GetUInt32Value(UNIT_NPC_EMOTESTATE);
uiNpcFlags = creature->GetUInt32Value(UNIT_NPC_FLAGS);
}
uint32 uiEmoteState;
uint32 uiNpcFlags;
uint32 uiEventTimer;
uint8 uiEventPhase;
uint64 uiPlayerGUID;
void Reset()
{
if (uiEmoteState)
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, uiEmoteState);
if (uiNpcFlags)
me->SetUInt32Value(UNIT_NPC_FLAGS, uiNpcFlags);
uiEventTimer = 0;
uiEventPhase = 0;
uiPlayerGUID = 0;
DoCast(SPELL_SHROUD_OF_THE_DEATH_CULTIST);
me->RestoreFaction();
}
void DoAction(int32 /*iParam*/)
{
me->StopMoving();
me->SetUInt32Value(UNIT_NPC_FLAGS, 0);
if (Player* player = ObjectAccessor::GetPlayer(*me, uiPlayerGUID))
me->SetFacingToObject(player);
uiEventTimer = 3000;
uiEventPhase = 1;
}
void SetGUID(uint64 uiGuid, int32 /*iId*/)
{
uiPlayerGUID = uiGuid;
}
void AttackPlayer()
{
me->setFaction(14);
if (Player* player = ObjectAccessor::GetPlayer(*me, uiPlayerGUID))
AttackStart(player);
}
void UpdateAI(uint32 uiDiff)
{
if (uiEventTimer && uiEventTimer <= uiDiff)
{
switch (uiEventPhase)
{
case 1:
switch (me->GetEntry())
{
case NPC_SALTY_JOHN_THORPE:
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0);
Talk(SAY_HIDDEN_CULTIST_1);
uiEventTimer = 5000;
uiEventPhase = 2;
break;
case NPC_GUARD_MITCHELLS:
Talk(SAY_HIDDEN_CULTIST_2);
uiEventTimer = 5000;
uiEventPhase = 2;
break;
case NPC_TOM_HEGGER:
Talk(SAY_HIDDEN_CULTIST_3);
uiEventTimer = 5000;
uiEventPhase = 2;
break;
}
break;
case 2:
switch (me->GetEntry())
{
case NPC_SALTY_JOHN_THORPE:
Talk(SAY_HIDDEN_CULTIST_4);
if (Player* player = ObjectAccessor::GetPlayer(*me, uiPlayerGUID))
me->SetFacingToObject(player);
uiEventTimer = 3000;
uiEventPhase = 3;
break;
case NPC_GUARD_MITCHELLS:
case NPC_TOM_HEGGER:
AttackPlayer();
uiEventPhase = 0;
break;
}
break;
case 3:
if (me->GetEntry() == NPC_SALTY_JOHN_THORPE)
{
AttackPlayer();
uiEventPhase = 0;
}
break;
}
}else uiEventTimer -= uiDiff;
if (!UpdateVictim())
return;
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI(Creature* creature) const
{
return new npc_hidden_cultistAI(creature);
}
bool OnGossipHello(Player* player, Creature* creature)
{
uint32 uiGossipText = 0;
const char* charGossipItem;
switch (creature->GetEntry())
{
case NPC_TOM_HEGGER:
uiGossipText = GOSSIP_TEXT_TOM_HEGGER;
charGossipItem = GOSSIP_ITEM_TOM_HEGGER;
break;
case NPC_SALTY_JOHN_THORPE:
uiGossipText = GOSSIP_TEXT_SALTY_JOHN_THORPE;
charGossipItem = GOSSIP_ITEM_SALTY_JOHN_THORPE;
break;
case NPC_GUARD_MITCHELLS:
uiGossipText = GOSSIP_TEXT_GUARD_MITCHELSS;
charGossipItem = GOSSIP_ITEM_GUARD_MITCHELLS;
break;
default:
charGossipItem = "";
return false;
}
if (player->HasAura(SPELL_RIGHTEOUS_VISION) && player->GetQuestStatus(QUEST_THE_HUNT_IS_ON) == QUEST_STATUS_INCOMPLETE)
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, charGossipItem, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
if (creature->IsVendor())
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE);
player->SEND_GOSSIP_MENU(uiGossipText, creature->GetGUID());
return true;
}
bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action)
{
player->PlayerTalkClass->ClearMenus();
if (action == GOSSIP_ACTION_INFO_DEF+1)
{
player->CLOSE_GOSSIP_MENU();
creature->AI()->SetGUID(player->GetGUID());
creature->AI()->DoAction(1);
}
if (action == GOSSIP_ACTION_TRADE)
player->GetSession()->SendListInventory(creature->GetGUID());
return true;
}
};
enum BloodsporeRuination
{
NPC_BLOODMAGE_LAURITH = 25381,
SAY_BLOODMAGE_LAURITH = 0,
EVENT_TALK = 1,
EVENT_RESET_ORIENTATION
};
class spell_q11719_bloodspore_ruination_45997 : public SpellScriptLoader
{
public:
spell_q11719_bloodspore_ruination_45997() : SpellScriptLoader("spell_q11719_bloodspore_ruination_45997") { }
class spell_q11719_bloodspore_ruination_45997_SpellScript : public SpellScript
{
PrepareSpellScript(spell_q11719_bloodspore_ruination_45997_SpellScript);
void HandleEffect(SpellEffIndex /*effIndex*/)
{
if (Unit* caster = GetCaster())
if (Creature* laurith = caster->FindNearestCreature(NPC_BLOODMAGE_LAURITH, 100.0f))
laurith->AI()->SetGUID(caster->GetGUID());
}
void Register() override
{
OnEffectHit += SpellEffectFn(spell_q11719_bloodspore_ruination_45997_SpellScript::HandleEffect, EFFECT_1, SPELL_EFFECT_SEND_EVENT);
}
};
SpellScript* GetSpellScript() const override
{
return new spell_q11719_bloodspore_ruination_45997_SpellScript();
}
};
class npc_bloodmage_laurith : public CreatureScript
{
public:
npc_bloodmage_laurith() : CreatureScript("npc_bloodmage_laurith") { }
struct npc_bloodmage_laurithAI : public ScriptedAI
{
npc_bloodmage_laurithAI(Creature* creature) : ScriptedAI(creature) { }
void Reset() override
{
_events.Reset();
_playerGUID = 0;
}
void SetGUID(uint64 guid, int32 /*action*/) override
{
if (_playerGUID)
return;
_playerGUID = guid;
if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID))
me->SetFacingToObject(player);
_events.ScheduleEvent(EVENT_TALK, 1000);
}
void UpdateAI(uint32 diff) override
{
if (UpdateVictim())
{
DoMeleeAttackIfReady();
return;
}
_events.Update(diff);
if (uint32 eventId = _events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_TALK:
if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID))
Talk(SAY_BLOODMAGE_LAURITH, player);
_playerGUID = 0;
_events.ScheduleEvent(EVENT_RESET_ORIENTATION, 5000);
break;
case EVENT_RESET_ORIENTATION:
me->SetFacingTo(me->GetHomePosition().GetOrientation());
break;
}
}
}
private:
EventMap _events;
uint64 _playerGUID;
};
CreatureAI* GetAI(Creature* creature) const override
{
return new npc_bloodmage_laurithAI(creature);
}
};
void AddSC_borean_tundra()
{
// Ours
new spell_q11919_q11940_drake_hunt();
// Theirs
new npc_sinkhole_kill_credit();
new npc_khunok_the_behemoth();
new npc_corastrasza();
new npc_iruk();
new npc_nerubar_victim();
new npc_lurgglbr();
new npc_beryl_sorcerer();
new npc_imprisoned_beryl_sorcerer();
new npc_mootoo_the_younger();
new npc_bonker_togglevolt();
new npc_valiance_keep_cannoneer();
new npc_warmage_coldarra();
new npc_hidden_cultist();
new spell_q11719_bloodspore_ruination_45997();
new npc_bloodmage_laurith();
}