Start using OneOf<>for unions/variant

This commit is contained in:
Hondacrx
2025-12-07 23:34:34 -05:00
parent 8cc270b895
commit 7f2baab1da
3 changed files with 30 additions and 31 deletions
@@ -191,7 +191,7 @@ namespace Game.DataStorage
float[] shapeData = new float[SharedConst.MaxAreatriggerEntityData]; float[] shapeData = new float[SharedConst.MaxAreatriggerEntityData];
for (byte i = 0; i < SharedConst.MaxAreatriggerEntityData; ++i) for (byte i = 0; i < SharedConst.MaxAreatriggerEntityData; ++i)
shapeData[i] = areatriggerCreateProperties.Read<float>(16 + i); shapeData[i] = areatriggerCreateProperties.Read<float>(16 + i);
switch (shape) switch (shape)
{ {
case AreaTriggerShapeType.Sphere: case AreaTriggerShapeType.Sphere:
@@ -201,7 +201,7 @@ namespace Game.DataStorage
createProperties.Shape.Data = new AreaTriggerShapeInfo.Box(shapeData); createProperties.Shape.Data = new AreaTriggerShapeInfo.Box(shapeData);
break; break;
case AreaTriggerShapeType.Polygon: case AreaTriggerShapeType.Polygon:
AreaTriggerShapeInfo.Polygon polygon = new AreaTriggerShapeInfo.Polygon(shapeData); AreaTriggerShapeInfo.Polygon polygon = new AreaTriggerShapeInfo.Polygon(shapeData);
if (polygon.Height <= 0.0f) if (polygon.Height <= 0.0f)
{ {
polygon.Height = 1.0f; polygon.Height = 1.0f;
@@ -239,7 +239,7 @@ namespace Game.DataStorage
var spline = splinesByCreateProperties.LookupByKey(createProperties.Id); var spline = splinesByCreateProperties.LookupByKey(createProperties.Id);
if (spline != null) if (spline != null)
createProperties.SplinePoints = spline; createProperties.Movement = spline;
_areaTriggerCreateProperties[createProperties.Id] = createProperties; _areaTriggerCreateProperties[createProperties.Id] = createProperties;
} }
@@ -288,7 +288,7 @@ namespace Game.DataStorage
orbitInfo.CounterClockwise = circularMovementInfos.Read<bool>(7); orbitInfo.CounterClockwise = circularMovementInfos.Read<bool>(7);
orbitInfo.CanLoop = circularMovementInfos.Read<bool>(8); orbitInfo.CanLoop = circularMovementInfos.Read<bool>(8);
createProperties.OrbitInfo = orbitInfo; createProperties.Movement = orbitInfo;
} }
while (circularMovementInfos.NextRow()); while (circularMovementInfos.NextRow());
} }
@@ -344,15 +344,15 @@ namespace Game.DataStorage
continue; 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"); string movementType = createProperties.Movement.Match(
continue; _ => "",
} splineInfo => "spline",
OrbitInfo => "orbit"
);
if (createProperties.SplinePoints != null) Log.outError(LogFilter.Sql, $"Table `areatrigger` has listed AreaTriggerCreatePropertiesId (Id: {createPropertiesId.Id}, IsCustom: {createPropertiesId.IsCustom}) with {movementType}");
{
Log.outError(LogFilter.Sql, $"Table `areatrigger` has listed AreaTriggerCreatePropertiesId (Id: {createPropertiesId.Id}, IsCustom: {createPropertiesId.IsCustom}) with splines");
continue; continue;
} }
+16 -18
View File
@@ -219,22 +219,20 @@ namespace Game.Entities
UpdateShape(); 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); GetCreateProperties().Movement.Switch(
} _ => SetUpdateFieldValue(areaTriggerData.ModifyValue(m_areaTriggerData.PathType), (byte)AreaTriggerPathType.None),
else if (GetCreateProperties().SplinePoints != null) splineInfo => InitSplineOffsets(splineInfo),
{ orbitInfo =>
InitSplineOffsets(GetCreateProperties().SplinePoints); {
} AreaTriggerOrbitInfo orbit = orbitInfo;
else if (target != null && HasAreaTriggerFlag(AreaTriggerFieldFlags.Attached))
SetUpdateFieldValue(areaTriggerData.ModifyValue(m_areaTriggerData.PathType), (byte)AreaTriggerPathType.None); orbit.PathTarget = target.GetGUID();
else
orbit.Center = pos;
InitOrbit(orbit);
});
SetUpdateFieldValue(areaTriggerData.ModifyValue(m_areaTriggerData.Facing), _stationaryPosition.GetOrientation()); 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.Extents), boxInfo.Extents);
SetUpdateFieldValue(box.ModifyValue(box.ExtentsTarget), boxInfo.ExtentsTarget); SetUpdateFieldValue(box.ModifyValue(box.ExtentsTarget), boxInfo.ExtentsTarget);
}, },
polygonInfo => polygonInfo =>
{ {
SetUpdateFieldValue(areaTriggerData.ModifyValue(m_areaTriggerData.ShapeType), (byte)3); SetUpdateFieldValue(areaTriggerData.ModifyValue(m_areaTriggerData.ShapeType), (byte)3);
var polygon = areaTriggerData.ModifyValue<AreaTriggerPolygon>(m_areaTriggerData.ShapeData); var polygon = areaTriggerData.ModifyValue<AreaTriggerPolygon>(m_areaTriggerData.ShapeData);
@@ -968,7 +966,7 @@ namespace Game.Entities
SetUpdateFieldValue(polygon.ModifyValue(polygon.Height), polygonInfo.Height); SetUpdateFieldValue(polygon.ModifyValue(polygon.Height), polygonInfo.Height);
SetUpdateFieldValue(polygon.ModifyValue(polygon.HeightTarget), polygonInfo.HeightTarget); SetUpdateFieldValue(polygon.ModifyValue(polygon.HeightTarget), polygonInfo.HeightTarget);
}, },
cylinderInfo => cylinderInfo =>
{ {
SetUpdateFieldValue(areaTriggerData.ModifyValue(m_areaTriggerData.ShapeType), (byte)4); SetUpdateFieldValue(areaTriggerData.ModifyValue(m_areaTriggerData.ShapeType), (byte)4);
var cylinder = areaTriggerData.ModifyValue<AreaTriggerCylinder>(m_areaTriggerData.ShapeData); var cylinder = areaTriggerData.ModifyValue<AreaTriggerCylinder>(m_areaTriggerData.ShapeData);
@@ -979,7 +977,7 @@ namespace Game.Entities
SetUpdateFieldValue(cylinder.ModifyValue(cylinder.LocationZOffset), cylinderInfo.LocationZOffset); SetUpdateFieldValue(cylinder.ModifyValue(cylinder.LocationZOffset), cylinderInfo.LocationZOffset);
SetUpdateFieldValue(cylinder.ModifyValue(cylinder.LocationZOffsetTarget), cylinderInfo.LocationZOffsetTarget); SetUpdateFieldValue(cylinder.ModifyValue(cylinder.LocationZOffsetTarget), cylinderInfo.LocationZOffsetTarget);
}, },
diskInfo => diskInfo =>
{ {
SetUpdateFieldValue(areaTriggerData.ModifyValue(m_areaTriggerData.ShapeType), (byte)7); SetUpdateFieldValue(areaTriggerData.ModifyValue(m_areaTriggerData.ShapeType), (byte)7);
var disk = areaTriggerData.ModifyValue<AreaTriggerDisk>(m_areaTriggerData.ShapeData); var disk = areaTriggerData.ModifyValue<AreaTriggerDisk>(m_areaTriggerData.ShapeData);
@@ -248,8 +248,7 @@ namespace Game.Entities
public AreaTriggerShapeInfo Shape = new(); public AreaTriggerShapeInfo Shape = new();
public float Speed = 1.0f; public float Speed = 1.0f;
public List<Vector3> SplinePoints = new(); public OneOf<EmptyStruct, List<Vector3>, AreaTriggerOrbitInfo> Movement;
public AreaTriggerOrbitInfo OrbitInfo;
public uint ScriptId; public uint ScriptId;
@@ -259,6 +258,8 @@ namespace Game.Entities
} }
} }
public struct EmptyStruct { }
public class AreaTriggerSpawn : SpawnData public class AreaTriggerSpawn : SpawnData
{ {
public new AreaTriggerId Id; public new AreaTriggerId Id;