diff options
| author | Meji <alvaro.megias@outlook.com> | 2024-05-04 13:20:13 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2024-05-27 18:53:47 +0200 |
| commit | b070e63fa867f7f25e73e9ef3aafbe18902a50e9 (patch) | |
| tree | c3d0151e9b46d30ccb69d57983df431acfb673a3 /src/server/game/Entities/Player | |
| parent | 38e99e1569fcba821211fcd2d7c3a0b2bd00701c (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.cpp | 41 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/Player.h | 2 |
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(); |
