diff options
Diffstat (limited to 'src')
-rwxr-xr-x | src/server/game/Entities/Object/Object.cpp | 17 |
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 |