aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2013-10-27 11:16:48 +0100
committerShauren <shauren.trinity@gmail.com>2013-10-27 11:16:48 +0100
commit54cc7dcb41f1a57f44d69bb45a6ebd16e259b389 (patch)
treefc6f27c669505ed510c7a4da0f74fbfdabf1df61
parent75a790ca475c6af31730d331a3ab185f8abdd6e2 (diff)
parentf0794d75850a0c43938a9cddf2c42e0aab08d4ff (diff)
Merge branch 'master' of github.com:TrinityCore/TrinityCore into 4.3.4
-rw-r--r--src/server/game/Entities/Creature/Creature.h3
-rw-r--r--src/server/game/Entities/Transport/Transport.cpp31
-rw-r--r--src/server/game/Maps/Map.cpp4
-rw-r--r--src/server/game/Maps/TransportMgr.cpp42
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)