diff options
author | Shauren <shauren.trinity@gmail.com> | 2025-09-11 22:10:24 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2025-09-11 22:10:24 +0200 |
commit | dac548a305c1509240ff6a923ccce8359c98915a (patch) | |
tree | 3d650106ecc4f2303b77939b14652ab2bbdf0ac5 /src/server/game/Globals | |
parent | b6acd368e0bca632d8742c9b5d0ef7f385cf1318 (diff) |
Core/AreaTriggers: Refactor AreaTriggerShapeInfo to use std::variant instead of union
Diffstat (limited to 'src/server/game/Globals')
-rw-r--r-- | src/server/game/Globals/AreaTriggerDataStore.cpp | 59 |
1 files changed, 41 insertions, 18 deletions
diff --git a/src/server/game/Globals/AreaTriggerDataStore.cpp b/src/server/game/Globals/AreaTriggerDataStore.cpp index d5c19690afb..67d9132a2a2 100644 --- a/src/server/game/Globals/AreaTriggerDataStore.cpp +++ b/src/server/game/Globals/AreaTriggerDataStore.cpp @@ -196,7 +196,7 @@ void AreaTriggerDataStore::LoadAreaTriggerTemplates() continue; } - if (shape >= AreaTriggerShapeType::Max) + if (shape == AreaTriggerShapeType::Unk || shape >= AreaTriggerShapeType::Max) { TC_LOG_ERROR("sql.sql", "Table `areatrigger_create_properties` has listed AreaTriggerCreatePropertiesId (Id: {}, IsCustom: {}) with invalid shape {}.", createPropertiesId.Id, uint32(createPropertiesId.IsCustom), uint32(shape)); @@ -237,30 +237,53 @@ void AreaTriggerDataStore::LoadAreaTriggerTemplates() createProperties.TimeToTargetScale = fields[13].GetUInt32(); createProperties.Speed = fields[14].GetFloat(); - createProperties.Shape.Type = shape; + std::array<float, MAX_AREATRIGGER_ENTITY_DATA> shapeData = { }; for (uint8 i = 0; i < MAX_AREATRIGGER_ENTITY_DATA; ++i) - createProperties.Shape.DefaultDatas.Data[i] = fields[16 + i].GetFloat(); + shapeData[i] = fields[16 + i].GetFloat(); - createProperties.ScriptId = sObjectMgr->GetScriptId(fields[24].GetString()); - - if (shape == AreaTriggerShapeType::Polygon) + switch (shape) { - if (createProperties.Shape.PolygonDatas.Height <= 0.0f) + case AreaTriggerShapeType::Sphere: + createProperties.Shape.Data.emplace<AreaTriggerShapeInfo::Sphere>(shapeData); + break; + case AreaTriggerShapeType::Box: + createProperties.Shape.Data.emplace<AreaTriggerShapeInfo::Box>(shapeData); + break; + case AreaTriggerShapeType::Polygon: { - createProperties.Shape.PolygonDatas.Height = 1.0f; - if (createProperties.Shape.PolygonDatas.HeightTarget <= 0.0f) - createProperties.Shape.PolygonDatas.HeightTarget = 1.0f; + AreaTriggerShapeInfo::Polygon& polygon = createProperties.Shape.Data.emplace<AreaTriggerShapeInfo::Polygon>(shapeData); + if (polygon.Height <= 0.0f) + { + polygon.Height = 1.0f; + if (polygon.HeightTarget <= 0.0f) + polygon.HeightTarget = 1.0f; + } + if (std::vector<TaggedPosition<Position::XY>>* vertices = Trinity::Containers::MapGetValuePtr(verticesByCreateProperties, createProperties.Id)) + polygon.PolygonVertices = std::move(*vertices); + if (std::vector<TaggedPosition<Position::XY>>* vertices = Trinity::Containers::MapGetValuePtr(verticesTargetByCreateProperties, createProperties.Id)) + polygon.PolygonVerticesTarget = std::move(*vertices); + if (!polygon.PolygonVerticesTarget.empty() && polygon.PolygonVertices.size() != polygon.PolygonVerticesTarget.size()) + { + TC_LOG_ERROR("sql.sql", "Table `areatrigger_create_properties_polygon_vertex` has invalid target vertices, either all or none vertices must have a corresponding target vertex (AreaTriggerCreatePropertiesId: (Id: {}, IsCustom: {})).", + createPropertiesId.Id, uint32(createPropertiesId.IsCustom)); + polygon.PolygonVerticesTarget.clear(); + } + break; } + case AreaTriggerShapeType::Cylinder: + createProperties.Shape.Data.emplace<AreaTriggerShapeInfo::Cylinder>(shapeData); + break; + case AreaTriggerShapeType::Disk: + createProperties.Shape.Data.emplace<AreaTriggerShapeInfo::Disk>(shapeData); + break; + case AreaTriggerShapeType::BoundedPlane: + createProperties.Shape.Data.emplace<AreaTriggerShapeInfo::BoundedPlane>(shapeData); + break; + default: + break; } - createProperties.Shape.PolygonVertices = std::move(verticesByCreateProperties[createProperties.Id]); - createProperties.Shape.PolygonVerticesTarget = std::move(verticesTargetByCreateProperties[createProperties.Id]); - if (!createProperties.Shape.PolygonVerticesTarget.empty() && createProperties.Shape.PolygonVertices.size() != createProperties.Shape.PolygonVerticesTarget.size()) - { - TC_LOG_ERROR("sql.sql", "Table `areatrigger_create_properties_polygon_vertex` has invalid target vertices, either all or none vertices must have a corresponding target vertex (AreaTriggerCreatePropertiesId: (Id: {}, IsCustom: {})).", - createPropertiesId.Id, uint32(createPropertiesId.IsCustom)); - createProperties.Shape.PolygonVerticesTarget.clear(); - } + createProperties.ScriptId = sObjectMgr->GetScriptId(fields[24].GetString()); if (std::vector<Position>* spline = Trinity::Containers::MapGetValuePtr(splinesByCreateProperties, createProperties.Id)) createProperties.Movement = std::move(*spline); |