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:
Shauren authored and Ovahlord committed 2022-06-19 18:11:20 +02:00
1 parent acb599823e
commit 786131a162
13 files changed
+207 -186

No files matched your search

+21 -34
View File
@@ -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 !