aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Maps/Map.cpp
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2022-06-13 20:06:26 +0200
committerShauren <shauren.trinity@gmail.com>2022-06-13 20:06:26 +0200
commitcace41449771bbe692e1a45c4d38b15a12f6496e (patch)
treebb4dda1bd73f71f846916617a75e41a5075aaf4d /src/server/game/Maps/Map.cpp
parent8f537b96868647d73aacd576bbe90bda138dd589 (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.cpp59
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 !