using Robust.Shared.Serialization; namespace Content.Shared.NPC; [Serializable, NetSerializable] public struct PathfindingBreadcrumb : IEquatable { /// /// The X and Y index in the point grid. /// The actual coordinates require using and /// public Vector2i Coordinates; public PathfindingData Data; public static readonly PathfindingBreadcrumb Invalid = new() { Data = new PathfindingData(PathfindingBreadcrumbFlag.None, -1, -1, 0f), }; public PathfindingBreadcrumb(Vector2i coordinates, int layer, int mask, float damage, PathfindingBreadcrumbFlag flags = PathfindingBreadcrumbFlag.None) { Coordinates = coordinates; Data = new PathfindingData(flags, layer, mask, damage); } /// /// Is this crumb equal for pathfinding region purposes. /// public bool Equivalent(PathfindingBreadcrumb other) { return Data.Equals(other.Data); } public bool Equals(PathfindingBreadcrumb other) { return Coordinates.Equals(other.Coordinates) && Data.Equals(other.Data); } public override bool Equals(object? obj) { return obj is PathfindingBreadcrumb other && Equals(other); } public override int GetHashCode() { return HashCode.Combine(Coordinates, Data); } } /// /// The data relevant for pathfinding. /// [Serializable, NetSerializable] public struct PathfindingData : IEquatable { public PathfindingBreadcrumbFlag Flags; public int CollisionLayer; public int CollisionMask; public float Damage; public bool IsFreeSpace => (Flags == PathfindingBreadcrumbFlag.None && Damage.Equals(0f)); public PathfindingData(PathfindingBreadcrumbFlag flag, int layer, int mask, float damage) { Flags = flag; CollisionLayer = layer; CollisionMask = mask; Damage = damage; } public bool IsEquivalent(PathfindingData other) { return CollisionLayer.Equals(other.CollisionLayer) && CollisionMask.Equals(other.CollisionMask) && Flags.Equals(other.Flags); } public bool Equals(PathfindingData other) { return CollisionLayer.Equals(other.CollisionLayer) && CollisionMask.Equals(other.CollisionMask) && Flags.Equals(other.Flags) && Damage.Equals(other.Damage); } public override bool Equals(object? obj) { return obj is PathfindingData other && Equals(other); } public override int GetHashCode() { return HashCode.Combine((int) Flags, CollisionLayer, CollisionMask); } } [Flags] public enum PathfindingBreadcrumbFlag : ushort { None = 0, /// /// Has this poly been replaced and is it no longer valid. /// Invalid = 1 << 0, Space = 1 << 1, /// /// Is there a door that is potentially pryable /// Door = 1 << 2, /// /// Is there access required /// Access = 1 << 3, }