aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Maps/Map.cpp
diff options
context:
space:
mode:
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 !