aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/game/MiscHandler.cpp34
1 files changed, 22 insertions, 12 deletions
diff --git a/src/game/MiscHandler.cpp b/src/game/MiscHandler.cpp
index 053efc299d8..f0f0a4b42a4 100644
--- a/src/game/MiscHandler.cpp
+++ b/src/game/MiscHandler.cpp
@@ -822,21 +822,31 @@ void WorldSession::HandleAreaTriggerOpcode(WorldPacket & recv_data)
else
{
// we have only extent
- float dx = pl->GetPositionX() - atEntry->x;
- float dy = pl->GetPositionY() - atEntry->y;
+
+ // rotate the players 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-atEntry->box_orientation;
+ double sinVal = sin(rotation);
+ double cosVal = cos(rotation);
+
+ float playerBoxDistX = pl->GetPositionX() - atEntry->x;
+ float playerBoxDistY = pl->GetPositionY() - atEntry->y;
+
+ float rotPlayerX = atEntry->x + playerBoxDistX * cosVal - playerBoxDistY*sinVal;
+ float rotPlayerY = atEntry->y + playerBoxDistY * cosVal + playerBoxDistX*sinVal;
+
+ // box edges are parallel to coordiante axis, so we can treat every dimension independently :D
float dz = pl->GetPositionZ() - atEntry->z;
- double es = sin(atEntry->box_orientation);
- double ec = cos(atEntry->box_orientation);
- // calc rotated vector based on extent axis
- double rotateDx = dx*ec - dy*es;
- double rotateDy = dx*es + dy*ec;
-
- if( (fabs(rotateDx) > atEntry->box_x/2 + delta) ||
- (fabs(rotateDy) > atEntry->box_y/2 + delta) ||
+ float dx = rotPlayerX - atEntry->x;
+ float dy = rotPlayerY - atEntry->y;
+ if( (fabs(dx) > atEntry->box_x/2 + delta) ||
+ (fabs(dy) > atEntry->box_y/2 + delta) ||
(fabs(dz) > atEntry->box_z/2 + delta) )
{
- sLog.outDebug("Player '%s' (GUID: %u) too far (1/2 box X: %f 1/2 box Y: %f 1/2 box Z: %f rotate dX: %f rotate dY: %f dZ:%f), ignore Area Trigger ID: %u",
- pl->GetName(), pl->GetGUIDLow(), atEntry->box_x/2, atEntry->box_y/2, atEntry->box_z/2, rotateDx, rotateDy, dz, Trigger_ID);
+ sLog.outDebug("Player '%s' (GUID: %u) too far (1/2 box X: %f 1/2 box Y: %f 1/2 box Z: %f rotatedPlayerX: %f rotatedPlayerY: %f dZ:%f), ignore Area Trigger ID: %u",
+ pl->GetName(), pl->GetGUIDLow(), atEntry->box_x/2, atEntry->box_y/2, atEntry->box_z/2, rotPlayerX, rotPlayerY, dz, Trigger_ID);
return;
}
}