aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2015-09-21 00:01:44 +0200
committerShauren <shauren.trinity@gmail.com>2015-09-21 00:01:44 +0200
commit32a2e584296556e852830e50cfa612ce279360b6 (patch)
treef92b0a49570eaedfdaf2c2f5afc731357308e081 /src
parentd68e3325d5a09328425b8ae9855f3f5936ff24f9 (diff)
Core/Taxi: Implemented rebuilding taxi path for early landing and enabled CMSG_TAXI_REQUEST_EARLY_LANDING
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Player/PlayerTaxi.cpp18
-rw-r--r--src/server/game/Entities/Player/PlayerTaxi.h6
-rw-r--r--src/server/game/Entities/Taxi/TaxiPathGraph.cpp2
-rw-r--r--src/server/game/Handlers/TaxiHandler.cpp11
-rw-r--r--src/server/game/Movement/MotionMaster.cpp2
-rwxr-xr-xsrc/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp6
-rwxr-xr-xsrc/server/game/Movement/MovementGenerators/WaypointMovementGenerator.h6
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp2
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);