aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Maps
diff options
context:
space:
mode:
authorariel- <ariel-@users.noreply.github.com>2017-03-28 01:52:49 -0300
committerfunjoker <funjoker109@gmail.com>2020-04-24 17:18:51 +0200
commit3f79c9f69674618a7d7e2bf8484f9ec6ce15b2df (patch)
treee60a82d47f39fe491801dfb0ad1fb9560d11dd9d /src/server/game/Maps
parent124b014f403bca147b8a7edaba6e90aee5c57e5f (diff)
Core/AI: AreaBoundary refactor
- Added an auxiliary function IsInBounds to base CreatureAI - Changed container to vector. Set had no sense because we're storing new pointers, they have different addresses even if the boundary is the same (cherry picked from commit 2f99fa09c9bacbad376d7a296c3311f94ec8a552)
Diffstat (limited to 'src/server/game/Maps')
-rw-r--r--src/server/game/Maps/AreaBoundary.cpp14
-rw-r--r--src/server/game/Maps/AreaBoundary.h78
2 files changed, 48 insertions, 44 deletions
diff --git a/src/server/game/Maps/AreaBoundary.cpp b/src/server/game/Maps/AreaBoundary.cpp
index f7ae5b4c9b6..af5e6ffe734 100644
--- a/src/server/game/Maps/AreaBoundary.cpp
+++ b/src/server/game/Maps/AreaBoundary.cpp
@@ -21,7 +21,7 @@
// ---== RECTANGLE ==---
RectangleBoundary::RectangleBoundary(float southX, float northX, float eastY, float westY, bool isInverted) :
- AreaBoundary(BoundaryType::BOUNDARY_RECTANGLE, isInverted), _minX(southX), _maxX(northX), _minY(eastY), _maxY(westY) { }
+ AreaBoundary(isInverted), _minX(southX), _maxX(northX), _minY(eastY), _maxY(westY) { }
bool RectangleBoundary::IsWithinBoundaryArea(Position const* pos) const
{
if (!pos)
@@ -40,11 +40,11 @@ bool RectangleBoundary::IsWithinBoundaryArea(Position const* pos) const
CircleBoundary::CircleBoundary(Position const& center, double radius, bool isInverted) :
CircleBoundary(DoublePosition(center), radius, isInverted) { }
CircleBoundary::CircleBoundary(DoublePosition const& center, double radius, bool isInverted) :
- AreaBoundary(BoundaryType::BOUNDARY_CIRCLE, isInverted), _center(center), _radiusSq(radius*radius) { }
+ AreaBoundary(isInverted), _center(center), _radiusSq(radius*radius) { }
CircleBoundary::CircleBoundary(Position const& center, Position const& pointOnCircle, bool isInverted) :
CircleBoundary(DoublePosition(center), DoublePosition(pointOnCircle), isInverted) { }
CircleBoundary::CircleBoundary(DoublePosition const& center, DoublePosition const& pointOnCircle, bool isInverted) :
- AreaBoundary(BoundaryType::BOUNDARY_CIRCLE, isInverted), _center(center), _radiusSq(center.GetDoubleExactDist2dSq(pointOnCircle)) { }
+ AreaBoundary(isInverted), _center(center), _radiusSq(center.GetDoubleExactDist2dSq(pointOnCircle)) { }
bool CircleBoundary::IsWithinBoundaryArea(Position const* pos) const
{
if (!pos)
@@ -60,7 +60,7 @@ bool CircleBoundary::IsWithinBoundaryArea(Position const* pos) const
EllipseBoundary::EllipseBoundary(Position const& center, double radiusX, double radiusY, bool isInverted) :
EllipseBoundary(DoublePosition(center), radiusX, radiusY, isInverted) { }
EllipseBoundary::EllipseBoundary(DoublePosition const& center, double radiusX, double radiusY, bool isInverted) :
- AreaBoundary(BoundaryType::BOUNDARY_ELLIPSE, isInverted), _center(center), _radiusYSq(radiusY*radiusY), _scaleXSq(_radiusYSq / (radiusX*radiusX)) { }
+ AreaBoundary(isInverted), _center(center), _radiusYSq(radiusY*radiusY), _scaleXSq(_radiusYSq / (radiusX*radiusX)) { }
bool EllipseBoundary::IsWithinBoundaryArea(Position const* pos) const
{
if (!pos)
@@ -75,7 +75,7 @@ bool EllipseBoundary::IsWithinBoundaryArea(Position const* pos) const
TriangleBoundary::TriangleBoundary(Position const& pointA, Position const& pointB, Position const& pointC, bool isInverted) :
TriangleBoundary(DoublePosition(pointA), DoublePosition(pointB), DoublePosition(pointC), isInverted) { }
TriangleBoundary::TriangleBoundary(DoublePosition const& pointA, DoublePosition const& pointB, DoublePosition const& pointC, bool isInverted) :
- AreaBoundary(BoundaryType::BOUNDARY_TRIANGLE, isInverted), _a(pointA), _b(pointB), _c(pointC), _abx(_b.GetDoublePositionX()-_a.GetDoublePositionX()), _bcx(_c.GetDoublePositionX()-_b.GetDoublePositionX()), _cax(_a.GetDoublePositionX() - _c.GetDoublePositionX()), _aby(_b.GetDoublePositionY()-_a.GetDoublePositionY()), _bcy(_c.GetDoublePositionY()-_b.GetDoublePositionY()), _cay(_a.GetDoublePositionY() - _c.GetDoublePositionY()) { }
+ AreaBoundary(isInverted), _a(pointA), _b(pointB), _c(pointC), _abx(_b.GetDoublePositionX()-_a.GetDoublePositionX()), _bcx(_c.GetDoublePositionX()-_b.GetDoublePositionX()), _cax(_a.GetDoublePositionX() - _c.GetDoublePositionX()), _aby(_b.GetDoublePositionY()-_a.GetDoublePositionY()), _bcy(_c.GetDoublePositionY()-_b.GetDoublePositionY()), _cay(_a.GetDoublePositionY() - _c.GetDoublePositionY()) { }
bool TriangleBoundary::IsWithinBoundaryArea(Position const* pos) const
{
if (!pos)
@@ -95,7 +95,7 @@ bool TriangleBoundary::IsWithinBoundaryArea(Position const* pos) const
ParallelogramBoundary::ParallelogramBoundary(Position const& cornerA, Position const& cornerB, Position const& cornerD, bool isInverted) :
ParallelogramBoundary(DoublePosition(cornerA), DoublePosition(cornerB), DoublePosition(cornerD), isInverted) { }
ParallelogramBoundary::ParallelogramBoundary(DoublePosition const& cornerA, DoublePosition const& cornerB, DoublePosition const& cornerD, bool isInverted) :
- AreaBoundary(BoundaryType::BOUNDARY_PARALLELOGRAM, isInverted), _a(cornerA), _b(cornerB), _d(cornerD), _c(DoublePosition(_d.GetDoublePositionX() + (_b.GetDoublePositionX() - _a.GetDoublePositionX()), _d.GetDoublePositionY() + (_b.GetDoublePositionY() - _a.GetDoublePositionY()))), _abx(_b.GetDoublePositionX() - _a.GetDoublePositionX()), _dax(_a.GetDoublePositionX() - _d.GetDoublePositionX()), _aby(_b.GetDoublePositionY() - _a.GetDoublePositionY()), _day(_a.GetDoublePositionY() - _d.GetDoublePositionY()) { }
+ AreaBoundary(isInverted), _a(cornerA), _b(cornerB), _d(cornerD), _c(DoublePosition(_d.GetDoublePositionX() + (_b.GetDoublePositionX() - _a.GetDoublePositionX()), _d.GetDoublePositionY() + (_b.GetDoublePositionY() - _a.GetDoublePositionY()))), _abx(_b.GetDoublePositionX() - _a.GetDoublePositionX()), _dax(_a.GetDoublePositionX() - _d.GetDoublePositionX()), _aby(_b.GetDoublePositionY() - _a.GetDoublePositionY()), _day(_a.GetDoublePositionY() - _d.GetDoublePositionY()) { }
bool ParallelogramBoundary::IsWithinBoundaryArea(Position const* pos) const
{
if (!pos)
@@ -114,7 +114,7 @@ bool ParallelogramBoundary::IsWithinBoundaryArea(Position const* pos) const
// ---== Z RANGE ==---
ZRangeBoundary::ZRangeBoundary(float minZ, float maxZ, bool isInverted) :
- AreaBoundary(BoundaryType::BOUNDARY_Z_RANGE, isInverted), _minZ(minZ), _maxZ(maxZ) { }
+ AreaBoundary(isInverted), _minZ(minZ), _maxZ(maxZ) { }
bool ZRangeBoundary::IsWithinBoundaryArea(Position const* pos) const
{
if (!pos)
diff --git a/src/server/game/Maps/AreaBoundary.h b/src/server/game/Maps/AreaBoundary.h
index 069701775eb..b2fdc49a7a6 100644
--- a/src/server/game/Maps/AreaBoundary.h
+++ b/src/server/game/Maps/AreaBoundary.h
@@ -23,48 +23,52 @@
class TC_GAME_API AreaBoundary
{
public:
- enum BoundaryType
- {
- BOUNDARY_RECTANGLE, // Rectangle aligned with the coordinate axis
- BOUNDARY_CIRCLE,
- BOUNDARY_ELLIPSE,
- BOUNDARY_TRIANGLE,
- BOUNDARY_PARALLELOGRAM,
- BOUNDARY_Z_RANGE,
- };
- virtual ~AreaBoundary() { }
- BoundaryType GetBoundaryType() const { return m_boundaryType; }
- bool IsWithinBoundary(Position const* pos) const { return (IsWithinBoundaryArea(pos) != m_isInvertedBoundary); }
+ bool IsWithinBoundary(Position const* pos) const { return (IsWithinBoundaryArea(pos) != _isInvertedBoundary); }
bool IsWithinBoundary(Position const& pos) const { return IsWithinBoundary(&pos); }
+ virtual ~AreaBoundary() { }
+
+ protected:
+ explicit AreaBoundary(bool isInverted) : _isInvertedBoundary(isInverted) { }
+
struct DoublePosition : Position
{
- double d_positionX, d_positionY, d_positionZ;
DoublePosition(double x = 0.0, double y = 0.0, double z = 0.0, float o = 0.0f)
- : Position(float(x), float(y), float(z), o), d_positionX(x), d_positionY(y), d_positionZ(z) { }
+ : Position(float(x), float(y), float(z), o), DoublePosX(x), DoublePosY(y), DoublePosZ(z) { }
+
DoublePosition(float x, float y = 0.0f, float z = 0.0f, float o = 0.0f)
- : Position(x, y, z, o), d_positionX(x), d_positionY(y), d_positionZ(z) { }
+ : Position(x, y, z, o), DoublePosX(x), DoublePosY(y), DoublePosZ(z) { }
+
DoublePosition(Position const & pos)
- : DoublePosition(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation()) { }
+ : Position(pos), DoublePosX(pos.m_positionX), DoublePosY(pos.m_positionY), DoublePosZ(pos.m_positionZ) { }
- double GetDoublePositionX() const { return d_positionX; }
- double GetDoublePositionY() const { return d_positionY; }
- double GetDoublePositionZ() const { return d_positionZ; }
+ double GetDoublePositionX() const { return DoublePosX; }
+ double GetDoublePositionY() const { return DoublePosY; }
+ double GetDoublePositionZ() const { return DoublePosZ; }
double GetDoubleExactDist2dSq(DoublePosition const& pos) const {
- double offX = GetDoublePositionX() - pos.GetDoublePositionX();
- double offY = GetDoublePositionY() - pos.GetDoublePositionY();
- return (offX*offX) + (offY*offY);
+ double const offX = GetDoublePositionX() - pos.GetDoublePositionX();
+ double const offY = GetDoublePositionY() - pos.GetDoublePositionY();
+ return (offX * offX) + (offY * offY);
+ }
+
+ Position* sync()
+ {
+ m_positionX = float(DoublePosX);
+ m_positionY = float(DoublePosY);
+ m_positionZ = float(DoublePosZ);
+ return this;
}
- Position* sync() { m_positionX = (float)d_positionX; m_positionY = (float)d_positionY; m_positionZ = (float)d_positionZ; return this; }
+ double DoublePosX;
+ double DoublePosY;
+ double DoublePosZ;
};
- protected:
- AreaBoundary(BoundaryType bType, bool isInverted) : m_boundaryType(bType), m_isInvertedBoundary(isInverted) { }
virtual bool IsWithinBoundaryArea(Position const* pos) const = 0;
- const BoundaryType m_boundaryType;
- bool m_isInvertedBoundary;
+
+ private:
+ bool _isInvertedBoundary;
};
class TC_GAME_API RectangleBoundary : public AreaBoundary
@@ -77,7 +81,7 @@ class TC_GAME_API RectangleBoundary : public AreaBoundary
bool IsWithinBoundaryArea(Position const* pos) const override;
private:
- const float _minX, _maxX, _minY, _maxY;
+ float const _minX, _maxX, _minY, _maxY;
};
class TC_GAME_API CircleBoundary : public AreaBoundary
@@ -92,8 +96,8 @@ class TC_GAME_API CircleBoundary : public AreaBoundary
bool IsWithinBoundaryArea(Position const* pos) const override;
private:
- const DoublePosition _center;
- const double _radiusSq;
+ DoublePosition const _center;
+ double const _radiusSq;
};
class TC_GAME_API EllipseBoundary : public AreaBoundary
@@ -106,8 +110,8 @@ class TC_GAME_API EllipseBoundary : public AreaBoundary
bool IsWithinBoundaryArea(Position const* pos) const override;
private:
- const DoublePosition _center;
- const double _radiusYSq, _scaleXSq;
+ DoublePosition const _center;
+ double const _radiusYSq, _scaleXSq;
};
class TC_GAME_API TriangleBoundary : public AreaBoundary
@@ -120,8 +124,8 @@ class TC_GAME_API TriangleBoundary : public AreaBoundary
bool IsWithinBoundaryArea(Position const* pos) const override;
private:
- const DoublePosition _a, _b, _c;
- const double _abx, _bcx, _cax, _aby, _bcy, _cay;
+ DoublePosition const _a, _b, _c;
+ double const _abx, _bcx, _cax, _aby, _bcy, _cay;
};
class TC_GAME_API ParallelogramBoundary : public AreaBoundary
@@ -135,8 +139,8 @@ class TC_GAME_API ParallelogramBoundary : public AreaBoundary
bool IsWithinBoundaryArea(Position const* pos) const override;
private:
- const DoublePosition _a, _b, _d, _c;
- const double _abx, _dax, _aby, _day;
+ DoublePosition const _a, _b, _d, _c;
+ double const _abx, _dax, _aby, _day;
};
class TC_GAME_API ZRangeBoundary : public AreaBoundary
@@ -148,7 +152,7 @@ class TC_GAME_API ZRangeBoundary : public AreaBoundary
bool IsWithinBoundaryArea(Position const* pos) const override;
private:
- const float _minZ, _maxZ;
+ float const _minZ, _maxZ;
};
#endif //TRINITY_AREA_BOUNDARY_H