aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Globals
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2025-09-11 22:10:24 +0200
committerShauren <shauren.trinity@gmail.com>2025-09-11 22:10:24 +0200
commitdac548a305c1509240ff6a923ccce8359c98915a (patch)
tree3d650106ecc4f2303b77939b14652ab2bbdf0ac5 /src/server/game/Globals
parentb6acd368e0bca632d8742c9b5d0ef7f385cf1318 (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.cpp59
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);