diff options
| author | Shauren <shauren.trinity@gmail.com> | 2013-10-27 11:15:56 +0100 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2013-10-27 11:15:56 +0100 |
| commit | f0794d75850a0c43938a9cddf2c42e0aab08d4ff (patch) | |
| tree | 04d1035ab50ab1e4f06d366f06c17a7191920530 /src/server/game/Maps | |
| parent | b81bf7d0250939ee96b942f554c16d950f06c7b1 (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.cpp | 4 | ||||
| -rw-r--r-- | src/server/game/Maps/TransportMgr.cpp | 42 |
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) |
