From 8f53ba385474e51b4e2ebf29e33d7661a2848669 Mon Sep 17 00:00:00 2001 From: Shauren Date: Sat, 3 Mar 2018 15:39:19 +0100 Subject: Core/Phasing: Rewrite GetTerrainMapId --- src/server/game/Phasing/PhaseShift.cpp | 29 ----------------------------- src/server/game/Phasing/PhaseShift.h | 1 - src/server/game/Phasing/PhasingHandler.cpp | 26 ++++++++++++++++++++++++++ src/server/game/Phasing/PhasingHandler.h | 3 +++ 4 files changed, 29 insertions(+), 30 deletions(-) (limited to 'src/server/game/Phasing') diff --git a/src/server/game/Phasing/PhaseShift.cpp b/src/server/game/Phasing/PhaseShift.cpp index d543ccd1f22..b2885ae15bb 100644 --- a/src/server/game/Phasing/PhaseShift.cpp +++ b/src/server/game/Phasing/PhaseShift.cpp @@ -17,8 +17,6 @@ #include "PhaseShift.h" #include "Containers.h" -#include "GridDefines.h" -#include "VMapFactory.h" bool PhaseShift::AddPhase(uint32 phaseId, PhaseFlags flags, std::vector const* areaConditions, int32 references /*= 1*/) { @@ -147,33 +145,6 @@ bool PhaseShift::CanSee(PhaseShift const& other) const return checkInversePhaseShift(other, *this); } -uint32 PhaseShift::GetTerrainMapId(uint32 realMapId, float x, float y) const -{ - if (VisibleMapIds.empty()) - return realMapId; - - if (VisibleMapIds.size() == 1) - return VisibleMapIds.begin()->first; - - GridCoord gridCoord = Trinity::ComputeGridCoord(x, y); - int32 gx = (MAX_NUMBER_OF_GRIDS - 1) - gridCoord.x_coord; - int32 gy = (MAX_NUMBER_OF_GRIDS - 1) - gridCoord.y_coord; - - int32 minDistance = std::numeric_limits::max(); - uint32 terrainMapId; - for (auto itr = VisibleMapIds.begin(); itr != VisibleMapIds.end(); ++itr) - { - int32 dist = VMAP::VMapFactory::createOrGetVMapManager()->GetDistanceToClosestPrimaryTile(itr->first, gx, gy); - if (dist < minDistance) - { - minDistance = dist; - terrainMapId = itr->first; - } - } - - return terrainMapId; -} - void PhaseShift::ModifyPhasesReferences(PhaseContainer::iterator itr, int32 references) { itr->References += references; diff --git a/src/server/game/Phasing/PhaseShift.h b/src/server/game/Phasing/PhaseShift.h index ca38614ed45..8755868ae9d 100644 --- a/src/server/game/Phasing/PhaseShift.h +++ b/src/server/game/Phasing/PhaseShift.h @@ -101,7 +101,6 @@ public: void ClearPhases(); bool CanSee(PhaseShift const& other) const; - uint32 GetTerrainMapId(uint32 realMapId, float x, float y) const; protected: friend class PhasingHandler; diff --git a/src/server/game/Phasing/PhasingHandler.cpp b/src/server/game/Phasing/PhasingHandler.cpp index 44f0a9ff753..549093fecba 100644 --- a/src/server/game/Phasing/PhasingHandler.cpp +++ b/src/server/game/Phasing/PhasingHandler.cpp @@ -469,6 +469,32 @@ bool PhasingHandler::InDbPhaseShift(WorldObject const* object, uint8 phaseUseFla return object->GetPhaseShift().CanSee(phaseShift); } +uint32 PhasingHandler::GetTerrainMapId(PhaseShift const& phaseShift, Map const* map, float x, float y) +{ + if (phaseShift.VisibleMapIds.empty()) + return map->GetId(); + + if (phaseShift.VisibleMapIds.size() == 1) + return phaseShift.VisibleMapIds.begin()->first; + + GridCoord gridCoord = Trinity::ComputeGridCoord(x, y); + int32 gx = (MAX_NUMBER_OF_GRIDS - 1) - gridCoord.x_coord; + int32 gy = (MAX_NUMBER_OF_GRIDS - 1) - gridCoord.y_coord; + + int32 gxbegin = std::max(gx - 1, 0); + int32 gxend = std::min(gx + 1, MAX_NUMBER_OF_GRIDS); + int32 gybegin = std::max(gy - 1, 0); + int32 gyend = std::min(gy + 1, MAX_NUMBER_OF_GRIDS); + + 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(itr->first, gxi, gyi)) + return itr->first; + + return map->GetId(); +} + void PhasingHandler::SetAlwaysVisible(PhaseShift& phaseShift, bool apply) { if (apply) diff --git a/src/server/game/Phasing/PhasingHandler.h b/src/server/game/Phasing/PhasingHandler.h index 9ee408ad26c..95f4357b30c 100644 --- a/src/server/game/Phasing/PhasingHandler.h +++ b/src/server/game/Phasing/PhasingHandler.h @@ -22,6 +22,7 @@ #include class ChatHandler; +class Map; class PhaseShift; class Player; class WorldObject; @@ -60,6 +61,8 @@ public: static void InitDbVisibleMapId(PhaseShift& phaseShift, int32 visibleMapId); static bool InDbPhaseShift(WorldObject const* object, uint8 phaseUseFlags, uint16 phaseId, uint32 phaseGroupId); + static uint32 GetTerrainMapId(PhaseShift const& phaseShift, Map const* map, float x, float y); + static void SetAlwaysVisible(PhaseShift& phaseShift, bool apply); static void SetInversed(PhaseShift& phaseShift, bool apply); -- cgit v1.2.3