diff options
| author | Shauren <shauren.trinity@gmail.com> | 2022-04-03 22:36:49 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2022-04-03 22:36:49 +0200 |
| commit | b1a94bf94c500b64a5c4ae92642a95d048d9f392 (patch) | |
| tree | f336113e8a55715b491c3dda0738fe0fe5895413 /src/server/scripts | |
| parent | 3f55647b3e2c65595d9822fa962810bcf559b73d (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
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 958a5be3436..eca32c1a9dd 100644 --- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp @@ -472,14 +472,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 9caecbebffd..f0e5ba85aef 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 33e30a051e0..36324199d84 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; } @@ -568,10 +570,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); } } @@ -934,11 +938,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 eebd9bf6440..952ab992e02 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 a909153a2b7..d187465f8f6 100644 --- a/src/server/scripts/Northrend/Naxxramas/naxxramas.cpp +++ b/src/server/scripts/Northrend/Naxxramas/naxxramas.cpp @@ -119,12 +119,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 e618905462b..a2883db6550 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 @@ -319,10 +319,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 d9a88456fe0..83eeebdbad7 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp @@ -331,12 +331,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 da38251aecc..d6b23fa120e 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_thorim.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_thorim.cpp @@ -651,16 +651,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 e54f22dd77c..205f27fec1f 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp @@ -347,10 +347,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 fe448d38124..1299df63c8b 100644 --- a/src/server/scripts/World/npcs_special.cpp +++ b/src/server/scripts/World/npcs_special.cpp @@ -2398,11 +2398,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 (who->GetTypeId() == TYPEID_UNIT) who->SetDisplayId(who->ToCreature()->GetCreatureTemplate()->Modelid1); |
