aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/Pandaria/zone_the_wandering_isle.cpp407
1 files changed, 393 insertions, 14 deletions
diff --git a/src/server/scripts/Pandaria/zone_the_wandering_isle.cpp b/src/server/scripts/Pandaria/zone_the_wandering_isle.cpp
index dfdd821eb2f..c9a04bc31ec 100644
--- a/src/server/scripts/Pandaria/zone_the_wandering_isle.cpp
+++ b/src/server/scripts/Pandaria/zone_the_wandering_isle.cpp
@@ -109,12 +109,12 @@ struct npc_tushui_huojin_trainee : public ScriptedAI
me->SetUnitFlag(UNIT_FLAG_IMMUNE_TO_PC);
me->CombatStop();
- _scheduler.Schedule(Seconds(1), [this](TaskContext /*task*/)
+ _scheduler.Schedule(1s, [this](TaskContext /*task*/)
{
Talk(SAY_FINISH_FIGHT);
});
- _scheduler.Schedule(Seconds(3), [this](TaskContext /*task*/)
+ _scheduler.Schedule(3s, [this](TaskContext /*task*/)
{
Position currentPosition;
float currentDist = 1000.0f;
@@ -145,12 +145,12 @@ struct npc_tushui_huojin_trainee : public ScriptedAI
void JustEngagedWith(Unit* /*attacker*/) override
{
- _scheduler.Schedule(Seconds(4), [this](TaskContext task)
+ _scheduler.Schedule(4s, [this](TaskContext task)
{
if (me->GetVictim())
DoCastVictim(SPELL_BLACKOUT_KICK);
- task.Repeat(Seconds(8));
+ task.Repeat(8s);
});
}
@@ -235,7 +235,7 @@ struct npc_huojin_trainee : public npc_tushui_huojin_trainee
_scheduler.CancelAll();
me->SetEmoteState(EMOTE_ONESHOT_NONE);
- _scheduler.Schedule(Seconds(1), [this](TaskContext /*task*/ )
+ _scheduler.Schedule(1s, [this](TaskContext /*task*/ )
{
me->HandleEmoteCommand(EMOTE_ONESHOT_BOW);
});
@@ -248,15 +248,15 @@ struct npc_huojin_trainee : public npc_tushui_huojin_trainee
me->SetEmoteState(EMOTE_ONESHOT_NONE);
me->HandleEmoteCommand(EMOTE_ONESHOT_BOW);
- _scheduler.Schedule(Seconds(1), [this](TaskContext /*task*/)
+ _scheduler.Schedule(1s, [this](TaskContext /*task*/)
{
me->SetEmoteState(EMOTE_STATE_MONKOFFENSE_READYUNARMED);
});
- _scheduler.Schedule(Seconds(4), [this](TaskContext task)
+ _scheduler.Schedule(4s, [this](TaskContext task)
{
PlayRandomEmote();
- task.Repeat(Seconds(4));
+ task.Repeat(4s);
});
}
@@ -272,7 +272,7 @@ struct npc_huojin_trainee : public npc_tushui_huojin_trainee
void BeginSparringDelayed(ObjectGuid partnerGuid)
{
_partnerGuid = partnerGuid;
- _scheduler.Schedule(Seconds(1), [this, partnerGuid](TaskContext /*task*/)
+ _scheduler.Schedule(1s, [this, partnerGuid](TaskContext /*task*/)
{
BeginSparring(partnerGuid);
});
@@ -353,11 +353,11 @@ struct npc_tushui_leading_trainee : public npc_tushui_huojin_trainee
void ScheduleEmoteExecution()
{
- _scheduler.Schedule(Seconds(1), [this](TaskContext task)
+ _scheduler.Schedule(1s, [this](TaskContext task)
{
Emote emote = PlayRandomEmote();
HandleEmoteNearbyTushuiTrainees(me, emote);
- task.Repeat(Seconds(6));
+ task.Repeat(6s);
});
}
@@ -385,16 +385,16 @@ struct npc_instructor_zhi : public ScriptedAI
void JustAppeared() override
{
- _scheduler.Schedule(Seconds(6), [this](TaskContext task)
+ _scheduler.Schedule(6s, [this](TaskContext task)
{
Emote emote = Trinity::Containers::SelectRandomContainerElement(TraineeEmotes);
me->HandleEmoteCommand(emote);
- task.Schedule(Seconds(1), [this, emote](TaskContext /*task*/)
+ task.Schedule(1s, [this, emote](TaskContext /*task*/)
{
HandleEmoteNearbyTushuiTrainees(me, emote);
});
- task.Repeat(Seconds(6));
+ task.Repeat(6s);
});
}
@@ -834,6 +834,379 @@ private:
TaskScheduler _scheduler;
};
+// Quest 29414 - The Way of the Tushui
+enum AysaCloudsingerMisc
+{
+ // Texts
+ SAY_GO_CAVE = 0,
+
+ // Waypoints
+ POINT_JUMP = 1,
+ PATH_CAVE_OF_MEDITATION = 5965200
+};
+
+constexpr Position aysaJumpPos[3] =
+{
+ { 1196.72f, 3492.85f, 90.9836f },
+ { 1192.29f, 3478.69f, 108.788f },
+ { 1197.99f, 3460.63f, 103.04f }
+};
+
+// 59652 - Aysa Cloudsinger (summon)
+struct npc_aysa_cloudsinger_summon : public ScriptedAI
+{
+ npc_aysa_cloudsinger_summon(Creature* creature) : ScriptedAI(creature) { }
+
+ void IsSummonedBy(WorldObject* summoner) override
+ {
+ if (!summoner->IsPlayer())
+ return;
+
+ Talk(SAY_GO_CAVE, summoner);
+
+ _scheduler.Schedule(3s, [this](TaskContext task)
+ {
+ me->GetMotionMaster()->MoveJumpWithGravity(aysaJumpPos[0], 12.0f, 17.4735f);
+
+ task.Schedule(1700ms, [this](TaskContext task)
+ {
+ me->GetMotionMaster()->MoveJumpWithGravity(aysaJumpPos[1], 12.0f, 10.7163f);
+
+ task.Schedule(2s, [this](TaskContext /*task*/)
+ {
+ me->GetMotionMaster()->MoveJumpWithGravity(aysaJumpPos[2], 12.0f, 14.6923f, POINT_JUMP);
+ });
+ });
+ });
+ }
+
+ void MovementInform(uint32 type, uint32 pointId) override
+ {
+ if (type != EFFECT_MOTION_TYPE)
+ return;
+
+ if (pointId == POINT_JUMP)
+ me->GetMotionMaster()->MovePath(PATH_CAVE_OF_MEDITATION, false);
+ }
+
+ void WaypointPathEnded(uint32 /*nodeId*/, uint32 pathId) override
+ {
+ if (pathId == PATH_CAVE_OF_MEDITATION)
+ me->DespawnOrUnsummon();
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ _scheduler.Update(diff);
+ }
+
+private:
+ TaskScheduler _scheduler;
+};
+
+enum CaveOfMeditationMisc
+{
+ // Quest
+ QUEST_THE_WAY_OF_THE_TUSHUI = 29414,
+
+ // Spells
+ SPELL_MEDITATION_TIMER_BAR = 116421,
+ SPELL_CAVE_OF_SCROLLS_CREDIT = 102447,
+ SPELL_AYSA_CAVE_OF_SCROLLS_COMP = 128598,
+ SPELL_SUMMON_MASTER_LI_FEI = 102445,
+ SPELL_SUMMON_AMBERLEAF_TROUBLEMAKER = 114710,
+
+ // Actions
+ ACTION_START_MEDITATION = 1,
+ ACTION_FINISH_MEDITATION = 2,
+ ACTION_FINISH_EVENT = 3,
+
+ // Events
+ EVENT_SUMMON_AMBERLEAF = 1,
+
+ // Texts
+ SAY_AYSA_HELP = 0,
+ SAY_AYSA_FINISH_MEDITATION = 1
+};
+
+// 59642 - Aysa Cloudsinger (Cave of Meditation)
+struct npc_aysa_cloudsinger_cave_of_meditation : public ScriptedAI
+{
+ npc_aysa_cloudsinger_cave_of_meditation(Creature* creature) : ScriptedAI(creature), _finishEvent(false) { }
+
+ void DoAction(int32 action) override
+ {
+ switch (action)
+ {
+ case ACTION_START_MEDITATION:
+ {
+ _finishEvent = false;
+ events.ScheduleEvent(EVENT_SUMMON_AMBERLEAF, 1s);
+ break;
+ }
+ case ACTION_FINISH_MEDITATION:
+ {
+ events.CancelEvent(EVENT_SUMMON_AMBERLEAF);
+ break;
+ }
+ case ACTION_FINISH_EVENT:
+ {
+ if (_finishEvent)
+ return;
+
+ Creature* aysa = me->FindNearestCreatureWithOptions(40.0f, { .StringId = "npc_aysa_after_quest_29414", .IgnorePhases = true });
+
+ if (!aysa)
+ return;
+
+ aysa->AI()->Talk(SAY_AYSA_FINISH_MEDITATION);
+ _finishEvent = true;
+ break;
+ }
+ default:
+ break;
+ }
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ events.Update(diff);
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_SUMMON_AMBERLEAF:
+ {
+ DoCastSelf(SPELL_SUMMON_AMBERLEAF_TROUBLEMAKER);
+ events.Repeat(11s);
+ break;
+ }
+ default:
+ break;
+ }
+ }
+ }
+
+private:
+ EventMap events;
+ bool _finishEvent;
+};
+
+enum MasterLiFeiMisc
+{
+ // Waypoint
+ PATH_MASTER_LI = 5485600,
+
+ // Texts
+ SAY_TEXT_0 = 0,
+ SAY_TEXT_1 = 1,
+ SAY_TEXT_2 = 2,
+ SAY_TEXT_3 = 3,
+ SAY_TEXT_4 = 4,
+ SAY_TEXT_5 = 5,
+ SAY_TEXT_6 = 6,
+ SAY_TEXT_7 = 7,
+
+ // Spells
+ SPELL_UPDATE_PHASE_SHIFT_DEMON_CREATOR = 84034
+};
+
+// 54856 - Master Li Fei (Summon)
+struct npc_master_li_fei_summon : public ScriptedAI
+{
+ npc_master_li_fei_summon(Creature* creature) : ScriptedAI(creature) { }
+
+ void FaceToPlayer()
+ {
+ if (me->IsSummon())
+ {
+ Unit* summoner = me->ToTempSummon()->GetSummonerUnit();
+
+ if (!summoner)
+ return;
+
+ me->SetFacingToObject(summoner);
+ }
+ }
+
+ void IsSummonedBy(WorldObject* summoner) override
+ {
+ if (!summoner->IsPlayer())
+ return;
+
+ me->GetMotionMaster()->MovePath(PATH_MASTER_LI, false);
+
+ Seconds delay = 23s;
+
+ _scheduler.Schedule(delay, [this](TaskContext)
+ {
+ FaceToPlayer();
+ });
+
+ delay += 2s;
+
+ _scheduler.Schedule(delay, [this](TaskContext)
+ {
+ Talk(SAY_TEXT_0);
+ });
+
+ delay += 10s;
+
+ _scheduler.Schedule(delay, [this](TaskContext)
+ {
+ Talk(SAY_TEXT_1);
+ });
+
+ delay += 12s;
+
+ _scheduler.Schedule(delay, [this](TaskContext)
+ {
+ Talk(SAY_TEXT_2);
+ });
+
+ delay += 11s;
+
+ _scheduler.Schedule(delay, [this](TaskContext)
+ {
+ FaceToPlayer();
+ Talk(SAY_TEXT_3);
+ });
+
+ delay += 11s;
+
+ _scheduler.Schedule(delay, [this](TaskContext)
+ {
+ Talk(SAY_TEXT_4);
+ });
+
+ delay += 9s;
+
+ _scheduler.Schedule(delay, [this](TaskContext)
+ {
+ FaceToPlayer();
+ });
+
+ delay += 2s;
+
+ _scheduler.Schedule(delay, [this](TaskContext)
+ {
+ Talk(SAY_TEXT_5);
+ });
+
+ delay += 6s;
+
+ _scheduler.Schedule(delay, [this](TaskContext)
+ {
+ Creature* aysa = me->FindNearestCreatureWithOptions(40.0f, { .StringId = "npc_aysa_quest_29414" });
+
+ if (!aysa)
+ return;
+
+ aysa->AI()->DoAction(ACTION_FINISH_MEDITATION);
+ DoCastSelf(SPELL_UPDATE_PHASE_SHIFT_DEMON_CREATOR);
+ Talk(SAY_TEXT_6);
+ me->DespawnOrUnsummon(200ms);
+ });
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ _scheduler.Update(diff);
+ }
+
+private:
+ TaskScheduler _scheduler;
+};
+
+// 7756 - Areatrigger
+class at_cave_of_meditation : public AreaTriggerScript
+{
+public:
+ at_cave_of_meditation() : AreaTriggerScript("at_cave_of_meditation") { }
+
+ bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override
+ {
+ if (player->IsAlive() && player->GetQuestStatus(QUEST_THE_WAY_OF_THE_TUSHUI) == QUEST_STATUS_INCOMPLETE)
+ {
+ if (!player->HasAura(SPELL_MEDITATION_TIMER_BAR))
+ player->CastSpell(player, SPELL_MEDITATION_TIMER_BAR, TRIGGERED_FULL_MASK);
+
+ return true;
+ }
+ return false;
+ }
+
+ bool OnExit(Player* player, AreaTriggerEntry const* /*trigger*/) override
+ {
+ player->RemoveAura(SPELL_MEDITATION_TIMER_BAR);
+ return true;
+ }
+};
+
+// 7645 - Areatrigger
+class at_inside_of_cave_of_meditation : public AreaTriggerScript
+{
+public:
+ at_inside_of_cave_of_meditation() : AreaTriggerScript("at_inside_of_cave_of_meditation") { }
+
+ bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override
+ {
+ if (player->IsAlive() && player->GetQuestStatus(QUEST_THE_WAY_OF_THE_TUSHUI) == QUEST_STATUS_INCOMPLETE)
+ {
+ if (!player->HasAura(SPELL_SUMMON_MASTER_LI_FEI))
+ {
+ Creature* aysa = player->FindNearestCreatureWithOptions(40.0f, { .StringId = "npc_aysa_quest_29414" });
+
+ if (!aysa)
+ return false;
+
+ aysa->AI()->Talk(SAY_AYSA_HELP, player);
+ aysa->AI()->DoAction(ACTION_START_MEDITATION);
+ player->CastSpell(player, SPELL_SUMMON_MASTER_LI_FEI, TRIGGERED_FULL_MASK);
+ }
+
+ return true;
+ }
+ return false;
+ }
+
+ bool OnExit(Player* player, AreaTriggerEntry const* /*trigger*/) override
+ {
+ if (player->IsAlive() && player->GetQuestStatus(QUEST_THE_WAY_OF_THE_TUSHUI) == QUEST_STATUS_COMPLETE)
+ {
+ if (Creature* aysa = player->FindNearestCreatureWithOptions(40.0f, { .StringId = "npc_aysa_quest_29414", .IgnorePhases = true }))
+ aysa->AI()->DoAction(ACTION_FINISH_EVENT);
+ }
+
+ return true;
+ }
+};
+
+// 116421 - Meditation Timer Bar
+class spell_meditation_timer_bar : public AuraScript
+{
+ void HandleEffectPeriodic(AuraEffect const* /*aurEff*/)
+ {
+ if (Unit* target = GetTarget())
+ {
+ target->ModifyPower(POWER_ALTERNATE_POWER, 1);
+
+ if (target->GetPowerPct(POWER_ALTERNATE_POWER) == 100)
+ {
+ target->CastSpell(GetTarget(), SPELL_CAVE_OF_SCROLLS_CREDIT, TRIGGERED_FULL_MASK);
+ target->CastSpell(GetTarget(), SPELL_AYSA_CAVE_OF_SCROLLS_COMP, TRIGGERED_FULL_MASK);
+ Remove();
+ }
+ }
+ }
+
+ void Register() override
+ {
+ OnEffectPeriodic += AuraEffectPeriodicFn(spell_meditation_timer_bar::HandleEffectPeriodic, EFFECT_1, SPELL_AURA_PERIODIC_DUMMY);
+ }
+};
+
void AddSC_zone_the_wandering_isle()
{
RegisterCreatureAI(npc_tushui_huojin_trainee);
@@ -845,9 +1218,15 @@ void AddSC_zone_the_wandering_isle()
RegisterCreatureAI(npc_jaomin_ro_hawk);
RegisterCreatureAI(npc_min_dimwind_summon);
RegisterCreatureAI(npc_amberleaf_scamp);
+ RegisterCreatureAI(npc_aysa_cloudsinger_summon);
+ RegisterCreatureAI(npc_aysa_cloudsinger_cave_of_meditation);
+ RegisterCreatureAI(npc_master_li_fei_summon);
RegisterSpellScript(spell_force_summoner_to_ride_vehicle);
RegisterSpellScript(spell_ride_drake);
+ RegisterSpellScript(spell_meditation_timer_bar);
new at_min_dimwind_captured();
+ new at_cave_of_meditation();
+ new at_inside_of_cave_of_meditation();
}