Core/Transports: Localized transport objects within each map
Transports no longer move between maps, each map gets a separate copy of the transport object and players are moved between them when transferring to another map This means they can no longer be globally looked up in HashMapHolder
This commit is contained in:
1 parent
acb599823e
commit
786131a162
13 files changed
+207
-186
No files matched your search
@@ -363,6 +363,9 @@ i_scriptLock(false), _respawnCheckTimer(0)
|
||||
Map::InitVisibilityDistance();
|
||||
|
||||
_weatherUpdateTimer.SetInterval(time_t(1 * IN_MILLISECONDS));
|
||||
|
||||
sTransportMgr->CreateTransportsForMap(this);
|
||||
|
||||
MMAP::MMapFactory::createOrGetMMapManager()->loadMapInstance(sWorld->GetDataPath(), GetId(), i_InstanceId);
|
||||
|
||||
sScriptMgr->OnCreateMap(this);
|
||||
@@ -546,13 +549,6 @@ void Map::DeleteFromWorld(Player* player)
|
||||
delete player;
|
||||
}
|
||||
|
||||
template<>
|
||||
void Map::DeleteFromWorld(Transport* transport)
|
||||
{
|
||||
ObjectAccessor::RemoveObject(transport);
|
||||
delete transport;
|
||||
}
|
||||
|
||||
void Map::EnsureGridCreated(const GridCoord &p)
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(_gridLock);
|
||||
@@ -774,15 +770,16 @@ bool Map::AddToMap(Transport* obj)
|
||||
return false; //Should delete object
|
||||
}
|
||||
|
||||
obj->AddToWorld();
|
||||
_transports.insert(obj);
|
||||
|
||||
// Broadcast creation to players
|
||||
if (!GetPlayers().isEmpty())
|
||||
if (obj->GetExpectedMapId() == GetId())
|
||||
{
|
||||
obj->AddToWorld();
|
||||
|
||||
// Broadcast creation to players
|
||||
for (Map::PlayerList::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr)
|
||||
{
|
||||
if (itr->GetSource()->GetTransport() != obj)
|
||||
if (itr->GetSource()->GetTransport() != obj && itr->GetSource()->IsInPhase(obj))
|
||||
{
|
||||
UpdateData data(GetId());
|
||||
obj->BuildCreateUpdateBlockForPlayer(&data, itr->GetSource());
|
||||
@@ -952,9 +949,6 @@ void Map::Update(uint32 t_diff)
|
||||
WorldObject* obj = *_transportsUpdateIter;
|
||||
++_transportsUpdateIter;
|
||||
|
||||
if (!obj->IsInWorld())
|
||||
continue;
|
||||
|
||||
obj->Update(t_diff);
|
||||
}
|
||||
|
||||
@@ -1123,18 +1117,19 @@ void Map::RemoveFromMap(T *obj, bool remove)
|
||||
template<>
|
||||
void Map::RemoveFromMap(Transport* obj, bool remove)
|
||||
{
|
||||
obj->RemoveFromWorld();
|
||||
|
||||
Map::PlayerList const& players = GetPlayers();
|
||||
if (!players.isEmpty())
|
||||
if (obj->IsInWorld())
|
||||
{
|
||||
obj->RemoveFromWorld();
|
||||
|
||||
UpdateData data(GetId());
|
||||
obj->BuildOutOfRangeUpdateBlock(&data);
|
||||
|
||||
|
||||
WorldPacket packet;
|
||||
data.BuildPacket(&packet);
|
||||
for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
|
||||
for (Map::PlayerList::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr)
|
||||
{
|
||||
if (itr->GetSource()->GetTransport() != obj)
|
||||
if (itr->GetSource()->GetTransport() != obj && itr->GetSource()->m_visibleTransports.count(obj->GetGUID()))
|
||||
{
|
||||
itr->GetSource()->SendDirectMessage(&packet);
|
||||
itr->GetSource()->m_visibleTransports.erase(obj->GetGUID());
|
||||
@@ -2879,10 +2874,10 @@ void Map::SendInitSelf(Player* player)
|
||||
void Map::SendInitTransports(Player* player)
|
||||
{
|
||||
// Hack to send out transports
|
||||
UpdateData transData(player->GetMapId());
|
||||
UpdateData transData(GetId());
|
||||
for (Transport* transport : _transports)
|
||||
{
|
||||
if (transport != player->GetTransport() && player->IsInPhase(transport))
|
||||
if (transport->IsInWorld() && transport != player->GetTransport() && player->IsInPhase(transport))
|
||||
{
|
||||
transport->BuildCreateUpdateBlockForPlayer(&transData, player);
|
||||
player->m_visibleTransports.insert(transport->GetGUID());
|
||||
@@ -2900,7 +2895,7 @@ void Map::SendRemoveTransports(Player* player)
|
||||
UpdateData transData(player->GetMapId());
|
||||
for (Transport* transport : _transports)
|
||||
{
|
||||
if (transport != player->GetTransport())
|
||||
if (player->m_visibleTransports.count(transport->GetGUID()) && transport != player->GetTransport())
|
||||
{
|
||||
transport->BuildOutOfRangeUpdateBlock(&transData);
|
||||
player->m_visibleTransports.erase(transport->GetGUID());
|
||||
@@ -2918,6 +2913,9 @@ void Map::SendUpdateTransportVisibility(Player* player)
|
||||
UpdateData transData(player->GetMapId());
|
||||
for (Transport* transport : _transports)
|
||||
{
|
||||
if (!transport->IsInWorld())
|
||||
continue;
|
||||
|
||||
auto transportItr = player->m_visibleTransports.find(transport->GetGUID());
|
||||
if (player->IsInPhase(transport))
|
||||
{
|
||||
@@ -3451,17 +3449,6 @@ bool Map::IsSpawnGroupActive(uint32 groupId) const
|
||||
|
||||
void Map::DelayedUpdate(uint32 t_diff)
|
||||
{
|
||||
for (_transportsUpdateIter = _transports.begin(); _transportsUpdateIter != _transports.end();)
|
||||
{
|
||||
Transport* transport = *_transportsUpdateIter;
|
||||
++_transportsUpdateIter;
|
||||
|
||||
if (!transport->IsInWorld())
|
||||
continue;
|
||||
|
||||
transport->DelayedUpdate(t_diff);
|
||||
}
|
||||
|
||||
RemoveAllObjectsInRemoveList();
|
||||
|
||||
// Don't unload grids if it's battleground, since we may have manually added GOs, creatures, those doesn't load from DB at grid re-load !
|
||||
|
||||
Reference in new issue
Block a user