From e8b9a845944adf8202d665f39b78f6140c22f238 Mon Sep 17 00:00:00 2001 From: Ovahlord Date: Sun, 18 Mar 2018 17:48:08 +0100 Subject: [PATCH] Core/Phasing: reducde differences between 434 and PR --- src/server/game/Maps/Map.cpp | 23 ++++++++++++++++++++-- src/server/game/Maps/Map.h | 2 +- src/server/game/Phasing/PhasingHandler.cpp | 2 +- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index 11c66afb2be..2c9ea901790 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -674,6 +674,7 @@ bool Map::AddToMap(Transport* obj) { UpdateData data(GetId()); obj->BuildCreateUpdateBlockForPlayer(&data, itr->GetSource()); + itr->GetSource()->m_visibleTransports.insert(obj->GetGUID()); WorldPacket packet; data.BuildPacket(&packet); itr->GetSource()->SendDirectMessage(&packet); @@ -981,8 +982,13 @@ void Map::RemoveFromMap(Transport* obj, bool remove) WorldPacket packet; data.BuildPacket(&packet); for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) + { if (itr->GetSource()->GetTransport() != obj) + { itr->GetSource()->SendDirectMessage(&packet); + itr->GetSource()->m_visibleTransports.erase(obj->GetGUID()); + } + } } if (_transportsUpdateIter != _transports.end()) @@ -2308,6 +2314,12 @@ GridMap* Map::GetGrid(uint32 mapId, float x, float y) return grid; } +bool Map::HasGrid(uint32 mapId, int32 gx, int32 gy) const +{ + auto childMapItr = std::find_if(m_childTerrainMaps->begin(), m_childTerrainMaps->end(), [mapId](Map* childTerrainMap) { return childTerrainMap->GetId() == mapId; }); + return childMapItr != m_childTerrainMaps->end() && (*childMapItr)->GridMaps[gx][gy] && (*childMapItr)->GridMaps[gx][gy]->fileExists(); +} + float Map::GetWaterOrGroundLevel(PhaseShift const& phaseShift, float x, float y, float z, float* ground /*= nullptr*/, bool /*swim = false*/) const { if (const_cast(this)->GetGrid(x, y)) @@ -2837,13 +2849,20 @@ void Map::SendUpdateTransportVisibility(Player* player) UpdateData transData(player->GetMapId()); for (Transport* transport : _transports) { + auto transportItr = player->m_visibleTransports.find(transport->GetGUID()); if (player->IsInPhase(transport)) { - if (player->m_visibleTransports.find(transport->GetGUID()) == player->m_visibleTransports.end()) + if (transportItr == player->m_visibleTransports.end()) + { transport->BuildCreateUpdateBlockForPlayer(&transData, player); + player->m_visibleTransports.insert(transport->GetGUID()); + } } - else if (player->m_visibleTransports.find(transport->GetGUID()) != player->m_visibleTransports.end()) + else if (transportItr != player->m_visibleTransports.end()) + { transport->BuildOutOfRangeUpdateBlock(&transData); + player->m_visibleTransports.erase(transportItr); + } } WorldPacket packet; diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h index 9be12e56e57..76710de25b7 100644 --- a/src/server/game/Maps/Map.h +++ b/src/server/game/Maps/Map.h @@ -352,7 +352,7 @@ class TC_GAME_API Map : public GridRefManager time_t GetGridExpiry(void) const { return i_gridExpiry; } uint32 GetId(void) const { return i_mapEntry->MapID; } - bool HasGrid(int32 gx, int32 gy) const { return GridMaps[gx][gy] && GridMaps[gx][gy]->fileExists(); } + bool HasGrid(uint32 mapId, int32 gx, int32 gy) const; static bool ExistMap(uint32 mapid, int gx, int gy); static bool ExistVMap(uint32 mapid, int gx, int gy); diff --git a/src/server/game/Phasing/PhasingHandler.cpp b/src/server/game/Phasing/PhasingHandler.cpp index 8b9e8843db5..bd65b93175a 100644 --- a/src/server/game/Phasing/PhasingHandler.cpp +++ b/src/server/game/Phasing/PhasingHandler.cpp @@ -516,7 +516,7 @@ uint32 PhasingHandler::GetTerrainMapId(PhaseShift const& phaseShift, Map const* for (auto itr = phaseShift.VisibleMapIds.rbegin(); itr != phaseShift.VisibleMapIds.rend(); ++itr) for (int32 gxi = gxbegin; gxi < gxend; ++gxi) for (int32 gyi = gybegin; gyi < gyend; ++gyi) - if (map->HasGrid(gxi, gyi)) + if (map->HasGrid(itr->first, gxi, gyi)) return itr->first; return map->GetId();