aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Entities/Player/Player.cpp30
-rw-r--r--src/server/game/Entities/Player/Player.h7
-rw-r--r--src/server/game/Handlers/TaxiHandler.cpp12
-rw-r--r--src/server/game/Movement/MotionMaster.cpp4
-rw-r--r--src/server/game/Movement/MotionMaster.h2
-rw-r--r--src/server/game/Movement/MovementGenerators/FlightPathMovementGenerator.cpp6
-rw-r--r--src/server/game/Movement/MovementGenerators/FlightPathMovementGenerator.h3
-rw-r--r--src/server/game/Server/WorldSession.h1
8 files changed, 30 insertions, 35 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index a24fdcfdd47..59c2f990f6a 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -22500,7 +22500,8 @@ UF::PVPInfo const* Player::GetPvpInfoForBracket(int8 bracket) const
return nullptr;
}
-bool Player::ActivateTaxiPathTo(std::vector<uint32> const& nodes, Creature* npc /*= nullptr*/, uint32 spellid /*= 0*/, uint32 preferredMountDisplay /*= 0*/)
+bool Player::ActivateTaxiPathTo(std::vector<uint32> const& nodes, Creature* npc /*= nullptr*/, uint32 spellid /*= 0*/, uint32 preferredMountDisplay /*= 0*/,
+ Optional<float> speed /*= {}*/)
{
if (nodes.size() < 2)
{
@@ -22680,24 +22681,18 @@ bool Player::ActivateTaxiPathTo(std::vector<uint32> const& nodes, Creature* npc
ModifyMoney(-int64(firstcost));
UpdateCriteria(CriteriaType::MoneySpentOnTaxis, firstcost);
GetSession()->SendActivateTaxiReply(ERR_TAXIOK);
- GetSession()->SendDoFlight(mount_display_id, sourcepath);
+ StartTaxiMovement(mount_display_id, sourcepath, 0, speed);
}
return true;
}
-bool Player::ActivateTaxiPathTo(uint32 taxi_path_id, uint32 spellid /*= 0*/)
+bool Player::ActivateTaxiPathTo(uint32 taxi_path_id, uint32 spellid /*= 0*/, Optional<float> speed /*= {}*/)
{
TaxiPathEntry const* entry = sTaxiPathStore.LookupEntry(taxi_path_id);
if (!entry)
return false;
- std::vector<uint32> nodes;
-
- nodes.resize(2);
- nodes[0] = entry->FromTaxiNode;
- nodes[1] = entry->ToTaxiNode;
-
- return ActivateTaxiPathTo(nodes, nullptr, spellid);
+ return ActivateTaxiPathTo({ { entry->FromTaxiNode, entry->ToTaxiNode } }, nullptr, spellid, 0, speed);
}
void Player::FinishTaxiFlight()
@@ -22716,7 +22711,7 @@ void Player::CleanupAfterTaxiFlight()
RemoveUnitFlag(UNIT_FLAG_REMOVE_CLIENT_CONTROL | UNIT_FLAG_ON_TAXI);
}
-void Player::ContinueTaxiFlight() const
+void Player::ContinueTaxiFlight()
{
uint32 sourceNode = m_taxi.GetTaxiSource();
if (!sourceNode)
@@ -22763,7 +22758,18 @@ void Player::ContinueTaxiFlight() const
}
}
- GetSession()->SendDoFlight(mountDisplayId, path, startNode);
+ StartTaxiMovement(mountDisplayId, path, startNode, {});
+}
+
+void Player::StartTaxiMovement(uint32 mountDisplayId, uint32 path, uint32 pathNode, Optional<float> speed)
+{
+ // remove fake death
+ RemoveAurasWithInterruptFlags(SpellAuraInterruptFlags::Interacting);
+
+ if (mountDisplayId)
+ Mount(mountDisplayId);
+
+ GetMotionMaster()->MoveTaxiFlight(path, pathNode, speed);
}
void Player::InitDataForForm(bool reapplyMods)
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index 48a1fc5e65a..e4b62c7bafc 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -1164,11 +1164,12 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player>
PlayerTaxi m_taxi;
void InitTaxiNodesForLevel() { m_taxi.InitTaxiNodesForLevel(GetRace(), GetClass(), GetLevel()); }
- bool ActivateTaxiPathTo(std::vector<uint32> const& nodes, Creature* npc = nullptr, uint32 spellid = 0, uint32 preferredMountDisplay = 0);
- bool ActivateTaxiPathTo(uint32 taxi_path_id, uint32 spellid = 0);
+ bool ActivateTaxiPathTo(std::vector<uint32> const& nodes, Creature* npc = nullptr, uint32 spellid = 0, uint32 preferredMountDisplay = 0, Optional<float> speed = {});
+ bool ActivateTaxiPathTo(uint32 taxi_path_id, uint32 spellid = 0, Optional<float> speed = {});
void FinishTaxiFlight();
void CleanupAfterTaxiFlight();
- void ContinueTaxiFlight() const;
+ void ContinueTaxiFlight();
+ void StartTaxiMovement(uint32 mountDisplayId, uint32 path, uint32 pathNode, Optional<float> speed);
bool IsDeveloper() const { return HasPlayerFlag(PLAYER_FLAGS_DEVELOPER); }
void SetDeveloper(bool on) { if (on) SetPlayerFlag(PLAYER_FLAGS_DEVELOPER); else RemovePlayerFlag(PLAYER_FLAGS_DEVELOPER); }
diff --git a/src/server/game/Handlers/TaxiHandler.cpp b/src/server/game/Handlers/TaxiHandler.cpp
index 48cb5a1cb99..39f9a55f601 100644
--- a/src/server/game/Handlers/TaxiHandler.cpp
+++ b/src/server/game/Handlers/TaxiHandler.cpp
@@ -123,18 +123,6 @@ void WorldSession::SendTaxiMenu(Creature* unit)
GetPlayer()->SetTaxiCheater(lastTaxiCheaterState);
}
-void WorldSession::SendDoFlight(uint32 mountDisplayId, uint32 path, uint32 pathNode)
-{
- // remove fake death
- if (GetPlayer()->HasUnitState(UNIT_STATE_DIED))
- GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH);
-
- if (mountDisplayId)
- GetPlayer()->Mount(mountDisplayId);
-
- GetPlayer()->GetMotionMaster()->MoveTaxiFlight(path, pathNode);
-}
-
bool WorldSession::SendLearnNewTaxiNode(Creature* unit)
{
// find current node
diff --git a/src/server/game/Movement/MotionMaster.cpp b/src/server/game/Movement/MotionMaster.cpp
index 212d2406ea8..5fadcff5f58 100644
--- a/src/server/game/Movement/MotionMaster.cpp
+++ b/src/server/game/Movement/MotionMaster.cpp
@@ -1079,7 +1079,7 @@ void MotionMaster::MoveSeekAssistanceDistract(uint32 time)
TC_LOG_ERROR("movement.motionmaster", "MotionMaster::MoveSeekAssistanceDistract: '{}', attempted to call distract assistance.", _owner->GetGUID());
}
-void MotionMaster::MoveTaxiFlight(uint32 path, uint32 pathnode)
+void MotionMaster::MoveTaxiFlight(uint32 path, uint32 pathnode, Optional<float> speed /*= {}*/)
{
if (_owner->GetTypeId() == TYPEID_PLAYER)
{
@@ -1091,7 +1091,7 @@ void MotionMaster::MoveTaxiFlight(uint32 path, uint32 pathnode)
bool hasExisting = HasMovementGenerator([](MovementGenerator const* gen) { return gen->GetMovementGeneratorType() == FLIGHT_MOTION_TYPE; });
ASSERT(!hasExisting, "Duplicate flight path movement generator");
- FlightPathMovementGenerator* movement = new FlightPathMovementGenerator();
+ FlightPathMovementGenerator* movement = new FlightPathMovementGenerator(speed);
movement->LoadPath(_owner->ToPlayer(), pathnode);
Add(movement);
}
diff --git a/src/server/game/Movement/MotionMaster.h b/src/server/game/Movement/MotionMaster.h
index 5f82006ef32..87cee0adf85 100644
--- a/src/server/game/Movement/MotionMaster.h
+++ b/src/server/game/Movement/MotionMaster.h
@@ -195,7 +195,7 @@ class TC_GAME_API MotionMaster
void MoveFall(uint32 id = 0);
void MoveSeekAssistance(float x, float y, float z);
void MoveSeekAssistanceDistract(uint32 timer);
- void MoveTaxiFlight(uint32 path, uint32 pathnode);
+ void MoveTaxiFlight(uint32 path, uint32 pathnode, Optional<float> speed = {});
void MoveDistract(uint32 time, float orientation);
void MovePath(uint32 pathId, bool repeatable, Optional<Milliseconds> duration = {}, Optional<float> speed = {},
MovementWalkRunSpeedSelectionMode speedSelectionMode = MovementWalkRunSpeedSelectionMode::Default,
diff --git a/src/server/game/Movement/MovementGenerators/FlightPathMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/FlightPathMovementGenerator.cpp
index dd45d94b088..02184136e2c 100644
--- a/src/server/game/Movement/MovementGenerators/FlightPathMovementGenerator.cpp
+++ b/src/server/game/Movement/MovementGenerators/FlightPathMovementGenerator.cpp
@@ -32,9 +32,9 @@
#define SKIP_SPLINE_POINT_DISTANCE_SQ (40.f * 40.f)
#define PLAYER_FLIGHT_SPEED 32.0f
-FlightPathMovementGenerator::FlightPathMovementGenerator()
+FlightPathMovementGenerator::FlightPathMovementGenerator(Optional<float> speed)
{
- _currentNode = 0;
+ _speed = speed;
_endGridX = 0.0f;
_endGridY = 0.0f;
_endMapId = 0;
@@ -98,7 +98,7 @@ void FlightPathMovementGenerator::DoReset(Player* owner)
init.SetSmooth();
init.SetUncompressed();
init.SetWalk(true);
- init.SetVelocity(PLAYER_FLIGHT_SPEED);
+ init.SetVelocity(_speed.value_or(PLAYER_FLIGHT_SPEED));
init.Launch();
}
diff --git a/src/server/game/Movement/MovementGenerators/FlightPathMovementGenerator.h b/src/server/game/Movement/MovementGenerators/FlightPathMovementGenerator.h
index 8a624b3fc25..2abc4c275f4 100644
--- a/src/server/game/Movement/MovementGenerators/FlightPathMovementGenerator.h
+++ b/src/server/game/Movement/MovementGenerators/FlightPathMovementGenerator.h
@@ -33,7 +33,7 @@ struct TaxiPathNodeEntry;
class FlightPathMovementGenerator : public MovementGeneratorMedium<Player, FlightPathMovementGenerator>, public PathMovementBase<Player, std::vector<TaxiPathNodeEntry const*>>
{
public:
- explicit FlightPathMovementGenerator();
+ explicit FlightPathMovementGenerator(Optional<float> speed);
MovementGeneratorType GetMovementGeneratorType() const override;
bool GetResetPosition(Unit* owner, float& x, float& y, float& z) override;
@@ -59,6 +59,7 @@ class FlightPathMovementGenerator : public MovementGeneratorMedium<Player, Fligh
std::string GetDebugInfo() const override;
private:
+ Optional<float> _speed;
float _endGridX; //!< X coord of last node location
float _endGridY; //!< Y coord of last node location
uint32 _endMapId; //!< map Id of last node location
diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
index e7b63f99464..7b3c8567382 100644
--- a/src/server/game/Server/WorldSession.h
+++ b/src/server/game/Server/WorldSession.h
@@ -1129,7 +1129,6 @@ class TC_GAME_API WorldSession
//Taxi
void SendTaxiStatus(ObjectGuid guid);
void SendTaxiMenu(Creature* unit);
- void SendDoFlight(uint32 mountDisplayId, uint32 path, uint32 pathNode = 0);
bool SendLearnNewTaxiNode(Creature* unit);
void SendDiscoverNewTaxiNode(uint32 nodeid);