diff options
Diffstat (limited to 'src')
6 files changed, 51 insertions, 37 deletions
| diff --git a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp index 046d194efb0..870bf676b7a 100644 --- a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp +++ b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp @@ -38,7 +38,7 @@  #include "Unit.h"  #include "UpdateData.h" -AreaTrigger::AreaTrigger() : WorldObject(false), MapObject(), _aurEff(nullptr), +AreaTrigger::AreaTrigger() : WorldObject(false), MapObject(), _aurEff(nullptr), _maxSearchRadius(0.0f),      _duration(0), _totalDuration(0), _timeSinceCreated(0), _previousCheckOrientation(std::numeric_limits<float>::infinity()),      _isRemoved(false), _reachedDestination(true), _lastSplineIndex(0), _movementTime(0),      _areaTriggerMiscTemplate(nullptr), _areaTriggerTemplate(nullptr) @@ -113,6 +113,11 @@ bool AreaTrigger::Create(uint32 spellMiscId, Unit* caster, Unit* target, SpellIn      SetObjectScale(1.0f); +    if (GetTemplate()->IsPolygon()) +        _maxSearchRadius = GetMiscTemplate()->GetPolygonMaxSearchRadius(); +    else +        _maxSearchRadius = GetTemplate()->MaxSearchRadius; +      auto areaTriggerData = m_values.ModifyValue(&AreaTrigger::m_areaTriggerData);      SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::Caster), caster->GetGUID());      SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::CreatingEffectGUID), castId); @@ -122,7 +127,7 @@ bool AreaTrigger::Create(uint32 spellMiscId, Unit* caster, Unit* target, SpellIn      SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::SpellVisual).ModifyValue(&UF::SpellCastVisual::SpellXSpellVisualID), spellVisual.SpellXSpellVisualID);      SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::SpellVisual).ModifyValue(&UF::SpellCastVisual::ScriptVisualID), spellVisual.ScriptVisualID);      SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::TimeToTargetScale), GetMiscTemplate()->TimeToTargetScale != 0 ? GetMiscTemplate()->TimeToTargetScale : *m_areaTriggerData->Duration); -    SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::BoundsRadius2D), GetTemplate()->MaxSearchRadius); +    SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::BoundsRadius2D), GetMaxSearchRadius());      SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::DecalPropertiesID), GetMiscTemplate()->DecalPropertiesId);      if (GetMiscTemplate()->ExtraScale.Data.Structured.StartTimeOffset) @@ -360,12 +365,12 @@ void AreaTrigger::SearchUnits(std::vector<Unit*>& targetList, float radius, bool      if (IsServerSide())      {          Trinity::PlayerListSearcher<Trinity::AnyUnitInObjectRangeCheck> searcher(this, targetList, check); -        Cell::VisitWorldObjects(this, searcher, GetTemplate()->MaxSearchRadius); +        Cell::VisitWorldObjects(this, searcher, GetMaxSearchRadius());      }      else      {          Trinity::UnitListSearcher<Trinity::AnyUnitInObjectRangeCheck> searcher(this, targetList, check); -        Cell::VisitAllObjects(this, searcher, GetTemplate()->MaxSearchRadius); +        Cell::VisitAllObjects(this, searcher, GetMaxSearchRadius());      }  } @@ -387,7 +392,7 @@ void AreaTrigger::SearchUnitInSphere(std::vector<Unit*>& targetList)  void AreaTrigger::SearchUnitInBox(std::vector<Unit*>& targetList)  { -    SearchUnits(targetList, GetTemplate()->MaxSearchRadius, false); +    SearchUnits(targetList, GetMaxSearchRadius(), false);      Position const& boxCenter = GetPosition();      float extentsX = GetTemplate()->BoxDatas.Extents[0]; @@ -402,7 +407,7 @@ void AreaTrigger::SearchUnitInBox(std::vector<Unit*>& targetList)  void AreaTrigger::SearchUnitInPolygon(std::vector<Unit*>& targetList)  { -    SearchUnits(targetList, GetTemplate()->MaxSearchRadius, false); +    SearchUnits(targetList, GetMaxSearchRadius(), false);      float height = GetTemplate()->PolygonDatas.Height;      float minZ = GetPositionZ() - height; @@ -418,7 +423,7 @@ void AreaTrigger::SearchUnitInPolygon(std::vector<Unit*>& targetList)  void AreaTrigger::SearchUnitInCylinder(std::vector<Unit*>& targetList)  { -    SearchUnits(targetList, GetTemplate()->MaxSearchRadius, false); +    SearchUnits(targetList, GetMaxSearchRadius(), false);      float height = GetTemplate()->CylinderDatas.Height;      float minZ = GetPositionZ() - height; @@ -516,7 +521,7 @@ void AreaTrigger::UpdatePolygonOrientation()      if (G3D::fuzzyEq(_previousCheckOrientation, newOrientation))          return; -    _polygonVertices.assign(GetTemplate()->PolygonVertices.begin(), GetTemplate()->PolygonVertices.end()); +    _polygonVertices.assign(GetMiscTemplate()->PolygonVertices.begin(), GetMiscTemplate()->PolygonVertices.end());      float angleSin = std::sin(newOrientation);      float angleCos = std::cos(newOrientation); diff --git a/src/server/game/Entities/AreaTrigger/AreaTrigger.h b/src/server/game/Entities/AreaTrigger/AreaTrigger.h index e00f8842ea6..5e60736be94 100644 --- a/src/server/game/Entities/AreaTrigger/AreaTrigger.h +++ b/src/server/game/Entities/AreaTrigger/AreaTrigger.h @@ -99,6 +99,7 @@ class TC_GAME_API AreaTrigger : public WorldObject, public GridObject<AreaTrigge          uint32 GetFaction() const override; +        float GetMaxSearchRadius() const { return _maxSearchRadius; }          Position const& GetRollPitchYaw() const { return _rollPitchYaw; }          Position const& GetTargetRollPitchYaw() const { return _targetRollPitchYaw; }          void InitSplineOffsets(std::vector<Position> const& offsets, uint32 timeToTarget); @@ -144,6 +145,7 @@ class TC_GAME_API AreaTrigger : public WorldObject, public GridObject<AreaTrigge          AuraEffect const* _aurEff; +        float _maxSearchRadius;          int32 _duration;          int32 _totalDuration;          uint32 _timeSinceCreated; diff --git a/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.cpp b/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.cpp index 22f51434f7e..4095037dece 100644 --- a/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.cpp +++ b/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.cpp @@ -56,20 +56,12 @@ void AreaTriggerTemplate::InitMaxSearchRadius()              MaxSearchRadius = std::sqrt(BoxDatas.Extents[0] * BoxDatas.Extents[0] / 4 + BoxDatas.Extents[1] * BoxDatas.Extents[1] / 4);              break;          } +        // Polygon is SpellMisc based, can't init MaxSearchRadius          case AREATRIGGER_TYPE_POLYGON:          {              if (PolygonDatas.Height <= 0.0f)                  PolygonDatas.Height = 1.0f; -            Position center(0.0f, 0.0f); -            for (TaggedPosition<Position::XY> const& vertice : PolygonVertices) -            { -                float pointDist = center.GetExactDist2d(vertice); - -                if (pointDist > MaxSearchRadius) -                    MaxSearchRadius = pointDist; -            } -              break;          }          case AREATRIGGER_TYPE_CYLINDER: @@ -118,3 +110,19 @@ bool AreaTriggerMiscTemplate::HasSplines() const  {      return SplinePoints.size() >= 2;  } + +float AreaTriggerMiscTemplate::GetPolygonMaxSearchRadius() const +{ +    Position center(0.0f, 0.0f); +    float maxSearchRadius = 0.0f; + +    for (TaggedPosition<Position::XY> const& vertice : PolygonVertices) +    { +        float pointDist = center.GetExactDist2d(vertice); + +        if (pointDist > maxSearchRadius) +            maxSearchRadius = pointDist; +    } + +    return maxSearchRadius; +} diff --git a/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h b/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h index 389f0e73b89..9de9356f273 100644 --- a/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h +++ b/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h @@ -150,8 +150,6 @@ public:      uint32 Flags;      uint32 ScriptId;      float MaxSearchRadius; -    std::vector<TaggedPosition<Position::XY>> PolygonVertices; -    std::vector<TaggedPosition<Position::XY>> PolygonVerticesTarget;      std::vector<AreaTriggerAction> Actions;      union @@ -201,7 +199,8 @@ public:      AreaTriggerMiscTemplate();      ~AreaTriggerMiscTemplate(); -    bool HasSplines()   const; +    bool HasSplines() const; +    float GetPolygonMaxSearchRadius() const;      uint32 MiscId;      uint32 AreaTriggerEntry; @@ -224,6 +223,9 @@ public:      AreaTriggerOrbitInfo OrbitInfo;      AreaTriggerTemplate const* Template; + +    std::vector<TaggedPosition<Position::XY>> PolygonVertices; +    std::vector<TaggedPosition<Position::XY>> PolygonVerticesTarget;      std::vector<Position> SplinePoints;  }; diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index becde162ffb..5ed83090c45 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -564,15 +564,15 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags) const          if (hasAreaTriggerPolygon)          { -            *data << int32(areaTriggerTemplate->PolygonVertices.size()); -            *data << int32(areaTriggerTemplate->PolygonVerticesTarget.size()); +            *data << int32(areaTriggerMiscTemplate->PolygonVertices.size()); +            *data << int32(areaTriggerMiscTemplate->PolygonVerticesTarget.size());              *data << float(areaTriggerTemplate->PolygonDatas.Height);              *data << float(areaTriggerTemplate->PolygonDatas.HeightTarget); -            for (TaggedPosition<Position::XY> const& vertice : areaTriggerTemplate->PolygonVertices) +            for (TaggedPosition<Position::XY> const& vertice : areaTriggerMiscTemplate->PolygonVertices)                  *data << vertice; -            for (TaggedPosition<Position::XY> const& vertice : areaTriggerTemplate->PolygonVerticesTarget) +            for (TaggedPosition<Position::XY> const& vertice : areaTriggerMiscTemplate->PolygonVerticesTarget)                  *data << vertice;          } diff --git a/src/server/game/Globals/AreaTriggerDataStore.cpp b/src/server/game/Globals/AreaTriggerDataStore.cpp index 178de282bba..2a6f2f31063 100644 --- a/src/server/game/Globals/AreaTriggerDataStore.cpp +++ b/src/server/game/Globals/AreaTriggerDataStore.cpp @@ -58,8 +58,8 @@ namespace  void AreaTriggerDataStore::LoadAreaTriggerTemplates()  {      uint32 oldMSTime = getMSTime(); -    std::unordered_map<uint32, std::vector<TaggedPosition<Position::XY>>> verticesByAreaTrigger; -    std::unordered_map<uint32, std::vector<TaggedPosition<Position::XY>>> verticesTargetByAreaTrigger; +    std::unordered_map<uint32, std::vector<TaggedPosition<Position::XY>>> verticesBySpellMisc; +    std::unordered_map<uint32, std::vector<TaggedPosition<Position::XY>>> verticesTargetBySpellMisc;      std::unordered_map<uint32, std::vector<Position>> splinesBySpellMisc;      std::unordered_map<AreaTriggerId, std::vector<AreaTriggerAction>> actionsByAreaTrigger; @@ -112,20 +112,20 @@ void AreaTriggerDataStore::LoadAreaTriggerTemplates()          TC_LOG_INFO("server.loading", ">> Loaded 0 AreaTrigger templates actions. DB table `areatrigger_template_actions` is empty.");      } -    //                                                     0              1    2         3         4               5 -    if (QueryResult vertices = WorldDatabase.Query("SELECT AreaTriggerId, Idx, VerticeX, VerticeY, VerticeTargetX, VerticeTargetY FROM `areatrigger_template_polygon_vertices` ORDER BY `AreaTriggerId`, `Idx`")) +    //                                                     0            1    2         3         4               5 +    if (QueryResult vertices = WorldDatabase.Query("SELECT SpellMiscId, Idx, VerticeX, VerticeY, VerticeTargetX, VerticeTargetY FROM `spell_areatrigger_vertices` ORDER BY `SpellMiscId`, `Idx`"))      {          do          {              Field* verticeFields = vertices->Fetch(); -            uint32 areaTriggerId = verticeFields[0].GetUInt32(); +            uint32 spellMiscId = verticeFields[0].GetUInt32(); -            verticesByAreaTrigger[areaTriggerId].emplace_back(verticeFields[2].GetFloat(), verticeFields[3].GetFloat()); +            verticesBySpellMisc[spellMiscId].emplace_back(verticeFields[2].GetFloat(), verticeFields[3].GetFloat());              if (!verticeFields[4].IsNull() && !verticeFields[5].IsNull()) -                verticesTargetByAreaTrigger[areaTriggerId].emplace_back(verticeFields[4].GetFloat(), verticeFields[5].GetFloat()); +                verticesTargetBySpellMisc[spellMiscId].emplace_back(verticeFields[4].GetFloat(), verticeFields[5].GetFloat());              else if (verticeFields[4].IsNull() != verticeFields[5].IsNull()) -                TC_LOG_ERROR("sql.sql", "Table `areatrigger_template_polygon_vertices` has listed invalid target vertices (AreaTrigger: %u, Index: %u).", areaTriggerId, verticeFields[1].GetUInt32()); +                TC_LOG_ERROR("sql.sql", "Table `spell_areatrigger_vertices` has listed invalid target vertices (SpellMiscId: %u, Index: %u).", spellMiscId, verticeFields[1].GetUInt32());          }          while (vertices->NextRow());      } @@ -183,11 +183,6 @@ void AreaTriggerDataStore::LoadAreaTriggerTemplates()                  areaTriggerTemplate.DefaultDatas.Data[i] = fields[4 + i].GetFloat();              areaTriggerTemplate.ScriptId = sObjectMgr->GetScriptId(fields[10].GetString()); -            if (!areaTriggerTemplate.Id.IsServerSide) -            { -                areaTriggerTemplate.PolygonVertices = std::move(verticesByAreaTrigger[areaTriggerTemplate.Id.Id]); -                areaTriggerTemplate.PolygonVerticesTarget = std::move(verticesTargetByAreaTrigger[areaTriggerTemplate.Id.Id]); -            }              areaTriggerTemplate.Actions = std::move(actionsByAreaTrigger[areaTriggerTemplate.Id]);              areaTriggerTemplate.InitMaxSearchRadius(); @@ -239,6 +234,8 @@ void AreaTriggerDataStore::LoadAreaTriggerTemplates()              miscTemplate.TimeToTarget       = areatriggerSpellMiscFields[9].GetUInt32();              miscTemplate.TimeToTargetScale  = areatriggerSpellMiscFields[10].GetUInt32(); +            miscTemplate.PolygonVertices = std::move(verticesBySpellMisc[miscTemplate.MiscId]); +            miscTemplate.PolygonVerticesTarget = std::move(verticesTargetBySpellMisc[miscTemplate.MiscId]);              miscTemplate.SplinePoints = std::move(splinesBySpellMisc[miscTemplate.MiscId]);              _areaTriggerTemplateSpellMisc[miscTemplate.MiscId] = miscTemplate; | 
