aboutsummaryrefslogtreecommitdiff
path: root/src/server/scripts/BrokenIsles
diff options
context:
space:
mode:
authorNaddley <64811442+Naddley@users.noreply.github.com>2024-04-12 17:30:04 +0200
committerGitHub <noreply@github.com>2024-04-12 17:30:04 +0200
commit611110be3b021bb4c72600be5062238952c66b7f (patch)
tree0c1ff921f08742655cb7f92c46c196d44153d32c /src/server/scripts/BrokenIsles
parent1f60bd8e5e46167296052892b8e706de19e2d478 (diff)
Scripts/Mardum: Implement "Hidden No More" quest accept event (#29899)
Co-Authored-By: ModoX <moardox@gmail.com>
Diffstat (limited to 'src/server/scripts/BrokenIsles')
-rw-r--r--src/server/scripts/BrokenIsles/zone_mardum.cpp326
1 files changed, 326 insertions, 0 deletions
diff --git a/src/server/scripts/BrokenIsles/zone_mardum.cpp b/src/server/scripts/BrokenIsles/zone_mardum.cpp
index 7ed591d195d..34b604ab7af 100644
--- a/src/server/scripts/BrokenIsles/zone_mardum.cpp
+++ b/src/server/scripts/BrokenIsles/zone_mardum.cpp
@@ -1611,7 +1611,15 @@ public:
enum GiveMeSightBeyondSightData
{
+ QUEST_GIVE_ME_SIGHT_BEYOND_SIGHT = 39262,
+
KILLCREDIT_FACE_THE_CAVE = 96437,
+ KILLCREDIT_SPEAK_WITH_JAYCE = 96436,
+
+ GOSSIP_MENU_USE_SPECTRAL_SIGHT = 19175,
+ GOSSIP_OPTION_USE_SPECTRAL_SIGHT = 0,
+
+ SAY_JAYCE_USE_SPECTRAL_SIGHT = 0,
SPELL_DH_SPECTRAL_SIGHT = 188501,
SPELL_GIVE_ME_SIGHT_PERIODIC_AURA = 191095,
@@ -1645,6 +1653,320 @@ class spell_give_me_sight_beyond_sight_periodic : public AuraScript
}
};
+enum HiddenNoMoreData
+{
+ QUEST_HIDDEN_NO_MORE = 39495,
+
+ NPC_JAYCE_CRYPTIC_HOLLOW = 96436,
+ NPC_SHIVARRA_CRYPTIC_HOLLOW = 96504,
+ NPC_ROCKSLIDE_KILLCREDIT = 98755,
+
+ SAY_JAYCE_ATTACK_ILLIDARI = 1,
+
+ ACTION_HIDDEN_NO_MORE_EYEBEAM = 1,
+ ACTION_HIDDEN_NO_MORE_MOVE = 2,
+
+ SPELL_VISUAL_KIT_SHIVARRA_TELEPORT = 43182,
+ SPELL_VISUAL_KIT_SHIVARRA_TELEPORT2 = 43576,
+ SPELL_VISUAL_KIT_SHIVARRA_TELEPORT3 = 45431,
+
+ SPELL_ABANDON_HIDDEN_NO_MORE = 194376,
+ SPELL_COSMETIC_EYE_BEAM_01_FEMALE = 200754,
+ SPELL_COSMETIC_EYE_BEAM_01_MALE = 194326
+};
+
+enum HiddenNoMorePaths
+{
+ POINT_JAYCE_DARKWEAVER_PREPARE_JUMP = 1,
+ POINT_JAYCE_DARKWEAVER_JUMP_TO_CAVE = 2,
+
+ PATH_JAYCE_DARKWEAVER_RUN_INTO_CAVE = 9643600,
+
+ PATH_CRYPTIC_HOLLOW_DEMON_HUNTER_01 = 10178700,
+ PATH_CRYPTIC_HOLLOW_DEMON_HUNTER_02 = 10178701,
+ PATH_CRYPTIC_HOLLOW_DEMON_HUNTER_03 = 10178800,
+ PATH_CRYPTIC_HOLLOW_DEMON_HUNTER_04 = 10178900,
+ PATH_CRYPTIC_HOLLOW_DEMON_HUNTER_05 = 10179000,
+ PATH_CRYPTIC_HOLLOW_COILSKAR_01 = 9650200,
+ PATH_CRYPTIC_HOLLOW_COILSKAR_02 = 9650201,
+ PATH_CRYPTIC_HOLLOW_COILSKAR_03 = 9650300,
+ PATH_CRYPTIC_HOLLOW_ASHTONGUE_01 = 9650000,
+ PATH_CRYPTIC_HOLLOW_ASHTONGUE_02 = 9650001,
+ PATH_CRYPTIC_HOLLOW_ASHTONGUE_03 = 9650100
+};
+
+// 39495 - Hidden No More
+class quest_hidden_no_more : public QuestScript
+{
+public:
+ quest_hidden_no_more() : QuestScript("quest_hidden_no_more") { }
+
+ void OnQuestStatusChange(Player* player, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus newStatus) override
+ {
+ if (newStatus == QUEST_STATUS_NONE)
+ {
+ player->CastSpell(nullptr, SPELL_ABANDON_HIDDEN_NO_MORE, true);
+ }
+ }
+};
+
+// 96436 - Jayce Darkweaver
+struct npc_jayce_darkweaver_cryptic_hollow : public ScriptedAI
+{
+ npc_jayce_darkweaver_cryptic_hollow(Creature* creature) : ScriptedAI(creature) { }
+
+ void OnQuestAccept(Player* player, Quest const* quest) override
+ {
+ if (quest->GetQuestId() == QUEST_HIDDEN_NO_MORE)
+ me->SummonPersonalClone(me->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
+ }
+
+ bool OnGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
+ {
+ if (menuId == GOSSIP_MENU_USE_SPECTRAL_SIGHT && gossipListId == GOSSIP_OPTION_USE_SPECTRAL_SIGHT)
+ {
+ Talk(SAY_JAYCE_USE_SPECTRAL_SIGHT);
+ player->KilledMonsterCredit(KILLCREDIT_SPEAK_WITH_JAYCE);
+ player->CastSpell(player, SPELL_GIVE_ME_SIGHT_PERIODIC_AURA);
+ player->CastSpell(player, SPELL_GIVE_ME_SIGHT_PERIODIC_DUMMY);
+ CloseGossipMenuFor(player);
+ }
+ return true;
+ }
+};
+
+struct HiddenNoMorePathDelay
+{
+ uint32 PathId;
+ Milliseconds ActionDelay;
+ Milliseconds MoveDelay;
+};
+
+std::unordered_map<std::string_view, HiddenNoMorePathDelay> HiddenNoMorePathMap = {
+ { "CrypticHollowDh01", { PATH_CRYPTIC_HOLLOW_DEMON_HUNTER_01, 554ms, 2990ms } },
+ { "CrypticHollowDh02", { PATH_CRYPTIC_HOLLOW_DEMON_HUNTER_02, 270ms, 1690ms } },
+ { "CrypticHollowDh03", { PATH_CRYPTIC_HOLLOW_DEMON_HUNTER_03, 554ms, 1690ms } },
+ { "CrypticHollowDh04", { PATH_CRYPTIC_HOLLOW_DEMON_HUNTER_04, 554ms, 2990ms } },
+ { "CrypticHollowDh05", { PATH_CRYPTIC_HOLLOW_DEMON_HUNTER_05, 402ms, 2990ms } },
+ { "CrypticHollowCoilskar01", { PATH_CRYPTIC_HOLLOW_COILSKAR_01, 0ms, 1521ms } },
+ { "CrypticHollowCoilskar02", { PATH_CRYPTIC_HOLLOW_COILSKAR_02, 0ms, 2024ms } },
+ { "CrypticHollowCoilskar03", { PATH_CRYPTIC_HOLLOW_COILSKAR_03, 0ms, 1521ms } },
+ { "CrypticHollowAshtongue01", { PATH_CRYPTIC_HOLLOW_ASHTONGUE_01, 0ms, 1521ms } },
+ { "CrypticHollowAshtongue02", { PATH_CRYPTIC_HOLLOW_ASHTONGUE_02, 0ms, 1521ms } },
+ { "CrypticHollowAshtongue03", { PATH_CRYPTIC_HOLLOW_ASHTONGUE_03, 0ms, 1521ms } },
+};
+
+constexpr Position JaycePrepareJump = { 1263.948f, 1632.9402f, 102.08563f };
+constexpr Position JayceJumpPosition = { 1245.257f, 1639.049f, 101.223f };
+
+// 96436 - Jayce Darkweaver
+struct npc_jayce_darkweaver_cryptic_hollow_private : public ScriptedAI
+{
+ npc_jayce_darkweaver_cryptic_hollow_private(Creature* creature) : ScriptedAI(creature) { }
+
+ void JustAppeared() override
+ {
+ Player* player = me->GetDemonCreatorPlayer();
+ if (!player)
+ return;
+
+ me->RemoveNpcFlag(NPCFlags(UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER));
+ me->CastSpell(nullptr, SPELL_COSMETIC_EYE_BEAM_01_MALE, false);
+
+ Creature* shivarraObject = me->FindNearestCreatureWithOptions(25.0f, { .CreatureId = NPC_SHIVARRA_CRYPTIC_HOLLOW, .IgnorePhases = true });
+ if (!shivarraObject)
+ return;
+
+ Creature* shivarraClone = shivarraObject->SummonPersonalClone(shivarraObject->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
+ if (!shivarraClone)
+ return;
+
+ _scheduler.Schedule(4s, [this, shivarraGuid = shivarraClone->GetGUID()](TaskContext task)
+ {
+ Creature* shivarraClone = ObjectAccessor::GetCreature(*me, shivarraGuid);
+ if (!shivarraClone)
+ return;
+
+ shivarraClone->SendPlaySpellVisualKit(SPELL_VISUAL_KIT_SHIVARRA_TELEPORT, 4, 2000);
+ shivarraClone->SetEmoteState(EMOTE_STATE_READY_SPELL_OMNI);
+ task.Schedule(3s, [this, shivarraGuid](TaskContext /*task*/)
+ {
+ Creature* shivarraClone = ObjectAccessor::GetCreature(*me, shivarraGuid);
+ if (!shivarraClone)
+ return;
+
+ shivarraClone->HandleEmoteCommand(EMOTE_ONESHOT_SPELL_CAST_OMNI);
+ shivarraClone->SendPlaySpellVisualKit(SPELL_VISUAL_KIT_SHIVARRA_TELEPORT2, 4, 1000);
+ shivarraClone->SendPlaySpellVisualKit(SPELL_VISUAL_KIT_SHIVARRA_TELEPORT3, 4, 2000);
+ shivarraClone->DespawnOrUnsummon(1s);
+ });
+ });
+
+ for (std::pair<std::string_view const, HiddenNoMorePathDelay>& npcPair : HiddenNoMorePathMap)
+ {
+ Creature* originalObject = me->FindNearestCreatureWithOptions(25.0f, { .StringId = npcPair.first, .IgnorePhases = true });
+ if (!originalObject)
+ continue;
+
+ Creature* clone = originalObject->SummonPersonalClone(originalObject->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, me->GetDemonCreatorPlayer());
+ if (!clone)
+ continue;
+
+ _cloneGuids.push_back(clone->GetGUID());
+ clone->AI()->DoAction(ACTION_HIDDEN_NO_MORE_EYEBEAM);
+ }
+ }
+
+ void OnChannelFinished(SpellInfo const* spell) override
+ {
+ if (spell->Id != SPELL_COSMETIC_EYE_BEAM_01_MALE)
+ return;
+
+ Player* player = me->GetDemonCreatorPlayer();
+
+ player->KilledMonsterCredit(NPC_ROCKSLIDE_KILLCREDIT);
+ Talk(SAY_JAYCE_ATTACK_ILLIDARI);
+ _scheduler.Schedule(1s, [this](TaskContext /*task*/)
+ {
+ me->GetMotionMaster()->MovePoint(POINT_JAYCE_DARKWEAVER_PREPARE_JUMP, JaycePrepareJump);
+ for (ObjectGuid const& guid : _cloneGuids)
+ {
+ Creature* clone = ObjectAccessor::GetCreature(*me, guid);
+ if (!clone)
+ continue;
+
+ clone->AI()->DoAction(ACTION_HIDDEN_NO_MORE_MOVE);
+ }
+ });
+ }
+
+ void MovementInform(uint32 type, uint32 pointId) override
+ {
+ if (type != EFFECT_MOTION_TYPE && type != POINT_MOTION_TYPE)
+ return;
+
+ if (pointId == POINT_JAYCE_DARKWEAVER_PREPARE_JUMP)
+ me->GetMotionMaster()->MoveJumpWithGravity(JayceJumpPosition, 19.880844f, 32.78205f, POINT_JAYCE_DARKWEAVER_JUMP_TO_CAVE);
+ else if (pointId == POINT_JAYCE_DARKWEAVER_JUMP_TO_CAVE)
+ {
+ me->GetMotionMaster()->MovePath(PATH_JAYCE_DARKWEAVER_RUN_INTO_CAVE, false);
+ me->DespawnOrUnsummon(5s);
+ }
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ _scheduler.Update(diff);
+ }
+
+private:
+ TaskScheduler _scheduler;
+ std::vector<ObjectGuid> _cloneGuids;
+};
+
+CreatureAI* JayceDarkweaverCrypticHollowAISelector(Creature* creature)
+{
+ if (creature->IsPrivateObject())
+ return new npc_jayce_darkweaver_cryptic_hollow_private(creature);
+ return new npc_jayce_darkweaver_cryptic_hollow(creature);
+};
+
+struct npc_basic_hidden_no_more_private : public ScriptedAI
+{
+ npc_basic_hidden_no_more_private(Creature* creature) : ScriptedAI(creature) { }
+
+ HiddenNoMorePathDelay const* GetPathDelay()
+ {
+ if (HiddenNoMorePathDelay const* pathDelay = Trinity::Containers::MapGetValuePtr(HiddenNoMorePathMap, me->GetStringId(StringIdType::Spawn)))
+ return pathDelay;
+ return nullptr;
+ }
+
+ void DoAction(int32 param) override
+ {
+ HiddenNoMorePathDelay const* pathDelay = GetPathDelay();
+ if (!pathDelay)
+ return;
+
+ switch (param)
+ {
+ case ACTION_HIDDEN_NO_MORE_MOVE:
+ {
+ _scheduler.Schedule(pathDelay->MoveDelay, [this, pathDelay](TaskContext /*task*/)
+ {
+ me->GetMotionMaster()->MovePath(pathDelay->PathId, false);
+ me->DespawnOrUnsummon(6s);
+ });
+ break;
+ }
+ default:
+ break;
+ }
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ _scheduler.Update(diff);
+ }
+
+protected:
+ TaskScheduler _scheduler;
+};
+
+CreatureAI* BasicHiddenNoMoreAISelector(Creature* creature)
+{
+ if (creature->IsPrivateObject())
+ return new npc_basic_hidden_no_more_private(creature);
+ return new NullCreatureAI(creature);
+};
+
+// 101787 - Demon Hunter
+// 101788 - Demon Hunter
+// 101789 - Demon Hunter
+// 101790 - Demon Hunter
+struct npc_demon_hunter_hidden_no_more_private : public npc_basic_hidden_no_more_private
+{
+ npc_demon_hunter_hidden_no_more_private(Creature* creature) : npc_basic_hidden_no_more_private(creature) { }
+
+ void DoAction(int32 param) override
+ {
+ HiddenNoMorePathDelay const* pathDelay = GetPathDelay();
+ if (!pathDelay)
+ return;
+
+ switch (param)
+ {
+ case ACTION_HIDDEN_NO_MORE_EYEBEAM:
+ {
+ _scheduler.Schedule(pathDelay->ActionDelay, [this](TaskContext /*task*/)
+ {
+ me->CastSpell(me, (me->GetGender() == GENDER_FEMALE ? SPELL_COSMETIC_EYE_BEAM_01_FEMALE : SPELL_COSMETIC_EYE_BEAM_01_MALE), false);
+ });
+ break;
+ }
+ case ACTION_HIDDEN_NO_MORE_MOVE:
+ {
+ me->SetAIAnimKitId(ANIM_DH_RUN);
+ _scheduler.Schedule(pathDelay->MoveDelay, [this, pathDelay](TaskContext /*task*/)
+ {
+ me->GetMotionMaster()->MovePath(pathDelay->PathId, false);
+ me->DespawnOrUnsummon(6s);
+ });
+ break;
+ }
+ default:
+ break;
+ }
+ }
+};
+
+CreatureAI* DemonHunterHiddenNoMoreAISelector(Creature* creature)
+{
+ if (creature->IsPrivateObject())
+ return new npc_demon_hunter_hidden_no_more_private(creature);
+ return new NullCreatureAI(creature);
+};
+
void AddSC_zone_mardum()
{
// Creature
@@ -1667,6 +1989,9 @@ void AddSC_zone_mardum()
new FactoryCreatureScript<CreatureAI, &IzalWhitemoonFreedAISelector>("npc_izal_whitemoon_freed_private");
new FactoryCreatureScript<CreatureAI, &BelathDawnbladeFreedAISelector>("npc_belath_dawnblade_freed_private");
new FactoryCreatureScript<CreatureAI, &MannethrelDarkstarFreedAISelector>("npc_mannethrel_darkstar_freed_private");
+ new FactoryCreatureScript<CreatureAI, &JayceDarkweaverCrypticHollowAISelector>("npc_jayce_darkweaver_cryptic_hollow");
+ new FactoryCreatureScript<CreatureAI, &DemonHunterHiddenNoMoreAISelector>("npc_demon_hunter_hidden_no_more_private");
+ new FactoryCreatureScript<CreatureAI, &BasicHiddenNoMoreAISelector>("npc_basic_hidden_no_more_private");
// AreaTrigger
RegisterAreaTriggerAI(at_enter_the_illidari_ashtongue_allari_killcredit);
@@ -1686,6 +2011,7 @@ void AddSC_zone_mardum()
// Quests
new quest_enter_the_illidari_shivarra();
+ new quest_hidden_no_more();
// Spells
RegisterSpellScript(spell_demon_hunter_intro_aura);