PalacePal/Pal.Client/Marker.cs

111 lines
3.4 KiB
C#
Raw Normal View History

using ECommons.SplatoonAPI;
2023-02-08 15:06:43 +00:00
using Pal.Client.Rendering;
using Pal.Common;
using Palace;
using System;
using System.Collections.Generic;
using System.Numerics;
using System.Text.Json.Serialization;
namespace Pal.Client
{
internal class Marker
{
2022-10-25 21:31:35 +00:00
public EType Type { get; set; } = EType.Unknown;
public Vector3 Position { get; set; }
/// <summary>
/// Whether we have encountered the trap/coffer at this location in-game.
/// </summary>
2023-02-10 19:48:14 +00:00
public bool Seen { get; set; }
/// <summary>
/// Network id for the server you're currently connected to.
/// </summary>
[JsonIgnore]
public Guid? NetworkId { get; set; }
/// <summary>
/// For markers that the server you're connected to doesn't know: Whether this was requested to be uploaded, to avoid duplicate requests.
/// </summary>
[JsonIgnore]
public bool UploadRequested { get; set; }
/// <summary>
/// Which account ids this marker was seen. This is a list merely to support different remote endpoints
/// (where each server would assign you a different id).
/// </summary>
2023-02-10 19:48:14 +00:00
public List<string> RemoteSeenOn { get; set; } = new();
/// <summary>
/// Whether this marker was requested to be seen, to avoid duplicate requests.
/// </summary>
[JsonIgnore]
2023-02-10 19:48:14 +00:00
public bool RemoteSeenRequested { get; set; }
/// <summary>
/// To keep track of which markers were imported through a downloaded file, we save the associated import-id.
///
/// Importing another file for the same remote server will remove the old import-id, and add the new import-id here.
/// </summary>
2023-02-10 19:48:14 +00:00
public List<Guid> Imports { get; set; } = new();
public bool WasImported { get; set; }
/// <summary>
/// To make rollbacks of local data easier, keep track of the version which was used to write the marker initially.
/// </summary>
2023-02-05 03:21:24 +00:00
public string? SinceVersion { get; set; }
[JsonIgnore]
2023-02-08 15:06:43 +00:00
public IRenderElement? RenderElement { get; set; }
public Marker(EType type, Vector3 position, Guid? networkId = null)
{
Type = type;
Position = position;
NetworkId = networkId;
}
public override int GetHashCode()
{
return HashCode.Combine(Type, PalaceMath.GetHashCode(Position));
}
2022-10-30 10:02:49 +00:00
public override bool Equals(object? obj)
{
return obj is Marker otherMarker && Type == otherMarker.Type && PalaceMath.IsNearlySamePosition(Position, otherMarker.Position);
2022-10-25 21:31:35 +00:00
}
2022-10-30 10:02:49 +00:00
public static bool operator ==(Marker? a, object? b)
2022-10-25 21:31:35 +00:00
{
return Equals(a, b);
}
2022-10-30 10:02:49 +00:00
public static bool operator !=(Marker? a, object? b)
2022-10-25 21:31:35 +00:00
{
return !Equals(a, b);
}
2023-02-08 19:41:45 +00:00
public bool IsPermanent() => Type == EType.Trap || Type == EType.Hoard;
2022-10-25 21:31:35 +00:00
public enum EType
{
Unknown = ObjectType.Unknown,
#region Permanent Markers
Trap = ObjectType.Trap,
Hoard = ObjectType.Hoard,
2023-02-08 19:41:45 +00:00
[Obsolete]
Debug = 3,
2022-10-25 21:31:35 +00:00
#endregion
# region Markers that only show up if they're currently visible
SilverCoffer = 100,
#endregion
}
}
}