Skip to content

Commit

Permalink
Add CircleZone
Browse files Browse the repository at this point in the history
  • Loading branch information
Twinki14 committed Feb 3, 2024
1 parent a3786b3 commit a4ba091
Show file tree
Hide file tree
Showing 9 changed files with 87 additions and 20 deletions.
13 changes: 13 additions & 0 deletions src/PolyZone/Extensions/EntityExtensions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
using CitizenFX.Core;
using PolyZone.Zones.Interfaces;

namespace PolyZone.Extensions;

public static class EntityExtensions
{
/// <inheritdoc cref="IZone.Contains"/>
public static bool IsInside(this Entity entity, IZone zone) => zone.Contains(entity);

/// <inheritdoc cref="IZone.DistanceFrom"/>
public static float DistanceTo(this Entity entity, IZone zone) => zone.DistanceFrom(entity);
}
10 changes: 0 additions & 10 deletions src/PolyZone/Extensions/Vector2Extensions.cs

This file was deleted.

9 changes: 0 additions & 9 deletions src/PolyZone/Extensions/Vector3Extensions.cs

This file was deleted.

16 changes: 16 additions & 0 deletions src/PolyZone/Extensions/VectorExtensions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
using CitizenFX.Core;
using PolyZone.Shapes.Interfaces;

namespace PolyZone.Extensions;

public static class VectorExtensions
{
/// <inheritdoc cref="ISpatial2dShape.Contains"/>
public static bool IsInside(this Vector2 vector2, in ISpatial2dShape shape) => shape.Contains(vector2);

/// <inheritdoc cref="ISpatial2dShape.DistanceFrom"/>
public static float DistanceTo(this Vector2 vector2, in ISpatial2dShape shape) => shape.DistanceFrom(vector2);

/// <inheritdoc cref="ISpatial3dShape.Contains"/>
public static bool IsInside(this Vector3 vector2, in ISpatial3dShape shape) => shape.Contains(vector2);
}
8 changes: 8 additions & 0 deletions src/PolyZone/Internal/VectorExtensions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
using CitizenFX.Core;

namespace PolyZone.Internal;

internal static class VectorExtensions
{
internal static Vector2 ToVector2(in this Vector3 vector3) => new() { X = vector3.X, Y = vector3.Y };
}
5 changes: 5 additions & 0 deletions src/PolyZone/Shapes/Circle.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,11 @@ public class Circle(in Vector2 center, float radius) : ICircle
{
public Vector2 Center { get; } = center;
public float Radius { get; } = radius;

public Circle(float centerX, float centerY, float radius) : this(new Vector2 { X = centerX, Y = centerY }, radius)
{

}

/// <inheritdoc cref="ISpatial2dShape.Contains"/>
public bool Contains(in Vector2 point)
Expand Down
1 change: 0 additions & 1 deletion src/PolyZone/Shapes/Sphere.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,5 @@ public bool Contains(in Vector3 point)

// Check if the distance is less than or equal to the radius
return distance <= Radius;

}
}
22 changes: 22 additions & 0 deletions src/PolyZone/Zones/CircleZone.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
using CitizenFX.Core;
using PolyZone.Internal;
using PolyZone.Shapes;
using PolyZone.Zones.Interfaces;

namespace PolyZone.Zones;

// IZone or ISpatial2dZone>
// Contains(player / character)
// IZone + IDrawableZone?
// Maybe have a simple constructor option? x, y, radius?

public class CircleZone(in Vector2 center, float radius) : Circle(in center, radius), IZone
{
public CircleZone(float centerX, float centerY, float radius) : this(new Vector2 { X = centerX, Y = centerY }, radius) { }

/// <inheritdoc />
public bool Contains(in Entity entity) => Contains(entity.Position.ToVector2());

/// <inheritdoc />
public float DistanceFrom(in Entity entity) => DistanceFrom(entity.Position.ToVector2());
}
23 changes: 23 additions & 0 deletions src/PolyZone/Zones/Interfaces/IZone.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
using CitizenFX.Core;

namespace PolyZone.Zones.Interfaces;

/// <summary>
///
/// </summary>
public interface IZone
{
/// <summary>
/// Spatially tests a given <see cref="Entity"/>'s position to determine if it lies within the <see cref="IZone"/>
/// </summary>
/// <param name="entity">A entity, like a vehicle, object, prop, or character</param>
/// <returns>True if the <see cref="Entity"/>'s position lies within the <see cref="IZone"/></returns>
public bool Contains(in Entity entity);

/// <summary>
/// Calculates the float-accurate distance from a <see cref="Entity"/>'s position to the <see cref="IZone"/>
/// </summary>
/// <param name="entity">A entity, like a vehicle, object, prop, or character</param>
/// <returns>The float-accurate distance from a <see cref="Entity"/>'s position to the <see cref="IZone"/></returns>
public float DistanceFrom(in Entity entity);
}

0 comments on commit a4ba091

Please sign in to comment.