Merge branch 'master' of github.com:TrinityCore/TrinityCore into 4.3.4
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user