mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-21 17:54:48 +01:00
Core/Maps: Moved min height calculation to worldserver for more precise results
Closes #16530
This commit is contained in:
@@ -40,7 +40,7 @@
|
||||
#include "Weather.h"
|
||||
|
||||
u_map_magic MapMagic = { {'M','A','P','S'} };
|
||||
u_map_magic MapVersionMagic = { {'v','1','.','7'} };
|
||||
u_map_magic MapVersionMagic = { {'v','1','.','8'} };
|
||||
u_map_magic MapAreaMagic = { {'A','R','E','A'} };
|
||||
u_map_magic MapHeightMagic = { {'M','H','G','T'} };
|
||||
u_map_magic MapLiquidMagic = { {'M','L','I','Q'} };
|
||||
@@ -1816,10 +1816,10 @@ bool GridMap::loadHeightData(FILE* in, uint32 offset, uint32 /*size*/)
|
||||
|
||||
if (header.flags & MAP_HEIGHT_HAS_FLIGHT_BOUNDS)
|
||||
{
|
||||
_maxHeight = new float[16 * 16];
|
||||
_minHeight = new float[16 * 16];
|
||||
if (fread(_maxHeight, sizeof(float), 16 * 16, in) != 16 * 16 ||
|
||||
fread(_minHeight, sizeof(float), 16 * 16, in) != 16 * 16)
|
||||
_maxHeight = new int16[3 * 3];
|
||||
_minHeight = new int16[3 * 3];
|
||||
if (fread(_maxHeight, sizeof(int16), 3 * 3, in) != 3 * 3 ||
|
||||
fread(_minHeight, sizeof(int16), 3 * 3, in) != 3 * 3)
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -2098,11 +2098,59 @@ float GridMap::getMinHeight(float x, float y) const
|
||||
if (!_minHeight)
|
||||
return -500.0f;
|
||||
|
||||
x = 16 * (CENTER_GRID_ID - x / SIZE_OF_GRIDS);
|
||||
y = 16 * (CENTER_GRID_ID - y / SIZE_OF_GRIDS);
|
||||
int lx = (int)x & 15;
|
||||
int ly = (int)y & 15;
|
||||
return _minHeight[lx * 16 + ly];
|
||||
static uint32 const indices[] =
|
||||
{
|
||||
3, 0, 4,
|
||||
0, 1, 4,
|
||||
1, 2, 4,
|
||||
2, 5, 4,
|
||||
5, 8, 4,
|
||||
8, 7, 4,
|
||||
7, 6, 4,
|
||||
6, 3, 4
|
||||
};
|
||||
|
||||
static float const boundGridCoords[] =
|
||||
{
|
||||
0.0f, 0.0f,
|
||||
0.0f, -266.66666f,
|
||||
0.0f, -533.33331f,
|
||||
-266.66666f, 0.0f,
|
||||
-266.66666f, -266.66666f,
|
||||
-266.66666f, -533.33331f,
|
||||
-533.33331f, 0.0f,
|
||||
-533.33331f, -266.66666f,
|
||||
-533.33331f, -533.33331f
|
||||
};
|
||||
|
||||
Cell cell(x, y);
|
||||
float gx = x - (int32(cell.GridX()) - CENTER_GRID_ID + 1) * SIZE_OF_GRIDS;
|
||||
float gy = y - (int32(cell.GridY()) - CENTER_GRID_ID + 1) * SIZE_OF_GRIDS;
|
||||
|
||||
uint32 quarterIndex = 0;
|
||||
if (cell.CellY() < MAX_NUMBER_OF_CELLS / 2)
|
||||
{
|
||||
if (cell.CellX() < MAX_NUMBER_OF_CELLS / 2)
|
||||
{
|
||||
quarterIndex = 4 + (gy > gx);
|
||||
}
|
||||
else
|
||||
quarterIndex = 2 + ((-SIZE_OF_GRIDS - gx) > gy);
|
||||
}
|
||||
else if (cell.CellX() < MAX_NUMBER_OF_CELLS / 2)
|
||||
{
|
||||
quarterIndex = 6 + ((-SIZE_OF_GRIDS - gx) <= gy);
|
||||
}
|
||||
else
|
||||
quarterIndex = gx > gy;
|
||||
|
||||
quarterIndex *= 3;
|
||||
|
||||
return G3D::Plane(
|
||||
G3D::Vector3(boundGridCoords[indices[quarterIndex + 0] * 2 + 0], boundGridCoords[indices[quarterIndex + 0] * 2 + 1], _minHeight[indices[quarterIndex + 0]]),
|
||||
G3D::Vector3(boundGridCoords[indices[quarterIndex + 1] * 2 + 0], boundGridCoords[indices[quarterIndex + 1] * 2 + 1], _minHeight[indices[quarterIndex + 1]]),
|
||||
G3D::Vector3(boundGridCoords[indices[quarterIndex + 2] * 2 + 0], boundGridCoords[indices[quarterIndex + 2] * 2 + 1], _minHeight[indices[quarterIndex + 2]])
|
||||
).distance(G3D::Vector3(gx, gy, 0.0f));
|
||||
}
|
||||
|
||||
float GridMap::getLiquidLevel(float x, float y) const
|
||||
|
||||
Reference in New Issue
Block a user