aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorjackpoz <giacomopoz@gmail.com>2020-12-27 18:24:53 +0100
committerShauren <shauren.trinity@gmail.com>2022-03-05 17:02:19 +0100
commitc14f4dc83502dea7dad8ad4f92270d8d36b01c12 (patch)
tree71a0e98be279fe5666541c8c9411dd63b41f8841 /src
parent13bf0e71b94907cc72c3907f9cddc501a7bdb563 (diff)
Core/Maps: Use the same logic to calculate grid coords to avoid mismatches
Use the same logic of (CENTER_GRID_ID - x / SIZE_OF_GRIDS) in GridMap::getMinHeight() as Map::GetGrid() to avoid coord grid mismatches caused by floating point precision, i.e. getting the wrong grid. Replace defines with constexpr in grids to make debugging easier. Closes #25652 (cherry picked from commit 0c69316714d0558e32462f5401197fe1e803ae75)
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Grids/GridDefines.h41
-rw-r--r--src/server/game/Maps/Map.cpp2
2 files changed, 25 insertions, 18 deletions
diff --git a/src/server/game/Grids/GridDefines.h b/src/server/game/Grids/GridDefines.h
index 83b13c04ebf..24e70d5fef2 100644
--- a/src/server/game/Grids/GridDefines.h
+++ b/src/server/game/Grids/GridDefines.h
@@ -33,29 +33,29 @@ class AreaTrigger;
class SceneObject;
class Conversation;
-#define MAX_NUMBER_OF_CELLS 8
+constexpr uint32 MAX_NUMBER_OF_CELLS = 8;
-#define MAX_NUMBER_OF_GRIDS 64
+constexpr uint32 MAX_NUMBER_OF_GRIDS = 64;
-#define SIZE_OF_GRIDS 533.3333f
-#define CENTER_GRID_ID (MAX_NUMBER_OF_GRIDS/2)
+constexpr float SIZE_OF_GRIDS = 533.3333f;
+constexpr uint32 CENTER_GRID_ID = (MAX_NUMBER_OF_GRIDS / 2);
-#define CENTER_GRID_OFFSET (SIZE_OF_GRIDS/2)
+constexpr float CENTER_GRID_OFFSET = (SIZE_OF_GRIDS / 2);
-#define MIN_GRID_DELAY (MINUTE*IN_MILLISECONDS)
-#define MIN_MAP_UPDATE_DELAY 1
+#define MIN_GRID_DELAY (MINUTE*IN_MILLISECONDS)
+#define MIN_MAP_UPDATE_DELAY 1
-#define SIZE_OF_GRID_CELL (SIZE_OF_GRIDS/MAX_NUMBER_OF_CELLS)
+constexpr float SIZE_OF_GRID_CELL = (SIZE_OF_GRIDS / MAX_NUMBER_OF_CELLS);
+
+constexpr uint32 CENTER_GRID_CELL_ID = (MAX_NUMBER_OF_CELLS * MAX_NUMBER_OF_GRIDS / 2);
+constexpr float CENTER_GRID_CELL_OFFSET = (SIZE_OF_GRID_CELL / 2);
-#define CENTER_GRID_CELL_ID (MAX_NUMBER_OF_CELLS*MAX_NUMBER_OF_GRIDS/2)
-#define CENTER_GRID_CELL_OFFSET (SIZE_OF_GRID_CELL/2)
+constexpr uint32 TOTAL_NUMBER_OF_CELLS_PER_MAP = (MAX_NUMBER_OF_GRIDS * MAX_NUMBER_OF_CELLS);
-#define TOTAL_NUMBER_OF_CELLS_PER_MAP (MAX_NUMBER_OF_GRIDS*MAX_NUMBER_OF_CELLS)
+constexpr uint32 MAP_RESOLUTION = 128;
-#define MAP_RESOLUTION 128
-
-#define MAP_SIZE (SIZE_OF_GRIDS*MAX_NUMBER_OF_GRIDS)
-#define MAP_HALFSIZE (MAP_SIZE/2)
+constexpr float MAP_SIZE = (SIZE_OF_GRIDS * MAX_NUMBER_OF_GRIDS);
+constexpr float MAP_HALFSIZE = (MAP_SIZE / 2);
// Creature used instead pet to simplify *::Visit templates (not required duplicate code for Creature->Pet case)
typedef TYPELIST_4(Player, Creature/*pets*/, Corpse/*resurrectable*/, DynamicObject/*farsight target*/) AllWorldObjectTypes;
@@ -185,8 +185,8 @@ namespace Trinity
double x_offset = (double(x) - center_offset)/size;
double y_offset = (double(y) - center_offset)/size;
- int x_val = int(x_offset + CENTER_VAL + 0.5f);
- int y_val = int(y_offset + CENTER_VAL + 0.5f);
+ int x_val = int(x_offset + CENTER_VAL + 0.5);
+ int y_val = int(y_offset + CENTER_VAL + 0.5);
return RET_TYPE(x_val, y_val);
}
@@ -195,6 +195,13 @@ namespace Trinity
return Compute<GridCoord, CENTER_GRID_ID>(x, y, CENTER_GRID_OFFSET, SIZE_OF_GRIDS);
}
+ inline GridCoord ComputeGridCoordSimple(float x, float y)
+ {
+ int gx = (int)(CENTER_GRID_ID - x / SIZE_OF_GRIDS);
+ int gy = (int)(CENTER_GRID_ID - y / SIZE_OF_GRIDS);
+ return GridCoord((MAX_NUMBER_OF_GRIDS - 1) - gx, (MAX_NUMBER_OF_GRIDS - 1) - gy);
+ }
+
inline CellCoord ComputeCellCoord(float x, float y)
{
return Compute<CellCoord, CENTER_GRID_CELL_ID>(x, y, CENTER_GRID_CELL_OFFSET, SIZE_OF_GRID_CELL);
diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp
index 7473ef1d374..8e8fcbe2d55 100644
--- a/src/server/game/Maps/Map.cpp
+++ b/src/server/game/Maps/Map.cpp
@@ -2393,7 +2393,7 @@ float GridMap::getMinHeight(float x, float y) const
if (!_minHeightPlanes)
return -500.0f;
- GridCoord gridCoord = Trinity::ComputeGridCoord(x, y);
+ GridCoord gridCoord = Trinity::ComputeGridCoordSimple(x, y);
int32 doubleGridX = int32(std::floor(-(x - MAP_HALFSIZE) / CENTER_GRID_OFFSET));
int32 doubleGridY = int32(std::floor(-(y - MAP_HALFSIZE) / CENTER_GRID_OFFSET));