aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorQAston <qaston@gmail.com>2011-09-23 06:04:17 -0700
committerQAston <qaston@gmail.com>2011-09-23 06:04:17 -0700
commit71bbbaa21b03b31a796308dbfe968904c769967f (patch)
tree5dc4a279534d3fad738d1c27eb9f7d042d7ac7be /src
parent9692be4cbb4dcc085ff9c3a31f2f83237ec74702 (diff)
parentc298d0941780a4cd0f30c2d3c0c23b84c9dad8ee (diff)
Merge pull request #3146 from Havenard/fix0001
Reimplement WorldObject::IsInBetween() to work as intented.
Diffstat (limited to 'src')
-rwxr-xr-xsrc/server/game/Entities/Object/Object.cpp17
1 files changed, 11 insertions, 6 deletions
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp
index 4305f90d7a3..8bd464a4820 100755
--- a/src/server/game/Entities/Object/Object.cpp
+++ b/src/server/game/Entities/Object/Object.cpp
@@ -1526,17 +1526,22 @@ bool Position::HasInArc(float arc, const Position* obj) const
bool WorldObject::IsInBetween(const WorldObject* obj1, const WorldObject* obj2, float size) const
{
- if (GetPositionX() > std::max(obj1->GetPositionX(), obj2->GetPositionX())
- || GetPositionX() < std::min(obj1->GetPositionX(), obj2->GetPositionX())
- || GetPositionY() > std::max(obj1->GetPositionY(), obj2->GetPositionY())
- || GetPositionY() < std::min(obj1->GetPositionY(), obj2->GetPositionY()))
+ if (!obj1 || !obj2)
+ return false;
+
+ float dist = GetExactDist2d(obj1->GetPositionX(), obj1->GetPositionY());
+
+ // not using sqrt() for performance
+ if ((dist * dist) >= obj1->GetExactDist2dSq(obj2->GetPositionX(), obj2->GetPositionY()))
return false;
if (!size)
size = GetObjectSize() / 2;
- float angle = obj1->GetAngle(this) - obj1->GetAngle(obj2);
- return fabs(sin(angle)) * GetExactDist2d(obj1->GetPositionX(), obj1->GetPositionY()) < size;
+ float angle = obj1->GetAngle(obj2);
+
+ // not using sqrt() for performance
+ return (size * size) >= GetExactDist2dSq(obj1->GetPositionX() + cos(angle) * dist, obj1->GetPositionY() + sin(angle) * dist);
}
bool WorldObject::isInFront(WorldObject const* target, float distance, float arc) const