aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorjackpoz <giacomopoz@gmail.com>2020-12-27 18:24:53 +0100
committerjackpoz <giacomopoz@gmail.com>2020-12-27 18:24:53 +0100
commit0c69316714d0558e32462f5401197fe1e803ae75 (patch)
treed025c6d59d338bebcf25af7bdfc46a017e63049e /src
parent9994459bd197d5555cfa16ab3d35d9c362a563fd (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
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 96dc3cd2b54..98077742773 100644
--- a/src/server/game/Grids/GridDefines.h
+++ b/src/server/game/Grids/GridDefines.h
@@ -31,29 +31,29 @@ class GameObject;
class Pet;
class Player;
-#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 50
+#define MIN_GRID_DELAY (MINUTE*IN_MILLISECONDS)
+#define MIN_MAP_UPDATE_DELAY 50
-#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;
@@ -178,8 +178,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);
}
@@ -188,6 +188,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 1e0af8d8d6f..1908f2efe2a 100644
--- a/src/server/game/Maps/Map.cpp
+++ b/src/server/game/Maps/Map.cpp
@@ -2305,7 +2305,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));