Client-side static store for HUD notifications. Pushes messages with a kind and timestamp, caps the list at five, and drops entries older than six seconds.
namespace HorizonRP;
/// <summary>
/// File des notifications affichées par le HUD, côté client. Elle ne passe pas
/// par le réseau : l'hôte envoie un RPC au joueur concerné, qui empile ici.
/// </summary>
public static class HudNotifications
{
public sealed record Entry( int Id, string Message, string Kind, RealTimeSince Age );
/// <summary>Durée d'affichage, en secondes.</summary>
public const float Lifetime = 6f;
static readonly List<Entry> entries = new();
static int nextId;
public static void Push( string message, string kind = "info" )
{
// Le serveur ne connaît pas le répertoire du joueur : un numéro enregistré devient ici le nom du contact.
message = PhoneClient.WithNames( message );
entries.Add( new Entry( ++nextId, message, kind ?? "info", 0 ) );
Sounds.ForNotification( kind ?? "info" );
// Au-delà de cinq, les plus anciennes ne se liraient de toute façon plus.
while ( entries.Count > 5 )
entries.RemoveAt( 0 );
}
public static IReadOnlyList<Entry> Current
{
get
{
entries.RemoveAll( x => x.Age > Lifetime );
return entries;
}
}
/// <summary>Change quand la liste change : sert au BuildHash du HUD.</summary>
public static int Version => HashCode.Combine( nextId, Current.Count );
}