aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities/Object
diff options
context:
space:
mode:
authorTraesh <Traesh@users.noreply.github.com>2021-08-15 11:09:46 +0200
committerGitHub <noreply@github.com>2021-08-15 11:09:46 +0200
commitfb6761c273d518eae6bab72fc9c2a2b6f93eec83 (patch)
treec2dc8907691bf0da898a62448058df38892d9333 /src/server/game/Entities/Object
parent4725941567f9dae583fc27b52b51a23aa84cd098 (diff)
Core/Spells Implement targets 133, 134, 135 : TARGET_UNIT_LINE_CASTER_TO_DEST_*** (#26786)
Diffstat (limited to 'src/server/game/Entities/Object')
-rw-r--r--src/server/game/Entities/Object/Position.cpp10
-rw-r--r--src/server/game/Entities/Object/Position.h5
2 files changed, 8 insertions, 7 deletions
diff --git a/src/server/game/Entities/Object/Position.cpp b/src/server/game/Entities/Object/Position.cpp
index 6afdb283c1b..daffd7a9b52 100644
--- a/src/server/game/Entities/Object/Position.cpp
+++ b/src/server/game/Entities/Object/Position.cpp
@@ -154,7 +154,7 @@ bool Position::IsWithinDoubleVerticalCylinder(Position const* center, float radi
return IsInDist2d(center, radius) && std::abs(verticalDelta) <= height;
}
-bool Position::HasInArc(float arc, Position const* obj, float border) const
+bool Position::HasInArc(float arc, Position const* obj, float border, Optional<float> orientation) const
{
// always have self in arc
if (obj == this)
@@ -164,7 +164,7 @@ bool Position::HasInArc(float arc, Position const* obj, float border) const
arc = NormalizeOrientation(arc);
float angle = GetAngle(obj);
- angle -= m_orientation;
+ angle -= orientation.is_initialized() ? *orientation : GetOrientation();
// move angle to range -pi ... +pi
angle = NormalizeOrientation(angle);
@@ -176,13 +176,13 @@ bool Position::HasInArc(float arc, Position const* obj, float border) const
return ((angle >= lborder) && (angle <= rborder));
}
-bool Position::HasInLine(Position const* pos, float objSize, float width) const
+bool Position::HasInLine(Position const* pos, float objSize, float width, Optional<float> orientation) const
{
- if (!HasInArc(float(M_PI), pos))
+ if (!HasInArc(float(M_PI), pos, 2.0f, orientation))
return false;
width += objSize;
- float angle = GetRelativeAngle(pos);
+ float angle = GetAngle(pos) - (orientation.is_initialized() ? *orientation : GetOrientation());
return std::fabs(std::sin(angle)) * GetExactDist2d(pos->GetPositionX(), pos->GetPositionY()) < width;
}
diff --git a/src/server/game/Entities/Object/Position.h b/src/server/game/Entities/Object/Position.h
index 9f2218397e9..fbf9f87d753 100644
--- a/src/server/game/Entities/Object/Position.h
+++ b/src/server/game/Entities/Object/Position.h
@@ -19,6 +19,7 @@
#define Trinity_game_Position_h__
#include "Define.h"
+#include "Optional.h"
#include <string>
#include <cmath>
@@ -215,8 +216,8 @@ public:
search using this relation: dist2d < radius && abs(dz) < height
*/
bool IsWithinDoubleVerticalCylinder(Position const* center, float radius, float height) const;
- bool HasInArc(float arcangle, Position const* pos, float border = 2.0f) const;
- bool HasInLine(Position const* pos, float objSize, float width) const;
+ bool HasInArc(float arcangle, Position const* pos, float border = 2.0f, Optional<float> orientation = Optional<float>()) const;
+ bool HasInLine(Position const* pos, float objSize, float width, Optional<float> orientation = Optional<float>()) const;
std::string ToString() const;
// modulos a radian orientation to the range of 0..2PI