diff --git a/Source/Game/DataStorage/AreaTriggerDataStorage.cs b/Source/Game/DataStorage/AreaTriggerDataStorage.cs index 4898d15ba..eaeddc608 100644 --- a/Source/Game/DataStorage/AreaTriggerDataStorage.cs +++ b/Source/Game/DataStorage/AreaTriggerDataStorage.cs @@ -191,7 +191,7 @@ namespace Game.DataStorage float[] shapeData = new float[SharedConst.MaxAreatriggerEntityData]; for (byte i = 0; i < SharedConst.MaxAreatriggerEntityData; ++i) shapeData[i] = areatriggerCreateProperties.Read(16 + i); - + switch (shape) { case AreaTriggerShapeType.Sphere: @@ -201,7 +201,7 @@ namespace Game.DataStorage createProperties.Shape.Data = new AreaTriggerShapeInfo.Box(shapeData); break; case AreaTriggerShapeType.Polygon: - AreaTriggerShapeInfo.Polygon polygon = new AreaTriggerShapeInfo.Polygon(shapeData); + AreaTriggerShapeInfo.Polygon polygon = new AreaTriggerShapeInfo.Polygon(shapeData); if (polygon.Height <= 0.0f) { polygon.Height = 1.0f; @@ -239,7 +239,7 @@ namespace Game.DataStorage var spline = splinesByCreateProperties.LookupByKey(createProperties.Id); if (spline != null) - createProperties.SplinePoints = spline; + createProperties.Movement = spline; _areaTriggerCreateProperties[createProperties.Id] = createProperties; } @@ -288,7 +288,7 @@ namespace Game.DataStorage orbitInfo.CounterClockwise = circularMovementInfos.Read(7); orbitInfo.CanLoop = circularMovementInfos.Read(8); - createProperties.OrbitInfo = orbitInfo; + createProperties.Movement = orbitInfo; } while (circularMovementInfos.NextRow()); } @@ -344,15 +344,15 @@ namespace Game.DataStorage continue; } - if (createProperties.OrbitInfo != null) + if (!createProperties.Movement.IsT0) { - Log.outError(LogFilter.Sql, $"Table `areatrigger` has listed AreaTriggerCreatePropertiesId (Id: {createPropertiesId.Id}, IsCustom: {createPropertiesId.IsCustom}) with orbit info"); - continue; - } + string movementType = createProperties.Movement.Match( + _ => "", + splineInfo => "spline", + OrbitInfo => "orbit" + ); - if (createProperties.SplinePoints != null) - { - Log.outError(LogFilter.Sql, $"Table `areatrigger` has listed AreaTriggerCreatePropertiesId (Id: {createPropertiesId.Id}, IsCustom: {createPropertiesId.IsCustom}) with splines"); + Log.outError(LogFilter.Sql, $"Table `areatrigger` has listed AreaTriggerCreatePropertiesId (Id: {createPropertiesId.Id}, IsCustom: {createPropertiesId.IsCustom}) with {movementType}"); continue; } diff --git a/Source/Game/Entities/AreaTrigger/AreaTrigger.cs b/Source/Game/Entities/AreaTrigger/AreaTrigger.cs index 9127ea0c7..666755e0f 100644 --- a/Source/Game/Entities/AreaTrigger/AreaTrigger.cs +++ b/Source/Game/Entities/AreaTrigger/AreaTrigger.cs @@ -219,22 +219,20 @@ namespace Game.Entities UpdateShape(); - if (GetCreateProperties().OrbitInfo != null) - { - AreaTriggerOrbitInfo orbit = GetCreateProperties().OrbitInfo; - if (target != null && HasAreaTriggerFlag(AreaTriggerFieldFlags.Attached)) - orbit.PathTarget = target.GetGUID(); - else - orbit.Center = new(pos.posX, pos.posY, pos.posZ); - InitOrbit(orbit, GetCreateProperties().Speed); - } - else if (GetCreateProperties().SplinePoints != null) - { - InitSplineOffsets(GetCreateProperties().SplinePoints); - } - else - SetUpdateFieldValue(areaTriggerData.ModifyValue(m_areaTriggerData.PathType), (byte)AreaTriggerPathType.None); + GetCreateProperties().Movement.Switch( + _ => SetUpdateFieldValue(areaTriggerData.ModifyValue(m_areaTriggerData.PathType), (byte)AreaTriggerPathType.None), + splineInfo => InitSplineOffsets(splineInfo), + orbitInfo => + { + AreaTriggerOrbitInfo orbit = orbitInfo; + if (target != null && HasAreaTriggerFlag(AreaTriggerFieldFlags.Attached)) + orbit.PathTarget = target.GetGUID(); + else + orbit.Center = pos; + + InitOrbit(orbit); + }); SetUpdateFieldValue(areaTriggerData.ModifyValue(m_areaTriggerData.Facing), _stationaryPosition.GetOrientation()); @@ -953,7 +951,7 @@ namespace Game.Entities SetUpdateFieldValue(box.ModifyValue(box.Extents), boxInfo.Extents); SetUpdateFieldValue(box.ModifyValue(box.ExtentsTarget), boxInfo.ExtentsTarget); }, - polygonInfo => + polygonInfo => { SetUpdateFieldValue(areaTriggerData.ModifyValue(m_areaTriggerData.ShapeType), (byte)3); var polygon = areaTriggerData.ModifyValue(m_areaTriggerData.ShapeData); @@ -968,7 +966,7 @@ namespace Game.Entities SetUpdateFieldValue(polygon.ModifyValue(polygon.Height), polygonInfo.Height); SetUpdateFieldValue(polygon.ModifyValue(polygon.HeightTarget), polygonInfo.HeightTarget); }, - cylinderInfo => + cylinderInfo => { SetUpdateFieldValue(areaTriggerData.ModifyValue(m_areaTriggerData.ShapeType), (byte)4); var cylinder = areaTriggerData.ModifyValue(m_areaTriggerData.ShapeData); @@ -979,7 +977,7 @@ namespace Game.Entities SetUpdateFieldValue(cylinder.ModifyValue(cylinder.LocationZOffset), cylinderInfo.LocationZOffset); SetUpdateFieldValue(cylinder.ModifyValue(cylinder.LocationZOffsetTarget), cylinderInfo.LocationZOffsetTarget); }, - diskInfo => + diskInfo => { SetUpdateFieldValue(areaTriggerData.ModifyValue(m_areaTriggerData.ShapeType), (byte)7); var disk = areaTriggerData.ModifyValue(m_areaTriggerData.ShapeData); diff --git a/Source/Game/Entities/AreaTrigger/AreaTriggerTemplate.cs b/Source/Game/Entities/AreaTrigger/AreaTriggerTemplate.cs index 9dc607263..009a212be 100644 --- a/Source/Game/Entities/AreaTrigger/AreaTriggerTemplate.cs +++ b/Source/Game/Entities/AreaTrigger/AreaTriggerTemplate.cs @@ -248,8 +248,7 @@ namespace Game.Entities public AreaTriggerShapeInfo Shape = new(); public float Speed = 1.0f; - public List SplinePoints = new(); - public AreaTriggerOrbitInfo OrbitInfo; + public OneOf, AreaTriggerOrbitInfo> Movement; public uint ScriptId; @@ -259,6 +258,8 @@ namespace Game.Entities } } + public struct EmptyStruct { } + public class AreaTriggerSpawn : SpawnData { public new AreaTriggerId Id;