diff options
author | Shauren <shauren.trinity@gmail.com> | 2022-04-03 22:36:49 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2022-06-10 15:16:39 +0200 |
commit | 36dde87249e87c5693162a6e890875d828f93d6d (patch) | |
tree | 6b715382a474deb81b8179aeef1c45533e684b5d /src/server/scripts | |
parent | 54b16f0d167a0c5a37c91dd7140fe97597a66ac8 (diff) |
Core/Movement: Delay creating MoveSplineInit objects used by GenericMovementGenerator to spline launch time
* This fixes inconsistent transport state detection for players exiting vehicles that are on transport (ICC gunship battle), fixes players being telerpoted to middle of nowhere on that fight
(cherry picked from commit b1a94bf94c500b64a5c4ae92642a95d048d9f392)
Diffstat (limited to 'src/server/scripts')
11 files changed, 100 insertions, 72 deletions
diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp index 2cd9a7f17ac..09331dc0fa5 100644 --- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp @@ -476,14 +476,16 @@ struct npc_eye_of_acherus : public ScriptedAI break; case EVENT_LAUNCH_TOWARDS_DESTINATION: { - Movement::PointsArray path(EyeOfAcherusPath, EyeOfAcherusPath + EyeOfAcherusPathSize); - Movement::MoveSplineInit init(me); - init.MovebyPath(path); - init.SetFly(); - if (Unit* owner = me->GetCharmerOrOwner()) - init.SetVelocity(owner->GetSpeed(MOVE_RUN)); - - me->GetMotionMaster()->LaunchMoveSpline(std::move(init), POINT_NEW_AVALON, MOTION_PRIORITY_NORMAL, POINT_MOTION_TYPE); + std::function<void(Movement::MoveSplineInit&)> initializer = [=](Movement::MoveSplineInit& init) + { + Movement::PointsArray path(EyeOfAcherusPath, EyeOfAcherusPath + EyeOfAcherusPathSize); + init.MovebyPath(path); + init.SetFly(); + if (Unit* owner = me->GetCharmerOrOwner()) + init.SetVelocity(owner->GetSpeed(MOVE_RUN)); + }; + + me->GetMotionMaster()->LaunchMoveSpline(std::move(initializer), POINT_NEW_AVALON, MOTION_PRIORITY_NORMAL, POINT_MOTION_TYPE); break; } case EVENT_GRANT_CONTROL: diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/npc_arthas.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/npc_arthas.cpp index 32969c7aa04..e850034383f 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/npc_arthas.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/npc_arthas.cpp @@ -1466,12 +1466,14 @@ public: if (Creature* chromie = instance->instance->SummonCreature(NPC_CHROMIE_3, ArthasPositions[RP5_CHROMIE_SPAWN])) { chromie->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER); - Movement::PointsArray path(ChromieSplinePos, ChromieSplinePos + chromiePathSize); - Movement::MoveSplineInit init(chromie); - init.SetFly(); - init.SetWalk(true); - init.MovebyPath(path, 0); - me->GetMotionMaster()->LaunchMoveSpline(std::move(init), 0, MOTION_PRIORITY_NORMAL, POINT_MOTION_TYPE); + std::function<void(Movement::MoveSplineInit&)> initializer = [](Movement::MoveSplineInit& init) + { + Movement::PointsArray path(ChromieSplinePos, ChromieSplinePos + chromiePathSize); + init.SetFly(); + init.SetWalk(true); + init.MovebyPath(path, 0); + }; + chromie->GetMotionMaster()->LaunchMoveSpline(std::move(initializer), 0, MOTION_PRIORITY_NORMAL, POINT_MOTION_TYPE); } break; case RP5_EVENT_CHROMIE_LAND: diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp index 5ccf6f45452..0831cda0605 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp @@ -474,10 +474,12 @@ public: if (!_owner->IsAlive()) return true; - Movement::MoveSplineInit init(_owner); - init.DisableTransportPathTransformations(); - init.MoveTo(_dest.GetPositionX(), _dest.GetPositionY(), _dest.GetPositionZ(), false); - _owner->GetMotionMaster()->LaunchMoveSpline(std::move(init), EVENT_CHARGE_PREPATH, MOTION_PRIORITY_NORMAL, POINT_MOTION_TYPE); + std::function<void(Movement::MoveSplineInit&)> initializer = [dest = _dest](Movement::MoveSplineInit& init) + { + init.DisableTransportPathTransformations(); + init.MoveTo(dest.GetPositionX(), dest.GetPositionY(), dest.GetPositionZ(), false); + }; + _owner->GetMotionMaster()->LaunchMoveSpline(std::move(initializer), EVENT_CHARGE_PREPATH, MOTION_PRIORITY_NORMAL, POINT_MOTION_TYPE); return true; } @@ -572,10 +574,12 @@ struct gunship_npc_AI : public ScriptedAI me->GetTransport()->CalculatePassengerPosition(hx, hy, hz, &ho); me->SetHomePosition(hx, hy, hz, ho); - Movement::MoveSplineInit init(me); - init.DisableTransportPathTransformations(); - init.MoveTo(x, y, z, false); - me->GetMotionMaster()->LaunchMoveSpline(std::move(init), EVENT_CHARGE_PREPATH, MOTION_PRIORITY_NORMAL, POINT_MOTION_TYPE); + std::function<void(Movement::MoveSplineInit&)> initializer = [=](Movement::MoveSplineInit& init) + { + init.DisableTransportPathTransformations(); + init.MoveTo(x, y, z, false); + }; + me->GetMotionMaster()->LaunchMoveSpline(std::move(initializer), EVENT_CHARGE_PREPATH, MOTION_PRIORITY_NORMAL, POINT_MOTION_TYPE); } } @@ -933,11 +937,13 @@ struct npc_high_overlord_saurfang_igb : public ScriptedAI } else if (action == ACTION_EXIT_SHIP) { - Movement::PointsArray path(SaurfangExitPath, SaurfangExitPath + SaurfangExitPathSize); - Movement::MoveSplineInit init(me); - init.DisableTransportPathTransformations(); - init.MovebyPath(path, 0); - me->GetMotionMaster()->LaunchMoveSpline(std::move(init), 0, MOTION_PRIORITY_NORMAL, POINT_MOTION_TYPE); + std::function<void(Movement::MoveSplineInit&)> initializer = [](Movement::MoveSplineInit& init) + { + Movement::PointsArray path(SaurfangExitPath, SaurfangExitPath + SaurfangExitPathSize); + init.DisableTransportPathTransformations(); + init.MovebyPath(path, 0); + }; + me->GetMotionMaster()->LaunchMoveSpline(std::move(initializer), 0, MOTION_PRIORITY_NORMAL, POINT_MOTION_TYPE); me->DespawnOrUnsummon(18s); } @@ -1187,11 +1193,13 @@ struct npc_muradin_bronzebeard_igb : public ScriptedAI } else if (action == ACTION_EXIT_SHIP) { - Movement::PointsArray path(MuradinExitPath, MuradinExitPath + MuradinExitPathSize); - Movement::MoveSplineInit init(me); - init.DisableTransportPathTransformations(); - init.MovebyPath(path, 0); - me->GetMotionMaster()->LaunchMoveSpline(std::move(init), 0, MOTION_PRIORITY_NORMAL, POINT_MOTION_TYPE); + std::function<void(Movement::MoveSplineInit&)> initializer = [](Movement::MoveSplineInit& init) + { + Movement::PointsArray path(MuradinExitPath, MuradinExitPath + MuradinExitPathSize); + init.DisableTransportPathTransformations(); + init.MovebyPath(path, 0); + }; + me->GetMotionMaster()->LaunchMoveSpline(std::move(initializer), 0, MOTION_PRIORITY_NORMAL, POINT_MOTION_TYPE); me->DespawnOrUnsummon(18s); } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp index c8b8c4a2f6c..c468477c152 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp @@ -455,10 +455,12 @@ struct npc_bone_spike : public ScriptedAI /// @HACK - Change passenger offset to the one taken directly from sniffs /// Remove this when proper calculations are implemented. /// This fixes healing spiked people - Movement::MoveSplineInit init(passenger); - init.DisableTransportPathTransformations(); - init.MoveTo(-0.02206125f, -0.02132235f, 5.514783f, false); - passenger->GetMotionMaster()->LaunchMoveSpline(std::move(init), EVENT_VEHICLE_BOARD, MOTION_PRIORITY_HIGHEST); + std::function<void(Movement::MoveSplineInit&)> initializer = [](Movement::MoveSplineInit& init) + { + init.DisableTransportPathTransformations(); + init.MoveTo(-0.02206125f, -0.02132235f, 5.514783f, false); + }; + passenger->GetMotionMaster()->LaunchMoveSpline(std::move(initializer), EVENT_VEHICLE_BOARD, MOTION_PRIORITY_HIGHEST); } void UpdateAI(uint32 diff) override diff --git a/src/server/scripts/Northrend/Naxxramas/naxxramas.cpp b/src/server/scripts/Northrend/Naxxramas/naxxramas.cpp index 522f1892cf4..75b66007585 100644 --- a/src/server/scripts/Northrend/Naxxramas/naxxramas.cpp +++ b/src/server/scripts/Northrend/Naxxramas/naxxramas.cpp @@ -118,12 +118,14 @@ struct npc_frogger_trigger_naxx : public NullCreatureAI private: EventMap _events; - static void LaunchSpline(Creature* slime, Position const dest) + static void LaunchSpline(Creature* slime, Position const& dest) { - Movement::MoveSplineInit init(slime); - init.MoveTo(dest.GetPositionX(), dest.GetPositionY(), dest.GetPositionZ()); - init.SetWalk(true); - slime->GetMotionMaster()->LaunchMoveSpline(std::move(init)); + std::function<void(Movement::MoveSplineInit&)> initializer = [dest = dest](Movement::MoveSplineInit& init) + { + init.MoveTo(dest.GetPositionX(), dest.GetPositionY(), dest.GetPositionZ()); + init.SetWalk(true); + }; + slime->GetMotionMaster()->LaunchMoveSpline(std::move(initializer)); } }; diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp index 163db8cfb4a..763fa92044f 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp @@ -317,10 +317,12 @@ struct boss_algalon_the_observer : public BossAI DoCastSelf(SPELL_RIDE_THE_LIGHTNING, true); me->SetHomePosition(AlgalonLandPos); - Movement::MoveSplineInit init(me); - init.MoveTo(AlgalonLandPos.GetPositionX(), AlgalonLandPos.GetPositionY(), AlgalonLandPos.GetPositionZ(), false); - init.SetOrientationFixed(true); - me->GetMotionMaster()->LaunchMoveSpline(std::move(init), 0, MOTION_PRIORITY_NORMAL, POINT_MOTION_TYPE); + std::function<void(Movement::MoveSplineInit&)> initializer = [](Movement::MoveSplineInit& init) + { + init.MoveTo(AlgalonLandPos.GetPositionX(), AlgalonLandPos.GetPositionY(), AlgalonLandPos.GetPositionZ(), false); + init.SetOrientationFixed(true); + }; + me->GetMotionMaster()->LaunchMoveSpline(std::move(initializer), 0, MOTION_PRIORITY_NORMAL, POINT_MOTION_TYPE); events.Reset(); events.SetPhase(PHASE_ROLE_PLAY); diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp index e9772a31be5..2cac4d62bc0 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp @@ -329,12 +329,14 @@ struct boss_razorscale : public BossAI void HandleInitialMovement() { - Movement::PointsArray path(RazorscalePath, RazorscalePath + pathSize); - Movement::MoveSplineInit init(me); - init.MovebyPath(path, 0); - init.SetCyclic(); - init.SetFly(); - me->GetMotionMaster()->LaunchMoveSpline(std::move(init), 0, MOTION_PRIORITY_NORMAL, POINT_MOTION_TYPE); + std::function<void(Movement::MoveSplineInit&)> initializer = [](Movement::MoveSplineInit& init) + { + Movement::PointsArray path(RazorscalePath, RazorscalePath + pathSize); + init.MovebyPath(path, 0); + init.SetCyclic(); + init.SetFly(); + }; + me->GetMotionMaster()->LaunchMoveSpline(std::move(initializer), 0, MOTION_PRIORITY_NORMAL, POINT_MOTION_TYPE); } bool CanAIAttack(Unit const* target) const override diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_thorim.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_thorim.cpp index 3bae76d19c8..f1fef936a9a 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_thorim.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_thorim.cpp @@ -632,16 +632,18 @@ class boss_thorim : public CreatureScript summon->SetReactState(REACT_PASSIVE); summon->CastSpell(summon, SPELL_LIGHTNING_DESTRUCTION, true); - Movement::PointsArray path; - path.reserve(LightningOrbPathSize); - std::transform(std::begin(LightningOrbPath), std::end(LightningOrbPath), std::back_inserter(path), [](Position const& pos) + std::function<void(Movement::MoveSplineInit&)> initializer = [](Movement::MoveSplineInit& init) { - return G3D::Vector3(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ()); - }); + Movement::PointsArray path; + path.reserve(LightningOrbPathSize); + std::transform(std::begin(LightningOrbPath), std::end(LightningOrbPath), std::back_inserter(path), [](Position const& pos) + { + return G3D::Vector3(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ()); + }); - Movement::MoveSplineInit init(summon); - init.MovebyPath(path); - summon->GetMotionMaster()->LaunchMoveSpline(std::move(init), 0, MOTION_PRIORITY_NORMAL, POINT_MOTION_TYPE); + init.MovebyPath(path); + }; + summon->GetMotionMaster()->LaunchMoveSpline(std::move(initializer), 0, MOTION_PRIORITY_NORMAL, POINT_MOTION_TYPE); break; } case NPC_DARK_RUNE_CHAMPION: diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp index 727b8397bd5..9655a4b5851 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp @@ -346,10 +346,12 @@ struct npc_grauf : public ScriptedAI return; } - Movement::MoveSplineInit init(who); - init.DisableTransportPathTransformations(); - init.MoveTo(0.3320355f, 0.05355075f, 5.196949f, false); - who->GetMotionMaster()->LaunchMoveSpline(std::move(init), EVENT_VEHICLE_BOARD, MOTION_PRIORITY_HIGHEST); + std::function<void(Movement::MoveSplineInit&)> initializer = [](Movement::MoveSplineInit& init) + { + init.DisableTransportPathTransformations(); + init.MoveTo(0.3320355f, 0.05355075f, 5.196949f, false); + }; + who->GetMotionMaster()->LaunchMoveSpline(std::move(initializer), EVENT_VEHICLE_BOARD, MOTION_PRIORITY_HIGHEST); me->setActive(true); me->SetFarVisible(true); diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp index b8d9fce5e4b..ed674dec990 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp @@ -257,10 +257,12 @@ struct boss_svala : public BossAI arthas->CastSpell(me, SPELL_TRANSFORMING_CHANNEL, true); me->SetDisableGravity(true); - Movement::MoveSplineInit init(me); - init.MoveTo(296.614f, -346.2484f, 95.62769f); - init.SetFly(); - me->GetMotionMaster()->LaunchMoveSpline(std::move(init)); + std::function<void(Movement::MoveSplineInit&)> initializer = [](Movement::MoveSplineInit& init) + { + init.MoveTo(296.614f, -346.2484f, 95.62769f); + init.SetFly(); + }; + me->GetMotionMaster()->LaunchMoveSpline(std::move(initializer)); // spectators flee event std::list<Creature*> spectators; diff --git a/src/server/scripts/World/npcs_special.cpp b/src/server/scripts/World/npcs_special.cpp index e4c5af9010f..8b8e8a61aeb 100644 --- a/src/server/scripts/World/npcs_special.cpp +++ b/src/server/scripts/World/npcs_special.cpp @@ -2302,11 +2302,13 @@ public: break; } - Movement::MoveSplineInit init(who); - init.DisableTransportPathTransformations(); - init.MoveTo(x, y, z, false); - init.SetFacing(o); - who->GetMotionMaster()->LaunchMoveSpline(std::move(init), EVENT_VEHICLE_BOARD, MOTION_PRIORITY_HIGHEST); + std::function<void(Movement::MoveSplineInit&)> initializer = [=](Movement::MoveSplineInit& init) + { + init.DisableTransportPathTransformations(); + init.MoveTo(x, y, z, false); + init.SetFacing(o); + }; + who->GetMotionMaster()->LaunchMoveSpline(std::move(initializer), EVENT_VEHICLE_BOARD, MOTION_PRIORITY_HIGHEST); who->m_Events.AddEvent(new CastFoodSpell(who, _chairSpells.at(who->GetEntry())), who->m_Events.CalculateTime(1s)); if (Creature* creature = who->ToCreature()) creature->SetDisplayFromModel(0); |