From: Ed <96445749+TheShuEd@users.noreply.github.com> Date: Mon, 19 Aug 2024 11:42:55 +0000 (+0300) Subject: No pacifist or blind sec (#30777) X-Git-Url: https://git.smokeofanarchy.ru/gitweb.cgi?a=commitdiff_plain;h=055dfe6f0baa18d7ca462fc0f6a85621c812df69;p=space-station-14.git No pacifist or blind sec (#30777) * no pacifist sec * also block blindness * Update warden.yml * Update security_officer.yml * Update head_of_security.yml * Update security_cadet.yml * Update detective.yml --- diff --git a/Content.Shared/Roles/JobRequirement/TraitsRequirement.cs b/Content.Shared/Roles/JobRequirement/TraitsRequirement.cs new file mode 100644 index 0000000000..418afba159 --- /dev/null +++ b/Content.Shared/Roles/JobRequirement/TraitsRequirement.cs @@ -0,0 +1,67 @@ +using System.Diagnostics.CodeAnalysis; +using System.Text; +using Content.Shared.Humanoid.Prototypes; +using Content.Shared.Preferences; +using Content.Shared.Traits; +using JetBrains.Annotations; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; +using Robust.Shared.Utility; + +namespace Content.Shared.Roles; + +/// +/// Requires a character to have, or not have, certain traits +/// +[UsedImplicitly] +[Serializable, NetSerializable] +public sealed partial class TraitsRequirement : JobRequirement +{ + [DataField(required: true)] + public HashSet> Traits = new(); + + public override bool Check(IEntityManager entManager, + IPrototypeManager protoManager, + HumanoidCharacterProfile? profile, + IReadOnlyDictionary playTimes, + [NotNullWhen(false)] out FormattedMessage? reason) + { + reason = new FormattedMessage(); + + if (profile is null) //the profile could be null if the player is a ghost. In this case we don't need to block the role selection for ghostrole + return true; + + var sb = new StringBuilder(); + sb.Append("[color=yellow]"); + foreach (var t in Traits) + { + sb.Append(Loc.GetString(protoManager.Index(t).Name) + " "); + } + + sb.Append("[/color]"); + + if (!Inverted) + { + reason = FormattedMessage.FromMarkupPermissive($"{Loc.GetString("role-timer-whitelisted-traits")}\n{sb}"); + //at least one of + foreach (var trait in Traits) + { + if (profile.TraitPreferences.Contains(trait)) + return true; + } + return false; + } + else + { + reason = FormattedMessage.FromMarkupPermissive($"{Loc.GetString("role-timer-blacklisted-traits")}\n{sb}"); + + foreach (var trait in Traits) + { + if (profile.TraitPreferences.Contains(trait)) + return false; + } + } + + return true; + } +} diff --git a/Resources/Locale/en-US/job/role-requirements.ftl b/Resources/Locale/en-US/job/role-requirements.ftl index f0fff98c09..00281fa6cd 100644 --- a/Resources/Locale/en-US/job/role-requirements.ftl +++ b/Resources/Locale/en-US/job/role-requirements.ftl @@ -8,6 +8,8 @@ role-timer-age-to-old = Your character's age must be at most [color=yellow]{$age role-timer-age-to-young = Your character's age must be at least [color=yellow]{$age}[/color] to play this role. role-timer-whitelisted-species = Your character must be one of the following species to play this role: role-timer-blacklisted-species = Your character must not be one of the following species to play this role: +role-timer-whitelisted-traits = Your character must have one of the following traits: +role-timer-blacklisted-traits = Your character must not have any of the following traits: role-timer-locked = Locked (hover for details) diff --git a/Resources/Prototypes/Roles/Jobs/Security/detective.yml b/Resources/Prototypes/Roles/Jobs/Security/detective.yml index 22ef115d7c..f44b424f40 100644 --- a/Resources/Prototypes/Roles/Jobs/Security/detective.yml +++ b/Resources/Prototypes/Roles/Jobs/Security/detective.yml @@ -4,9 +4,9 @@ description: job-description-detective playTimeTracker: JobDetective requirements: - - !type:DepartmentTimeRequirement - department: Security - time: 54000 # 15 hours + - !type:DepartmentTimeRequirement + department: Security + time: 54000 # 15 hours startingGear: DetectiveGear icon: "JobIconDetective" supervisors: job-supervisors-hos