diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Creature/Creature.h | 3 | ||||
-rw-r--r-- | src/server/game/Entities/Transport/Transport.cpp | 31 | ||||
-rw-r--r-- | src/server/game/Maps/Map.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Maps/TransportMgr.cpp | 42 |
4 files changed, 56 insertions, 24 deletions
diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index 574ee7e64f3..82e4ee2e7bc 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -656,9 +656,6 @@ class Creature : public Unit, public GridObject<Creature>, public MapObject float m_SightDistance, m_CombatDistance; - void SetGUIDTransport(uint32 guid) { guid_transport=guid; } - uint32 GetGUIDTransport() { return guid_transport; } - void FarTeleportTo(Map* map, float X, float Y, float Z, float O); bool m_isTempWorldObject; //true when possessed diff --git a/src/server/game/Entities/Transport/Transport.cpp b/src/server/game/Entities/Transport/Transport.cpp index 47493e281e5..50526136ab5 100644 --- a/src/server/game/Entities/Transport/Transport.cpp +++ b/src/server/game/Entities/Transport/Transport.cpp @@ -40,6 +40,7 @@ Transport::Transport() : GameObject(), Transport::~Transport() { + ASSERT(_passengers.empty()); UnloadStaticPassengers(); } @@ -192,20 +193,23 @@ void Transport::Update(uint32 diff) void Transport::AddPassenger(WorldObject* passenger) { if (_passengers.insert(passenger).second) + { TC_LOG_DEBUG(LOG_FILTER_TRANSPORTS, "Object %s boarded transport %s.", passenger->GetName().c_str(), GetName().c_str()); - if (Player* plr = passenger->ToPlayer()) - sScriptMgr->OnAddPassenger(this, plr); + if (Player* plr = passenger->ToPlayer()) + sScriptMgr->OnAddPassenger(this, plr); + } } void Transport::RemovePassenger(WorldObject* passenger) { if (_passengers.erase(passenger) || _staticPassengers.erase(passenger)) // static passenger can remove itself in case of grid unload + { TC_LOG_DEBUG(LOG_FILTER_TRANSPORTS, "Object %s removed from transport %s.", passenger->GetName().c_str(), GetName().c_str()); - - if (Player* plr = passenger->ToPlayer()) - sScriptMgr->OnRemovePassenger(this, plr); + if (Player* plr = passenger->ToPlayer()) + sScriptMgr->OnRemovePassenger(this, plr); + } } Creature* Transport::CreateNPCPassenger(uint32 guid, CreatureData const* data) @@ -239,9 +243,13 @@ Creature* Transport::CreateNPCPassenger(uint32 guid, CreatureData const* data) return NULL; } - map->AddToMap(creature); - _staticPassengers.insert(creature); + if (!map->AddToMap(creature)) + { + delete creature; + return NULL; + } + _staticPassengers.insert(creature); sScriptMgr->OnAddCreaturePassenger(this, creature); return creature; } @@ -275,10 +283,13 @@ GameObject* Transport::CreateGOPassenger(uint32 guid, GameObjectData const* data return NULL; } - map->AddToMap(go); - _staticPassengers.insert(go); + if (!map->AddToMap(go)) + { + delete go; + return NULL; + } - //sScriptMgr->OnAddCreaturePassenger(this, go); + _staticPassengers.insert(go); return go; } diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index f443646f218..7e165564583 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) |