diff options
Diffstat (limited to 'src/server/game/Maps/Map.cpp')
-rw-r--r-- | src/server/game/Maps/Map.cpp | 59 |
1 files changed, 23 insertions, 36 deletions
diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index 41d3d2a9abc..174b3fda99a 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -367,6 +367,8 @@ i_scriptLock(false), _respawnCheckTimer(0) _poolData = sPoolMgr->InitPoolsForMap(this); + sTransportMgr->CreateTransportsForMap(this); + MMAP::MMapFactory::createOrGetMMapManager()->loadMapInstance(sWorld->GetDataPath(), GetId(), i_InstanceId); sScriptMgr->OnCreateMap(this); @@ -514,13 +516,6 @@ void Map::DeleteFromWorld(Player* player) delete player; } -template<> -void Map::DeleteFromWorld(Transport* transport) -{ - ObjectAccessor::RemoveObject(transport); - delete transport; -} - void Map::EnsureGridCreated(GridCoord const& p) { std::lock_guard<std::mutex> lock(_gridLock); @@ -765,15 +760,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()); @@ -944,10 +940,6 @@ void Map::Update(uint32 t_diff) { WorldObject* obj = *_transportsUpdateIter; ++_transportsUpdateIter; - - if (!obj->IsInWorld()) - continue; - obj->Update(t_diff); } @@ -1131,18 +1123,21 @@ 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); + if (obj->IsDestroyedObject()) + obj->BuildDestroyUpdateBlock(&data); + else + 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()); @@ -3049,10 +3044,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()); @@ -3070,7 +3065,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()); @@ -3088,6 +3083,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)) { @@ -3658,17 +3656,6 @@ 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 ! |