Files
OldThink/Content.Server.Database/Model.cs

1011 lines
36 KiB
C#
Raw Normal View History

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
2021-11-11 17:54:02 +01:00
using System.Net;
using System.Text.Json;
2021-11-28 14:56:53 +01:00
using Content.Shared.Database;
using Microsoft.EntityFrameworkCore;
using NpgsqlTypes;
namespace Content.Server.Database
{
public abstract class ServerDbContext : DbContext
2020-01-24 17:25:01 +01:00
{
protected ServerDbContext(DbContextOptions options) : base(options)
{
}
public DbSet<Preference> Preference { get; set; } = null!;
public DbSet<Profile> Profile { get; set; } = null!;
public DbSet<AssignedUserId> AssignedUserId { get; set; } = null!;
2021-11-11 17:54:02 +01:00
public DbSet<Player> Player { get; set; } = default!;
public DbSet<Admin> Admin { get; set; } = null!;
public DbSet<AdminRank> AdminRank { get; set; } = null!;
public DbSet<Round> Round { get; set; } = null!;
public DbSet<Server> Server { get; set; } = null!;
public DbSet<AdminLog> AdminLog { get; set; } = null!;
public DbSet<AdminLogPlayer> AdminLogPlayer { get; set; } = null!;
2022-01-04 06:37:06 -07:00
public DbSet<Whitelist> Whitelist { get; set; } = null!;
public DbSet<ServerBan> Ban { get; set; } = default!;
public DbSet<ServerUnban> Unban { get; set; } = default!;
2023-04-03 02:24:55 +02:00
public DbSet<ServerBanExemption> BanExemption { get; set; } = default!;
public DbSet<ConnectionLog> ConnectionLog { get; set; } = default!;
public DbSet<ServerBanHit> ServerBanHit { get; set; } = default!;
2022-02-21 14:11:39 -08:00
public DbSet<ServerRoleBan> RoleBan { get; set; } = default!;
public DbSet<ServerRoleUnban> RoleUnban { get; set; } = default!;
public DbSet<PlayTime> PlayTime { get; set; } = default!;
public DbSet<UploadedResourceLog> UploadedResourceLog { get; set; } = default!;
public DbSet<AdminNote> AdminNotes { get; set; } = null!;
public DbSet<AdminWatchlist> AdminWatchlists { get; set; } = null!;
public DbSet<AdminMessage> AdminMessages { get; set; } = null!;
public DbSet<PlayerReputation> PlayerReputations { get; set; } = default!; // WD edit
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Preference>()
.HasIndex(p => p.UserId)
.IsUnique();
2020-06-26 03:46:08 +02:00
modelBuilder.Entity<Profile>()
.HasIndex(p => new {p.Slot, PrefsId = p.PreferenceId})
2020-06-26 03:46:08 +02:00
.IsUnique();
modelBuilder.Entity<Antag>()
.HasIndex(p => new {HumanoidProfileId = p.ProfileId, p.AntagName})
.IsUnique();
2022-09-10 17:40:06 +02:00
modelBuilder.Entity<Trait>()
.HasIndex(p => new {HumanoidProfileId = p.ProfileId, p.TraitName})
.IsUnique();
modelBuilder.Entity<Job>()
.HasIndex(j => j.ProfileId);
modelBuilder.Entity<Job>()
.HasIndex(j => j.ProfileId, "IX_job_one_high_priority")
.IsUnique()
.HasFilter("priority = 3");
modelBuilder.Entity<Job>()
.HasIndex(j => new { j.ProfileId, j.JobName })
.IsUnique();
modelBuilder.Entity<AssignedUserId>()
.HasIndex(p => p.UserName)
.IsUnique();
// Can't have two usernames with the same user ID.
modelBuilder.Entity<AssignedUserId>()
.HasIndex(p => p.UserId)
.IsUnique();
modelBuilder.Entity<Admin>()
.HasOne(p => p.AdminRank)
.WithMany(p => p!.Admins)
.OnDelete(DeleteBehavior.SetNull);
2020-11-10 16:50:28 +01:00
modelBuilder.Entity<AdminFlag>()
.HasIndex(f => new {f.Flag, f.AdminId})
.IsUnique();
modelBuilder.Entity<AdminRankFlag>()
.HasIndex(f => new {f.Flag, f.AdminRankId})
.IsUnique();
modelBuilder.Entity<AdminLog>()
.HasKey(log => new {log.RoundId, log.Id});
modelBuilder.Entity<AdminLog>()
.Property(log => log.Id);
2022-05-04 16:18:55 +02:00
modelBuilder.Entity<AdminLog>()
.HasIndex(log => log.Date);
modelBuilder.Entity<PlayTime>()
.HasIndex(v => new { v.PlayerId, Role = v.Tracker })
.IsUnique();
modelBuilder.Entity<AdminLogPlayer>()
.HasOne(player => player.Player)
.WithMany(player => player.AdminLogs)
.HasForeignKey(player => player.PlayerUserId)
.HasPrincipalKey(player => player.UserId);
modelBuilder.Entity<AdminLogPlayer>()
.HasIndex(p => p.PlayerUserId);
modelBuilder.Entity<Round>()
.HasIndex(round => round.StartDate);
modelBuilder.Entity<Round>()
.Property(round => round.StartDate)
.HasDefaultValue(default(DateTime));
modelBuilder.Entity<AdminLogPlayer>()
.HasKey(logPlayer => new {logPlayer.RoundId, logPlayer.LogId, logPlayer.PlayerUserId});
modelBuilder.Entity<ServerBan>()
.HasIndex(p => p.PlayerUserId);
modelBuilder.Entity<ServerBan>()
.HasIndex(p => p.Address);
modelBuilder.Entity<ServerBan>()
.HasIndex(p => p.PlayerUserId);
modelBuilder.Entity<ServerUnban>()
.HasIndex(p => p.BanId)
.IsUnique();
2023-04-03 02:24:55 +02:00
modelBuilder.Entity<ServerBan>().ToTable(t =>
t.HasCheckConstraint("HaveEitherAddressOrUserIdOrHWId", "address IS NOT NULL OR player_user_id IS NOT NULL OR hwid IS NOT NULL"));
2023-04-03 02:24:55 +02:00
// Ban exemption can't have flags 0 since that wouldn't exempt anything.
// The row should be removed if setting to 0.
modelBuilder.Entity<ServerBanExemption>().ToTable(t =>
t.HasCheckConstraint("FlagsNotZero", "flags != 0"));
2022-02-21 21:00:55 -08:00
modelBuilder.Entity<ServerRoleBan>()
.HasIndex(p => p.PlayerUserId);
2022-02-21 21:00:55 -08:00
modelBuilder.Entity<ServerRoleBan>()
.HasIndex(p => p.Address);
modelBuilder.Entity<ServerRoleBan>()
.HasIndex(p => p.PlayerUserId);
2022-02-21 21:00:55 -08:00
modelBuilder.Entity<ServerRoleUnban>()
.HasIndex(p => p.BanId)
.IsUnique();
2023-04-03 02:24:55 +02:00
modelBuilder.Entity<ServerRoleBan>().ToTable(t =>
t.HasCheckConstraint("HaveEitherAddressOrUserIdOrHWId", "address IS NOT NULL OR player_user_id IS NOT NULL OR hwid IS NOT NULL"));
2022-02-21 21:00:55 -08:00
modelBuilder.Entity<Player>()
.HasIndex(p => p.UserId)
.IsUnique();
modelBuilder.Entity<Player>()
.HasIndex(p => p.LastSeenUserName);
modelBuilder.Entity<ConnectionLog>()
.HasIndex(p => p.UserId);
modelBuilder.Entity<ConnectionLog>()
.Property(p => p.ServerId)
.HasDefaultValue(0);
modelBuilder.Entity<ConnectionLog>()
.HasOne(p => p.Server)
.WithMany(p => p.ConnectionLogs)
.OnDelete(DeleteBehavior.SetNull);
2023-07-26 20:05:51 +02:00
// SetNull is necessary for created by/edited by-s here,
// so you can safely delete admins (GDPR right to erasure) while keeping the notes intact
modelBuilder.Entity<AdminNote>()
.HasOne(note => note.Player)
.WithMany(player => player.AdminNotesReceived)
.HasForeignKey(note => note.PlayerUserId)
.HasPrincipalKey(player => player.UserId)
2023-07-26 20:05:51 +02:00
.OnDelete(DeleteBehavior.Cascade);
modelBuilder.Entity<AdminNote>()
.HasOne(version => version.CreatedBy)
.WithMany(author => author.AdminNotesCreated)
.HasForeignKey(note => note.CreatedById)
.HasPrincipalKey(author => author.UserId)
.OnDelete(DeleteBehavior.SetNull);
modelBuilder.Entity<AdminNote>()
.HasOne(version => version.LastEditedBy)
.WithMany(author => author.AdminNotesLastEdited)
.HasForeignKey(note => note.LastEditedById)
.HasPrincipalKey(author => author.UserId)
.OnDelete(DeleteBehavior.SetNull);
modelBuilder.Entity<AdminNote>()
.HasOne(version => version.DeletedBy)
.WithMany(author => author.AdminNotesDeleted)
.HasForeignKey(note => note.DeletedById)
.HasPrincipalKey(author => author.UserId)
.OnDelete(DeleteBehavior.SetNull);
modelBuilder.Entity<AdminWatchlist>()
.HasOne(note => note.Player)
.WithMany(player => player.AdminWatchlistsReceived)
.HasForeignKey(note => note.PlayerUserId)
.HasPrincipalKey(player => player.UserId)
2023-07-26 20:05:51 +02:00
.OnDelete(DeleteBehavior.Cascade);
modelBuilder.Entity<AdminWatchlist>()
.HasOne(version => version.CreatedBy)
.WithMany(author => author.AdminWatchlistsCreated)
.HasForeignKey(note => note.CreatedById)
.HasPrincipalKey(author => author.UserId)
.OnDelete(DeleteBehavior.SetNull);
modelBuilder.Entity<AdminWatchlist>()
.HasOne(version => version.LastEditedBy)
.WithMany(author => author.AdminWatchlistsLastEdited)
.HasForeignKey(note => note.LastEditedById)
.HasPrincipalKey(author => author.UserId)
.OnDelete(DeleteBehavior.SetNull);
modelBuilder.Entity<AdminWatchlist>()
.HasOne(version => version.DeletedBy)
.WithMany(author => author.AdminWatchlistsDeleted)
.HasForeignKey(note => note.DeletedById)
.HasPrincipalKey(author => author.UserId)
.OnDelete(DeleteBehavior.SetNull);
modelBuilder.Entity<AdminMessage>()
.HasOne(note => note.Player)
.WithMany(player => player.AdminMessagesReceived)
.HasForeignKey(note => note.PlayerUserId)
.HasPrincipalKey(player => player.UserId)
2023-07-26 20:05:51 +02:00
.OnDelete(DeleteBehavior.Cascade);
modelBuilder.Entity<AdminMessage>()
.HasOne(version => version.CreatedBy)
.WithMany(author => author.AdminMessagesCreated)
.HasForeignKey(note => note.CreatedById)
.HasPrincipalKey(author => author.UserId)
.OnDelete(DeleteBehavior.SetNull);
modelBuilder.Entity<AdminMessage>()
.HasOne(version => version.LastEditedBy)
.WithMany(author => author.AdminMessagesLastEdited)
.HasForeignKey(note => note.LastEditedById)
.HasPrincipalKey(author => author.UserId)
.OnDelete(DeleteBehavior.SetNull);
modelBuilder.Entity<AdminMessage>()
.HasOne(version => version.DeletedBy)
.WithMany(author => author.AdminMessagesDeleted)
.HasForeignKey(note => note.DeletedById)
.HasPrincipalKey(author => author.UserId)
.OnDelete(DeleteBehavior.SetNull);
// A message cannot be "dismissed" without also being "seen".
modelBuilder.Entity<AdminMessage>().ToTable(t =>
t.HasCheckConstraint("NotDismissedAndSeen",
"NOT dismissed OR seen"));
modelBuilder.Entity<ServerBan>()
.HasOne(ban => ban.CreatedBy)
.WithMany(author => author.AdminServerBansCreated)
.HasForeignKey(ban => ban.BanningAdmin)
.HasPrincipalKey(author => author.UserId)
.OnDelete(DeleteBehavior.SetNull);
modelBuilder.Entity<ServerBan>()
.HasOne(ban => ban.LastEditedBy)
.WithMany(author => author.AdminServerBansLastEdited)
.HasForeignKey(ban => ban.LastEditedById)
.HasPrincipalKey(author => author.UserId)
.OnDelete(DeleteBehavior.SetNull);
modelBuilder.Entity<ServerRoleBan>()
.HasOne(ban => ban.CreatedBy)
.WithMany(author => author.AdminServerRoleBansCreated)
.HasForeignKey(ban => ban.BanningAdmin)
.HasPrincipalKey(author => author.UserId)
.OnDelete(DeleteBehavior.SetNull);
modelBuilder.Entity<ServerRoleBan>()
.HasOne(ban => ban.LastEditedBy)
.WithMany(author => author.AdminServerRoleBansLastEdited)
.HasForeignKey(ban => ban.LastEditedById)
.HasPrincipalKey(author => author.UserId)
.OnDelete(DeleteBehavior.SetNull);
}
public virtual IQueryable<AdminLog> SearchLogs(IQueryable<AdminLog> query, string searchText)
{
return query.Where(log => EF.Functions.Like(log.Message, "%" + searchText + "%"));
}
public abstract int CountAdminLogs();
}
// WD start
public class PlayerReputation
{
public int Id { get; set; }
public Guid UserId { get; set; }
public float Reputation { get; set; }
}
// WD end
public class Preference
{
// NOTE: on postgres there SHOULD be an FK ensuring that the selected character slot always exists.
// I had to use a migration to implement it and as a result its creation is a finicky mess.
// Because if I let EFCore know about it it would explode on a circular reference.
// Also it has to be DEFERRABLE INITIALLY DEFERRED so that insertion of new preferences works.
// Also I couldn't figure out how to create it on SQLite.
public int Id { get; set; }
public Guid UserId { get; set; }
public int SelectedCharacterSlot { get; set; }
public string AdminOOCColor { get; set; } = null!;
public List<Profile> Profiles { get; } = new();
}
public class Profile
{
public int Id { get; set; }
public int Slot { get; set; }
[Column("char_name")] public string CharacterName { get; set; } = null!;
public string ClownName { get; set; } = null!;
public string MimeName { get; set; } = null!;
public string BorgName { get; set; } = null!;
2022-05-14 08:58:45 +10:00
public string FlavorText { get; set; } = null!;
public int Age { get; set; }
public string Sex { get; set; } = null!;
public string Gender { get; set; } = null!;
//WD-EDIT
public string BodyType { get; set; } = null!;
public string Voice { get; set; } = null!;
//WD-EDIT
public string Species { get; set; } = null!;
[Column(TypeName = "jsonb")] public JsonDocument? Markings { get; set; } = null!;
public string HairName { get; set; } = null!;
public string HairColor { get; set; } = null!;
public string FacialHairName { get; set; } = null!;
public string FacialHairColor { get; set; } = null!;
public string EyeColor { get; set; } = null!;
public string SkinColor { get; set; } = null!;
public string Clothing { get; set; } = null!;
public string Backpack { get; set; } = null!;
public int SpawnPriority { get; set; } = 0;
public List<Job> Jobs { get; } = new();
public List<Antag> Antags { get; } = new();
2022-09-10 17:40:06 +02:00
public List<Trait> Traits { get; } = new();
[Column("pref_unavailable")] public DbPreferenceUnavailableMode PreferenceUnavailable { get; set; }
public int PreferenceId { get; set; }
public Preference Preference { get; set; } = null!;
}
public class Job
{
public int Id { get; set; }
public Profile Profile { get; set; } = null!;
public int ProfileId { get; set; }
public string JobName { get; set; } = null!;
public DbJobPriority Priority { get; set; }
}
public enum DbJobPriority
{
// These enum values HAVE to match the ones in JobPriority in Content.Shared
Never = 0,
Low = 1,
Medium = 2,
High = 3
}
public class Antag
{
public int Id { get; set; }
public Profile Profile { get; set; } = null!;
public int ProfileId { get; set; }
public string AntagName { get; set; } = null!;
}
2022-09-10 17:40:06 +02:00
public class Trait
{
public int Id { get; set; }
public Profile Profile { get; set; } = null!;
public int ProfileId { get; set; }
public string TraitName { get; set; } = null!;
}
public enum DbPreferenceUnavailableMode
{
// These enum values HAVE to match the ones in PreferenceUnavailableMode in Shared.
StayInLobby = 0,
SpawnAsOverflow,
}
public class AssignedUserId
{
public int Id { get; set; }
public string UserName { get; set; } = null!;
public Guid UserId { get; set; }
}
2021-11-11 17:54:02 +01:00
[Table("player")]
public class Player
{
public int Id { get; set; }
// Permanent data
public Guid UserId { get; set; }
public DateTime FirstSeenTime { get; set; }
// Data that gets updated on each join.
public string LastSeenUserName { get; set; } = null!;
public DateTime LastSeenTime { get; set; }
public IPAddress LastSeenAddress { get; set; } = null!;
public byte[]? LastSeenHWId { get; set; }
// Data that changes with each round
public List<Round> Rounds { get; set; } = null!;
public List<AdminLogPlayer> AdminLogs { get; set; } = null!;
public DateTime? LastReadRules { get; set; }
public List<AdminNote> AdminNotesReceived { get; set; } = null!;
public List<AdminNote> AdminNotesCreated { get; set; } = null!;
public List<AdminNote> AdminNotesLastEdited { get; set; } = null!;
public List<AdminNote> AdminNotesDeleted { get; set; } = null!;
public List<AdminWatchlist> AdminWatchlistsReceived { get; set; } = null!;
public List<AdminWatchlist> AdminWatchlistsCreated { get; set; } = null!;
public List<AdminWatchlist> AdminWatchlistsLastEdited { get; set; } = null!;
public List<AdminWatchlist> AdminWatchlistsDeleted { get; set; } = null!;
public List<AdminMessage> AdminMessagesReceived { get; set; } = null!;
public List<AdminMessage> AdminMessagesCreated { get; set; } = null!;
public List<AdminMessage> AdminMessagesLastEdited { get; set; } = null!;
public List<AdminMessage> AdminMessagesDeleted { get; set; } = null!;
public List<ServerBan> AdminServerBansCreated { get; set; } = null!;
public List<ServerBan> AdminServerBansLastEdited { get; set; } = null!;
public List<ServerRoleBan> AdminServerRoleBansCreated { get; set; } = null!;
public List<ServerRoleBan> AdminServerRoleBansLastEdited { get; set; } = null!;
2021-11-11 17:54:02 +01:00
}
2022-01-04 06:37:06 -07:00
[Table("whitelist")]
public class Whitelist
{
[Required, Key] public Guid UserId { get; set; }
}
public class Admin
{
[Key] public Guid UserId { get; set; }
public string? Title { get; set; }
public int? AdminRankId { get; set; }
public AdminRank? AdminRank { get; set; }
public List<AdminFlag> Flags { get; set; } = default!;
public string? AdminServer { get; set; }
}
public class AdminFlag
{
public int Id { get; set; }
public string Flag { get; set; } = default!;
public bool Negative { get; set; }
public Guid AdminId { get; set; }
public Admin Admin { get; set; } = default!;
}
public class AdminRank
{
public int Id { get; set; }
public string Name { get; set; } = default!;
public List<Admin> Admins { get; set; } = default!;
public List<AdminRankFlag> Flags { get; set; } = default!;
}
public class AdminRankFlag
{
public int Id { get; set; }
public string Flag { get; set; } = default!;
public int AdminRankId { get; set; }
public AdminRank Rank { get; set; } = default!;
}
public class Round
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public DateTime StartDate { get; set; }
public List<Player> Players { get; set; } = default!;
public List<AdminLog> AdminLogs { get; set; } = default!;
[ForeignKey("Server")] public int ServerId { get; set; }
public Server Server { get; set; } = default!;
}
public class Server
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string Name { get; set; } = default!;
[InverseProperty(nameof(Round.Server))]
public List<Round> Rounds { get; set; } = default!;
[InverseProperty(nameof(ConnectionLog.Server))]
public List<ConnectionLog> ConnectionLogs { get; set; } = default!;
}
[Index(nameof(Type))]
public class AdminLog
{
[Key, ForeignKey("Round")] public int RoundId { get; set; }
[Key]
public int Id { get; set; }
public Round Round { get; set; } = default!;
[Required] public LogType Type { get; set; }
[Required] public LogImpact Impact { get; set; }
[Required] public DateTime Date { get; set; }
[Required] public string Message { get; set; } = default!;
[Required, Column(TypeName = "jsonb")] public JsonDocument Json { get; set; } = default!;
public List<AdminLogPlayer> Players { get; set; } = default!;
}
public class AdminLogPlayer
{
[Required, Key] public int RoundId { get; set; }
[Required, Key] public int LogId { get; set; }
[Required, Key, ForeignKey("Player")] public Guid PlayerUserId { get; set; }
public Player Player { get; set; } = default!;
[ForeignKey("RoundId,LogId")] public AdminLog Log { get; set; } = default!;
}
// Used by SS14.Admin
public interface IBanCommon<TUnban> where TUnban : IUnbanCommon
{
int Id { get; set; }
Guid? PlayerUserId { get; set; }
NpgsqlInet? Address { get; set; }
byte[]? HWId { get; set; }
DateTime BanTime { get; set; }
DateTime? ExpirationTime { get; set; }
string Reason { get; set; }
NoteSeverity Severity { get; set; }
Guid? BanningAdmin { get; set; }
TUnban? Unban { get; set; }
}
// Used by SS14.Admin
public interface IUnbanCommon
{
int Id { get; set; }
int BanId { get; set; }
Guid? UnbanningAdmin { get; set; }
DateTime UnbanTime { get; set; }
}
2023-04-03 02:24:55 +02:00
/// <summary>
/// Flags for use with <see cref="ServerBanExemption"/>.
/// </summary>
[Flags]
public enum ServerBanExemptFlags
{
// @formatter:off
None = 0,
/// <summary>
/// Ban is a datacenter range, connections usually imply usage of a VPN service.
/// </summary>
Datacenter = 1 << 0,
2023-04-27 13:59:18 -05:00
/// <summary>
/// Ban only matches the IP.
/// </summary>
/// <remarks>
/// Intended use is for users with shared connections. This should not be used as an alternative to <see cref="Datacenter"/>.
/// </remarks>
IP = 1 << 1,
2023-04-03 02:24:55 +02:00
// @formatter:on
}
/// <summary>
/// A ban from playing on the server.
/// If an incoming connection matches any of UserID, IP, or HWID, they will be blocked from joining the server.
/// </summary>
/// <remarks>
/// At least one of UserID, IP, or HWID must be given (otherwise the ban would match nothing).
/// </remarks>
[Table("server_ban"), Index(nameof(PlayerUserId))]
public class ServerBan : IBanCommon<ServerUnban>
{
public int Id { get; set; }
2023-04-03 02:24:55 +02:00
[ForeignKey("Round")]
public int? RoundId { get; set; }
public Round? Round { get; set; }
2023-04-03 02:24:55 +02:00
/// <summary>
/// The user ID of the banned player.
/// </summary>
public Guid? PlayerUserId { get; set; }
[Required] public TimeSpan PlaytimeAtNote { get; set; }
2023-04-03 02:24:55 +02:00
/// <summary>
/// CIDR IP address range of the ban. The whole range can match the ban.
/// </summary>
public NpgsqlInet? Address { get; set; }
2023-04-03 02:24:55 +02:00
/// <summary>
/// Hardware ID of the banned player.
/// </summary>
public byte[]? HWId { get; set; }
2023-04-03 02:24:55 +02:00
/// <summary>
/// The time when the ban was applied by an administrator.
/// </summary>
public DateTime BanTime { get; set; }
2023-04-03 02:24:55 +02:00
/// <summary>
/// The time the ban will expire. If null, the ban is permanent and will not expire naturally.
/// </summary>
public DateTime? ExpirationTime { get; set; }
2023-04-03 02:24:55 +02:00
/// <summary>
/// The administrator-stated reason for applying the ban.
/// </summary>
public string Reason { get; set; } = null!;
2023-04-03 02:24:55 +02:00
/// <summary>
/// The severity of the incident
/// </summary>
public NoteSeverity Severity { get; set; }
2023-04-03 02:24:55 +02:00
/// <summary>
/// User ID of the admin that applied the ban.
/// </summary>
[ForeignKey("CreatedBy")]
public Guid? BanningAdmin { get; set; }
public Player? CreatedBy { get; set; }
/// <summary>
/// User ID of the admin that last edited the note
/// </summary>
[ForeignKey("LastEditedBy")]
public Guid? LastEditedById { get; set; }
public Player? LastEditedBy { get; set; }
/// <summary>
/// When the ban was last edited
/// </summary>
public DateTime? LastEditedAt { get; set; }
2023-04-03 02:24:55 +02:00
/// <summary>
/// Optional flags that allow adding exemptions to the ban via <see cref="ServerBanExemption"/>.
/// </summary>
public ServerBanExemptFlags ExemptFlags { get; set; }
/// <summary>
/// If present, an administrator has manually repealed this ban.
/// </summary>
public ServerUnban? Unban { get; set; }
2023-04-03 02:24:55 +02:00
/// <summary>
/// Whether this ban should be automatically deleted from the database when it expires.
/// </summary>
/// <remarks>
/// This isn't done automatically by the game,
/// you will need to set up something like a cron job to clear this from your database,
/// using a command like this:
/// psql -d ss14 -c "DELETE FROM server_ban WHERE auto_delete AND expiration_time &lt; NOW()"
/// </remarks>
public bool AutoDelete { get; set; }
/// <summary>
/// Whether to display this ban in the admin remarks (notes) panel
/// </summary>
public bool Hidden { get; set; }
public List<ServerBanHit> BanHits { get; set; } = null!;
public string? ServerName { get; set; }
}
2023-04-03 02:24:55 +02:00
/// <summary>
/// An explicit repeal of a <see cref="ServerBan"/> by an administrator.
/// Having an entry for a ban neutralizes it.
/// </summary>
[Table("server_unban")]
public class ServerUnban : IUnbanCommon
{
[Column("unban_id")] public int Id { get; set; }
2023-04-03 02:24:55 +02:00
/// <summary>
/// The ID of ban that is being repealed.
/// </summary>
public int BanId { get; set; }
2023-04-03 02:24:55 +02:00
/// <summary>
/// The ban that is being repealed.
/// </summary>
public ServerBan Ban { get; set; } = null!;
2023-04-03 02:24:55 +02:00
/// <summary>
/// The admin that repealed the ban.
/// </summary>
public Guid? UnbanningAdmin { get; set; }
2023-04-03 02:24:55 +02:00
/// <summary>
/// The time the ban repealed.
/// </summary>
public DateTime UnbanTime { get; set; }
}
2023-04-03 02:24:55 +02:00
/// <summary>
/// An exemption for a specific user to a certain type of <see cref="ServerBan"/>.
/// </summary>
/// <example>
/// Certain players may need to be exempted from VPN bans due to issues with their ISP.
/// We would tag all VPN bans with <see cref="ServerBanExemptFlags.Datacenter"/>,
/// and then add an exemption for these players to this table with the same flag.
/// They will only be exempted from VPN bans, other bans (if they manage to get any) will still apply.
/// </example>
[Table("server_ban_exemption")]
public sealed class ServerBanExemption
{
/// <summary>
/// The UserID of the exempted player.
/// </summary>
[Key]
public Guid UserId { get; set; }
/// <summary>
/// The ban flags to exempt this player from.
/// If any bit overlaps <see cref="ServerBan.ExemptFlags"/>, the ban is ignored.
/// </summary>
public ServerBanExemptFlags Flags { get; set; }
}
[Table("connection_log")]
public class ConnectionLog
{
public int Id { get; set; }
public Guid UserId { get; set; }
public string UserName { get; set; } = null!;
public DateTime Time { get; set; }
public IPAddress Address { get; set; } = null!;
public byte[]? HWId { get; set; }
public ConnectionDenyReason? Denied { get; set; }
/// <summary>
/// ID of the <see cref="Server"/> that the connection was attempted to.
/// </summary>
/// <remarks>
/// <para>
/// The default value of this column is set to <c>0</c>, which is the ID of the "<c>unknown</c>" server.
/// This is intended for old entries (that didn't track this) and if the server name isn't configured.
/// </para>
/// </remarks>
public int ServerId { get; set; }
public List<ServerBanHit> BanHits { get; set; } = null!;
public Server Server { get; set; } = null!;
}
public enum ConnectionDenyReason : byte
{
Ban = 0,
Whitelist = 1,
Full = 2,
Panic = 3,
}
public class ServerBanHit
{
public int Id { get; set; }
public int BanId { get; set; }
public int ConnectionId { get; set; }
public ServerBan Ban { get; set; } = null!;
public ConnectionLog Connection { get; set; } = null!;
}
2022-02-21 14:11:39 -08:00
[Table("server_role_ban"), Index(nameof(PlayerUserId))]
public sealed class ServerRoleBan : IBanCommon<ServerRoleUnban>
2022-02-21 14:11:39 -08:00
{
public int Id { get; set; }
public int? RoundId { get; set; }
public Round? Round { get; set; }
public Guid? PlayerUserId { get; set; }
[Required] public TimeSpan PlaytimeAtNote { get; set; }
public NpgsqlInet? Address { get; set; }
2022-02-21 14:11:39 -08:00
public byte[]? HWId { get; set; }
public DateTime BanTime { get; set; }
public DateTime? ExpirationTime { get; set; }
public string Reason { get; set; } = null!;
public NoteSeverity Severity { get; set; }
[ForeignKey("CreatedBy")] public Guid? BanningAdmin { get; set; }
public Player? CreatedBy { get; set; }
[ForeignKey("LastEditedBy")] public Guid? LastEditedById { get; set; }
public Player? LastEditedBy { get; set; }
public DateTime? LastEditedAt { get; set; }
2022-02-21 14:11:39 -08:00
public ServerRoleUnban? Unban { get; set; }
public bool Hidden { get; set; }
2022-02-21 14:11:39 -08:00
public string RoleId { get; set; } = null!;
public string? ServerName { get; set; }
2022-02-21 14:11:39 -08:00
}
[Table("server_role_unban")]
public sealed class ServerRoleUnban : IUnbanCommon
2022-02-21 14:11:39 -08:00
{
[Column("role_unban_id")] public int Id { get; set; }
public int BanId { get; set; }
public ServerRoleBan Ban { get; set; } = null!;
2022-02-21 14:11:39 -08:00
public Guid? UnbanningAdmin { get; set; }
public DateTime UnbanTime { get; set; }
}
[Table("play_time")]
public sealed class PlayTime
{
[Required, Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[Required, ForeignKey("player")]
public Guid PlayerId { get; set; }
public string Tracker { get; set; } = null!;
public TimeSpan TimeSpent { get; set; }
}
[Table("uploaded_resource_log")]
public sealed class UploadedResourceLog
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public DateTime Date { get; set; }
public Guid UserId { get; set; }
public string Path { get; set; } = string.Empty;
public byte[] Data { get; set; } = default!;
}
[Index(nameof(PlayerUserId))]
[Upstream] Upstream (#109) * Automatic changelog update * atlas update (#25071) * atlas update * untroll --------- Co-authored-by: deltanedas <@deltanedas:kde.org> * box update (#25074) * fland update (#25075) * marathon update (#25076) * meta update (#25077) * Syndicate key grammar fix (#25085) * Syndicate encryption key grammar fix An encryption key used by... wait... Who is owner of this chip? > An encryption key used by... wait... Who is the owner of this chip? * Syndicate key grammar fix An encryption key used by... wait... Who is owner of this chip? > An encryption key used by... wait... Who is the owner of this chip? * Fix hybridization seedless probability (#25084) Fix comparison Hybrids (different plants being crossed) are supposed to have a high chance of becoming seedless to balance overpowered plants. However, a logic error in the comparison gave seedless to plants when they were from the same seed (not hybrids) rather than the other way around. Reported by: @genderGeometries * Added Tourniquets to stop bleeds (#23198) * Fixed Error with RobustToolbox Edits. Removed the addition of secbelt tag from assault belt. * Resprite of the monstrosity * Resprite of the tourniquet NO LONGER PHALLUS SHAPED * too bright, now darker and edgier * Tourniquet resprite * metajson yay * Update Skelly Vs The Rev lobby art (#25088) Someone said the original was a bit low res and I agreed. This is a 1440p (from an 8k base image) rendition of the same scene, with a new dramatic forced perspective look, and generally cleaner art throughout. Also now there's two mothroaches. * Automatic changelog update * Minor airlock assembly clean up (#25073) 1 * Update README.md (#25067) * Update README.md * emo review Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> --------- Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> * prevent opening debug menus without perms (#25091) prevent people without permissions from opening the tile, entityspawn, or decal menus * Remove battery from crew observation kit, fix description (#25000) -Remove battery from crew observation kit, fix description * Laughin' Peas (#25089) * laughter * make clownmobs bleed laughter * laughin syrup and laughter recipe * add laughin peas * Automatic changelog update * QM drip DLC (#24477) * New Drip for the QM QM beret and QM formal uniform * Asd Asd * Adds the new clothing to the uniform printer what it says on the tin * I always forget to update the copyright RAAAAAH yup * EMT Belt Part 2 (#24289) * add * fix * aaaa * Flipped caps real (#24961) * Flipped caps real * oops * whoops * flip not fold * fix formatting * cargosoft formatting * Automatic changelog update * Nerf Beanbags (#24653) Lowers beanbag damage from 55 stam to 30 stam * Automatic changelog update * Fix screenspace popups (#24987) * Fix screenspace popups Never got around to it earlier but need to draw it above UI controls. * Minor null change * Automatic changelog update * Fix crew manifest department bugs (#24975) * Automatic changelog update * Changed door remote to trigger based on vision occlusion(#25093) Changed door remote to trigger based on vision occlusion rather than opaque collision targeting check. Ian's butt will no longer absorb your 5G signals. Co-authored-by: Plykiya <plykiya@protonmail.com> * GPS In Paramed Locker (#25096) GPS in paramed locker * Remove 'travis scott day' from the game (#25106) * remove travis scott from the game * KILL TRAVIS EVEN MORE * Automatic changelog update * Remove erroneous changelog (#25107) * fixed fland cargo shuttle not having tiny fans (sorry) (#25095) * Glass box for antique laser pistol (#25104) * glassbox * fix * Gibbing refactor (Per-part gibbing and giblet throwing!) (#24989) * Moving Gibbing rework out from medrefactor into it's own PR * Re-enabled warning for missing gibbable on TryGibEntity * Implemented better logic for gibbing failover and better logging * Allowing audio params and drop scattering customization per component. Created UnGibbable organ base types and made brains ungibbable. Removed delete brain from gibBody function. Artifact crusher does not destroy brains anymore. It only destroyed brains before not other organs which was wierd. * Update Content.Shared/Body/Systems/SharedBodySystem.Body.cs Fixing space for multiplication Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> * Added event raised when attempting to gib contained entities to allow modification of allowed and excluded container ids * removing audioParams var from component (sound specifier includes it) * Fixing signature --------- Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> * Automatic changelog update * Gibbing contents hotfix (#25114) Fixing gibbing contents not respecting Include/Exclude container lists. This is currently unused * Predict two-way levers (#25043) * Predict two-way levers Annoys me the rare occasions I touch cargo. Doesn't predict the signal but at least the lever responds immediately. * space * a * Replace Romerol with Ambuzol in chemist guidebook (#25108) replace romerol with ambuzol * Fix borgs being able to emag themselves (#24748) * Fix self emagging borgs * Add popup on self emag failure. * Ectoplasm is grindable into Necrosol (#25053) add * Automatic changelog update * Automatic changelog update * Roundstart Food Service research (#25046) add * Automatic changelog update * Add option for character name colors in chat & move coloration to clientside (#24625) * Adds option to disable character names in chat/speechbubbles * Moved the coloring of names to clientside * Move string functions to SharedChatSystem to avoid duplicate code in SpeechBubble.cs * Changed to be put under Accessibility section * Cache CVar * Automatic changelog update * Update Credits (#25115) Co-authored-by: PJBot <pieterjan.briers+bot@gmail.com> * Replace fixed drink glasses with metamorphic versions (#25134) * Replaced fixed drink glasses with metamorphic versions * Fine, no milkshake then * ambuzol beef (#25119) * Automatic changelog update * Shuttle floor resprite (#25127) * resprites shuttle tiles * resprites shuttle floor tiles & adds grey/black shuttle tiles * attributions.yml update * Adding a period to an object description (#25138) Added a period to an object description. Adds a period to silk's description. This is my first and last pull request. * Door Remote Changelog Entry (#25144) I'm so dumb. Co-authored-by: Plykiya <plykiya@protonmail.com> * Automatic changelog update * Lowered Ion Storm Reoccurence Delay to 20 (#25135) * Lowered reoccurencedelay to 45 * Lowered Further down to 20 * Re-added shivs to crafting menus (#25094) Added a recipe for crafting menu * Automatic changelog update * Color Tipped Ammo (#25103) * Tipped .35 ammo * used layers instead of new sprites * remove the useless old sprites * changed the green slightly * Automatic changelog update * Add overlay decals for mini tiles and bricks (#24949) Add minitile and brick decals overlay * Update Core (#24862) * add * Update Resources/Textures/Parallaxes/attributions.yml * sprite change * address review --------- Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> * Buyable Jani Trolley (#25139) Trolley * Added display for amount of hits left in stun batons/stun prods. (#25141) Added display for amount of hits left in stun batons/stunprods. Co-authored-by: Plykiya <plykiya@protonmail.com> * Automatic changelog update * autolatheable air tanks (#25130) * gastankening * fix price * Automatic changelog update * Fix pointing arrow trajectory (#25061) Initial commit * make linking logic gates 1000% better (#25041) * make door status use SendSignal * LastSignals and logic, add ClearSignal api too * make everything outputting a logic signal default to false * refactor ops * :trollface: * :trollface: * protoid for LastSignals * oop --------- Co-authored-by: deltanedas <@deltanedas:kde.org> * Buff emergency toolbox fill (#24225) Resolves issue #23059, for which the submitter wrote: Emergency toolboxes contain a crowbar, two flashlights (sometimes one), two breath masks, and two chocolate. With the addition of water bottles to survival boxes and emergency nitrogen tanks, I think emergency toolboxes should be updated to include said water bottles and emergency tanks. Would make these just a little bit more useful. It feels weird they don't have oxygen tanks when they have two breath masks, and since water bottles are now commonplace it would be a good idea to put them in a place where emergency food is stored as well. * Void jetpack resprite (#25150) add * Automatic changelog update * Allow configuring gen_build_info.py through environment variables (#25162) This makes the life of forks slightly easier by letting you pass an environment variable instead of having to maintain this file yourself. * Significantly nerf Deathnettles (#25068) * Balancing my beloved Significantly nerfs deathnettles so botanists can't just take down jug's like it's no issue, we have guns, we should be using them * Additional Balancing Changes. * Losing my mind * Automatic changelog update * Fix spelling errors in mechs.yml (#25168) * fix showhealthbars perms (#25157) * Allow inspecting ID's and Health of people behind glass (#25163) Hops will love me * Automatic changelog update * Fix decal error spam (#25172) * Restore MonoOverlay (#25170) https://github.com/space-wizards/space-station-14/pull/24949 nuked it. * Automatic changelog update * Added "wink" and "tearfully smiles" emotes + more cry emote variations (#25129) Added wink and tearfully smiles emote + more cries variations * Automatic changelog update * Update submodule to 210.0.0 (#25175) * Update submodule to 210.0.0 * 210.0.1 instead, the previous one was broken * 210.0.3 instead, the previous one was ALSO broken --------- Co-authored-by: Pieter-Jan Briers <pieterjan.briers+git@gmail.com> * The medical beret is real (#25176) * 1 * 2 * button is real. * Automatic changelog update * Fixed Tipped ammo not being Spent (#25167) Fix Tipped Ammo not being Spent * Automatic changelog update * Hoods and some chaplain's hats now hides hair (#25142) * Hoods now hide hair * additional plague hat and witch hat now hide hair * fixing some tags in hats * hoods tag fix * Glassbox shatter resprite (#25136) * Automatic changelog update * Random spontaneous cleanup PR (#25131) * Use new Subs.CVar helper Removes manual config OnValueChanged calls, removes need to remember to manually unsubscribe. This both reduces boilerplate and fixes many issues where subscriptions weren't removed on entity system shutdown. * Fix a bunch of warnings * More warning fixes * Use new DateTime serializer to get rid of ISerializationHooks in changelog code. * Get rid of some more ISerializationHooks for enums * And a little more * Apply suggestions from code review Co-authored-by: 0x6273 <0x40@keemail.me> --------- Co-authored-by: 0x6273 <0x40@keemail.me> * Decrease the chemical cost of regen mesh and sutures and move them to their own file (#24948) * WHYWEREMEDSINMEALRECIPES * 20chem * didiforgettosavethis * Split slime marking leg gradient (#24928) * Split slime marking leg gradient * up markings to 4 * Automatic changelog update * Require plants to be harvestable before sampling (#24851) * Add verbs to Open/Close Openable containers, and add optional seals (#24780) * Implement closing; add open/close verbs * Add breakable seals * Allow custom verb names; make condiment bottles closeable * Remove pointless VV annotations and false defaults * Split Sealable off into a new component * Should have a Closed event too * Oh hey, there are icons I could use * Ternary operator * Add support for seal visualizers * Moved Sealable to Shared, added networking * Replaced bottle_close1.ogg * Automatic changelog update * Shadow anomaly returns (#24629) * content * add cat * ambient * I FORGOT HEARTS! * fix ambient * some fixes * canCollide: false * connect to damageable * pi * remove fx * some fixes * *sad bruh* * hazed * Update base_shadow.yml * Automatic changelog update * Microwave UX enhancements (#24547) * Facelift Microwave UI Includes new background light in UI, Uses predictive input, UI now properly disables buttons when microwave is active * Microwave now shows Elapsed time * Fixed bad formatting * Added new term for "BottomMargin" * Change yellow color * Update StyleNano.cs just spacing fixed * Cook time countdown now detached from server Instead of the server constantly sending out messages for the cook countdown, it is now predicted client side using TimeSpan * Update MicrowaveMenu.xaml forgot to re-add item space * Automatic changelog update * Additional damage visualisers (#24618) * brute * add * Anomaly Synchronizer + Signallers tweaks (#24461) * content * nerf * fix rsi * Automatic changelog update * saltern update (#25182) Co-authored-by: deltanedas <@deltanedas:kde.org> * Allow players to run saveconfig command. (#25200) Benign client-side command. * Revert "Allow configuring gen_build_info.py through environment variables" (#25201) Revert "Allow configuring gen_build_info.py through environment variables (#2…" This reverts commit 163e6d2f896ccf9a37be2e17bbbad8b6514ccf4b. * Fax machines can print from text file (#23262) * added * checks tweaking * fixed what sloth wanted * fixed? * dialog diposing fix * checks tweaking * more changes * dispose streamreader * Update Content.Client/Fax/UI/FaxBoundUi.cs Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> * Update Content.Server/Fax/FaxSystem.cs Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> * fix minor typo --------- Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> * Automatic changelog update * Vox names, species prototype cleanup, some cosmetic changes (#24994) * voxnames * New generator parameters, names are more readable * bunch of missing vox stuff * more names * sad * Balanced ChemVend Stock (#25207) * Balanced ChemVend Stock ChemVend needs more balanced stock for what actually gets used * +1 Sugar * Ranged Holosigns (#25120) * Changed holo signs to be ranged and used on click rather than Z. * Updated comments * Failed attempt at ignoring walls * Getting rid of unused libraries --------- Co-authored-by: Plykiya <plykiya@protonmail.com> * Automatic changelog update * Minor test fixes (#25174) Stuff that probably shoulda been wrapped ig but our test runner stinky. * Add pun to diagnostic hud description (#25209) Seaborgium is element number 106 and is presumably what lets these glasses "see" "borgs". * Add events for TemperatureProtection and PressureProtection (#25165) * Update criminal-records.ftl (#25229) * Adds always powered variants of colored lights (#25185) Co-authored-by: Jeff <velcroboy333@hotmail.com> * Fixes silver bars being whole stacks (#25239) Co-authored-by: Jeff <velcroboy333@hotmail.com> * Makes clumsy not delete guns (#25243) clumsy no longer deletes guns Co-authored-by: Jessica M <jessica@maybe.sh> * Predict Injector (syringes), cleanup (#25235) At least the mode/transfer amount logic. Actual transfer logic needs Bloodstream which I didn't wanna move into shared. * Updated disabler to have suitStorage tag under slots. (#25238) * Automatic changelog update * Updates to Origin (#24908) Replaced medical's HM console with a CM console, added janitor equipment closet * Fix spawn priority persistence on reconnect and restart (#25246) Because of course I would forget one line * Add French accent beret (#21430) * Allow thermomachines to exchange with air instead of inlet (#25247) Add purely atmospheric heat exchange to the gas thermomachine component (in preparation for space heaters). * Fix: Holosigns can be stored again (#25249) * Holosigns can be stored again * TryComp to HasComp --------- Co-authored-by: Plykiya <plykiya@protonmail.com> * Death acidifier fix (#25251) * Automatic changelog update * Clarify stripping logs (#25190) * Indicate whether pickpocketing is stealthy in logs, change :user to :actor, and clean up messages. * Remove ugly whitespace * Do the thing I should have done but didn't because I didn't want to think * Fix spacing * Fix disposals bins not automatically flushing after an object is inserted (#25233) Fix disposals bins not automatically flushing after an object is inserted. Because of Spaghetti Code:tm:, AfterInsert() in DisposalUnitSystem still handles insertion itself. Except in all cases except drag/drop insert, the object is already inserted so this check fails and the remaining logic doesn't happen anymore. Fixed now. * Sec & greysec jumpskirt fix (#25269) * "resprites" sec & greysec jumpskirts * adjustments * Automatic changelog update * Reduce eshield hp (#25258) reduce eshield hp * Automatic changelog update * Artifact hemoglobin trigger now accepts all sentient blood types (#25240) * Artifact blood trigger now accepts all sentient blood types * Update artifact-hints.ftl * Update engine to v210.1.0 (#25288) * Made ghost.role_time a server modifiable only cvar (#25292) Fix * Nuke fancification (#25297) Actually use more icon states for deployed/armed/about to explode Also unlit layer. Also examine text * Automatic changelog update * Change copper blood from ferrous to metallic (#25217) changed copper blood from ferrous to metallic * Thindow glass dupe fix (#25304) smite glass dupe off the face of the planet eww nasty dupe exploits blehh * Automatic changelog update * Kill Seperated Mindshield Icons (#25303) * Unghettoify mindshield icons Adds support for layers in status icons, through the StatusIconLayer enum and the new "layer" datafield. Defaults to the Base layer where functionally remains unchanged. * TG icon for shield probably better than the shitty one I made in paint * forgor meta.json I forgor * Emo review Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> --------- Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> * Automatic changelog update * MORE SUFFIXES (#25314) Co-authored-by: Jeff <velcroboy333@hotmail.com> * Fix spawning glass shard for each glass sheet in stack (#25308) * fix: SpawnEntitiesBehavior now works with stacks Fixed the issue of SpawnEntitiesBehavior not executing multiple times on entities with stack conponent. Fixes #25287 * fix: reduced dictionary iterations * Automatic changelog update * Adds atmospherics access to the fire fighting door remote. Feels like… (#25097) Adds atmospherics access to the fire fighting door remote. Feels like an oversight for the atmos door remote to not have atmos access. Co-authored-by: Plykiya <plykiya@protonmail.com> * Automatic changelog update * Re-organise main menu screen (#25173) - The dummy control of 2px size has annoyed me for almost 5 years. - Why is it in the top-right. - Why is the server address not labelled. * Allow t-ray to penetrate carpets and puddles (#25276) * Allow t-ray to penetrate carpets and puddles * handle edge cases * Automatic changelog update * Add sfx for writing on paper (#25257) * Initial commit * Moved params to sound * Removed type tag * Removed null check * Forced default * Automatic changelog update * New sprites for guidebooks (#25232) * added books to roles * First pass * removed yaml to split pull requests into resprite first, then giving the books to assistants * new science * Automatic changelog update * LockVisualizer (#25224) * LockVisualizer * Fix state * Clean some code * Make it component, fix tests fail * Fix for StateUnlocked Now it is possible to manually set the unlocked state and it will work! * Optimize LockVisualizer, add check for unlocked state * No todo I guess * Solution precision fixes (#25199) * Add test for two chemistry issues 1. rounding issue with reaction processing when making chloral hydrate 2. reliable assert trip due to the ValidateSolution() heat capacity issue. * Fix FixedPoint2 arithmetic Fix internal floating point arithmetic in places where it could be avoided. Fix incorrect rounding mode used in other places (it should always floor, like regular int arithmetic). I had to add an explicit epsilon value for float -> FixedPoint2 because something like 1.05 is actually like 1.04999 and that'd cause it to be rounded down to 1.04. This fixes reaction reagent processing in cases where the reagent inputs can't cleanly divide. Previously, when making 30u chloral hydrate by adding the chlorine in 10u increments you'd end up with 0.04 chlorine left over. This was caused by division in the reaction code rounding up in some cases. Changing division here to always round down fixes it. * Attempt to fix heat capacity precision assert issues. Fixes #22126 First, we just increase the tolerance of the assert. It was way too low. Second, actually put a cap on float drift from one-off _heatCapacity changes. * Fix float -> FixedPoint2 epsilon for negative number, fix tests. * Fix DamageableTest * Oh yeah I need to call CleanReturnAsync * Automatic changelog update * WebP lobby images (#25184) * Allow webp in lobby background files * Make lobby art webp images Reduces folder from 10 MB to 2.5 MB without only slight quality loss. * Update PutLobbyScreensHere.txt * New lobby art : Blueprint (#25179) * add * replace image with webp version waiting on #25184 * Automatic changelog update * Diona Nymphs & Splitting (#24630) * Porting & implementation * Fix two stupid errors * Human not humans * fix audio path * Fix test fails & update cooldown * Work on reviews & test fail * Rework nymph organ system. * Make the nymph organs nospawn. * IsDeadIC * Automatic changelog update * reform cooldown 10 minutes (#25328) * Change plant clipping mechanics (#25326) Make seeds from clipped plants inherit the decreased health from parents. Also require one growth stage before clipping. * Automatic changelog update * Fix nymphs being deleted immediatly after spawning (#25344) * nymphs now don't get deleted together with the body of the diona * moved nymph system to server * Automatic changelog update * Fix: Grenades don't make trigger sound (#25321) * Fix: Grenades don't make trigger sound * transform instead of trycomp transform --------- Co-authored-by: Plykiya <plykiya@protonmail.com> * fixed the specific if statement called when plant age is under 0 (#25346) * Save round information into replay_final.yml (#23013) * Save round information into the replay * Add round end text too * This is way better * Get actual job * oop * OK THERE * Fake line endings to make life easier * I was told this yaml is legal * I just realised this will make my life easier * REVIEWS BABY IM A PROGRAMMER MOMMY * Live pjb reaction * Live pjb reaction 2 * Reviews 2 * Dont need this * Please no more have mercy on my soul * Oh frick * Adds a massban flag to the admin flags (#25327) Adds a massban flag to the admin flags used on ss14 to ban large amounts of players rom a .tsv file Co-authored-by: Geekyhobo <66805063+Ahlytlex@users.noreply.github.com> * Automatic changelog update * Fix missing line in nuke exploding sprite (#25351) I could've sworn I corrected this before committing but guess not ??? * Added Evidence Markers for the Detective! (#25255) * added evidence markers * box tweak * fixed a spelling mistake * new sprites, tweaked yml too * Add "tailed" hair (#25216) * add * yes * Clean up scars.yml and add a new chest scar (#25215) add * Automatic changelog update * Add new "OptionsVisualizer" (#25128) This is a visualizer somewhat similar to the Generic. It allows configuring appearance info based on specific CVars the user has set. This allows YAML to easily configure alternatives for accessibility CVars like reduced motion. * Suffix spelling mistake on seed vendor (#25352) spelling error * Update engine to v210.1.1 (#25354) Important fixes from the UI PR * Stop wagging tails on crit (#25323) * Add Flammable Touch Reaction for liquid tritium * Stop tail wagging action on crit * Revert "Add Flammable Touch Reaction for liquid tritium" This reverts commit 41be57b058a0cdee0cecfc51eb1c4a25631e62f3. * Automatic changelog update * EVA suit helmets now have (un)equip sounds (#25349) add (un)equip sounds to EVA helms * Automatic changelog update * Newton Cradle Fix + Addition to Bureaucracy Crate (#25357) fixes makes the newton cradle not able to decimate ears while also adding it to the bureaucracy crate and lowering its volume and range a little bit * Automatic changelog update * Shadow anomaly respects "reduced motion" (#25355) Enabling "reduced motion" now makes the smoke effects not animate. This helps some people with vision issues. * Fixed directional window durability (#25259) shit * Very little cleanup (#25364) * Origin Station Update 18.02.2024 (medbay update) (#25369) * Update Credits (#25360) Co-authored-by: PJBot <pieterjan.briers+bot@gmail.com> * Add bio reactions (#25366) * added more foodstuff breakdowns * Calcium doesn't exist; moved phosphorus to protein * tested reactions- some should be centrifuged * more testing tweaks * Automatic changelog update * Increase printing price for neck clothes (#25375) * Increase printing price * Update clothing.yml * Update Core (#25383) add * add icons for drinks in Solar's (#25301) * add icons for drinks in Solar's fixed colors of tea * consistently use capitals for color codes * don't add extra whitespace * Automatic changelog update * Small Nymph Changes (#25363) * Emote sounds, accent & doorbump * Oops * Only non-brains can't talk * Automatic changelog update * Bump nixpkgs rev (#25361) * Bump nixpkgs revision * Update nix-direnv * Remove extra nix functionalities Both nix-direnv and legacy command nix-shell fail. Reverting to flakes-only commands. * Pin nixpkgs per suggestion See https://github.com/space-wizards/space-station-14/pull/25361#discussion_r1494196038 * Revert nix-direnv removal * Add python3 to shell.nix * Adds guidebooks to the 4 learner roles (#25388) added the books * Automatic changelog update * Add support for metamorphic fill levels (#25022) * Added support for fill levels to metamorphic glasses * Fix warnings and cleanup * Don't break non-metamorphic fills! * Vending UI facelift (#25377) * Convert to fancy window + added footer + add list spacing * margin add * Automatic changelog update * Make metamorphic glasses use last solution's empty sprite (#25322) Make metamorphic glasses use empty sprite for the last solution they contained. * Moths can eat plushies (#25382) * Update toys.yml * fix * New sound of eating * Increased eating time * New sounds+sorting * Automatic changelog update * Make pills colorful and labeled (#25284) * Make pills colorful and labeled * Inherit pill sprites from parent * Add Flammable Touch Reaction for liquid tritium (#25281) * randomized sexless species now have epicene gender by default (#25282) Fikss * Automatic changelog update * Mechanized treatment improvements (#25356) Medical module merge * Hotfix: Set round end information for replays back to null on round start instead of round end (#25394) * Hotfix * I dont think i need this now * Fix action state handling bug (#25395) * Rejig action state handling * Fix entity arg * Fix deserialization * Automatic changelog update * Fix admin notes and database time nonsense. (#25280) God bloody christ. There's like three layers of shit here. So firstly, apparently we were still using Npgsql.EnableLegacyTimestampBehavior. This means that time values (which are stored UTC in the database) were converted to local time when read out. This meant they were passed around as kind Local to clients (instead of UTC in the case of SQLite). That's easy enough to fix just turn off the flag and fix the couple spots we're passing a local DateTime ez. Oh but it turns out there's a DIFFERENT problem with SQLite: See SQLite we definitely store the DateTimes as UTC, but when Microsoft.Data.Sqlite reads them it reads them as Kind Unspecified instead of Utc. Why are these so bad? Because the admin notes system passes DateTime instances from EF Core straight to the rest of the game code. And that means it's a PAIN IN THE ASS to run the necessary conversions to fix the DateTime instances. GOD DAMNIT now I have to make a whole new set of "Record" entities so we avoid leaking the EF Core model entities. WAAAAAAA. Fixes #19897 * PlayerListControl fixes. (#25248) * PlayerListControl fixes. Fix a button being selected by default always, which then can't be selected properly for real. This affected multiple admin UIs. This broke due to upstream RT changes but ButtonGroup was always kinda busted so whatever. Uses the new IsNoneSetAllowed to implement everything properly. Also make sure the selected player STAYS selected when filtering the list and stuff. Also this PlayerInfo record has been changed to only do equality on the User ID because otherwise it'd need to compare each field individually which would be weird. * Revert changes to ListContainer This change was made default in the engine, no longer necessary here. * Automatic changelog update * Ore crab structural weakness (#25390) * Attempt to change structural dmg of ore crab * Made ore crabs susceptible to structural damage * Automatic changelog update * Set nav map icon textures to use bilinear filtering (#25411) This just makes them look slightly better when zoomed. * Fix PlayerListControl re-raising selection changed when repopulated. (#25412) Now we just skip duplicate "item pressed" events from the ListContainer. This caused the ahelp window to unfocus the message box after sending something. Flow is something like this: you send ahelp -> bwoink window refreshes player list due to new bwoink -> repopulated player list -> sent selection change -> repopulates right pane -> line edit gets unfocused. * Train station (#24927) * some content * some next content * fixes * remove stained window * return bot message? * woah! Full map added! * map update * big update * camera server * Corvax playtest feedback * add mail system and 30$ meteor shield * update * updatik * hardwork * pipip * update * remove from mappool * fixes * sentipode * e * Mindshield outline flashes, (#25409) * Add animation support to status icons Animated like any other entity. Change the png to have all frames, add delays in meta.json, and you're good to go. * Dirty "fix" for the crashing. Still have no idea why files cannot be read without changing their path in the yaml. * Sloth review ig I still have no idea why it wont work with /Textures/ missing as a prefix. * Automatic changelog update * Small Artifact Fixes (#25416) * 20kw artifact fix * Change that hopefully doesn't completely break storage artifacts without me realising * Add roundid to replay_final.yml (#25398) oopsy i forgor * Resprite & hand position correction of Nettle & Death Nettle (#25421) Resprite of Nettle & Death Nettle. Corrected R & L hand locations for all orientations of both plants. * Automatic changelog update * balance Explosive Technology (#25397) * update arsenal yml balance ExplosiveTechnology * small changes in arsenal research small changes in arsenal research * Update arsenal.yml * Automatic changelog update * Tiny shove fix. (#25353) * Remove second shove check. * Change when popups and sounds are created. Reduces phantom shoves that feel bad. * why didn't i think of this i saw it earlier... * Replaced Is fields with prefix * remove some dependencies to fix tests??? * Automatic changelog update * fix: пара фиксов апстрима * Revert "Nuke fancification (#25297)" This reverts commit 3a45d519dcc3679375b5239b6f1881cdd1a07344. # Conflicts: # Resources/Textures/Objects/Devices/nuke.rsi/meta.json # Resources/Textures/Objects/Devices/nuke.rsi/nuclearbomb_deployed.png # Resources/Textures/Objects/Devices/nuke.rsi/nuclearbomb_exploding.png # Resources/Textures/Objects/Devices/nuke.rsi/nuclearbomb_timing.png * Revert "Shuttle floor resprite (#25127)" This reverts commit a93466ac24c7256d4b584ba830c4fa1cda253d5a. # Conflicts: # Resources/Textures/Tiles/shuttleblue.png # Resources/Textures/Tiles/shuttleorange.png # Resources/Textures/Tiles/shuttlepurple.png # Resources/Textures/Tiles/shuttlered.png # Resources/Textures/Tiles/shuttlewhite.png * Revert "New lobby art : Blueprint (#25179)" This reverts commit 90d02a590117b54a16b3af848f3b2fe0195724c9. # Conflicts: # Resources/Prototypes/lobbyscreens.yml * Revert "Added Monitor Computer Boards to Observation Kit (#24979)" This reverts commit c5027b51ecc7387a678e194fd7733a03349be536. * Revert "Small t-ray scanner resprite (#25047)" This reverts commit 601da0c3a33279beff818f82913ed2583e48c642. # Conflicts: # Resources/Textures/Objects/Tools/t-ray.rsi/tray-off.png # Resources/Textures/Objects/Tools/t-ray.rsi/tray-on.png * add: переводы * fix: фиксы под тесты --------- Co-authored-by: PJBot <pieterjan.briers+bot@gmail.com> Co-authored-by: deltanedas <39013340+deltanedas@users.noreply.github.com> Co-authored-by: Emisse <99158783+Emisse@users.noreply.github.com> Co-authored-by: Armok <155400926+ARMOKS@users.noreply.github.com> Co-authored-by: Kevin Zheng <kevinz5000@gmail.com> Co-authored-by: PoorMansDreams <150595537+PoorMansDreams@users.noreply.github.com> Co-authored-by: Hannah Giovanna Dawson <karakkaraz@gmail.com> Co-authored-by: lapatison <100279397+lapatison@users.noreply.github.com> Co-authored-by: router <messagebus@vk.com> Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Co-authored-by: Varen <ychwack@hotmail.it> Co-authored-by: potato1234_x <79580518+potato1234x@users.noreply.github.com> Co-authored-by: Hanz <41141796+Hanzdegloker@users.noreply.github.com> Co-authored-by: Ubaser <134914314+UbaserB@users.noreply.github.com> Co-authored-by: themias <89101928+themias@users.noreply.github.com> Co-authored-by: Alzore <140123969+Blackern5000@users.noreply.github.com> Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Co-authored-by: Plykiya <58439124+Plykiya@users.noreply.github.com> Co-authored-by: Plykiya <plykiya@protonmail.com> Co-authored-by: YuNii <benjamin@bhenrich.de> Co-authored-by: Kara <lunarautomaton6@gmail.com> Co-authored-by: Mangohydra <156087924+Mangohydra@users.noreply.github.com> Co-authored-by: Nim <128169402+Nimfar11@users.noreply.github.com> Co-authored-by: Jezithyr <jezithyr@gmail.com> Co-authored-by: Fluffiest Floofers <thebluewulf@gmail.com> Co-authored-by: Jajsha <101492056+Zap527@users.noreply.github.com> Co-authored-by: SlamBamActionman <83650252+SlamBamActionman@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Tayrtahn <tayrtahn@gmail.com> Co-authored-by: Flareguy <78941145+Flareguy@users.noreply.github.com> Co-authored-by: forgotmyotheraccount <133569389+forgotmyotheraccount@users.noreply.github.com> Co-authored-by: FungiFellow <151778459+FungiFellow@users.noreply.github.com> Co-authored-by: Ko4ergaPunk <62609550+Ko4ergaPunk@users.noreply.github.com> Co-authored-by: Ilya246 <57039557+Ilya246@users.noreply.github.com> Co-authored-by: Krunklehorn <42424291+Krunklehorn@users.noreply.github.com> Co-authored-by: Alex Nordlund <deep.alexander@gmail.com> Co-authored-by: EdenTheLiznerd <138748328+EdenTheLiznerd@users.noreply.github.com> Co-authored-by: deepdarkdepths <155149356+deepdarkdepths@users.noreply.github.com> Co-authored-by: Genkail <50331122+Genkail@users.noreply.github.com> Co-authored-by: Vasilis <vasilis@pikachu.systems> Co-authored-by: James Simonson <jamessimo89@gmail.com> Co-authored-by: Pieter-Jan Briers <pieterjan.briers+git@gmail.com> Co-authored-by: icekot8 <93311212+icekot8@users.noreply.github.com> Co-authored-by: Agoichi <92464780+Agoichi@users.noreply.github.com> Co-authored-by: KREKS <132602258+xKREKSx@users.noreply.github.com> Co-authored-by: 0x6273 <0x40@keemail.me> Co-authored-by: lzk <124214523+lzk228@users.noreply.github.com> Co-authored-by: Ed <96445749+TheShuEd@users.noreply.github.com> Co-authored-by: Guilherme Ornel <86210200+joshepvodka@users.noreply.github.com> Co-authored-by: Errant <35878406+Errant-4@users.noreply.github.com> Co-authored-by: wafehling <wafehling@users.noreply.github.com> Co-authored-by: Interrobang01 <113810873+Interrobang01@users.noreply.github.com> Co-authored-by: k3yw <grenadiumdota@gmail.com> Co-authored-by: Velcroboy <107660393+IamVelcroboy@users.noreply.github.com> Co-authored-by: Jeff <velcroboy333@hotmail.com> Co-authored-by: Jessica M <jessica@jessicamaybe.com> Co-authored-by: Jessica M <jessica@maybe.sh> Co-authored-by: Zadeon <loldude9000@gmail.com> Co-authored-by: brainfood1183 <113240905+brainfood1183@users.noreply.github.com> Co-authored-by: Menshin <Menshin@users.noreply.github.com> Co-authored-by: nikthechampiongr <32041239+nikthechampiongr@users.noreply.github.com> Co-authored-by: liltenhead <104418166+liltenhead@users.noreply.github.com> Co-authored-by: Leon Friedrich <60421075+ElectroJr@users.noreply.github.com> Co-authored-by: Daxxi3 <158596935+Daxxi3@users.noreply.github.com> Co-authored-by: MACMAN2003 <macman2003c@gmail.com> Co-authored-by: Golinth <amh2023@gmail.com> Co-authored-by: Łukasz Mędrek <lukasz@lukaszm.xyz> Co-authored-by: PotentiallyTom <67602105+PotentiallyTom@users.noreply.github.com> Co-authored-by: MilenVolf <63782763+MilenVolf@users.noreply.github.com> Co-authored-by: LankLTE <135308300+LankLTE@users.noreply.github.com> Co-authored-by: Flesh <62557990+PolterTzi@users.noreply.github.com> Co-authored-by: Arendian <137322659+Arendian@users.noreply.github.com> Co-authored-by: Geekyhobo <66805063+Geekyhobo@users.noreply.github.com> Co-authored-by: Geekyhobo <66805063+Ahlytlex@users.noreply.github.com> Co-authored-by: Moomoobeef <62638182+Moomoobeef@users.noreply.github.com> Co-authored-by: Peptide90 <78795277+Peptide90@users.noreply.github.com> Co-authored-by: ArchPigeon <bookmaster3@gmail.com> Co-authored-by: Killerqu00 <47712032+Killerqu00@users.noreply.github.com> Co-authored-by: Firewatch <54725557+musicmanvr@users.noreply.github.com> Co-authored-by: Vigers Ray <60344369+VigersRay@users.noreply.github.com> Co-authored-by: genderGeometries <159584039+genderGeometries@users.noreply.github.com> Co-authored-by: hiucko <86206040+Hiucko@users.noreply.github.com> Co-authored-by: Sybil <azurerosegarden@gmail.com> Co-authored-by: Ioannis Eleftheriou <me@yath.xyz> Co-authored-by: marboww <152051971+marboww@users.noreply.github.com> Co-authored-by: veprolet <68151557+veprolet@users.noreply.github.com> Co-authored-by: Mr. 27 <45323883+Dutch-VanDerLinde@users.noreply.github.com> Co-authored-by: Tonydatguy <154929293+Tonydatguy@users.noreply.github.com> Co-authored-by: Gotimanga <127038462+Gotimanga@users.noreply.github.com> Co-authored-by: MjrLandWhale <brandonemitch@gmail.com> Co-authored-by: takemysoult <143123247+takemysoult@users.noreply.github.com> Co-authored-by: Callmore <22885888+Callmore@users.noreply.github.com>
2024-02-23 23:05:48 +07:00
public class AdminNote
{
[Required, Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int Id { get; set; }
[ForeignKey("Round")] public int? RoundId { get; set; }
public Round? Round { get; set; }
[ForeignKey("Player")] public Guid? PlayerUserId { get; set; }
public Player? Player { get; set; }
[Required] public TimeSpan PlaytimeAtNote { get; set; }
[Required, MaxLength(4096)] public string Message { get; set; } = string.Empty;
[Required] public NoteSeverity Severity { get; set; }
[ForeignKey("CreatedBy")] public Guid? CreatedById { get; set; }
public Player? CreatedBy { get; set; }
[Required] public DateTime CreatedAt { get; set; }
[ForeignKey("LastEditedBy")] public Guid? LastEditedById { get; set; }
public Player? LastEditedBy { get; set; }
[Required] public DateTime? LastEditedAt { get; set; }
public DateTime? ExpirationTime { get; set; }
public bool Deleted { get; set; }
[ForeignKey("DeletedBy")] public Guid? DeletedById { get; set; }
public Player? DeletedBy { get; set; }
public DateTime? DeletedAt { get; set; }
public bool Secret { get; set; }
}
[Index(nameof(PlayerUserId))]
[Upstream] Upstream (#109) * Automatic changelog update * atlas update (#25071) * atlas update * untroll --------- Co-authored-by: deltanedas <@deltanedas:kde.org> * box update (#25074) * fland update (#25075) * marathon update (#25076) * meta update (#25077) * Syndicate key grammar fix (#25085) * Syndicate encryption key grammar fix An encryption key used by... wait... Who is owner of this chip? > An encryption key used by... wait... Who is the owner of this chip? * Syndicate key grammar fix An encryption key used by... wait... Who is owner of this chip? > An encryption key used by... wait... Who is the owner of this chip? * Fix hybridization seedless probability (#25084) Fix comparison Hybrids (different plants being crossed) are supposed to have a high chance of becoming seedless to balance overpowered plants. However, a logic error in the comparison gave seedless to plants when they were from the same seed (not hybrids) rather than the other way around. Reported by: @genderGeometries * Added Tourniquets to stop bleeds (#23198) * Fixed Error with RobustToolbox Edits. Removed the addition of secbelt tag from assault belt. * Resprite of the monstrosity * Resprite of the tourniquet NO LONGER PHALLUS SHAPED * too bright, now darker and edgier * Tourniquet resprite * metajson yay * Update Skelly Vs The Rev lobby art (#25088) Someone said the original was a bit low res and I agreed. This is a 1440p (from an 8k base image) rendition of the same scene, with a new dramatic forced perspective look, and generally cleaner art throughout. Also now there's two mothroaches. * Automatic changelog update * Minor airlock assembly clean up (#25073) 1 * Update README.md (#25067) * Update README.md * emo review Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> --------- Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> * prevent opening debug menus without perms (#25091) prevent people without permissions from opening the tile, entityspawn, or decal menus * Remove battery from crew observation kit, fix description (#25000) -Remove battery from crew observation kit, fix description * Laughin' Peas (#25089) * laughter * make clownmobs bleed laughter * laughin syrup and laughter recipe * add laughin peas * Automatic changelog update * QM drip DLC (#24477) * New Drip for the QM QM beret and QM formal uniform * Asd Asd * Adds the new clothing to the uniform printer what it says on the tin * I always forget to update the copyright RAAAAAH yup * EMT Belt Part 2 (#24289) * add * fix * aaaa * Flipped caps real (#24961) * Flipped caps real * oops * whoops * flip not fold * fix formatting * cargosoft formatting * Automatic changelog update * Nerf Beanbags (#24653) Lowers beanbag damage from 55 stam to 30 stam * Automatic changelog update * Fix screenspace popups (#24987) * Fix screenspace popups Never got around to it earlier but need to draw it above UI controls. * Minor null change * Automatic changelog update * Fix crew manifest department bugs (#24975) * Automatic changelog update * Changed door remote to trigger based on vision occlusion(#25093) Changed door remote to trigger based on vision occlusion rather than opaque collision targeting check. Ian's butt will no longer absorb your 5G signals. Co-authored-by: Plykiya <plykiya@protonmail.com> * GPS In Paramed Locker (#25096) GPS in paramed locker * Remove 'travis scott day' from the game (#25106) * remove travis scott from the game * KILL TRAVIS EVEN MORE * Automatic changelog update * Remove erroneous changelog (#25107) * fixed fland cargo shuttle not having tiny fans (sorry) (#25095) * Glass box for antique laser pistol (#25104) * glassbox * fix * Gibbing refactor (Per-part gibbing and giblet throwing!) (#24989) * Moving Gibbing rework out from medrefactor into it's own PR * Re-enabled warning for missing gibbable on TryGibEntity * Implemented better logic for gibbing failover and better logging * Allowing audio params and drop scattering customization per component. Created UnGibbable organ base types and made brains ungibbable. Removed delete brain from gibBody function. Artifact crusher does not destroy brains anymore. It only destroyed brains before not other organs which was wierd. * Update Content.Shared/Body/Systems/SharedBodySystem.Body.cs Fixing space for multiplication Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> * Added event raised when attempting to gib contained entities to allow modification of allowed and excluded container ids * removing audioParams var from component (sound specifier includes it) * Fixing signature --------- Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> * Automatic changelog update * Gibbing contents hotfix (#25114) Fixing gibbing contents not respecting Include/Exclude container lists. This is currently unused * Predict two-way levers (#25043) * Predict two-way levers Annoys me the rare occasions I touch cargo. Doesn't predict the signal but at least the lever responds immediately. * space * a * Replace Romerol with Ambuzol in chemist guidebook (#25108) replace romerol with ambuzol * Fix borgs being able to emag themselves (#24748) * Fix self emagging borgs * Add popup on self emag failure. * Ectoplasm is grindable into Necrosol (#25053) add * Automatic changelog update * Automatic changelog update * Roundstart Food Service research (#25046) add * Automatic changelog update * Add option for character name colors in chat & move coloration to clientside (#24625) * Adds option to disable character names in chat/speechbubbles * Moved the coloring of names to clientside * Move string functions to SharedChatSystem to avoid duplicate code in SpeechBubble.cs * Changed to be put under Accessibility section * Cache CVar * Automatic changelog update * Update Credits (#25115) Co-authored-by: PJBot <pieterjan.briers+bot@gmail.com> * Replace fixed drink glasses with metamorphic versions (#25134) * Replaced fixed drink glasses with metamorphic versions * Fine, no milkshake then * ambuzol beef (#25119) * Automatic changelog update * Shuttle floor resprite (#25127) * resprites shuttle tiles * resprites shuttle floor tiles & adds grey/black shuttle tiles * attributions.yml update * Adding a period to an object description (#25138) Added a period to an object description. Adds a period to silk's description. This is my first and last pull request. * Door Remote Changelog Entry (#25144) I'm so dumb. Co-authored-by: Plykiya <plykiya@protonmail.com> * Automatic changelog update * Lowered Ion Storm Reoccurence Delay to 20 (#25135) * Lowered reoccurencedelay to 45 * Lowered Further down to 20 * Re-added shivs to crafting menus (#25094) Added a recipe for crafting menu * Automatic changelog update * Color Tipped Ammo (#25103) * Tipped .35 ammo * used layers instead of new sprites * remove the useless old sprites * changed the green slightly * Automatic changelog update * Add overlay decals for mini tiles and bricks (#24949) Add minitile and brick decals overlay * Update Core (#24862) * add * Update Resources/Textures/Parallaxes/attributions.yml * sprite change * address review --------- Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> * Buyable Jani Trolley (#25139) Trolley * Added display for amount of hits left in stun batons/stun prods. (#25141) Added display for amount of hits left in stun batons/stunprods. Co-authored-by: Plykiya <plykiya@protonmail.com> * Automatic changelog update * autolatheable air tanks (#25130) * gastankening * fix price * Automatic changelog update * Fix pointing arrow trajectory (#25061) Initial commit * make linking logic gates 1000% better (#25041) * make door status use SendSignal * LastSignals and logic, add ClearSignal api too * make everything outputting a logic signal default to false * refactor ops * :trollface: * :trollface: * protoid for LastSignals * oop --------- Co-authored-by: deltanedas <@deltanedas:kde.org> * Buff emergency toolbox fill (#24225) Resolves issue #23059, for which the submitter wrote: Emergency toolboxes contain a crowbar, two flashlights (sometimes one), two breath masks, and two chocolate. With the addition of water bottles to survival boxes and emergency nitrogen tanks, I think emergency toolboxes should be updated to include said water bottles and emergency tanks. Would make these just a little bit more useful. It feels weird they don't have oxygen tanks when they have two breath masks, and since water bottles are now commonplace it would be a good idea to put them in a place where emergency food is stored as well. * Void jetpack resprite (#25150) add * Automatic changelog update * Allow configuring gen_build_info.py through environment variables (#25162) This makes the life of forks slightly easier by letting you pass an environment variable instead of having to maintain this file yourself. * Significantly nerf Deathnettles (#25068) * Balancing my beloved Significantly nerfs deathnettles so botanists can't just take down jug's like it's no issue, we have guns, we should be using them * Additional Balancing Changes. * Losing my mind * Automatic changelog update * Fix spelling errors in mechs.yml (#25168) * fix showhealthbars perms (#25157) * Allow inspecting ID's and Health of people behind glass (#25163) Hops will love me * Automatic changelog update * Fix decal error spam (#25172) * Restore MonoOverlay (#25170) https://github.com/space-wizards/space-station-14/pull/24949 nuked it. * Automatic changelog update * Added "wink" and "tearfully smiles" emotes + more cry emote variations (#25129) Added wink and tearfully smiles emote + more cries variations * Automatic changelog update * Update submodule to 210.0.0 (#25175) * Update submodule to 210.0.0 * 210.0.1 instead, the previous one was broken * 210.0.3 instead, the previous one was ALSO broken --------- Co-authored-by: Pieter-Jan Briers <pieterjan.briers+git@gmail.com> * The medical beret is real (#25176) * 1 * 2 * button is real. * Automatic changelog update * Fixed Tipped ammo not being Spent (#25167) Fix Tipped Ammo not being Spent * Automatic changelog update * Hoods and some chaplain's hats now hides hair (#25142) * Hoods now hide hair * additional plague hat and witch hat now hide hair * fixing some tags in hats * hoods tag fix * Glassbox shatter resprite (#25136) * Automatic changelog update * Random spontaneous cleanup PR (#25131) * Use new Subs.CVar helper Removes manual config OnValueChanged calls, removes need to remember to manually unsubscribe. This both reduces boilerplate and fixes many issues where subscriptions weren't removed on entity system shutdown. * Fix a bunch of warnings * More warning fixes * Use new DateTime serializer to get rid of ISerializationHooks in changelog code. * Get rid of some more ISerializationHooks for enums * And a little more * Apply suggestions from code review Co-authored-by: 0x6273 <0x40@keemail.me> --------- Co-authored-by: 0x6273 <0x40@keemail.me> * Decrease the chemical cost of regen mesh and sutures and move them to their own file (#24948) * WHYWEREMEDSINMEALRECIPES * 20chem * didiforgettosavethis * Split slime marking leg gradient (#24928) * Split slime marking leg gradient * up markings to 4 * Automatic changelog update * Require plants to be harvestable before sampling (#24851) * Add verbs to Open/Close Openable containers, and add optional seals (#24780) * Implement closing; add open/close verbs * Add breakable seals * Allow custom verb names; make condiment bottles closeable * Remove pointless VV annotations and false defaults * Split Sealable off into a new component * Should have a Closed event too * Oh hey, there are icons I could use * Ternary operator * Add support for seal visualizers * Moved Sealable to Shared, added networking * Replaced bottle_close1.ogg * Automatic changelog update * Shadow anomaly returns (#24629) * content * add cat * ambient * I FORGOT HEARTS! * fix ambient * some fixes * canCollide: false * connect to damageable * pi * remove fx * some fixes * *sad bruh* * hazed * Update base_shadow.yml * Automatic changelog update * Microwave UX enhancements (#24547) * Facelift Microwave UI Includes new background light in UI, Uses predictive input, UI now properly disables buttons when microwave is active * Microwave now shows Elapsed time * Fixed bad formatting * Added new term for "BottomMargin" * Change yellow color * Update StyleNano.cs just spacing fixed * Cook time countdown now detached from server Instead of the server constantly sending out messages for the cook countdown, it is now predicted client side using TimeSpan * Update MicrowaveMenu.xaml forgot to re-add item space * Automatic changelog update * Additional damage visualisers (#24618) * brute * add * Anomaly Synchronizer + Signallers tweaks (#24461) * content * nerf * fix rsi * Automatic changelog update * saltern update (#25182) Co-authored-by: deltanedas <@deltanedas:kde.org> * Allow players to run saveconfig command. (#25200) Benign client-side command. * Revert "Allow configuring gen_build_info.py through environment variables" (#25201) Revert "Allow configuring gen_build_info.py through environment variables (#2…" This reverts commit 163e6d2f896ccf9a37be2e17bbbad8b6514ccf4b. * Fax machines can print from text file (#23262) * added * checks tweaking * fixed what sloth wanted * fixed? * dialog diposing fix * checks tweaking * more changes * dispose streamreader * Update Content.Client/Fax/UI/FaxBoundUi.cs Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> * Update Content.Server/Fax/FaxSystem.cs Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> * fix minor typo --------- Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> * Automatic changelog update * Vox names, species prototype cleanup, some cosmetic changes (#24994) * voxnames * New generator parameters, names are more readable * bunch of missing vox stuff * more names * sad * Balanced ChemVend Stock (#25207) * Balanced ChemVend Stock ChemVend needs more balanced stock for what actually gets used * +1 Sugar * Ranged Holosigns (#25120) * Changed holo signs to be ranged and used on click rather than Z. * Updated comments * Failed attempt at ignoring walls * Getting rid of unused libraries --------- Co-authored-by: Plykiya <plykiya@protonmail.com> * Automatic changelog update * Minor test fixes (#25174) Stuff that probably shoulda been wrapped ig but our test runner stinky. * Add pun to diagnostic hud description (#25209) Seaborgium is element number 106 and is presumably what lets these glasses "see" "borgs". * Add events for TemperatureProtection and PressureProtection (#25165) * Update criminal-records.ftl (#25229) * Adds always powered variants of colored lights (#25185) Co-authored-by: Jeff <velcroboy333@hotmail.com> * Fixes silver bars being whole stacks (#25239) Co-authored-by: Jeff <velcroboy333@hotmail.com> * Makes clumsy not delete guns (#25243) clumsy no longer deletes guns Co-authored-by: Jessica M <jessica@maybe.sh> * Predict Injector (syringes), cleanup (#25235) At least the mode/transfer amount logic. Actual transfer logic needs Bloodstream which I didn't wanna move into shared. * Updated disabler to have suitStorage tag under slots. (#25238) * Automatic changelog update * Updates to Origin (#24908) Replaced medical's HM console with a CM console, added janitor equipment closet * Fix spawn priority persistence on reconnect and restart (#25246) Because of course I would forget one line * Add French accent beret (#21430) * Allow thermomachines to exchange with air instead of inlet (#25247) Add purely atmospheric heat exchange to the gas thermomachine component (in preparation for space heaters). * Fix: Holosigns can be stored again (#25249) * Holosigns can be stored again * TryComp to HasComp --------- Co-authored-by: Plykiya <plykiya@protonmail.com> * Death acidifier fix (#25251) * Automatic changelog update * Clarify stripping logs (#25190) * Indicate whether pickpocketing is stealthy in logs, change :user to :actor, and clean up messages. * Remove ugly whitespace * Do the thing I should have done but didn't because I didn't want to think * Fix spacing * Fix disposals bins not automatically flushing after an object is inserted (#25233) Fix disposals bins not automatically flushing after an object is inserted. Because of Spaghetti Code:tm:, AfterInsert() in DisposalUnitSystem still handles insertion itself. Except in all cases except drag/drop insert, the object is already inserted so this check fails and the remaining logic doesn't happen anymore. Fixed now. * Sec & greysec jumpskirt fix (#25269) * "resprites" sec & greysec jumpskirts * adjustments * Automatic changelog update * Reduce eshield hp (#25258) reduce eshield hp * Automatic changelog update * Artifact hemoglobin trigger now accepts all sentient blood types (#25240) * Artifact blood trigger now accepts all sentient blood types * Update artifact-hints.ftl * Update engine to v210.1.0 (#25288) * Made ghost.role_time a server modifiable only cvar (#25292) Fix * Nuke fancification (#25297) Actually use more icon states for deployed/armed/about to explode Also unlit layer. Also examine text * Automatic changelog update * Change copper blood from ferrous to metallic (#25217) changed copper blood from ferrous to metallic * Thindow glass dupe fix (#25304) smite glass dupe off the face of the planet eww nasty dupe exploits blehh * Automatic changelog update * Kill Seperated Mindshield Icons (#25303) * Unghettoify mindshield icons Adds support for layers in status icons, through the StatusIconLayer enum and the new "layer" datafield. Defaults to the Base layer where functionally remains unchanged. * TG icon for shield probably better than the shitty one I made in paint * forgor meta.json I forgor * Emo review Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> --------- Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> * Automatic changelog update * MORE SUFFIXES (#25314) Co-authored-by: Jeff <velcroboy333@hotmail.com> * Fix spawning glass shard for each glass sheet in stack (#25308) * fix: SpawnEntitiesBehavior now works with stacks Fixed the issue of SpawnEntitiesBehavior not executing multiple times on entities with stack conponent. Fixes #25287 * fix: reduced dictionary iterations * Automatic changelog update * Adds atmospherics access to the fire fighting door remote. Feels like… (#25097) Adds atmospherics access to the fire fighting door remote. Feels like an oversight for the atmos door remote to not have atmos access. Co-authored-by: Plykiya <plykiya@protonmail.com> * Automatic changelog update * Re-organise main menu screen (#25173) - The dummy control of 2px size has annoyed me for almost 5 years. - Why is it in the top-right. - Why is the server address not labelled. * Allow t-ray to penetrate carpets and puddles (#25276) * Allow t-ray to penetrate carpets and puddles * handle edge cases * Automatic changelog update * Add sfx for writing on paper (#25257) * Initial commit * Moved params to sound * Removed type tag * Removed null check * Forced default * Automatic changelog update * New sprites for guidebooks (#25232) * added books to roles * First pass * removed yaml to split pull requests into resprite first, then giving the books to assistants * new science * Automatic changelog update * LockVisualizer (#25224) * LockVisualizer * Fix state * Clean some code * Make it component, fix tests fail * Fix for StateUnlocked Now it is possible to manually set the unlocked state and it will work! * Optimize LockVisualizer, add check for unlocked state * No todo I guess * Solution precision fixes (#25199) * Add test for two chemistry issues 1. rounding issue with reaction processing when making chloral hydrate 2. reliable assert trip due to the ValidateSolution() heat capacity issue. * Fix FixedPoint2 arithmetic Fix internal floating point arithmetic in places where it could be avoided. Fix incorrect rounding mode used in other places (it should always floor, like regular int arithmetic). I had to add an explicit epsilon value for float -> FixedPoint2 because something like 1.05 is actually like 1.04999 and that'd cause it to be rounded down to 1.04. This fixes reaction reagent processing in cases where the reagent inputs can't cleanly divide. Previously, when making 30u chloral hydrate by adding the chlorine in 10u increments you'd end up with 0.04 chlorine left over. This was caused by division in the reaction code rounding up in some cases. Changing division here to always round down fixes it. * Attempt to fix heat capacity precision assert issues. Fixes #22126 First, we just increase the tolerance of the assert. It was way too low. Second, actually put a cap on float drift from one-off _heatCapacity changes. * Fix float -> FixedPoint2 epsilon for negative number, fix tests. * Fix DamageableTest * Oh yeah I need to call CleanReturnAsync * Automatic changelog update * WebP lobby images (#25184) * Allow webp in lobby background files * Make lobby art webp images Reduces folder from 10 MB to 2.5 MB without only slight quality loss. * Update PutLobbyScreensHere.txt * New lobby art : Blueprint (#25179) * add * replace image with webp version waiting on #25184 * Automatic changelog update * Diona Nymphs & Splitting (#24630) * Porting & implementation * Fix two stupid errors * Human not humans * fix audio path * Fix test fails & update cooldown * Work on reviews & test fail * Rework nymph organ system. * Make the nymph organs nospawn. * IsDeadIC * Automatic changelog update * reform cooldown 10 minutes (#25328) * Change plant clipping mechanics (#25326) Make seeds from clipped plants inherit the decreased health from parents. Also require one growth stage before clipping. * Automatic changelog update * Fix nymphs being deleted immediatly after spawning (#25344) * nymphs now don't get deleted together with the body of the diona * moved nymph system to server * Automatic changelog update * Fix: Grenades don't make trigger sound (#25321) * Fix: Grenades don't make trigger sound * transform instead of trycomp transform --------- Co-authored-by: Plykiya <plykiya@protonmail.com> * fixed the specific if statement called when plant age is under 0 (#25346) * Save round information into replay_final.yml (#23013) * Save round information into the replay * Add round end text too * This is way better * Get actual job * oop * OK THERE * Fake line endings to make life easier * I was told this yaml is legal * I just realised this will make my life easier * REVIEWS BABY IM A PROGRAMMER MOMMY * Live pjb reaction * Live pjb reaction 2 * Reviews 2 * Dont need this * Please no more have mercy on my soul * Oh frick * Adds a massban flag to the admin flags (#25327) Adds a massban flag to the admin flags used on ss14 to ban large amounts of players rom a .tsv file Co-authored-by: Geekyhobo <66805063+Ahlytlex@users.noreply.github.com> * Automatic changelog update * Fix missing line in nuke exploding sprite (#25351) I could've sworn I corrected this before committing but guess not ??? * Added Evidence Markers for the Detective! (#25255) * added evidence markers * box tweak * fixed a spelling mistake * new sprites, tweaked yml too * Add "tailed" hair (#25216) * add * yes * Clean up scars.yml and add a new chest scar (#25215) add * Automatic changelog update * Add new "OptionsVisualizer" (#25128) This is a visualizer somewhat similar to the Generic. It allows configuring appearance info based on specific CVars the user has set. This allows YAML to easily configure alternatives for accessibility CVars like reduced motion. * Suffix spelling mistake on seed vendor (#25352) spelling error * Update engine to v210.1.1 (#25354) Important fixes from the UI PR * Stop wagging tails on crit (#25323) * Add Flammable Touch Reaction for liquid tritium * Stop tail wagging action on crit * Revert "Add Flammable Touch Reaction for liquid tritium" This reverts commit 41be57b058a0cdee0cecfc51eb1c4a25631e62f3. * Automatic changelog update * EVA suit helmets now have (un)equip sounds (#25349) add (un)equip sounds to EVA helms * Automatic changelog update * Newton Cradle Fix + Addition to Bureaucracy Crate (#25357) fixes makes the newton cradle not able to decimate ears while also adding it to the bureaucracy crate and lowering its volume and range a little bit * Automatic changelog update * Shadow anomaly respects "reduced motion" (#25355) Enabling "reduced motion" now makes the smoke effects not animate. This helps some people with vision issues. * Fixed directional window durability (#25259) shit * Very little cleanup (#25364) * Origin Station Update 18.02.2024 (medbay update) (#25369) * Update Credits (#25360) Co-authored-by: PJBot <pieterjan.briers+bot@gmail.com> * Add bio reactions (#25366) * added more foodstuff breakdowns * Calcium doesn't exist; moved phosphorus to protein * tested reactions- some should be centrifuged * more testing tweaks * Automatic changelog update * Increase printing price for neck clothes (#25375) * Increase printing price * Update clothing.yml * Update Core (#25383) add * add icons for drinks in Solar's (#25301) * add icons for drinks in Solar's fixed colors of tea * consistently use capitals for color codes * don't add extra whitespace * Automatic changelog update * Small Nymph Changes (#25363) * Emote sounds, accent & doorbump * Oops * Only non-brains can't talk * Automatic changelog update * Bump nixpkgs rev (#25361) * Bump nixpkgs revision * Update nix-direnv * Remove extra nix functionalities Both nix-direnv and legacy command nix-shell fail. Reverting to flakes-only commands. * Pin nixpkgs per suggestion See https://github.com/space-wizards/space-station-14/pull/25361#discussion_r1494196038 * Revert nix-direnv removal * Add python3 to shell.nix * Adds guidebooks to the 4 learner roles (#25388) added the books * Automatic changelog update * Add support for metamorphic fill levels (#25022) * Added support for fill levels to metamorphic glasses * Fix warnings and cleanup * Don't break non-metamorphic fills! * Vending UI facelift (#25377) * Convert to fancy window + added footer + add list spacing * margin add * Automatic changelog update * Make metamorphic glasses use last solution's empty sprite (#25322) Make metamorphic glasses use empty sprite for the last solution they contained. * Moths can eat plushies (#25382) * Update toys.yml * fix * New sound of eating * Increased eating time * New sounds+sorting * Automatic changelog update * Make pills colorful and labeled (#25284) * Make pills colorful and labeled * Inherit pill sprites from parent * Add Flammable Touch Reaction for liquid tritium (#25281) * randomized sexless species now have epicene gender by default (#25282) Fikss * Automatic changelog update * Mechanized treatment improvements (#25356) Medical module merge * Hotfix: Set round end information for replays back to null on round start instead of round end (#25394) * Hotfix * I dont think i need this now * Fix action state handling bug (#25395) * Rejig action state handling * Fix entity arg * Fix deserialization * Automatic changelog update * Fix admin notes and database time nonsense. (#25280) God bloody christ. There's like three layers of shit here. So firstly, apparently we were still using Npgsql.EnableLegacyTimestampBehavior. This means that time values (which are stored UTC in the database) were converted to local time when read out. This meant they were passed around as kind Local to clients (instead of UTC in the case of SQLite). That's easy enough to fix just turn off the flag and fix the couple spots we're passing a local DateTime ez. Oh but it turns out there's a DIFFERENT problem with SQLite: See SQLite we definitely store the DateTimes as UTC, but when Microsoft.Data.Sqlite reads them it reads them as Kind Unspecified instead of Utc. Why are these so bad? Because the admin notes system passes DateTime instances from EF Core straight to the rest of the game code. And that means it's a PAIN IN THE ASS to run the necessary conversions to fix the DateTime instances. GOD DAMNIT now I have to make a whole new set of "Record" entities so we avoid leaking the EF Core model entities. WAAAAAAA. Fixes #19897 * PlayerListControl fixes. (#25248) * PlayerListControl fixes. Fix a button being selected by default always, which then can't be selected properly for real. This affected multiple admin UIs. This broke due to upstream RT changes but ButtonGroup was always kinda busted so whatever. Uses the new IsNoneSetAllowed to implement everything properly. Also make sure the selected player STAYS selected when filtering the list and stuff. Also this PlayerInfo record has been changed to only do equality on the User ID because otherwise it'd need to compare each field individually which would be weird. * Revert changes to ListContainer This change was made default in the engine, no longer necessary here. * Automatic changelog update * Ore crab structural weakness (#25390) * Attempt to change structural dmg of ore crab * Made ore crabs susceptible to structural damage * Automatic changelog update * Set nav map icon textures to use bilinear filtering (#25411) This just makes them look slightly better when zoomed. * Fix PlayerListControl re-raising selection changed when repopulated. (#25412) Now we just skip duplicate "item pressed" events from the ListContainer. This caused the ahelp window to unfocus the message box after sending something. Flow is something like this: you send ahelp -> bwoink window refreshes player list due to new bwoink -> repopulated player list -> sent selection change -> repopulates right pane -> line edit gets unfocused. * Train station (#24927) * some content * some next content * fixes * remove stained window * return bot message? * woah! Full map added! * map update * big update * camera server * Corvax playtest feedback * add mail system and 30$ meteor shield * update * updatik * hardwork * pipip * update * remove from mappool * fixes * sentipode * e * Mindshield outline flashes, (#25409) * Add animation support to status icons Animated like any other entity. Change the png to have all frames, add delays in meta.json, and you're good to go. * Dirty "fix" for the crashing. Still have no idea why files cannot be read without changing their path in the yaml. * Sloth review ig I still have no idea why it wont work with /Textures/ missing as a prefix. * Automatic changelog update * Small Artifact Fixes (#25416) * 20kw artifact fix * Change that hopefully doesn't completely break storage artifacts without me realising * Add roundid to replay_final.yml (#25398) oopsy i forgor * Resprite & hand position correction of Nettle & Death Nettle (#25421) Resprite of Nettle & Death Nettle. Corrected R & L hand locations for all orientations of both plants. * Automatic changelog update * balance Explosive Technology (#25397) * update arsenal yml balance ExplosiveTechnology * small changes in arsenal research small changes in arsenal research * Update arsenal.yml * Automatic changelog update * Tiny shove fix. (#25353) * Remove second shove check. * Change when popups and sounds are created. Reduces phantom shoves that feel bad. * why didn't i think of this i saw it earlier... * Replaced Is fields with prefix * remove some dependencies to fix tests??? * Automatic changelog update * fix: пара фиксов апстрима * Revert "Nuke fancification (#25297)" This reverts commit 3a45d519dcc3679375b5239b6f1881cdd1a07344. # Conflicts: # Resources/Textures/Objects/Devices/nuke.rsi/meta.json # Resources/Textures/Objects/Devices/nuke.rsi/nuclearbomb_deployed.png # Resources/Textures/Objects/Devices/nuke.rsi/nuclearbomb_exploding.png # Resources/Textures/Objects/Devices/nuke.rsi/nuclearbomb_timing.png * Revert "Shuttle floor resprite (#25127)" This reverts commit a93466ac24c7256d4b584ba830c4fa1cda253d5a. # Conflicts: # Resources/Textures/Tiles/shuttleblue.png # Resources/Textures/Tiles/shuttleorange.png # Resources/Textures/Tiles/shuttlepurple.png # Resources/Textures/Tiles/shuttlered.png # Resources/Textures/Tiles/shuttlewhite.png * Revert "New lobby art : Blueprint (#25179)" This reverts commit 90d02a590117b54a16b3af848f3b2fe0195724c9. # Conflicts: # Resources/Prototypes/lobbyscreens.yml * Revert "Added Monitor Computer Boards to Observation Kit (#24979)" This reverts commit c5027b51ecc7387a678e194fd7733a03349be536. * Revert "Small t-ray scanner resprite (#25047)" This reverts commit 601da0c3a33279beff818f82913ed2583e48c642. # Conflicts: # Resources/Textures/Objects/Tools/t-ray.rsi/tray-off.png # Resources/Textures/Objects/Tools/t-ray.rsi/tray-on.png * add: переводы * fix: фиксы под тесты --------- Co-authored-by: PJBot <pieterjan.briers+bot@gmail.com> Co-authored-by: deltanedas <39013340+deltanedas@users.noreply.github.com> Co-authored-by: Emisse <99158783+Emisse@users.noreply.github.com> Co-authored-by: Armok <155400926+ARMOKS@users.noreply.github.com> Co-authored-by: Kevin Zheng <kevinz5000@gmail.com> Co-authored-by: PoorMansDreams <150595537+PoorMansDreams@users.noreply.github.com> Co-authored-by: Hannah Giovanna Dawson <karakkaraz@gmail.com> Co-authored-by: lapatison <100279397+lapatison@users.noreply.github.com> Co-authored-by: router <messagebus@vk.com> Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Co-authored-by: Varen <ychwack@hotmail.it> Co-authored-by: potato1234_x <79580518+potato1234x@users.noreply.github.com> Co-authored-by: Hanz <41141796+Hanzdegloker@users.noreply.github.com> Co-authored-by: Ubaser <134914314+UbaserB@users.noreply.github.com> Co-authored-by: themias <89101928+themias@users.noreply.github.com> Co-authored-by: Alzore <140123969+Blackern5000@users.noreply.github.com> Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Co-authored-by: Plykiya <58439124+Plykiya@users.noreply.github.com> Co-authored-by: Plykiya <plykiya@protonmail.com> Co-authored-by: YuNii <benjamin@bhenrich.de> Co-authored-by: Kara <lunarautomaton6@gmail.com> Co-authored-by: Mangohydra <156087924+Mangohydra@users.noreply.github.com> Co-authored-by: Nim <128169402+Nimfar11@users.noreply.github.com> Co-authored-by: Jezithyr <jezithyr@gmail.com> Co-authored-by: Fluffiest Floofers <thebluewulf@gmail.com> Co-authored-by: Jajsha <101492056+Zap527@users.noreply.github.com> Co-authored-by: SlamBamActionman <83650252+SlamBamActionman@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Tayrtahn <tayrtahn@gmail.com> Co-authored-by: Flareguy <78941145+Flareguy@users.noreply.github.com> Co-authored-by: forgotmyotheraccount <133569389+forgotmyotheraccount@users.noreply.github.com> Co-authored-by: FungiFellow <151778459+FungiFellow@users.noreply.github.com> Co-authored-by: Ko4ergaPunk <62609550+Ko4ergaPunk@users.noreply.github.com> Co-authored-by: Ilya246 <57039557+Ilya246@users.noreply.github.com> Co-authored-by: Krunklehorn <42424291+Krunklehorn@users.noreply.github.com> Co-authored-by: Alex Nordlund <deep.alexander@gmail.com> Co-authored-by: EdenTheLiznerd <138748328+EdenTheLiznerd@users.noreply.github.com> Co-authored-by: deepdarkdepths <155149356+deepdarkdepths@users.noreply.github.com> Co-authored-by: Genkail <50331122+Genkail@users.noreply.github.com> Co-authored-by: Vasilis <vasilis@pikachu.systems> Co-authored-by: James Simonson <jamessimo89@gmail.com> Co-authored-by: Pieter-Jan Briers <pieterjan.briers+git@gmail.com> Co-authored-by: icekot8 <93311212+icekot8@users.noreply.github.com> Co-authored-by: Agoichi <92464780+Agoichi@users.noreply.github.com> Co-authored-by: KREKS <132602258+xKREKSx@users.noreply.github.com> Co-authored-by: 0x6273 <0x40@keemail.me> Co-authored-by: lzk <124214523+lzk228@users.noreply.github.com> Co-authored-by: Ed <96445749+TheShuEd@users.noreply.github.com> Co-authored-by: Guilherme Ornel <86210200+joshepvodka@users.noreply.github.com> Co-authored-by: Errant <35878406+Errant-4@users.noreply.github.com> Co-authored-by: wafehling <wafehling@users.noreply.github.com> Co-authored-by: Interrobang01 <113810873+Interrobang01@users.noreply.github.com> Co-authored-by: k3yw <grenadiumdota@gmail.com> Co-authored-by: Velcroboy <107660393+IamVelcroboy@users.noreply.github.com> Co-authored-by: Jeff <velcroboy333@hotmail.com> Co-authored-by: Jessica M <jessica@jessicamaybe.com> Co-authored-by: Jessica M <jessica@maybe.sh> Co-authored-by: Zadeon <loldude9000@gmail.com> Co-authored-by: brainfood1183 <113240905+brainfood1183@users.noreply.github.com> Co-authored-by: Menshin <Menshin@users.noreply.github.com> Co-authored-by: nikthechampiongr <32041239+nikthechampiongr@users.noreply.github.com> Co-authored-by: liltenhead <104418166+liltenhead@users.noreply.github.com> Co-authored-by: Leon Friedrich <60421075+ElectroJr@users.noreply.github.com> Co-authored-by: Daxxi3 <158596935+Daxxi3@users.noreply.github.com> Co-authored-by: MACMAN2003 <macman2003c@gmail.com> Co-authored-by: Golinth <amh2023@gmail.com> Co-authored-by: Łukasz Mędrek <lukasz@lukaszm.xyz> Co-authored-by: PotentiallyTom <67602105+PotentiallyTom@users.noreply.github.com> Co-authored-by: MilenVolf <63782763+MilenVolf@users.noreply.github.com> Co-authored-by: LankLTE <135308300+LankLTE@users.noreply.github.com> Co-authored-by: Flesh <62557990+PolterTzi@users.noreply.github.com> Co-authored-by: Arendian <137322659+Arendian@users.noreply.github.com> Co-authored-by: Geekyhobo <66805063+Geekyhobo@users.noreply.github.com> Co-authored-by: Geekyhobo <66805063+Ahlytlex@users.noreply.github.com> Co-authored-by: Moomoobeef <62638182+Moomoobeef@users.noreply.github.com> Co-authored-by: Peptide90 <78795277+Peptide90@users.noreply.github.com> Co-authored-by: ArchPigeon <bookmaster3@gmail.com> Co-authored-by: Killerqu00 <47712032+Killerqu00@users.noreply.github.com> Co-authored-by: Firewatch <54725557+musicmanvr@users.noreply.github.com> Co-authored-by: Vigers Ray <60344369+VigersRay@users.noreply.github.com> Co-authored-by: genderGeometries <159584039+genderGeometries@users.noreply.github.com> Co-authored-by: hiucko <86206040+Hiucko@users.noreply.github.com> Co-authored-by: Sybil <azurerosegarden@gmail.com> Co-authored-by: Ioannis Eleftheriou <me@yath.xyz> Co-authored-by: marboww <152051971+marboww@users.noreply.github.com> Co-authored-by: veprolet <68151557+veprolet@users.noreply.github.com> Co-authored-by: Mr. 27 <45323883+Dutch-VanDerLinde@users.noreply.github.com> Co-authored-by: Tonydatguy <154929293+Tonydatguy@users.noreply.github.com> Co-authored-by: Gotimanga <127038462+Gotimanga@users.noreply.github.com> Co-authored-by: MjrLandWhale <brandonemitch@gmail.com> Co-authored-by: takemysoult <143123247+takemysoult@users.noreply.github.com> Co-authored-by: Callmore <22885888+Callmore@users.noreply.github.com>
2024-02-23 23:05:48 +07:00
public class AdminWatchlist
{
[Required, Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int Id { get; set; }
[ForeignKey("Round")] public int? RoundId { get; set; }
public Round? Round { get; set; }
[ForeignKey("Player")] public Guid? PlayerUserId { get; set; }
public Player? Player { get; set; }
[Required] public TimeSpan PlaytimeAtNote { get; set; }
[Required, MaxLength(4096)] public string Message { get; set; } = string.Empty;
[ForeignKey("CreatedBy")] public Guid? CreatedById { get; set; }
public Player? CreatedBy { get; set; }
[Required] public DateTime CreatedAt { get; set; }
[ForeignKey("LastEditedBy")] public Guid? LastEditedById { get; set; }
public Player? LastEditedBy { get; set; }
[Required] public DateTime? LastEditedAt { get; set; }
public DateTime? ExpirationTime { get; set; }
public bool Deleted { get; set; }
[ForeignKey("DeletedBy")] public Guid? DeletedById { get; set; }
public Player? DeletedBy { get; set; }
public DateTime? DeletedAt { get; set; }
}
[Index(nameof(PlayerUserId))]
[Upstream] Upstream (#109) * Automatic changelog update * atlas update (#25071) * atlas update * untroll --------- Co-authored-by: deltanedas <@deltanedas:kde.org> * box update (#25074) * fland update (#25075) * marathon update (#25076) * meta update (#25077) * Syndicate key grammar fix (#25085) * Syndicate encryption key grammar fix An encryption key used by... wait... Who is owner of this chip? > An encryption key used by... wait... Who is the owner of this chip? * Syndicate key grammar fix An encryption key used by... wait... Who is owner of this chip? > An encryption key used by... wait... Who is the owner of this chip? * Fix hybridization seedless probability (#25084) Fix comparison Hybrids (different plants being crossed) are supposed to have a high chance of becoming seedless to balance overpowered plants. However, a logic error in the comparison gave seedless to plants when they were from the same seed (not hybrids) rather than the other way around. Reported by: @genderGeometries * Added Tourniquets to stop bleeds (#23198) * Fixed Error with RobustToolbox Edits. Removed the addition of secbelt tag from assault belt. * Resprite of the monstrosity * Resprite of the tourniquet NO LONGER PHALLUS SHAPED * too bright, now darker and edgier * Tourniquet resprite * metajson yay * Update Skelly Vs The Rev lobby art (#25088) Someone said the original was a bit low res and I agreed. This is a 1440p (from an 8k base image) rendition of the same scene, with a new dramatic forced perspective look, and generally cleaner art throughout. Also now there's two mothroaches. * Automatic changelog update * Minor airlock assembly clean up (#25073) 1 * Update README.md (#25067) * Update README.md * emo review Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> --------- Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> * prevent opening debug menus without perms (#25091) prevent people without permissions from opening the tile, entityspawn, or decal menus * Remove battery from crew observation kit, fix description (#25000) -Remove battery from crew observation kit, fix description * Laughin' Peas (#25089) * laughter * make clownmobs bleed laughter * laughin syrup and laughter recipe * add laughin peas * Automatic changelog update * QM drip DLC (#24477) * New Drip for the QM QM beret and QM formal uniform * Asd Asd * Adds the new clothing to the uniform printer what it says on the tin * I always forget to update the copyright RAAAAAH yup * EMT Belt Part 2 (#24289) * add * fix * aaaa * Flipped caps real (#24961) * Flipped caps real * oops * whoops * flip not fold * fix formatting * cargosoft formatting * Automatic changelog update * Nerf Beanbags (#24653) Lowers beanbag damage from 55 stam to 30 stam * Automatic changelog update * Fix screenspace popups (#24987) * Fix screenspace popups Never got around to it earlier but need to draw it above UI controls. * Minor null change * Automatic changelog update * Fix crew manifest department bugs (#24975) * Automatic changelog update * Changed door remote to trigger based on vision occlusion(#25093) Changed door remote to trigger based on vision occlusion rather than opaque collision targeting check. Ian's butt will no longer absorb your 5G signals. Co-authored-by: Plykiya <plykiya@protonmail.com> * GPS In Paramed Locker (#25096) GPS in paramed locker * Remove 'travis scott day' from the game (#25106) * remove travis scott from the game * KILL TRAVIS EVEN MORE * Automatic changelog update * Remove erroneous changelog (#25107) * fixed fland cargo shuttle not having tiny fans (sorry) (#25095) * Glass box for antique laser pistol (#25104) * glassbox * fix * Gibbing refactor (Per-part gibbing and giblet throwing!) (#24989) * Moving Gibbing rework out from medrefactor into it's own PR * Re-enabled warning for missing gibbable on TryGibEntity * Implemented better logic for gibbing failover and better logging * Allowing audio params and drop scattering customization per component. Created UnGibbable organ base types and made brains ungibbable. Removed delete brain from gibBody function. Artifact crusher does not destroy brains anymore. It only destroyed brains before not other organs which was wierd. * Update Content.Shared/Body/Systems/SharedBodySystem.Body.cs Fixing space for multiplication Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> * Added event raised when attempting to gib contained entities to allow modification of allowed and excluded container ids * removing audioParams var from component (sound specifier includes it) * Fixing signature --------- Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> * Automatic changelog update * Gibbing contents hotfix (#25114) Fixing gibbing contents not respecting Include/Exclude container lists. This is currently unused * Predict two-way levers (#25043) * Predict two-way levers Annoys me the rare occasions I touch cargo. Doesn't predict the signal but at least the lever responds immediately. * space * a * Replace Romerol with Ambuzol in chemist guidebook (#25108) replace romerol with ambuzol * Fix borgs being able to emag themselves (#24748) * Fix self emagging borgs * Add popup on self emag failure. * Ectoplasm is grindable into Necrosol (#25053) add * Automatic changelog update * Automatic changelog update * Roundstart Food Service research (#25046) add * Automatic changelog update * Add option for character name colors in chat & move coloration to clientside (#24625) * Adds option to disable character names in chat/speechbubbles * Moved the coloring of names to clientside * Move string functions to SharedChatSystem to avoid duplicate code in SpeechBubble.cs * Changed to be put under Accessibility section * Cache CVar * Automatic changelog update * Update Credits (#25115) Co-authored-by: PJBot <pieterjan.briers+bot@gmail.com> * Replace fixed drink glasses with metamorphic versions (#25134) * Replaced fixed drink glasses with metamorphic versions * Fine, no milkshake then * ambuzol beef (#25119) * Automatic changelog update * Shuttle floor resprite (#25127) * resprites shuttle tiles * resprites shuttle floor tiles & adds grey/black shuttle tiles * attributions.yml update * Adding a period to an object description (#25138) Added a period to an object description. Adds a period to silk's description. This is my first and last pull request. * Door Remote Changelog Entry (#25144) I'm so dumb. Co-authored-by: Plykiya <plykiya@protonmail.com> * Automatic changelog update * Lowered Ion Storm Reoccurence Delay to 20 (#25135) * Lowered reoccurencedelay to 45 * Lowered Further down to 20 * Re-added shivs to crafting menus (#25094) Added a recipe for crafting menu * Automatic changelog update * Color Tipped Ammo (#25103) * Tipped .35 ammo * used layers instead of new sprites * remove the useless old sprites * changed the green slightly * Automatic changelog update * Add overlay decals for mini tiles and bricks (#24949) Add minitile and brick decals overlay * Update Core (#24862) * add * Update Resources/Textures/Parallaxes/attributions.yml * sprite change * address review --------- Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> * Buyable Jani Trolley (#25139) Trolley * Added display for amount of hits left in stun batons/stun prods. (#25141) Added display for amount of hits left in stun batons/stunprods. Co-authored-by: Plykiya <plykiya@protonmail.com> * Automatic changelog update * autolatheable air tanks (#25130) * gastankening * fix price * Automatic changelog update * Fix pointing arrow trajectory (#25061) Initial commit * make linking logic gates 1000% better (#25041) * make door status use SendSignal * LastSignals and logic, add ClearSignal api too * make everything outputting a logic signal default to false * refactor ops * :trollface: * :trollface: * protoid for LastSignals * oop --------- Co-authored-by: deltanedas <@deltanedas:kde.org> * Buff emergency toolbox fill (#24225) Resolves issue #23059, for which the submitter wrote: Emergency toolboxes contain a crowbar, two flashlights (sometimes one), two breath masks, and two chocolate. With the addition of water bottles to survival boxes and emergency nitrogen tanks, I think emergency toolboxes should be updated to include said water bottles and emergency tanks. Would make these just a little bit more useful. It feels weird they don't have oxygen tanks when they have two breath masks, and since water bottles are now commonplace it would be a good idea to put them in a place where emergency food is stored as well. * Void jetpack resprite (#25150) add * Automatic changelog update * Allow configuring gen_build_info.py through environment variables (#25162) This makes the life of forks slightly easier by letting you pass an environment variable instead of having to maintain this file yourself. * Significantly nerf Deathnettles (#25068) * Balancing my beloved Significantly nerfs deathnettles so botanists can't just take down jug's like it's no issue, we have guns, we should be using them * Additional Balancing Changes. * Losing my mind * Automatic changelog update * Fix spelling errors in mechs.yml (#25168) * fix showhealthbars perms (#25157) * Allow inspecting ID's and Health of people behind glass (#25163) Hops will love me * Automatic changelog update * Fix decal error spam (#25172) * Restore MonoOverlay (#25170) https://github.com/space-wizards/space-station-14/pull/24949 nuked it. * Automatic changelog update * Added "wink" and "tearfully smiles" emotes + more cry emote variations (#25129) Added wink and tearfully smiles emote + more cries variations * Automatic changelog update * Update submodule to 210.0.0 (#25175) * Update submodule to 210.0.0 * 210.0.1 instead, the previous one was broken * 210.0.3 instead, the previous one was ALSO broken --------- Co-authored-by: Pieter-Jan Briers <pieterjan.briers+git@gmail.com> * The medical beret is real (#25176) * 1 * 2 * button is real. * Automatic changelog update * Fixed Tipped ammo not being Spent (#25167) Fix Tipped Ammo not being Spent * Automatic changelog update * Hoods and some chaplain's hats now hides hair (#25142) * Hoods now hide hair * additional plague hat and witch hat now hide hair * fixing some tags in hats * hoods tag fix * Glassbox shatter resprite (#25136) * Automatic changelog update * Random spontaneous cleanup PR (#25131) * Use new Subs.CVar helper Removes manual config OnValueChanged calls, removes need to remember to manually unsubscribe. This both reduces boilerplate and fixes many issues where subscriptions weren't removed on entity system shutdown. * Fix a bunch of warnings * More warning fixes * Use new DateTime serializer to get rid of ISerializationHooks in changelog code. * Get rid of some more ISerializationHooks for enums * And a little more * Apply suggestions from code review Co-authored-by: 0x6273 <0x40@keemail.me> --------- Co-authored-by: 0x6273 <0x40@keemail.me> * Decrease the chemical cost of regen mesh and sutures and move them to their own file (#24948) * WHYWEREMEDSINMEALRECIPES * 20chem * didiforgettosavethis * Split slime marking leg gradient (#24928) * Split slime marking leg gradient * up markings to 4 * Automatic changelog update * Require plants to be harvestable before sampling (#24851) * Add verbs to Open/Close Openable containers, and add optional seals (#24780) * Implement closing; add open/close verbs * Add breakable seals * Allow custom verb names; make condiment bottles closeable * Remove pointless VV annotations and false defaults * Split Sealable off into a new component * Should have a Closed event too * Oh hey, there are icons I could use * Ternary operator * Add support for seal visualizers * Moved Sealable to Shared, added networking * Replaced bottle_close1.ogg * Automatic changelog update * Shadow anomaly returns (#24629) * content * add cat * ambient * I FORGOT HEARTS! * fix ambient * some fixes * canCollide: false * connect to damageable * pi * remove fx * some fixes * *sad bruh* * hazed * Update base_shadow.yml * Automatic changelog update * Microwave UX enhancements (#24547) * Facelift Microwave UI Includes new background light in UI, Uses predictive input, UI now properly disables buttons when microwave is active * Microwave now shows Elapsed time * Fixed bad formatting * Added new term for "BottomMargin" * Change yellow color * Update StyleNano.cs just spacing fixed * Cook time countdown now detached from server Instead of the server constantly sending out messages for the cook countdown, it is now predicted client side using TimeSpan * Update MicrowaveMenu.xaml forgot to re-add item space * Automatic changelog update * Additional damage visualisers (#24618) * brute * add * Anomaly Synchronizer + Signallers tweaks (#24461) * content * nerf * fix rsi * Automatic changelog update * saltern update (#25182) Co-authored-by: deltanedas <@deltanedas:kde.org> * Allow players to run saveconfig command. (#25200) Benign client-side command. * Revert "Allow configuring gen_build_info.py through environment variables" (#25201) Revert "Allow configuring gen_build_info.py through environment variables (#2…" This reverts commit 163e6d2f896ccf9a37be2e17bbbad8b6514ccf4b. * Fax machines can print from text file (#23262) * added * checks tweaking * fixed what sloth wanted * fixed? * dialog diposing fix * checks tweaking * more changes * dispose streamreader * Update Content.Client/Fax/UI/FaxBoundUi.cs Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> * Update Content.Server/Fax/FaxSystem.cs Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> * fix minor typo --------- Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> * Automatic changelog update * Vox names, species prototype cleanup, some cosmetic changes (#24994) * voxnames * New generator parameters, names are more readable * bunch of missing vox stuff * more names * sad * Balanced ChemVend Stock (#25207) * Balanced ChemVend Stock ChemVend needs more balanced stock for what actually gets used * +1 Sugar * Ranged Holosigns (#25120) * Changed holo signs to be ranged and used on click rather than Z. * Updated comments * Failed attempt at ignoring walls * Getting rid of unused libraries --------- Co-authored-by: Plykiya <plykiya@protonmail.com> * Automatic changelog update * Minor test fixes (#25174) Stuff that probably shoulda been wrapped ig but our test runner stinky. * Add pun to diagnostic hud description (#25209) Seaborgium is element number 106 and is presumably what lets these glasses "see" "borgs". * Add events for TemperatureProtection and PressureProtection (#25165) * Update criminal-records.ftl (#25229) * Adds always powered variants of colored lights (#25185) Co-authored-by: Jeff <velcroboy333@hotmail.com> * Fixes silver bars being whole stacks (#25239) Co-authored-by: Jeff <velcroboy333@hotmail.com> * Makes clumsy not delete guns (#25243) clumsy no longer deletes guns Co-authored-by: Jessica M <jessica@maybe.sh> * Predict Injector (syringes), cleanup (#25235) At least the mode/transfer amount logic. Actual transfer logic needs Bloodstream which I didn't wanna move into shared. * Updated disabler to have suitStorage tag under slots. (#25238) * Automatic changelog update * Updates to Origin (#24908) Replaced medical's HM console with a CM console, added janitor equipment closet * Fix spawn priority persistence on reconnect and restart (#25246) Because of course I would forget one line * Add French accent beret (#21430) * Allow thermomachines to exchange with air instead of inlet (#25247) Add purely atmospheric heat exchange to the gas thermomachine component (in preparation for space heaters). * Fix: Holosigns can be stored again (#25249) * Holosigns can be stored again * TryComp to HasComp --------- Co-authored-by: Plykiya <plykiya@protonmail.com> * Death acidifier fix (#25251) * Automatic changelog update * Clarify stripping logs (#25190) * Indicate whether pickpocketing is stealthy in logs, change :user to :actor, and clean up messages. * Remove ugly whitespace * Do the thing I should have done but didn't because I didn't want to think * Fix spacing * Fix disposals bins not automatically flushing after an object is inserted (#25233) Fix disposals bins not automatically flushing after an object is inserted. Because of Spaghetti Code:tm:, AfterInsert() in DisposalUnitSystem still handles insertion itself. Except in all cases except drag/drop insert, the object is already inserted so this check fails and the remaining logic doesn't happen anymore. Fixed now. * Sec & greysec jumpskirt fix (#25269) * "resprites" sec & greysec jumpskirts * adjustments * Automatic changelog update * Reduce eshield hp (#25258) reduce eshield hp * Automatic changelog update * Artifact hemoglobin trigger now accepts all sentient blood types (#25240) * Artifact blood trigger now accepts all sentient blood types * Update artifact-hints.ftl * Update engine to v210.1.0 (#25288) * Made ghost.role_time a server modifiable only cvar (#25292) Fix * Nuke fancification (#25297) Actually use more icon states for deployed/armed/about to explode Also unlit layer. Also examine text * Automatic changelog update * Change copper blood from ferrous to metallic (#25217) changed copper blood from ferrous to metallic * Thindow glass dupe fix (#25304) smite glass dupe off the face of the planet eww nasty dupe exploits blehh * Automatic changelog update * Kill Seperated Mindshield Icons (#25303) * Unghettoify mindshield icons Adds support for layers in status icons, through the StatusIconLayer enum and the new "layer" datafield. Defaults to the Base layer where functionally remains unchanged. * TG icon for shield probably better than the shitty one I made in paint * forgor meta.json I forgor * Emo review Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> --------- Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> * Automatic changelog update * MORE SUFFIXES (#25314) Co-authored-by: Jeff <velcroboy333@hotmail.com> * Fix spawning glass shard for each glass sheet in stack (#25308) * fix: SpawnEntitiesBehavior now works with stacks Fixed the issue of SpawnEntitiesBehavior not executing multiple times on entities with stack conponent. Fixes #25287 * fix: reduced dictionary iterations * Automatic changelog update * Adds atmospherics access to the fire fighting door remote. Feels like… (#25097) Adds atmospherics access to the fire fighting door remote. Feels like an oversight for the atmos door remote to not have atmos access. Co-authored-by: Plykiya <plykiya@protonmail.com> * Automatic changelog update * Re-organise main menu screen (#25173) - The dummy control of 2px size has annoyed me for almost 5 years. - Why is it in the top-right. - Why is the server address not labelled. * Allow t-ray to penetrate carpets and puddles (#25276) * Allow t-ray to penetrate carpets and puddles * handle edge cases * Automatic changelog update * Add sfx for writing on paper (#25257) * Initial commit * Moved params to sound * Removed type tag * Removed null check * Forced default * Automatic changelog update * New sprites for guidebooks (#25232) * added books to roles * First pass * removed yaml to split pull requests into resprite first, then giving the books to assistants * new science * Automatic changelog update * LockVisualizer (#25224) * LockVisualizer * Fix state * Clean some code * Make it component, fix tests fail * Fix for StateUnlocked Now it is possible to manually set the unlocked state and it will work! * Optimize LockVisualizer, add check for unlocked state * No todo I guess * Solution precision fixes (#25199) * Add test for two chemistry issues 1. rounding issue with reaction processing when making chloral hydrate 2. reliable assert trip due to the ValidateSolution() heat capacity issue. * Fix FixedPoint2 arithmetic Fix internal floating point arithmetic in places where it could be avoided. Fix incorrect rounding mode used in other places (it should always floor, like regular int arithmetic). I had to add an explicit epsilon value for float -> FixedPoint2 because something like 1.05 is actually like 1.04999 and that'd cause it to be rounded down to 1.04. This fixes reaction reagent processing in cases where the reagent inputs can't cleanly divide. Previously, when making 30u chloral hydrate by adding the chlorine in 10u increments you'd end up with 0.04 chlorine left over. This was caused by division in the reaction code rounding up in some cases. Changing division here to always round down fixes it. * Attempt to fix heat capacity precision assert issues. Fixes #22126 First, we just increase the tolerance of the assert. It was way too low. Second, actually put a cap on float drift from one-off _heatCapacity changes. * Fix float -> FixedPoint2 epsilon for negative number, fix tests. * Fix DamageableTest * Oh yeah I need to call CleanReturnAsync * Automatic changelog update * WebP lobby images (#25184) * Allow webp in lobby background files * Make lobby art webp images Reduces folder from 10 MB to 2.5 MB without only slight quality loss. * Update PutLobbyScreensHere.txt * New lobby art : Blueprint (#25179) * add * replace image with webp version waiting on #25184 * Automatic changelog update * Diona Nymphs & Splitting (#24630) * Porting & implementation * Fix two stupid errors * Human not humans * fix audio path * Fix test fails & update cooldown * Work on reviews & test fail * Rework nymph organ system. * Make the nymph organs nospawn. * IsDeadIC * Automatic changelog update * reform cooldown 10 minutes (#25328) * Change plant clipping mechanics (#25326) Make seeds from clipped plants inherit the decreased health from parents. Also require one growth stage before clipping. * Automatic changelog update * Fix nymphs being deleted immediatly after spawning (#25344) * nymphs now don't get deleted together with the body of the diona * moved nymph system to server * Automatic changelog update * Fix: Grenades don't make trigger sound (#25321) * Fix: Grenades don't make trigger sound * transform instead of trycomp transform --------- Co-authored-by: Plykiya <plykiya@protonmail.com> * fixed the specific if statement called when plant age is under 0 (#25346) * Save round information into replay_final.yml (#23013) * Save round information into the replay * Add round end text too * This is way better * Get actual job * oop * OK THERE * Fake line endings to make life easier * I was told this yaml is legal * I just realised this will make my life easier * REVIEWS BABY IM A PROGRAMMER MOMMY * Live pjb reaction * Live pjb reaction 2 * Reviews 2 * Dont need this * Please no more have mercy on my soul * Oh frick * Adds a massban flag to the admin flags (#25327) Adds a massban flag to the admin flags used on ss14 to ban large amounts of players rom a .tsv file Co-authored-by: Geekyhobo <66805063+Ahlytlex@users.noreply.github.com> * Automatic changelog update * Fix missing line in nuke exploding sprite (#25351) I could've sworn I corrected this before committing but guess not ??? * Added Evidence Markers for the Detective! (#25255) * added evidence markers * box tweak * fixed a spelling mistake * new sprites, tweaked yml too * Add "tailed" hair (#25216) * add * yes * Clean up scars.yml and add a new chest scar (#25215) add * Automatic changelog update * Add new "OptionsVisualizer" (#25128) This is a visualizer somewhat similar to the Generic. It allows configuring appearance info based on specific CVars the user has set. This allows YAML to easily configure alternatives for accessibility CVars like reduced motion. * Suffix spelling mistake on seed vendor (#25352) spelling error * Update engine to v210.1.1 (#25354) Important fixes from the UI PR * Stop wagging tails on crit (#25323) * Add Flammable Touch Reaction for liquid tritium * Stop tail wagging action on crit * Revert "Add Flammable Touch Reaction for liquid tritium" This reverts commit 41be57b058a0cdee0cecfc51eb1c4a25631e62f3. * Automatic changelog update * EVA suit helmets now have (un)equip sounds (#25349) add (un)equip sounds to EVA helms * Automatic changelog update * Newton Cradle Fix + Addition to Bureaucracy Crate (#25357) fixes makes the newton cradle not able to decimate ears while also adding it to the bureaucracy crate and lowering its volume and range a little bit * Automatic changelog update * Shadow anomaly respects "reduced motion" (#25355) Enabling "reduced motion" now makes the smoke effects not animate. This helps some people with vision issues. * Fixed directional window durability (#25259) shit * Very little cleanup (#25364) * Origin Station Update 18.02.2024 (medbay update) (#25369) * Update Credits (#25360) Co-authored-by: PJBot <pieterjan.briers+bot@gmail.com> * Add bio reactions (#25366) * added more foodstuff breakdowns * Calcium doesn't exist; moved phosphorus to protein * tested reactions- some should be centrifuged * more testing tweaks * Automatic changelog update * Increase printing price for neck clothes (#25375) * Increase printing price * Update clothing.yml * Update Core (#25383) add * add icons for drinks in Solar's (#25301) * add icons for drinks in Solar's fixed colors of tea * consistently use capitals for color codes * don't add extra whitespace * Automatic changelog update * Small Nymph Changes (#25363) * Emote sounds, accent & doorbump * Oops * Only non-brains can't talk * Automatic changelog update * Bump nixpkgs rev (#25361) * Bump nixpkgs revision * Update nix-direnv * Remove extra nix functionalities Both nix-direnv and legacy command nix-shell fail. Reverting to flakes-only commands. * Pin nixpkgs per suggestion See https://github.com/space-wizards/space-station-14/pull/25361#discussion_r1494196038 * Revert nix-direnv removal * Add python3 to shell.nix * Adds guidebooks to the 4 learner roles (#25388) added the books * Automatic changelog update * Add support for metamorphic fill levels (#25022) * Added support for fill levels to metamorphic glasses * Fix warnings and cleanup * Don't break non-metamorphic fills! * Vending UI facelift (#25377) * Convert to fancy window + added footer + add list spacing * margin add * Automatic changelog update * Make metamorphic glasses use last solution's empty sprite (#25322) Make metamorphic glasses use empty sprite for the last solution they contained. * Moths can eat plushies (#25382) * Update toys.yml * fix * New sound of eating * Increased eating time * New sounds+sorting * Automatic changelog update * Make pills colorful and labeled (#25284) * Make pills colorful and labeled * Inherit pill sprites from parent * Add Flammable Touch Reaction for liquid tritium (#25281) * randomized sexless species now have epicene gender by default (#25282) Fikss * Automatic changelog update * Mechanized treatment improvements (#25356) Medical module merge * Hotfix: Set round end information for replays back to null on round start instead of round end (#25394) * Hotfix * I dont think i need this now * Fix action state handling bug (#25395) * Rejig action state handling * Fix entity arg * Fix deserialization * Automatic changelog update * Fix admin notes and database time nonsense. (#25280) God bloody christ. There's like three layers of shit here. So firstly, apparently we were still using Npgsql.EnableLegacyTimestampBehavior. This means that time values (which are stored UTC in the database) were converted to local time when read out. This meant they were passed around as kind Local to clients (instead of UTC in the case of SQLite). That's easy enough to fix just turn off the flag and fix the couple spots we're passing a local DateTime ez. Oh but it turns out there's a DIFFERENT problem with SQLite: See SQLite we definitely store the DateTimes as UTC, but when Microsoft.Data.Sqlite reads them it reads them as Kind Unspecified instead of Utc. Why are these so bad? Because the admin notes system passes DateTime instances from EF Core straight to the rest of the game code. And that means it's a PAIN IN THE ASS to run the necessary conversions to fix the DateTime instances. GOD DAMNIT now I have to make a whole new set of "Record" entities so we avoid leaking the EF Core model entities. WAAAAAAA. Fixes #19897 * PlayerListControl fixes. (#25248) * PlayerListControl fixes. Fix a button being selected by default always, which then can't be selected properly for real. This affected multiple admin UIs. This broke due to upstream RT changes but ButtonGroup was always kinda busted so whatever. Uses the new IsNoneSetAllowed to implement everything properly. Also make sure the selected player STAYS selected when filtering the list and stuff. Also this PlayerInfo record has been changed to only do equality on the User ID because otherwise it'd need to compare each field individually which would be weird. * Revert changes to ListContainer This change was made default in the engine, no longer necessary here. * Automatic changelog update * Ore crab structural weakness (#25390) * Attempt to change structural dmg of ore crab * Made ore crabs susceptible to structural damage * Automatic changelog update * Set nav map icon textures to use bilinear filtering (#25411) This just makes them look slightly better when zoomed. * Fix PlayerListControl re-raising selection changed when repopulated. (#25412) Now we just skip duplicate "item pressed" events from the ListContainer. This caused the ahelp window to unfocus the message box after sending something. Flow is something like this: you send ahelp -> bwoink window refreshes player list due to new bwoink -> repopulated player list -> sent selection change -> repopulates right pane -> line edit gets unfocused. * Train station (#24927) * some content * some next content * fixes * remove stained window * return bot message? * woah! Full map added! * map update * big update * camera server * Corvax playtest feedback * add mail system and 30$ meteor shield * update * updatik * hardwork * pipip * update * remove from mappool * fixes * sentipode * e * Mindshield outline flashes, (#25409) * Add animation support to status icons Animated like any other entity. Change the png to have all frames, add delays in meta.json, and you're good to go. * Dirty "fix" for the crashing. Still have no idea why files cannot be read without changing their path in the yaml. * Sloth review ig I still have no idea why it wont work with /Textures/ missing as a prefix. * Automatic changelog update * Small Artifact Fixes (#25416) * 20kw artifact fix * Change that hopefully doesn't completely break storage artifacts without me realising * Add roundid to replay_final.yml (#25398) oopsy i forgor * Resprite & hand position correction of Nettle & Death Nettle (#25421) Resprite of Nettle & Death Nettle. Corrected R & L hand locations for all orientations of both plants. * Automatic changelog update * balance Explosive Technology (#25397) * update arsenal yml balance ExplosiveTechnology * small changes in arsenal research small changes in arsenal research * Update arsenal.yml * Automatic changelog update * Tiny shove fix. (#25353) * Remove second shove check. * Change when popups and sounds are created. Reduces phantom shoves that feel bad. * why didn't i think of this i saw it earlier... * Replaced Is fields with prefix * remove some dependencies to fix tests??? * Automatic changelog update * fix: пара фиксов апстрима * Revert "Nuke fancification (#25297)" This reverts commit 3a45d519dcc3679375b5239b6f1881cdd1a07344. # Conflicts: # Resources/Textures/Objects/Devices/nuke.rsi/meta.json # Resources/Textures/Objects/Devices/nuke.rsi/nuclearbomb_deployed.png # Resources/Textures/Objects/Devices/nuke.rsi/nuclearbomb_exploding.png # Resources/Textures/Objects/Devices/nuke.rsi/nuclearbomb_timing.png * Revert "Shuttle floor resprite (#25127)" This reverts commit a93466ac24c7256d4b584ba830c4fa1cda253d5a. # Conflicts: # Resources/Textures/Tiles/shuttleblue.png # Resources/Textures/Tiles/shuttleorange.png # Resources/Textures/Tiles/shuttlepurple.png # Resources/Textures/Tiles/shuttlered.png # Resources/Textures/Tiles/shuttlewhite.png * Revert "New lobby art : Blueprint (#25179)" This reverts commit 90d02a590117b54a16b3af848f3b2fe0195724c9. # Conflicts: # Resources/Prototypes/lobbyscreens.yml * Revert "Added Monitor Computer Boards to Observation Kit (#24979)" This reverts commit c5027b51ecc7387a678e194fd7733a03349be536. * Revert "Small t-ray scanner resprite (#25047)" This reverts commit 601da0c3a33279beff818f82913ed2583e48c642. # Conflicts: # Resources/Textures/Objects/Tools/t-ray.rsi/tray-off.png # Resources/Textures/Objects/Tools/t-ray.rsi/tray-on.png * add: переводы * fix: фиксы под тесты --------- Co-authored-by: PJBot <pieterjan.briers+bot@gmail.com> Co-authored-by: deltanedas <39013340+deltanedas@users.noreply.github.com> Co-authored-by: Emisse <99158783+Emisse@users.noreply.github.com> Co-authored-by: Armok <155400926+ARMOKS@users.noreply.github.com> Co-authored-by: Kevin Zheng <kevinz5000@gmail.com> Co-authored-by: PoorMansDreams <150595537+PoorMansDreams@users.noreply.github.com> Co-authored-by: Hannah Giovanna Dawson <karakkaraz@gmail.com> Co-authored-by: lapatison <100279397+lapatison@users.noreply.github.com> Co-authored-by: router <messagebus@vk.com> Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Co-authored-by: Varen <ychwack@hotmail.it> Co-authored-by: potato1234_x <79580518+potato1234x@users.noreply.github.com> Co-authored-by: Hanz <41141796+Hanzdegloker@users.noreply.github.com> Co-authored-by: Ubaser <134914314+UbaserB@users.noreply.github.com> Co-authored-by: themias <89101928+themias@users.noreply.github.com> Co-authored-by: Alzore <140123969+Blackern5000@users.noreply.github.com> Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Co-authored-by: Plykiya <58439124+Plykiya@users.noreply.github.com> Co-authored-by: Plykiya <plykiya@protonmail.com> Co-authored-by: YuNii <benjamin@bhenrich.de> Co-authored-by: Kara <lunarautomaton6@gmail.com> Co-authored-by: Mangohydra <156087924+Mangohydra@users.noreply.github.com> Co-authored-by: Nim <128169402+Nimfar11@users.noreply.github.com> Co-authored-by: Jezithyr <jezithyr@gmail.com> Co-authored-by: Fluffiest Floofers <thebluewulf@gmail.com> Co-authored-by: Jajsha <101492056+Zap527@users.noreply.github.com> Co-authored-by: SlamBamActionman <83650252+SlamBamActionman@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Tayrtahn <tayrtahn@gmail.com> Co-authored-by: Flareguy <78941145+Flareguy@users.noreply.github.com> Co-authored-by: forgotmyotheraccount <133569389+forgotmyotheraccount@users.noreply.github.com> Co-authored-by: FungiFellow <151778459+FungiFellow@users.noreply.github.com> Co-authored-by: Ko4ergaPunk <62609550+Ko4ergaPunk@users.noreply.github.com> Co-authored-by: Ilya246 <57039557+Ilya246@users.noreply.github.com> Co-authored-by: Krunklehorn <42424291+Krunklehorn@users.noreply.github.com> Co-authored-by: Alex Nordlund <deep.alexander@gmail.com> Co-authored-by: EdenTheLiznerd <138748328+EdenTheLiznerd@users.noreply.github.com> Co-authored-by: deepdarkdepths <155149356+deepdarkdepths@users.noreply.github.com> Co-authored-by: Genkail <50331122+Genkail@users.noreply.github.com> Co-authored-by: Vasilis <vasilis@pikachu.systems> Co-authored-by: James Simonson <jamessimo89@gmail.com> Co-authored-by: Pieter-Jan Briers <pieterjan.briers+git@gmail.com> Co-authored-by: icekot8 <93311212+icekot8@users.noreply.github.com> Co-authored-by: Agoichi <92464780+Agoichi@users.noreply.github.com> Co-authored-by: KREKS <132602258+xKREKSx@users.noreply.github.com> Co-authored-by: 0x6273 <0x40@keemail.me> Co-authored-by: lzk <124214523+lzk228@users.noreply.github.com> Co-authored-by: Ed <96445749+TheShuEd@users.noreply.github.com> Co-authored-by: Guilherme Ornel <86210200+joshepvodka@users.noreply.github.com> Co-authored-by: Errant <35878406+Errant-4@users.noreply.github.com> Co-authored-by: wafehling <wafehling@users.noreply.github.com> Co-authored-by: Interrobang01 <113810873+Interrobang01@users.noreply.github.com> Co-authored-by: k3yw <grenadiumdota@gmail.com> Co-authored-by: Velcroboy <107660393+IamVelcroboy@users.noreply.github.com> Co-authored-by: Jeff <velcroboy333@hotmail.com> Co-authored-by: Jessica M <jessica@jessicamaybe.com> Co-authored-by: Jessica M <jessica@maybe.sh> Co-authored-by: Zadeon <loldude9000@gmail.com> Co-authored-by: brainfood1183 <113240905+brainfood1183@users.noreply.github.com> Co-authored-by: Menshin <Menshin@users.noreply.github.com> Co-authored-by: nikthechampiongr <32041239+nikthechampiongr@users.noreply.github.com> Co-authored-by: liltenhead <104418166+liltenhead@users.noreply.github.com> Co-authored-by: Leon Friedrich <60421075+ElectroJr@users.noreply.github.com> Co-authored-by: Daxxi3 <158596935+Daxxi3@users.noreply.github.com> Co-authored-by: MACMAN2003 <macman2003c@gmail.com> Co-authored-by: Golinth <amh2023@gmail.com> Co-authored-by: Łukasz Mędrek <lukasz@lukaszm.xyz> Co-authored-by: PotentiallyTom <67602105+PotentiallyTom@users.noreply.github.com> Co-authored-by: MilenVolf <63782763+MilenVolf@users.noreply.github.com> Co-authored-by: LankLTE <135308300+LankLTE@users.noreply.github.com> Co-authored-by: Flesh <62557990+PolterTzi@users.noreply.github.com> Co-authored-by: Arendian <137322659+Arendian@users.noreply.github.com> Co-authored-by: Geekyhobo <66805063+Geekyhobo@users.noreply.github.com> Co-authored-by: Geekyhobo <66805063+Ahlytlex@users.noreply.github.com> Co-authored-by: Moomoobeef <62638182+Moomoobeef@users.noreply.github.com> Co-authored-by: Peptide90 <78795277+Peptide90@users.noreply.github.com> Co-authored-by: ArchPigeon <bookmaster3@gmail.com> Co-authored-by: Killerqu00 <47712032+Killerqu00@users.noreply.github.com> Co-authored-by: Firewatch <54725557+musicmanvr@users.noreply.github.com> Co-authored-by: Vigers Ray <60344369+VigersRay@users.noreply.github.com> Co-authored-by: genderGeometries <159584039+genderGeometries@users.noreply.github.com> Co-authored-by: hiucko <86206040+Hiucko@users.noreply.github.com> Co-authored-by: Sybil <azurerosegarden@gmail.com> Co-authored-by: Ioannis Eleftheriou <me@yath.xyz> Co-authored-by: marboww <152051971+marboww@users.noreply.github.com> Co-authored-by: veprolet <68151557+veprolet@users.noreply.github.com> Co-authored-by: Mr. 27 <45323883+Dutch-VanDerLinde@users.noreply.github.com> Co-authored-by: Tonydatguy <154929293+Tonydatguy@users.noreply.github.com> Co-authored-by: Gotimanga <127038462+Gotimanga@users.noreply.github.com> Co-authored-by: MjrLandWhale <brandonemitch@gmail.com> Co-authored-by: takemysoult <143123247+takemysoult@users.noreply.github.com> Co-authored-by: Callmore <22885888+Callmore@users.noreply.github.com>
2024-02-23 23:05:48 +07:00
public class AdminMessage
{
[Required, Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int Id { get; set; }
[ForeignKey("Round")] public int? RoundId { get; set; }
public Round? Round { get; set; }
[ForeignKey("Player")]
public Guid? PlayerUserId { get; set; }
public Player? Player { get; set; }
[Required] public TimeSpan PlaytimeAtNote { get; set; }
[Required, MaxLength(4096)] public string Message { get; set; } = string.Empty;
[ForeignKey("CreatedBy")] public Guid? CreatedById { get; set; }
public Player? CreatedBy { get; set; }
[Required] public DateTime CreatedAt { get; set; }
[ForeignKey("LastEditedBy")] public Guid? LastEditedById { get; set; }
public Player? LastEditedBy { get; set; }
public DateTime? LastEditedAt { get; set; }
public DateTime? ExpirationTime { get; set; }
public bool Deleted { get; set; }
[ForeignKey("DeletedBy")] public Guid? DeletedById { get; set; }
public Player? DeletedBy { get; set; }
public DateTime? DeletedAt { get; set; }
/// <summary>
/// Whether the message has been seen at least once by the player.
/// </summary>
public bool Seen { get; set; }
/// <summary>
/// Whether the message has been dismissed permanently by the player.
/// </summary>
public bool Dismissed { get; set; }
}
}