diff options
author | Aqua Deus <95978183+aquadeus@users.noreply.github.com> | 2024-04-12 22:30:45 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-04-12 22:30:45 +0200 |
commit | a3f760e38338c9ca4159e315ae99ac2f04491e95 (patch) | |
tree | 7f5f72aa08cf05a9c8d58457dc88e6f2cf421539 /src | |
parent | 59333a4d609d45fcf4a3c5c55fe17e42e4002a75 (diff) |
Scripts/Wandering Isle: Script quest 29419 The Missing Driver (#29821)
Diffstat (limited to 'src')
-rw-r--r-- | src/server/scripts/Pandaria/zone_the_wandering_isle.cpp | 219 |
1 files changed, 219 insertions, 0 deletions
diff --git a/src/server/scripts/Pandaria/zone_the_wandering_isle.cpp b/src/server/scripts/Pandaria/zone_the_wandering_isle.cpp index 3ae96020d88..dfdd821eb2f 100644 --- a/src/server/scripts/Pandaria/zone_the_wandering_isle.cpp +++ b/src/server/scripts/Pandaria/zone_the_wandering_isle.cpp @@ -24,11 +24,13 @@ #include "GridNotifiersImpl.h" #include "MotionMaster.h" #include "ObjectAccessor.h" +#include "PhasingHandler.h" #include "Player.h" #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "SpellScript.h" #include "TaskScheduler.h" +#include "TemporarySummon.h" enum TraineeMisc { @@ -620,6 +622,218 @@ class spell_ride_drake : public AuraScript } }; +// Quest 29419 - The Missing Driver +enum TheMissingDriverMisc +{ + // Spells + SPELL_SERVERSIDE_DRIVER_CREDIT = 106231, + SPELL_FORCE_SUMMON_CART_DRIVER = 106206, + SPELL_SUMMON_CART_DRIVER = 106205, + + // Texts + SAY_MIN_DIMWIND_TEXT_0 = 0, + SAY_MIN_DIMWIND_TEXT_1 = 1, + SAY_MIN_DIMWIND_TEXT_2 = 2, + SAY_MIN_DIMWIND_TEXT_3 = 3, + + SAY_AMBERLEAF_SCAMP_0 = 0, + SAY_AMBERLEAF_SCAMP_1 = 1, + + // Waypoint + PATH_MOVE_RUN = 5650300, + PATH_MOVE_WALK = 5650301, + + WAYPOINT_TALK_0 = 0, + WAYPOINT_TALK_1 = 3, + WAYPOINT_MOVE_WALK = 11, + + WAYPOINT_DESPAWN = 3, + + POINT_MOVE_RANDOM = 0, + + // Quests + QUEST_THE_MISSING_DRIVER = 29419 +}; + +constexpr Position amberleafPos[5] = +{ + { 1410.2014f, 3598.6494f, 89.59319f }, + { 1456.201f, 3568.265f, 88.39075f }, + { 1383.158f, 3595.447f, 90.3155f }, + { 1367.333f, 3594.927f, 88.89806f }, + { 1350.278f, 3588.938f, 89.17908f } +}; + +// 6958 - Areatrigger +class at_min_dimwind_captured : public AreaTriggerScript +{ + public: + at_min_dimwind_captured() : AreaTriggerScript("at_min_dimwind_captured") { } + + bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override + { + if (!player->isDead() && player->GetQuestStatus(QUEST_THE_MISSING_DRIVER) == QUEST_STATUS_INCOMPLETE) + { + Creature* minDimwind = player->FindNearestCreatureWithOptions(20.0f, { .StringId = "npc_min_dimwind" }); + + if (!minDimwind) + return false; + + minDimwind->CastSpell(player, SPELL_FORCE_SUMMON_CART_DRIVER, TRIGGERED_FULL_MASK); + player->CastSpell(player, SPELL_SERVERSIDE_DRIVER_CREDIT, TRIGGERED_FULL_MASK); + PhasingHandler::OnConditionChange(player); // phase 630 is added when kill credit but immediately is removed to be added again when Min Dimwind reaches final waypoint + } + + return false; + } +}; + +// 56503 - Min Dimwind (Summon) +struct npc_min_dimwind_summon : public ScriptedAI +{ + using ScriptedAI::ScriptedAI; + + void IsSummonedBy(WorldObject* summoner) override + { + if (!summoner->IsPlayer()) + return; + + Creature* amberleafScamp1 = me->FindNearestCreatureWithOptions(20.0f, { .StringId = "npc_amberleaf_scamp_1" }); + Creature* amberleafScamp2 = me->FindNearestCreatureWithOptions(20.0f, { .StringId = "npc_amberleaf_scamp_2" }); + Creature* amberleafScamp3 = me->FindNearestCreatureWithOptions(20.0f, { .StringId = "npc_amberleaf_scamp_3" }); + Creature* amberleafScamp5 = me->FindNearestCreatureWithOptions(20.0f, { .StringId = "npc_amberleaf_scamp_5" }); + + if (!amberleafScamp1 || !amberleafScamp2 || !amberleafScamp3 || !amberleafScamp5) + return; + + amberleafScamp1->AI()->Talk(SAY_AMBERLEAF_SCAMP_0); + amberleafScamp1->GetMotionMaster()->MovePoint(0, amberleafPos[0]); + + amberleafScamp2->GetMotionMaster()->MovePoint(0, amberleafPos[1]); + + amberleafScamp3->GetMotionMaster()->MovePoint(0, amberleafPos[2]); + + amberleafScamp5->GetMotionMaster()->MovePoint(0, amberleafPos[4]); + + _scheduler.Schedule(2s, [this](TaskContext /*task*/) + { + Creature* amberleafScamp4 = me->FindNearestCreatureWithOptions(20.0f, { .StringId = "npc_amberleaf_scamp_4" }); + + if (!amberleafScamp4) + return; + + amberleafScamp4->AI()->Talk(SAY_AMBERLEAF_SCAMP_1); + amberleafScamp4->GetMotionMaster()->MovePoint(0, amberleafPos[3]); + }); + + _scheduler.Schedule(5s, [this](TaskContext task) + { + Unit* summoner = me->ToTempSummon()->GetSummonerUnit(); + + if (!summoner) + return; + + me->SetFacingToObject(summoner); + Talk(SAY_MIN_DIMWIND_TEXT_0, summoner); + + task.Schedule(4s, [this](TaskContext task) + { + Talk(SAY_MIN_DIMWIND_TEXT_1); + + task.Schedule(4s, [this](TaskContext /*task*/) + { + me->GetMotionMaster()->MovePath(PATH_MOVE_RUN, false); + }); + }); + }); + } + + void WaypointReached(uint32 waypointId, uint32 pathId) override + { + if (pathId == PATH_MOVE_RUN) + { + switch (waypointId) + { + case WAYPOINT_TALK_0: + case WAYPOINT_TALK_1: + { + Talk(SAY_MIN_DIMWIND_TEXT_2); + break; + } + case WAYPOINT_MOVE_WALK: + { + Talk(SAY_MIN_DIMWIND_TEXT_3); + me->GetMotionMaster()->MovePath(PATH_MOVE_WALK, false); + break; + } + } + } + else if (pathId == PATH_MOVE_WALK) + { + if (waypointId == WAYPOINT_DESPAWN) + { + me->SetFacingTo(0.575958f); + me->DespawnOrUnsummon(2s); + + _scheduler.Schedule(1s, [this](TaskContext /*task*/) + { + if (me->IsSummon()) + { + Unit* summoner = me->ToTempSummon()->GetSummonerUnit(); + + if (!summoner) + return; + + summoner->RemoveAurasDueToSpell(SPELL_SUMMON_CART_DRIVER); + PhasingHandler::OnConditionChange(summoner); + } + }); + } + } + } + + void UpdateAI(uint32 diff) override + { + _scheduler.Update(diff); + } + +private: + TaskScheduler _scheduler; +}; + +// 54130 - Amberleaf Scamp +struct npc_amberleaf_scamp : public ScriptedAI +{ + using ScriptedAI::ScriptedAI; + + void MovementInform(uint32 type, uint32 id) override + { + if (type == POINT_MOTION_TYPE && id == POINT_MOVE_RANDOM && !me->IsInCombat()) + { + me->GetMotionMaster()->MoveRandom(10.0f); + + _scheduler.Schedule(10s, [this](TaskContext /*task*/) + { + if (!me->IsInCombat()) + me->GetMotionMaster()->MoveTargetedHome(); + }); + } + } + + void JustReachedHome() override + { + me->GetMotionMaster()->InitializeDefault(); + } + + void UpdateAI(uint32 diff) override + { + _scheduler.Update(diff); + } + +private: + TaskScheduler _scheduler; +}; + void AddSC_zone_the_wandering_isle() { RegisterCreatureAI(npc_tushui_huojin_trainee); @@ -629,6 +843,11 @@ void AddSC_zone_the_wandering_isle() RegisterGameObjectAI(go_edict_of_temperance); RegisterCreatureAI(npc_jaomin_ro); RegisterCreatureAI(npc_jaomin_ro_hawk); + RegisterCreatureAI(npc_min_dimwind_summon); + RegisterCreatureAI(npc_amberleaf_scamp); + RegisterSpellScript(spell_force_summoner_to_ride_vehicle); RegisterSpellScript(spell_ride_drake); + + new at_min_dimwind_captured(); } |