diff options
author | Shauren <shauren.trinity@gmail.com> | 2024-04-04 16:17:09 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2024-04-04 16:17:09 +0200 |
commit | 038f995ad6ce6a26f71367cae3eb7ae107527a18 (patch) | |
tree | cdcd1bb487cbec762089c8c6088d22470aa3c7b7 /src | |
parent | c2f2f4201d1d1a6cd394692535715cde94e5ea1f (diff) |
Core/Movement: Allow overriding speed for taxi movement generator
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 30 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 7 | ||||
-rw-r--r-- | src/server/game/Handlers/TaxiHandler.cpp | 12 | ||||
-rw-r--r-- | src/server/game/Movement/MotionMaster.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Movement/MotionMaster.h | 2 | ||||
-rw-r--r-- | src/server/game/Movement/MovementGenerators/FlightPathMovementGenerator.cpp | 6 | ||||
-rw-r--r-- | src/server/game/Movement/MovementGenerators/FlightPathMovementGenerator.h | 3 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.h | 1 |
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); |