aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities/Player
diff options
context:
space:
mode:
authorMeji <alvaro.megias@outlook.com>2024-05-04 13:20:13 +0200
committerShauren <shauren.trinity@gmail.com>2024-05-27 18:53:47 +0200
commitb070e63fa867f7f25e73e9ef3aafbe18902a50e9 (patch)
treec3d0151e9b46d30ccb69d57983df431acfb673a3 /src/server/game/Entities/Player
parent38e99e1569fcba821211fcd2d7c3a0b2bd00701c (diff)
Core/AreaTriggers: Fix triggering of client areatriggers for some shapes
Diffstat (limited to 'src/server/game/Entities/Player')
-rw-r--r--src/server/game/Entities/Player/Player.cpp41
-rw-r--r--src/server/game/Entities/Player/Player.h2
2 files changed, 26 insertions, 17 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index aad59f7930d..b06f41e0619 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -1029,7 +1029,7 @@ void Player::Update(uint32 p_time)
if (_restMgr->HasRestFlag(REST_FLAG_IN_TAVERN))
{
AreaTriggerEntry const* atEntry = sAreaTriggerStore.LookupEntry(_restMgr->GetInnTriggerID());
- if (!atEntry || !IsInAreaTriggerRadius(atEntry))
+ if (!atEntry || !IsInAreaTrigger(atEntry))
_restMgr->RemoveRestFlag(REST_FLAG_IN_TAVERN);
}
@@ -2015,29 +2015,38 @@ GameObject* Player::GetGameObjectIfCanInteractWith(ObjectGuid const& guid, Gameo
return go;
}
-bool Player::IsInAreaTriggerRadius(AreaTriggerEntry const* trigger) const
+bool Player::IsInAreaTrigger(AreaTriggerEntry const* areaTrigger) const
{
- if (!trigger)
+ if (!areaTrigger)
return false;
- if (int32(GetMapId()) != trigger->ContinentID && !GetPhaseShift().HasVisibleMapId(trigger->ContinentID))
+ if (int32(GetMapId()) != areaTrigger->ContinentID && !GetPhaseShift().HasVisibleMapId(areaTrigger->ContinentID))
return false;
- if (trigger->PhaseID || trigger->PhaseGroupID || trigger->PhaseUseFlags)
- if (!PhasingHandler::InDbPhaseShift(this, trigger->PhaseUseFlags, trigger->PhaseID, trigger->PhaseGroupID))
+ if (areaTrigger->PhaseID || areaTrigger->PhaseGroupID || areaTrigger->PhaseUseFlags)
+ if (!PhasingHandler::InDbPhaseShift(this, areaTrigger->PhaseUseFlags, areaTrigger->PhaseID, areaTrigger->PhaseGroupID))
return false;
- if (trigger->Radius > 0.f)
+ Position areaTriggerPos(areaTrigger->Pos.X, areaTrigger->Pos.Y, areaTrigger->Pos.Z, areaTrigger->BoxYaw);
+ switch (areaTrigger->ShapeType)
{
- // if we have radius check it
- float dist = GetDistance(trigger->Pos.X, trigger->Pos.Y, trigger->Pos.Z);
- if (dist > trigger->Radius)
- return false;
- }
- else
- {
- Position center(trigger->Pos.X, trigger->Pos.Y, trigger->Pos.Z, trigger->BoxYaw);
- if (!IsWithinBox(center, trigger->BoxLength / 2.f, trigger->BoxWidth / 2.f, trigger->BoxHeight / 2.f))
+ case 0: // Sphere
+ if (!IsInDist(&areaTriggerPos, areaTrigger->Radius))
+ return false;
+ break;
+ case 1: // Box
+ if (!IsWithinBox(areaTriggerPos, areaTrigger->BoxLength / 2.f, areaTrigger->BoxWidth / 2.f, areaTrigger->BoxHeight / 2.f))
+ return false;
+ break;
+ case 3: // Polygon
+ if (!IsInPolygon2D(areaTriggerPos, sObjectMgr->GetVerticesForAreaTrigger(areaTrigger)))
+ return false;
+ break;
+ case 4: // Cylinder
+ if (!IsWithinVerticalCylinder(areaTriggerPos, areaTrigger->Radius, areaTrigger->BoxHeight))
+ return false;
+ break;
+ default:
return false;
}
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index 24bc8ae574b..e427a2639d4 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -1178,7 +1178,7 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player>
bool IsImmunedToSpellEffect(SpellInfo const* spellInfo, SpellEffectInfo const& spellEffectInfo, WorldObject const* caster, bool requireImmunityPurgesEffectAttribute = false) const override;
- bool IsInAreaTriggerRadius(AreaTriggerEntry const* trigger) const;
+ bool IsInAreaTrigger(AreaTriggerEntry const* areaTrigger) const;
void SendInitialPacketsBeforeAddToMap();
void SendInitialPacketsAfterAddToMap();