aboutsummaryrefslogtreecommitdiff
path: root/src/server/scripts
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2022-04-03 22:36:49 +0200
committerShauren <shauren.trinity@gmail.com>2022-04-03 22:36:49 +0200
commitb1a94bf94c500b64a5c4ae92642a95d048d9f392 (patch)
treef336113e8a55715b491c3dda0738fe0fe5895413 /src/server/scripts
parent3f55647b3e2c65595d9822fa962810bcf559b73d (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')
-rw-r--r--src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp18
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/npc_arthas.cpp14
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp44
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp10
-rw-r--r--src/server/scripts/Northrend/Naxxramas/naxxramas.cpp12
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp10
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp14
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_thorim.cpp18
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp10
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp10
-rw-r--r--src/server/scripts/World/npcs_special.cpp12
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);