diff options
author | Shauren <shauren.trinity@gmail.com> | 2015-09-21 00:01:44 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2015-09-21 00:01:44 +0200 |
commit | 32a2e584296556e852830e50cfa612ce279360b6 (patch) | |
tree | f92b0a49570eaedfdaf2c2f5afc731357308e081 /src | |
parent | d68e3325d5a09328425b8ae9855f3f5936ff24f9 (diff) |
Core/Taxi: Implemented rebuilding taxi path for early landing and enabled CMSG_TAXI_REQUEST_EARLY_LANDING
Diffstat (limited to 'src')
8 files changed, 35 insertions, 18 deletions
diff --git a/src/server/game/Entities/Player/PlayerTaxi.cpp b/src/server/game/Entities/Player/PlayerTaxi.cpp index 466cb7b947b..478b2dbc89d 100644 --- a/src/server/game/Entities/Player/PlayerTaxi.cpp +++ b/src/server/game/Entities/Player/PlayerTaxi.cpp @@ -164,17 +164,23 @@ std::ostringstream& operator<< (std::ostringstream& ss, PlayerTaxi const& taxi) return ss; } -void PlayerTaxi::RequestEarlyLanding() +bool PlayerTaxi::RequestEarlyLanding() { - if (m_TaxiDestinations.empty()) - return; + if (m_TaxiDestinations.size() <= 2) + return false; - for (std::deque<uint32>::iterator it = m_TaxiDestinations.begin(); it != m_TaxiDestinations.end(); it++) + // start from first destination - m_TaxiDestinations[0] is the current starting node + for (std::deque<uint32>::iterator it = ++m_TaxiDestinations.begin(); it != m_TaxiDestinations.end(); ++it) { if (IsTaximaskNodeKnown(*it)) { - m_TaxiDestinations.erase(++it, m_TaxiDestinations.end()); - return; + if (++it == m_TaxiDestinations.end()) + return false; // if we are left with only 1 known node on the path don't change the spline, its our final destination anyway + + m_TaxiDestinations.erase(it, m_TaxiDestinations.end()); + return true; } } + + return false; } diff --git a/src/server/game/Entities/Player/PlayerTaxi.h b/src/server/game/Entities/Player/PlayerTaxi.h index 57ab58c0f56..fb73042cb84 100644 --- a/src/server/game/Entities/Player/PlayerTaxi.h +++ b/src/server/game/Entities/Player/PlayerTaxi.h @@ -9,7 +9,7 @@ class PlayerTaxi { public: - PlayerTaxi() { } + PlayerTaxi() { m_taximask.fill(0); } ~PlayerTaxi() { } // Nodes void InitTaxiNodesForLevel(uint32 race, uint32 chrClass, uint8 level); @@ -51,13 +51,13 @@ class PlayerTaxi m_TaxiDestinations.pop_front(); return GetTaxiDestination(); } - void RequestEarlyLanding(); + bool RequestEarlyLanding(); std::deque<uint32> const& GetPath() const { return m_TaxiDestinations; } bool empty() const { return m_TaxiDestinations.empty(); } friend std::ostringstream& operator<< (std::ostringstream& ss, PlayerTaxi const& taxi); private: - TaxiMask m_taximask = { { } }; + TaxiMask m_taximask; std::deque<uint32> m_TaxiDestinations; }; diff --git a/src/server/game/Entities/Taxi/TaxiPathGraph.cpp b/src/server/game/Entities/Taxi/TaxiPathGraph.cpp index ef899795bfd..7fbcf2bf37e 100644 --- a/src/server/game/Entities/Taxi/TaxiPathGraph.cpp +++ b/src/server/game/Entities/Taxi/TaxiPathGraph.cpp @@ -116,7 +116,7 @@ void TaxiPathGraph::AddVerticeAndEdgeFromNodeInfo(TaxiNodesEntry const* from, Ta uint32 dist = uint32(totalDist); if (dist > 0xFFFF) - return; + dist = 0xFFFF; edges.push_back(std::make_pair(edge(fromVertexID, toVertexID), EdgeCost{ to, dist })); } diff --git a/src/server/game/Handlers/TaxiHandler.cpp b/src/server/game/Handlers/TaxiHandler.cpp index d3612e5a031..217a29c5338 100644 --- a/src/server/game/Handlers/TaxiHandler.cpp +++ b/src/server/game/Handlers/TaxiHandler.cpp @@ -26,6 +26,7 @@ #include "Player.h" #include "TaxiPackets.h" #include "TaxiPathGraph.h" +#include "WaypointMovementGenerator.h" void WorldSession::HandleEnableTaxiNodeOpcode(WorldPackets::Taxi::EnableTaxiNode& enableTaxiNode) { @@ -198,5 +199,13 @@ void WorldSession::SendActivateTaxiReply(ActivateTaxiReply reply) void WorldSession::HandleTaxiRequestEarlyLanding(WorldPackets::Taxi::TaxiRequestEarlyLanding& /*taxiRequestEarlyLanding*/) { - GetPlayer()->m_taxi.RequestEarlyLanding(); + if (GetPlayer()->GetMotionMaster()->GetCurrentMovementGeneratorType() == FLIGHT_MOTION_TYPE) + { + if (GetPlayer()->m_taxi.RequestEarlyLanding()) + { + FlightPathMovementGenerator* flight = static_cast<FlightPathMovementGenerator*>(GetPlayer()->GetMotionMaster()->top()); + flight->LoadPath(GetPlayer(), flight->GetPath()[flight->GetCurrentNode()]->NodeIndex); + flight->Reset(GetPlayer()); + } + } } diff --git a/src/server/game/Movement/MotionMaster.cpp b/src/server/game/Movement/MotionMaster.cpp index 50ff839e23c..117f4b675bf 100644 --- a/src/server/game/Movement/MotionMaster.cpp +++ b/src/server/game/Movement/MotionMaster.cpp @@ -534,7 +534,7 @@ void MotionMaster::MoveTaxiFlight(uint32 path, uint32 pathnode) if (path < sTaxiPathNodesByPath.size()) { TC_LOG_DEBUG("misc", "%s taxi to (Path %u node %u)", _owner->GetName().c_str(), path, pathnode); - FlightPathMovementGenerator* mgen = new FlightPathMovementGenerator(pathnode); + FlightPathMovementGenerator* mgen = new FlightPathMovementGenerator(); mgen->LoadPath(_owner->ToPlayer()); Mutate(mgen, MOTION_SLOT_CONTROLLED); } diff --git a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp index bf2148fc0b8..277f4222fed 100755 --- a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp @@ -263,8 +263,10 @@ bool IsNodeIncludedInShortenedPath(TaxiPathNodeEntry const* p1, TaxiPathNodeEntr return p1->MapID != p2->MapID || std::pow(p1->Loc.X - p2->Loc.X, 2) + std::pow(p1->Loc.Y - p2->Loc.Y, 2) > SKIP_SPLINE_POINT_DISTANCE_SQ; } -void FlightPathMovementGenerator::LoadPath(Player* player) +void FlightPathMovementGenerator::LoadPath(Player* player, uint32 startNode /*= 0*/) { + i_path.clear(); + i_currentNode = startNode; _pointsForPathSwitch.clear(); std::deque<uint32> const& taxi = player->m_taxi.GetPath(); for (uint32 src = 0, dst = 1; dst < taxi.size(); src = dst++) @@ -282,7 +284,7 @@ void FlightPathMovementGenerator::LoadPath(Player* player) bool passedPreviousSegmentProximityCheck = false; for (uint32 i = 0; i < nodes.size(); ++i) { - if (passedPreviousSegmentProximityCheck || !src || i_path.empty() || IsNodeIncludedInShortenedPath(i_path[i_path.size() - 1], nodes[i])) + if (passedPreviousSegmentProximityCheck || !src || i_path.empty() || IsNodeIncludedInShortenedPath(i_path.back(), nodes[i])) { if ((!src || (IsNodeIncludedInShortenedPath(start, nodes[i]) && i >= 2)) && (dst == taxi.size() - 1 || (IsNodeIncludedInShortenedPath(end, nodes[i]) && i < nodes.size() - 1))) diff --git a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.h b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.h index caf76b5ea19..287e6fe8b14 100755 --- a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.h @@ -106,15 +106,15 @@ class FlightPathMovementGenerator : public MovementGeneratorMedium< Player, Flig public PathMovementBase<Player, TaxiPathNodeList> { public: - explicit FlightPathMovementGenerator(uint32 startNode = 0) + explicit FlightPathMovementGenerator() { - i_currentNode = startNode; + i_currentNode = 0; _endGridX = 0.0f; _endGridY = 0.0f; _endMapId = 0; _preloadTargetNode = 0; } - void LoadPath(Player* player); + void LoadPath(Player* player, uint32 startNode = 0); void DoInitialize(Player*); void DoReset(Player*); void DoFinalize(Player*); diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index e56b331f647..fd4cb12b819 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -780,7 +780,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_TALK_TO_GOSSIP, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::NPC::Hello, &WorldSession::HandleGossipHelloOpcode); DEFINE_HANDLER(CMSG_TAXI_NODE_STATUS_QUERY, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Taxi::TaxiNodeStatusQuery, &WorldSession::HandleTaxiNodeStatusQueryOpcode); DEFINE_HANDLER(CMSG_TAXI_QUERY_AVAILABLE_NODES, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Taxi::TaxiQueryAvailableNodes, &WorldSession::HandleTaxiQueryAvailableNodesOpcode); - DEFINE_HANDLER(CMSG_TAXI_REQUEST_EARLY_LANDING, STATUS_UNHANDLED, PROCESS_THREADSAFE, WorldPackets::Taxi::TaxiRequestEarlyLanding, &WorldSession::HandleTaxiRequestEarlyLanding); + DEFINE_HANDLER(CMSG_TAXI_REQUEST_EARLY_LANDING, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Taxi::TaxiRequestEarlyLanding, &WorldSession::HandleTaxiRequestEarlyLanding); DEFINE_HANDLER(CMSG_TELEPORT_TO_UNIT, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_TIME_ADJUSTMENT_RESPONSE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_TIME_SYNC_RESPONSE, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Misc::TimeSyncResponse, &WorldSession::HandleTimeSyncResponse); |