diff options
author | Shauren <shauren.trinity@gmail.com> | 2022-06-13 20:06:26 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2022-06-13 20:06:26 +0200 |
commit | cace41449771bbe692e1a45c4d38b15a12f6496e (patch) | |
tree | bb4dda1bd73f71f846916617a75e41a5075aaf4d /src/server/game/Maps/Map.cpp | |
parent | 8f537b96868647d73aacd576bbe90bda138dd589 (diff) |
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
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 ! |