diff options
| author | Rochet2 <tqbattlenet@gmail.com> | 2015-08-10 18:12:22 +0200 |
|---|---|---|
| committer | Carbenium <carbenium@outlook.com> | 2015-09-24 20:29:55 +0200 |
| commit | c3c7ab6ec765833e98799956a44ee9e59bf0af87 (patch) | |
| tree | 714be793debee7ea30d1acdb7bfc1e0b979ed3f8 /src/server/game/Entities/Object | |
| parent | bfb373ef22ba69b61caf174ec2c987d403ca805f (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.cpp | 28 | ||||
| -rw-r--r-- | src/server/game/Entities/Object/Position.h | 1 |
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; |
