diff options
author | Traesh <Traesh@users.noreply.github.com> | 2021-09-12 17:50:13 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-09-12 17:50:13 +0200 |
commit | c60cb7bab1e85fcc33be2f6bb0178adc0216c867 (patch) | |
tree | d256397298a1c3dccb6cd8bb9ee1fcd9f0e04a17 | |
parent | d9c0c062a4c684cc31408c384c513afe002999fa (diff) |
Core/AreaTrigger Switch polygon vertices from Template to SpellMisc (#26827)
7 files changed, 69 insertions, 37 deletions
diff --git a/sql/updates/world/master/2021_09_12_01_world.sql b/sql/updates/world/master/2021_09_12_01_world.sql new file mode 100644 index 00000000000..7b4043916d2 --- /dev/null +++ b/sql/updates/world/master/2021_09_12_01_world.sql @@ -0,0 +1,18 @@ +DROP TABLE IF EXISTS `spell_areatrigger_vertices`; +CREATE TABLE `spell_areatrigger_vertices` ( + `SpellMiscId` int(10) unsigned NOT NULL, + `Idx` int(10) unsigned NOT NULL, + `VerticeX` float NOT NULL DEFAULT '0', + `VerticeY` float NOT NULL DEFAULT '0', + `VerticeTargetX` float DEFAULT NULL, + `VerticeTargetY` float DEFAULT NULL, + `VerifiedBuild` int(10) unsigned NOT NULL DEFAULT '0', + PRIMARY KEY (`SpellMiscId`,`Idx`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +INSERT INTO `spell_areatrigger_vertices` + SELECT `sa`.`SpellMiscId`,`atpv`.`Idx`,`atpv`.`VerticeX`,`atpv`.`VerticeY`,`atpv`.`VerticeTargetX`,`atpv`.`VerticeTargetY`,`atpv`.`VerifiedBuild` + FROM `spell_areatrigger` `sa` + INNER JOIN `areatrigger_template_polygon_vertices` `atpv` ON `sa`.`AreaTriggerId`=`atpv`.`AreaTriggerId`; + +DROP TABLE `areatrigger_template_polygon_vertices`; 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; |