diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Object/Object.cpp | 13 | ||||
-rw-r--r-- | src/server/game/Entities/Object/Object.h | 3 | ||||
-rw-r--r-- | src/server/game/Entities/Object/Position.cpp | 6 | ||||
-rw-r--r-- | src/server/game/Entities/Object/Position.h | 26 |
4 files changed, 35 insertions, 13 deletions
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 044d9fc7c62..f80f132ca0a 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -1867,24 +1867,21 @@ bool WorldObject::IsInRange3d(float x, float y, float z, float minRange, float m return distsq < maxdist * maxdist; } -bool WorldObject::IsInBetween(const WorldObject* obj1, const WorldObject* obj2, float size) const +bool WorldObject::IsInBetween(Position const& pos1, Position const& pos2, float size) const { - if (!obj1 || !obj2) - return false; - - float dist = GetExactDist2d(obj1->GetPositionX(), obj1->GetPositionY()); + float dist = GetExactDist2d(pos1); // not using sqrt() for performance - if ((dist * dist) >= obj1->GetExactDist2dSq(obj2->GetPositionX(), obj2->GetPositionY())) + if ((dist * dist) >= pos1.GetExactDist2dSq(pos2)) return false; if (!size) size = GetObjectSize() / 2; - float angle = obj1->GetAngle(obj2); + float angle = pos1.GetAngle(pos2); // not using sqrt() for performance - return (size * size) >= GetExactDist2dSq(obj1->GetPositionX() + std::cos(angle) * dist, obj1->GetPositionY() + std::sin(angle) * dist); + return (size * size) >= GetExactDist2dSq(pos1.GetPositionX() + std::cos(angle) * dist, pos1.GetPositionY() + std::sin(angle) * dist); } bool WorldObject::isInFront(WorldObject const* target, float arc) const diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index 5b7b324a70e..b5bc67bd8ad 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -602,7 +602,8 @@ class TC_GAME_API WorldObject : public Object, public WorldLocation bool isInFront(WorldObject const* target, float arc = float(M_PI)) const; bool isInBack(WorldObject const* target, float arc = float(M_PI)) const; - bool IsInBetween(WorldObject const* obj1, WorldObject const* obj2, float size = 0) const; + bool IsInBetween(Position const& pos1, Position const& pos2, float size = 0) const; + bool IsInBetween(WorldObject const* obj1, WorldObject const* obj2, float size = 0) const { return obj1 && obj2 && IsInBetween(obj1->GetPosition(), obj2->GetPosition(), size); } virtual void CleanupsBeforeDelete(bool finalCleanup = true); // used in destructor or explicitly before mass creature delete to remove cross-references to already deleted units diff --git a/src/server/game/Entities/Object/Position.cpp b/src/server/game/Entities/Object/Position.cpp index 6c5ad7a97ef..5cf7fdd51f1 100644 --- a/src/server/game/Entities/Object/Position.cpp +++ b/src/server/game/Entities/Object/Position.cpp @@ -70,12 +70,12 @@ Position Position::GetPositionWithOffset(Position const& offset) const return ret; } -float Position::GetAngle(const Position* obj) const +float Position::GetAngle(Position const* pos) const { - if (!obj) + if (!pos) return 0; - return GetAngle(obj->GetPositionX(), obj->GetPositionY()); + return GetAngle(pos->GetPositionX(), pos->GetPositionY()); } // Return angle in range 0..2*pi diff --git a/src/server/game/Entities/Object/Position.h b/src/server/game/Entities/Object/Position.h index 1553d4e0791..2a72653501a 100644 --- a/src/server/game/Entities/Object/Position.h +++ b/src/server/game/Entities/Object/Position.h @@ -133,7 +133,7 @@ public: bool IsPositionValid() const; - float GetExactDist2dSq(float x, float y) const + float GetExactDist2dSq(const float x, const float y) const { float dx = m_positionX - x; float dy = m_positionY - y; return dx*dx + dy*dy; } @@ -143,6 +143,16 @@ public: return std::sqrt(GetExactDist2dSq(x, y)); } + float GetExactDist2dSq(Position const& pos) const + { + float dx = m_positionX - pos.m_positionX; float dy = m_positionY - pos.m_positionY; return dx*dx + dy*dy; + } + + float GetExactDist2d(Position const& pos) const + { + return std::sqrt(GetExactDist2dSq(pos)); + } + float GetExactDist2dSq(Position const* pos) const { float dx = m_positionX - pos->m_positionX; float dy = m_positionY - pos->m_positionY; return dx*dx + dy*dy; @@ -163,6 +173,16 @@ public: return std::sqrt(GetExactDistSq(x, y, z)); } + float GetExactDistSq(Position const& pos) const + { + float dx = m_positionX - pos.m_positionX; float dy = m_positionY - pos.m_positionY; float dz = m_positionZ - pos.m_positionZ; return dx*dx + dy*dy + dz*dz; + } + + float GetExactDist(Position const& pos) const + { + return std::sqrt(GetExactDistSq(pos)); + } + float GetExactDistSq(Position const* pos) const { float dx = m_positionX - pos->m_positionX; float dy = m_positionY - pos->m_positionY; float dz = m_positionZ - pos->m_positionZ; return dx*dx + dy*dy + dz*dz; @@ -177,6 +197,10 @@ public: Position GetPositionWithOffset(Position const& offset) const; float GetAngle(Position const* pos) const; + float GetAngle(Position const& pos) const + { + return GetAngle(pos.m_positionX, pos.m_positionY); + } float GetAngle(float x, float y) const; float GetRelativeAngle(Position const* pos) const { |