aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities/Object
diff options
context:
space:
mode:
authorRochet2 <tqbattlenet@gmail.com>2015-08-10 18:12:22 +0200
committerCarbenium <carbenium@outlook.com>2015-09-24 20:29:55 +0200
commitc3c7ab6ec765833e98799956a44ee9e59bf0af87 (patch)
tree714be793debee7ea30d1acdb7bfc1e0b979ed3f8 /src/server/game/Entities/Object
parentbfb373ef22ba69b61caf174ec2c987d403ca805f (diff)
Core/RestState: Check area trigger radius instead of 1.0f distance
Closes #15016 Closes #15052 Signed-off-by: jackpoz <giacomopoz@gmail.com> (cherry picked from commit 12931f4762d2592e4b28c6e6bf137b3348230c45) Conflicts: src/server/game/Entities/Player/Player.h src/server/game/Handlers/MiscHandler.cpp
Diffstat (limited to 'src/server/game/Entities/Object')
-rw-r--r--src/server/game/Entities/Object/Position.cpp28
-rw-r--r--src/server/game/Entities/Object/Position.h1
2 files changed, 29 insertions, 0 deletions
diff --git a/src/server/game/Entities/Object/Position.cpp b/src/server/game/Entities/Object/Position.cpp
index 8f8e5743f8c..ae559cbac3a 100644
--- a/src/server/game/Entities/Object/Position.cpp
+++ b/src/server/game/Entities/Object/Position.cpp
@@ -98,6 +98,34 @@ void Position::GetSinCos(const float x, const float y, float &vsin, float &vcos)
}
}
+bool Position::IsWithinBox(const Position& center, float xradius, float yradius, float zradius) const
+{
+ // rotate the WorldObject position instead of rotating the whole cube, that way we can make a simplified
+ // is-in-cube check and we have to calculate only one point instead of 4
+
+ // 2PI = 360*, keep in mind that ingame orientation is counter-clockwise
+ double rotation = 2 * M_PI - center.GetOrientation();
+ double sinVal = std::sin(rotation);
+ double cosVal = std::cos(rotation);
+
+ float BoxDistX = GetPositionX() - center.GetPositionX();
+ float BoxDistY = GetPositionY() - center.GetPositionY();
+
+ float rotX = float(center.GetPositionX() + BoxDistX * cosVal - BoxDistY*sinVal);
+ float rotY = float(center.GetPositionY() + BoxDistY * cosVal + BoxDistX*sinVal);
+
+ // box edges are parallel to coordiante axis, so we can treat every dimension independently :D
+ float dz = GetPositionZ() - center.GetPositionZ();
+ float dx = rotX - center.GetPositionX();
+ float dy = rotY - center.GetPositionY();
+ if ((std::fabs(dx) > xradius) ||
+ (std::fabs(dy) > yradius) ||
+ (std::fabs(dz) > zradius))
+ return false;
+
+ return true;
+}
+
bool Position::HasInArc(float arc, const Position* obj, float border) const
{
// always have self in arc
diff --git a/src/server/game/Entities/Object/Position.h b/src/server/game/Entities/Object/Position.h
index 109ff09d66c..98dbf1ca628 100644
--- a/src/server/game/Entities/Object/Position.h
+++ b/src/server/game/Entities/Object/Position.h
@@ -195,6 +195,7 @@ public:
return GetExactDistSq(pos) < dist * dist;
}
+ bool IsWithinBox(const Position& center, float xradius, float yradius, float zradius) const;
bool HasInArc(float arcangle, Position const* pos, float border = 2.0f) const;
bool HasInLine(Position const* pos, float width) const;
std::string ToString() const;