aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Maps
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2013-10-27 11:15:56 +0100
committerShauren <shauren.trinity@gmail.com>2013-10-27 11:15:56 +0100
commitf0794d75850a0c43938a9cddf2c42e0aab08d4ff (patch)
tree04d1035ab50ab1e4f06d366f06c17a7191920530 /src/server/game/Maps
parentb81bf7d0250939ee96b942f554c16d950f06c7b1 (diff)
Core/Transports: Correct path generation for a few transports
Diffstat (limited to 'src/server/game/Maps')
-rw-r--r--src/server/game/Maps/Map.cpp4
-rw-r--r--src/server/game/Maps/TransportMgr.cpp42
2 files changed, 35 insertions, 11 deletions
diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp
index 9abb78187a9..a63638b0220 100644
--- a/src/server/game/Maps/Map.cpp
+++ b/src/server/game/Maps/Map.cpp
@@ -63,9 +63,11 @@ Map::~Map()
obj->ResetMap();
}
- for (TransportsContainer::iterator itr = _transports.begin(); itr != _transports.end(); ++itr)
+ for (TransportsContainer::iterator itr = _transports.begin(); itr != _transports.end();)
{
Transport* transport = *itr;
+ ++itr;
+
// Destroy local transports
if (transport->GetTransportTemplate()->inInstance)
{
diff --git a/src/server/game/Maps/TransportMgr.cpp b/src/server/game/Maps/TransportMgr.cpp
index bd79cd793d5..fe49be5607d 100644
--- a/src/server/game/Maps/TransportMgr.cpp
+++ b/src/server/game/Maps/TransportMgr.cpp
@@ -93,12 +93,12 @@ void TransportMgr::GeneratePath(GameObjectTemplate const* goInfo, TransportTempl
Movement::PointsArray splinePath;
bool mapChange = false;
bool cyclic = true;
- for (size_t i = 1; i < path.size() - 1; ++i)
+ for (size_t i = 0; i < path.size(); ++i)
{
if (!mapChange)
{
TaxiPathNodeEntry const& node_i = path[i];
- if (node_i.actionFlag == 1 || node_i.mapid != path[i + 1].mapid)
+ if (i != path.size() - 1 && (node_i.actionFlag == 1 || node_i.mapid != path[i + 1].mapid))
{
cyclic = false;
keyFrames.back().Teleport = true;
@@ -116,6 +116,24 @@ void TransportMgr::GeneratePath(GameObjectTemplate const* goInfo, TransportTempl
mapChange = false;
}
+ // Not sure if data8 means the transport can be stopped or that its path in dbc does not contain extra spline points
+ if (!goInfo->moTransport.canBeStopped && splinePath.size() >= 2)
+ {
+ // Remove special catmull-rom spline points
+ splinePath.erase(splinePath.begin());
+ keyFrames.erase(keyFrames.begin());
+ splinePath.pop_back();
+ keyFrames.pop_back();
+ // Cyclic spline has one more extra point
+ if (cyclic && !splinePath.empty())
+ {
+ splinePath.pop_back();
+ keyFrames.pop_back();
+ }
+ }
+
+ ASSERT(!keyFrames.empty());
+
if (transport->mapsUsed.size() > 1)
{
for (std::set<uint32>::const_iterator itr = transport->mapsUsed.begin(); itr != transport->mapsUsed.end(); ++itr)
@@ -157,11 +175,12 @@ void TransportMgr::GeneratePath(GameObjectTemplate const* goInfo, TransportTempl
spline->initLengths();
keyFrames[0].DistFromPrev = spline->length(spline->last() - 2, spline->last() - 1);
keyFrames[0].Spline = spline;
- for (size_t i = 1; i < keyFrames.size(); ++i)
+ for (size_t i = 0; i < keyFrames.size(); ++i)
{
keyFrames[i].Index = i + 1;
keyFrames[i].DistFromPrev = spline->length(i, i + 1);
- keyFrames[i - 1].NextDistFromPrev = keyFrames[i].DistFromPrev;
+ if (i > 0)
+ keyFrames[i - 1].NextDistFromPrev = keyFrames[i].DistFromPrev;
keyFrames[i].Spline = spline;
if (keyFrames[i].IsStopFrame())
{
@@ -215,6 +234,9 @@ void TransportMgr::GeneratePath(GameObjectTemplate const* goInfo, TransportTempl
keyFrames.back().NextDistFromPrev = keyFrames.front().DistFromPrev;
+ if (firstStop == -1 || lastStop == -1)
+ firstStop = lastStop = 0;
+
// at stopping keyframes, we define distSinceStop == 0,
// and distUntilStop is to the next stopping keyframe.
// this is required to properly handle cases of two stopping frames in a row (yes they do exist)
@@ -222,7 +244,7 @@ void TransportMgr::GeneratePath(GameObjectTemplate const* goInfo, TransportTempl
for (size_t i = 0; i < keyFrames.size(); ++i)
{
int32 j = (i + lastStop) % keyFrames.size();
- if (keyFrames[j].IsStopFrame())
+ if (keyFrames[j].IsStopFrame() || j == lastStop)
tmpDist = 0.0f;
else
tmpDist += keyFrames[j].DistFromPrev;
@@ -235,7 +257,7 @@ void TransportMgr::GeneratePath(GameObjectTemplate const* goInfo, TransportTempl
int32 j = (i + firstStop) % keyFrames.size();
tmpDist += keyFrames[(j + 1) % keyFrames.size()].DistFromPrev;
keyFrames[j].DistUntilStop = tmpDist;
- if (keyFrames[j].IsStopFrame())
+ if (keyFrames[j].IsStopFrame() || j == firstStop)
tmpDist = 0.0f;
}
@@ -272,7 +294,7 @@ void TransportMgr::GeneratePath(GameObjectTemplate const* goInfo, TransportTempl
for (size_t i = 0; i < keyFrames.size(); ++i)
{
int32 j = (i + lastStop) % keyFrames.size();
- if (keyFrames[j].IsStopFrame())
+ if (keyFrames[j].IsStopFrame() || j == lastStop)
segmentTime = keyFrames[j].TimeTo;
keyFrames[j].TimeFrom = segmentTime - keyFrames[j].TimeTo;
}
@@ -288,12 +310,12 @@ void TransportMgr::GeneratePath(GameObjectTemplate const* goInfo, TransportTempl
for (size_t i = 1; i < keyFrames.size(); ++i)
{
- curPathTime += keyFrames[i-1].TimeTo;
+ curPathTime += keyFrames[i - 1].TimeTo;
if (keyFrames[i].IsStopFrame())
{
keyFrames[i].ArriveTime = uint32(curPathTime * IN_MILLISECONDS);
keyFrames[i - 1].NextArriveTime = keyFrames[i].ArriveTime;
- curPathTime += (float)keyFrames[i].Node->delay;
+ curPathTime += float(keyFrames[i].Node->delay);
keyFrames[i].DepartureTime = uint32(curPathTime * IN_MILLISECONDS);
}
else
@@ -304,10 +326,10 @@ void TransportMgr::GeneratePath(GameObjectTemplate const* goInfo, TransportTempl
keyFrames[i].DepartureTime = keyFrames[i].ArriveTime;
}
}
+
keyFrames.back().NextArriveTime = keyFrames.back().DepartureTime;
transport->pathTime = keyFrames.back().DepartureTime;
- //WorldDatabase.DirectPExecute("UPDATE `transports` SET `period_gen`=%u WHERE `entry`=%u", transport->pathTime, transport->entry);
}
void TransportMgr::AddPathNodeToTransport(uint32 transportEntry, uint32 timeSeg, TransportAnimationEntry const* node)