diff --git a/Content.Client/Preferences/ClientPreferencesManager.cs b/Content.Client/Preferences/ClientPreferencesManager.cs index 9ede456f6c..9c3fd7ccd2 100644 --- a/Content.Client/Preferences/ClientPreferencesManager.cs +++ b/Content.Client/Preferences/ClientPreferencesManager.cs @@ -1,10 +1,10 @@ -using System; -using System.Collections.Generic; using System.Linq; +using Content.Client.Administration.Managers; using Content.Client.White.Sponsors; +using Content.Shared.Administration; using Content.Shared.Preferences; using Robust.Client; -using Robust.Shared.IoC; +using Robust.Client.Player; using Robust.Shared.Network; using Robust.Shared.Utility; @@ -22,6 +22,8 @@ namespace Content.Client.Preferences //WD-EDIT [Dependency] private readonly SponsorsManager _sponsorsManager = default!; + [Dependency] private readonly IPlayerManager _playerManager = default!; + [Dependency] private readonly IClientAdminManager _adminManager = default!; //WD-EDIT public event Action? OnServerDataLoaded; @@ -67,7 +69,7 @@ namespace Content.Client.Preferences { //WD-EDIT var allowedMarkings = _sponsorsManager.TryGetInfo(out var sponsor) ? sponsor.AllowedMarkings : new string[]{}; - profile.EnsureValid(allowedMarkings); + profile.EnsureValid(allowedMarkings, _adminManager.HasFlag(AdminFlags.AdminSpecies)); //WD-EDIT var characters = new Dictionary(Preferences.Characters) {[slot] = profile}; Preferences = new PlayerPreferences(characters, Preferences.SelectedCharacterIndex, Preferences.AdminOOCColor); diff --git a/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml.cs b/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml.cs index e6431c9da5..60be5c84fe 100644 --- a/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml.cs +++ b/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml.cs @@ -1,5 +1,6 @@ using System.Linq; using System.Numerics; +using Content.Client.Administration.Managers; using Content.Client.Humanoid; using Content.Client.Lobby.UI; using Content.Client.Message; @@ -7,6 +8,7 @@ using Content.Client.Players.PlayTimeTracking; using Content.Client.Stylesheets; using Content.Client.UserInterface.Controls; using Content.Client.White.Sponsors; +using Content.Shared.Administration; using Content.Shared.CCVar; using Content.Shared.GameTicking; using Content.Shared.Humanoid; @@ -27,11 +29,13 @@ using Robust.Client.UserInterface.XAML; using Robust.Client.Utility; using Robust.Shared.Configuration; using Robust.Shared.Enums; +using Robust.Shared.Log; using Robust.Shared.Map; using Robust.Shared.Prototypes; using Robust.Shared.Random; using Robust.Shared.Timing; using Robust.Shared.Utility; +using TerraFX.Interop.Windows; using static Robust.Client.UserInterface.Controls.BoxContainer; using Direction = Robust.Shared.Maths.Direction; @@ -58,6 +62,7 @@ namespace Content.Client.Preferences.UI //WD-EDIT private readonly SponsorsManager _sponsorsManager; + private readonly IClientAdminManager _adminManager; //WD-EDIT private readonly IClientPreferencesManager _preferencesManager; @@ -128,6 +133,7 @@ namespace Content.Client.Preferences.UI { RobustXamlLoader.Load(this); _sponsorsManager = IoCManager.Resolve(); + _adminManager = IoCManager.Resolve(); _prototypeManager = prototypeManager; _entMan = entityManager; _preferencesManager = preferencesManager; @@ -208,37 +214,11 @@ namespace Content.Client.Preferences.UI #region Species //WD EDIT - _speciesList = prototypeManager.EnumeratePrototypes().Where(o => o.RoundStart).ToList(); - - if (_sponsorsManager.TryGetInfo(out var sponsor)) - { - for (int i = _speciesList.Count - 1; i >= 0; i--) - { - var specie = _speciesList[i]; - - if (specie.SponsorOnly && !sponsor.AllowedMarkings.Contains(specie.ID)) - { - _speciesList.RemoveAt(i); - } - } - } - else - { - for (int i = _speciesList.Count - 1; i >= 0; i--) - { - var specie = _speciesList[i]; - - if (specie.SponsorOnly) - { - _speciesList.RemoveAt(i); - } - } - } + _speciesList = GetAllowedSpecies(); //WD EDIT END for (var i = 0; i < _speciesList.Count; i++) { - var specie = _speciesList[i]; // WD EDIT var name = Loc.GetString(specie.Name); @@ -1228,6 +1208,54 @@ namespace Content.Client.Preferences.UI } } + //WD EDIT + private List GetAllowedSpecies() + { + var allowedSpecies = new List(); + + var rawSpecieList = _prototypeManager.EnumeratePrototypes() + .Where((specie) => + { + if (specie.RoundStart && (specie.SponsorOnly || specie.ForAdmins)) + { + return true; + } + else if (specie.RoundStart) + { + allowedSpecies.Add(specie); + return false; + } + return false; + }).ToList(); + + if (_sponsorsManager.TryGetInfo(out var sponsor)) + { + foreach (var specie in rawSpecieList) + { + if (specie.SponsorOnly + && sponsor.AllowedMarkings.Contains(specie.ID) + && !allowedSpecies.Contains(specie)) + { + allowedSpecies.Add(specie); + } + } + } + + if (_adminManager.HasFlag(AdminFlags.AdminSpecies)) + { + foreach (var specie in rawSpecieList) + { + if (specie.ForAdmins && !allowedSpecies.Contains(specie)) + { + allowedSpecies.Add(specie); + } + } + } + + return allowedSpecies; + } + //WD EDIT END + private void UpdateJobPriorities() { foreach (var prioritySelector in _jobPriorities) diff --git a/Content.Server/Preferences/Managers/ServerPreferencesManager.cs b/Content.Server/Preferences/Managers/ServerPreferencesManager.cs index 7047ada9db..346a9a0042 100644 --- a/Content.Server/Preferences/Managers/ServerPreferencesManager.cs +++ b/Content.Server/Preferences/Managers/ServerPreferencesManager.cs @@ -2,6 +2,7 @@ using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Threading; using System.Threading.Tasks; +using Content.Server.Administration.Managers; using Content.Server.Database; using Content.Server.Humanoid; using Content.Server.White.Sponsors; @@ -29,7 +30,9 @@ namespace Content.Server.Preferences.Managers [Dependency] private readonly IPrototypeManager _protos = default!; // WD-EDIT + [Dependency] private readonly IPlayerManager _playerManager = default!; [Dependency] private readonly SponsorsManager _sponsors = default!; + [Dependency] private readonly IAdminManager _adminManager = default!; // WD-EDIT // Cache player prefs on the server so we don't need as much async hell related to them. @@ -104,7 +107,14 @@ namespace Content.Server.Preferences.Managers // WD-EDIT var allowedMarkings = _sponsors.TryGetInfo(message.MsgChannel.UserId, out var sponsor) ? sponsor.AllowedMarkings : new string[]{}; - profile.EnsureValid(allowedMarkings); + + bool isAdminSpecie = false; + if (_playerManager.TryGetSessionById(message.MsgChannel.UserId, out var session)) + { + isAdminSpecie = _adminManager.HasAdminFlag(session, Shared.Administration.AdminFlags.AdminSpecies); + } + + profile.EnsureValid(allowedMarkings, isAdminSpecie); // WD-EDIT var profiles = new Dictionary(curPrefs.Characters) @@ -204,7 +214,8 @@ namespace Content.Server.Preferences.Managers foreach (var (_, profile) in prefs.Characters) { var allowedMarkings = _sponsors.TryGetInfo(session.UserId, out var sponsor) ? sponsor.AllowedMarkings : new string[]{}; - profile.EnsureValid(allowedMarkings); + bool isAdminSpecie = _adminManager.HasAdminFlag(session, Shared.Administration.AdminFlags.AdminSpecies); + profile.EnsureValid(allowedMarkings, isAdminSpecie); } // WD-EDIT diff --git a/Content.Shared/Administration/AdminFlags.cs b/Content.Shared/Administration/AdminFlags.cs index 845826e62f..4e30fa89d7 100644 --- a/Content.Shared/Administration/AdminFlags.cs +++ b/Content.Shared/Administration/AdminFlags.cs @@ -1,4 +1,4 @@ -namespace Content.Shared.Administration +namespace Content.Shared.Administration { /// /// Permissions that admins can have. @@ -94,6 +94,8 @@ /// MeatyOre = 1 << 15, + AdminSpecies = 1 << 16, + /// /// Dangerous host permissions like scsi. /// diff --git a/Content.Shared/Humanoid/Prototypes/SpeciesPrototype.cs b/Content.Shared/Humanoid/Prototypes/SpeciesPrototype.cs index 663120d587..cc48b08b50 100644 --- a/Content.Shared/Humanoid/Prototypes/SpeciesPrototype.cs +++ b/Content.Shared/Humanoid/Prototypes/SpeciesPrototype.cs @@ -128,6 +128,9 @@ public sealed partial class SpeciesPrototype : IPrototype [DataField("sponsorOnly")] public bool SponsorOnly { get; } = false; + + [DataField("forAmins")] + public bool ForAdmins { get; } = false; } public enum SpeciesNaming : byte diff --git a/Content.Shared/Preferences/HumanoidCharacterProfile.cs b/Content.Shared/Preferences/HumanoidCharacterProfile.cs index 9c06ef1f3c..698a444802 100644 --- a/Content.Shared/Preferences/HumanoidCharacterProfile.cs +++ b/Content.Shared/Preferences/HumanoidCharacterProfile.cs @@ -15,6 +15,8 @@ using Robust.Shared.Prototypes; using Robust.Shared.Random; using Robust.Shared.Serialization; using Robust.Shared.Utility; +using Content.Shared.Administration.Managers; +using Content.Shared.Administration; namespace Content.Shared.Preferences { @@ -406,7 +408,7 @@ namespace Content.Shared.Preferences return Appearance.MemberwiseEquals(other.Appearance); } - public void EnsureValid(string[] sponsorMarkings) //WD-EDIT + public void EnsureValid(string[] sponsorMarkings, bool isAdminSpecie) //WD-EDIT { var prototypeManager = IoCManager.Resolve(); @@ -416,7 +418,8 @@ namespace Content.Shared.Preferences speciesPrototype = prototypeManager.Index(Species); } - if (speciesPrototype.SponsorOnly && !sponsorMarkings.Contains(Species)) + if (speciesPrototype.SponsorOnly && !sponsorMarkings.Contains(Species) + && speciesPrototype.ForAdmins && !isAdminSpecie) { Species = SharedHumanoidAppearanceSystem.DefaultSpecies; speciesPrototype = prototypeManager.Index(Species); diff --git a/Content.Shared/Preferences/ICharacterProfile.cs b/Content.Shared/Preferences/ICharacterProfile.cs index f49a4d5152..6467f40e85 100644 --- a/Content.Shared/Preferences/ICharacterProfile.cs +++ b/Content.Shared/Preferences/ICharacterProfile.cs @@ -13,6 +13,6 @@ namespace Content.Shared.Preferences /// /// Makes this profile valid so there's no bad data like negative ages. /// - void EnsureValid(string[] sponsorMarkings); //WD-EDIT + void EnsureValid(string[] sponsorMarkings, bool isAdminSpecie); //WD-EDIT } } diff --git a/Resources/Prototypes/White/Species/felinid.yml b/Resources/Prototypes/White/Species/felinid.yml index 5cc33f76a3..027d9b7496 100644 --- a/Resources/Prototypes/White/Species/felinid.yml +++ b/Resources/Prototypes/White/Species/felinid.yml @@ -10,6 +10,7 @@ bodyTypes: - HumanNormal sponsorOnly: true + forAmins: true - type: markingPoints id: MobFelinidMarkingLimits