[7598] Implement proper hide out of range (at another map) transports. Remove duplicate name field.

This commit is contained in:
VladimirMangos 2009-04-02 00:49:03 +04:00
parent 1ec8e1f24d
commit 836d356d67
4 changed files with 54 additions and 19 deletions

View file

@ -1875,7 +1875,8 @@ void Map::SendInitTransports( Player * player )
for (MapManager::TransportSet::iterator i = tset.begin(); i != tset.end(); ++i) for (MapManager::TransportSet::iterator i = tset.begin(); i != tset.end(); ++i)
{ {
if((*i) != player->GetTransport()) // send data for current transport in other place // send data for current transport in other place
if((*i) != player->GetTransport() && (*i)->GetMapId()==i_id)
{ {
hasTransport = true; hasTransport = true;
(*i)->BuildCreateUpdateBlockForPlayer(&transData, player); (*i)->BuildCreateUpdateBlockForPlayer(&transData, player);
@ -1902,7 +1903,7 @@ void Map::SendRemoveTransports( Player * player )
// except used transport // except used transport
for (MapManager::TransportSet::iterator i = tset.begin(); i != tset.end(); ++i) for (MapManager::TransportSet::iterator i = tset.begin(); i != tset.end(); ++i)
if(player->GetTransport() != (*i)) if((*i) != player->GetTransport() && (*i)->GetMapId()!=i_id)
(*i)->BuildOutOfRangeUpdateBlock(&transData); (*i)->BuildOutOfRangeUpdateBlock(&transData);
WorldPacket packet; WorldPacket packet;

View file

@ -85,8 +85,6 @@ void MapManager::LoadTransports()
continue; continue;
} }
t->m_name = goinfo->name;
float x, y, z, o; float x, y, z, o;
uint32 mapid; uint32 mapid;
x = t->m_WayPoints[0].x; y = t->m_WayPoints[0].y; z = t->m_WayPoints[0].z; mapid = t->m_WayPoints[0].mapid; o = 1; x = t->m_WayPoints[0].x; y = t->m_WayPoints[0].y; z = t->m_WayPoints[0].z; mapid = t->m_WayPoints[0].mapid; o = 1;
@ -181,6 +179,8 @@ bool Transport::Create(uint32 guidlow, uint32 mapid, float x, float y, float z,
if(dynflags) if(dynflags)
SetUInt32Value(GAMEOBJECT_DYNAMIC, MAKE_PAIR32(0, dynflags)); SetUInt32Value(GAMEOBJECT_DYNAMIC, MAKE_PAIR32(0, dynflags));
SetName(goinfo->name);
return true; return true;
} }
@ -432,11 +432,9 @@ Transport::WayPointMap::iterator Transport::GetNextWayPoint()
void Transport::TeleportTransport(uint32 newMapid, float x, float y, float z) void Transport::TeleportTransport(uint32 newMapid, float x, float y, float z)
{ {
//GetMap()->Remove((GameObject *)this, false); Map const* oldMap = GetMap();
SetMapId(newMapid); SetMapId(newMapid);
//MapManager::Instance().LoadGrid(newMapid,x,y,true);
Relocate(x, y, z); Relocate(x, y, z);
//GetMap()->Add<GameObject>((GameObject *)this);
for(PlayerSet::iterator itr = m_passengers.begin(); itr != m_passengers.end();) for(PlayerSet::iterator itr = m_passengers.begin(); itr != m_passengers.end();)
{ {
@ -460,13 +458,21 @@ void Transport::TeleportTransport(uint32 newMapid, float x, float y, float z)
//data << uint32(0); //data << uint32(0);
//plr->GetSession()->SendPacket(&data); //plr->GetSession()->SendPacket(&data);
} }
Map const* newMap = GetMap();
if(oldMap != newMap)
{
UpdateForMap(oldMap);
UpdateForMap(newMap);
}
} }
bool Transport::AddPassenger(Player* passenger) bool Transport::AddPassenger(Player* passenger)
{ {
if (m_passengers.find(passenger) == m_passengers.end()) if (m_passengers.find(passenger) == m_passengers.end())
{ {
sLog.outDetail("Player %s boarded transport %s.", passenger->GetName(), m_name.c_str()); sLog.outDetail("Player %s boarded transport %s.", passenger->GetName(), GetName());
m_passengers.insert(passenger); m_passengers.insert(passenger);
} }
return true; return true;
@ -475,7 +481,7 @@ bool Transport::AddPassenger(Player* passenger)
bool Transport::RemovePassenger(Player* passenger) bool Transport::RemovePassenger(Player* passenger)
{ {
if (m_passengers.erase(passenger)) if (m_passengers.erase(passenger))
sLog.outDetail("Player %s removed from transport %s.", passenger->GetName(), m_name.c_str()); sLog.outDetail("Player %s removed from transport %s.", passenger->GetName(), GetName());
return true; return true;
} }
@ -497,7 +503,6 @@ void Transport::Update(uint32 /*p_time*/)
} }
else else
{ {
//MapManager::Instance().GetMap(m_curr->second.mapid)->GameobjectRelocation((GameObject *)this, m_curr->second.x, m_curr->second.y, m_curr->second.z, m_orientation);
Relocate(m_curr->second.x, m_curr->second.y, m_curr->second.z); Relocate(m_curr->second.x, m_curr->second.y, m_curr->second.z);
} }
@ -513,13 +518,42 @@ void Transport::Update(uint32 /*p_time*/)
m_nextNodeTime = m_curr->first; m_nextNodeTime = m_curr->first;
if (m_curr == m_WayPoints.begin() && (sLog.getLogFilter() & LOG_FILTER_TRANSPORT_MOVES)==0) if (m_curr == m_WayPoints.begin() && (sLog.getLogFilter() & LOG_FILTER_TRANSPORT_MOVES)==0)
sLog.outDetail(" ************ BEGIN ************** %s", m_name.c_str()); sLog.outDetail(" ************ BEGIN ************** %s", GetName());
// MapManager::Instance().GetMap(m_curr->second.mapid)->Add(&this); // -> // ->Add(t);
//MapManager::Instance().GetMap(m_curr->second.mapid)->Remove((GameObject *)this, false); // -> // ->Add(t);
//MapManager::Instance().GetMap(m_curr->second.mapid)->Add((GameObject *)this); // -> // ->Add(t);
if ((sLog.getLogFilter() & LOG_FILTER_TRANSPORT_MOVES)==0) if ((sLog.getLogFilter() & LOG_FILTER_TRANSPORT_MOVES)==0)
sLog.outDetail("%s moved to %f %f %f %d", m_name.c_str(), m_curr->second.x, m_curr->second.y, m_curr->second.z, m_curr->second.mapid); sLog.outDetail("%s moved to %f %f %f %d", GetName(), m_curr->second.x, m_curr->second.y, m_curr->second.z, m_curr->second.mapid);
}
}
void Transport::UpdateForMap(Map const* targetMap)
{
Map::PlayerList const& pl = targetMap->GetPlayers();
if(pl.isEmpty())
return;
if(GetMapId()==targetMap->GetId())
{
for(Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr)
{
if(this != itr->getSource()->GetTransport())
{
UpdateData transData;
BuildCreateUpdateBlockForPlayer(&transData, itr->getSource());
WorldPacket packet;
transData.BuildPacket(&packet, true);
itr->getSource()->SendDirectMessage(&packet);
}
}
}
else
{
UpdateData transData;
BuildOutOfRangeUpdateBlock(&transData);
WorldPacket out_packet;
transData.BuildPacket(&out_packet, true);
for(Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr)
if(this != itr->getSource()->GetTransport())
itr->getSource()->SendDirectMessage(&out_packet);
} }
} }

View file

@ -54,7 +54,7 @@ class TransportPath
std::vector<PathNode> i_nodes; std::vector<PathNode> i_nodes;
}; };
class Transport : private GameObject class Transport : protected GameObject
{ {
public: public:
explicit Transport(); explicit Transport();
@ -80,7 +80,6 @@ class Transport : private GameObject
typedef std::set<Player*> PlayerSet; typedef std::set<Player*> PlayerSet;
PlayerSet const& GetPassengers() const { return m_passengers; } PlayerSet const& GetPassengers() const { return m_passengers; }
std::string m_name;
private: private:
struct WayPoint struct WayPoint
{ {
@ -110,6 +109,7 @@ class Transport : private GameObject
private: private:
void TeleportTransport(uint32 newMapid, float x, float y, float z); void TeleportTransport(uint32 newMapid, float x, float y, float z);
void UpdateForMap(Map const* map);
WayPointMap::iterator GetNextWayPoint(); WayPointMap::iterator GetNextWayPoint();
}; };
#endif #endif

View file

@ -1,4 +1,4 @@
#ifndef __REVISION_NR_H__ #ifndef __REVISION_NR_H__
#define __REVISION_NR_H__ #define __REVISION_NR_H__
#define REVISION_NR "7597" #define REVISION_NR "7598"
#endif // __REVISION_NR_H__ #endif // __REVISION_NR_H__