From 796f59917283682a9671dcd68fc975f4245afb56 Mon Sep 17 00:00:00 2001 From: John <35928781+sporkyz@users.noreply.github.com> Date: Tue, 21 Jan 2025 04:51:27 -0500 Subject: [PATCH] Job contraband rework (#33385) * contraband system rework to allow restriction by job, not just department * Fixing detective trenchcoat inheritance * removing unnecessary using declarations * trying to fix testing error by re-adding diagnostics using declaration * removing unecessary dependency, making allowedJobs nullable * Adding all of slarti's requested changes except for the hacky job icon method fix * removing accidental whitespace * choosing to use the non-localized version because we're comparing the string against the AllowedJobs field, and the contraband classes that fill that field are written in english * removing unneeded using dec, fixing nesting logic problem * didn't remove the old nesting, doing that now * using localized job title and localizing the allowed jobs string, removing usages of JobTitle field. Also networked the _jobTitle field instead. * rewrite some stuff * fixes * fix energy pen --------- Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> --- .../Access/Components/IdCardComponent.cs | 2 ++ .../Contraband/ContrabandComponent.cs | 10 +++++- .../Contraband/ContrabandSeverityPrototype.cs | 4 +-- Content.Shared/Contraband/ContrabandSystem.cs | 36 ++++++++++++------- .../Entities/Clothing/Belt/belts.yml | 2 +- .../Entities/Clothing/Ears/headsets.yml | 2 +- .../Entities/Clothing/OuterClothing/armor.yml | 14 +++++--- .../Entities/Clothing/OuterClothing/coats.yml | 2 +- .../Entities/Clothing/OuterClothing/vests.yml | 2 +- .../Entities/Clothing/Shoes/specific.yml | 2 +- .../Objects/Devices/encryption_keys.yml | 2 +- .../Guns/Ammunition/Cartridges/shotgun.yml | 4 +-- .../Weapons/Guns/Shotguns/shotguns.yml | 4 +-- .../Objects/Weapons/Melee/e_sword.yml | 1 - .../Entities/Objects/base_contraband.yml | 32 ++++++++++++++--- .../Prototypes/contraband_severities.yml | 2 +- 16 files changed, 85 insertions(+), 36 deletions(-) diff --git a/Content.Shared/Access/Components/IdCardComponent.cs b/Content.Shared/Access/Components/IdCardComponent.cs index e80ced6464..3b8322671b 100644 --- a/Content.Shared/Access/Components/IdCardComponent.cs +++ b/Content.Shared/Access/Components/IdCardComponent.cs @@ -22,6 +22,8 @@ public sealed partial class IdCardComponent : Component [Access(typeof(SharedIdCardSystem), typeof(SharedPdaSystem), typeof(SharedAgentIdCardSystem), Other = AccessPermissions.ReadWrite)] public LocId? JobTitle; + [DataField] + [AutoNetworkedField] private string? _jobTitle; [Access(typeof(SharedIdCardSystem), typeof(SharedPdaSystem), typeof(SharedAgentIdCardSystem), Other = AccessPermissions.ReadWriteExecute)] diff --git a/Content.Shared/Contraband/ContrabandComponent.cs b/Content.Shared/Contraband/ContrabandComponent.cs index a4ce652f2f..f758d91f0c 100644 --- a/Content.Shared/Contraband/ContrabandComponent.cs +++ b/Content.Shared/Contraband/ContrabandComponent.cs @@ -24,5 +24,13 @@ public sealed partial class ContrabandComponent : Component /// [DataField] [AutoNetworkedField] - public HashSet>? AllowedDepartments = ["Security"]; + public HashSet> AllowedDepartments = new(); + + /// + /// Which jobs is this item restricted to? + /// If empty, no jobs are allowed to use this beyond the allowed departments. + /// + [DataField] + [AutoNetworkedField] + public HashSet> AllowedJobs = new(); } diff --git a/Content.Shared/Contraband/ContrabandSeverityPrototype.cs b/Content.Shared/Contraband/ContrabandSeverityPrototype.cs index c1ab4b8292..094275a6fd 100644 --- a/Content.Shared/Contraband/ContrabandSeverityPrototype.cs +++ b/Content.Shared/Contraband/ContrabandSeverityPrototype.cs @@ -19,8 +19,8 @@ public sealed partial class ContrabandSeverityPrototype : IPrototype public LocId ExamineText; /// - /// When examining the contraband, should this take into account the viewer's departments? + /// When examining the contraband, should this take into account the viewer's departments and job? /// [DataField] - public bool ShowDepartments; + public bool ShowDepartmentsAndJobs; } diff --git a/Content.Shared/Contraband/ContrabandSystem.cs b/Content.Shared/Contraband/ContrabandSystem.cs index e6931f2860..811ea53567 100644 --- a/Content.Shared/Contraband/ContrabandSystem.cs +++ b/Content.Shared/Contraband/ContrabandSystem.cs @@ -40,6 +40,7 @@ public sealed class ContrabandSystem : EntitySystem contraband.Severity = other.Severity; contraband.AllowedDepartments = other.AllowedDepartments; + contraband.AllowedJobs = other.AllowedJobs; Dirty(uid, contraband); } @@ -54,11 +55,15 @@ public sealed class ContrabandSystem : EntitySystem using (args.PushGroup(nameof(ContrabandComponent))) { + // TODO shouldn't department prototypes have a localized name instead of just using the ID for this? + var localizedDepartments = ent.Comp.AllowedDepartments.Select(p => Loc.GetString($"department-{p.Id}")); + var localizedJobs = ent.Comp.AllowedJobs.Select(p => _proto.Index(p).LocalizedName); + var severity = _proto.Index(ent.Comp.Severity); - if (severity.ShowDepartments && ent.Comp is { AllowedDepartments: not null }) + if (severity.ShowDepartmentsAndJobs) { - // TODO shouldn't department prototypes have a localized name instead of just using the ID for this? - var list = ContentLocalizationManager.FormatList(ent.Comp.AllowedDepartments.Select(p => Loc.GetString($"department-{p.Id}")).ToList()); + //creating a combined list of jobs and departments for the restricted text + var list = ContentLocalizationManager.FormatList(localizedDepartments.Concat(localizedJobs).ToList()); // department restricted text args.PushMarkup(Loc.GetString("contraband-examine-text-Restricted-department", ("departments", list))); @@ -69,23 +74,30 @@ public sealed class ContrabandSystem : EntitySystem } // text based on ID card - List>? departments = null; + List> departments = new(); + var jobId = ""; + if (_id.TryFindIdCard(args.Examiner, out var id)) { departments = id.Comp.JobDepartments; + if (id.Comp.LocalizedJobTitle is not null) + { + jobId = id.Comp.LocalizedJobTitle; + } } - // either its fully restricted, you have no departments, or your departments dont intersect with the restricted departments - if (ent.Comp.AllowedDepartments is null - || departments is null - || !departments.Intersect(ent.Comp.AllowedDepartments).Any()) + // for the jobs we compare the localized string in case you use an agent ID or custom job name that is not a prototype + if (departments.Intersect(ent.Comp.AllowedDepartments).Any() + || localizedJobs.Contains(jobId)) + { + // you are allowed to use this! + args.PushMarkup(Loc.GetString("contraband-examine-text-in-the-clear")); + } + else { + // straight to jail! args.PushMarkup(Loc.GetString("contraband-examine-text-avoid-carrying-around")); - return; } - - // otherwise fine to use :tm: - args.PushMarkup(Loc.GetString("contraband-examine-text-in-the-clear")); } } } diff --git a/Resources/Prototypes/Entities/Clothing/Belt/belts.yml b/Resources/Prototypes/Entities/Clothing/Belt/belts.yml index 621f30dbb3..77f53f9417 100644 --- a/Resources/Prototypes/Entities/Clothing/Belt/belts.yml +++ b/Resources/Prototypes/Entities/Clothing/Belt/belts.yml @@ -542,7 +542,7 @@ # Belts without visualizers - type: entity - parent: [ClothingBeltAmmoProviderBase, BaseRestrictedContraband] + parent: [ClothingBeltAmmoProviderBase, BaseSecurityBartenderContraband] id: ClothingBeltBandolier name: bandolier description: A bandolier for holding shotgun ammunition. diff --git a/Resources/Prototypes/Entities/Clothing/Ears/headsets.yml b/Resources/Prototypes/Entities/Clothing/Ears/headsets.yml index 817f83ec92..ca9d0e89a1 100644 --- a/Resources/Prototypes/Entities/Clothing/Ears/headsets.yml +++ b/Resources/Prototypes/Entities/Clothing/Ears/headsets.yml @@ -226,7 +226,7 @@ - EncryptionKeyCommon - type: entity - parent: [ClothingHeadset, BaseRestrictedContraband] + parent: [ClothingHeadset, BaseSecurityLawyerContraband] id: ClothingHeadsetSecurity name: security headset description: This is used by your elite security force. diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/armor.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/armor.yml index 2412dd9d5c..cdb938030d 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/armor.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/armor.yml @@ -1,11 +1,12 @@ # Numbers for armor here largely taken from /tg/. # NOTE: Half of the kind of armor you're probably thinking of is in vests.yml. These should probably be merged some day. -#Basic armor vest +#Basic armor vest for inheritance - type: entity parent: [ClothingOuterBaseMedium, AllowSuitStorageClothing, BaseRestrictedContraband] - id: ClothingOuterArmorBasic + id: ClothingOuterArmorBase name: armor vest + abstract: true description: A standard Type I armored vest that provides decent protection against most types of damage. components: - type: Sprite @@ -22,6 +23,11 @@ - type: ExplosionResistance damageCoefficient: 0.90 +#Standard armor vest, allowed for security and bartenders +- type: entity + parent: [ BaseSecurityBartenderContraband, ClothingOuterArmorBase] + id: ClothingOuterArmorBasic + #Alternate / slim basic armor vest - type: entity parent: ClothingOuterArmorBasic @@ -58,7 +64,7 @@ - type: GroupExamine - type: entity - parent: ClothingOuterArmorBasic + parent: ClothingOuterArmorBase id: ClothingOuterArmorBulletproof name: bulletproof vest description: A Type III heavy bulletproof vest that excels in protecting the wearer against traditional projectile weaponry and explosives to a minor extent. @@ -78,7 +84,7 @@ damageCoefficient: 0.80 - type: entity - parent: ClothingOuterArmorBasic + parent: ClothingOuterArmorBase id: ClothingOuterArmorReflective name: reflective vest description: An armored vest with advanced shielding to protect against energy weapons. diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/coats.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/coats.yml index f2dfe7c6e7..e2db7ebd94 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/coats.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/coats.yml @@ -10,7 +10,7 @@ sprite: Clothing/OuterClothing/Coats/bomber.rsi - type: entity - parent: [ClothingOuterStorageBase, AllowSuitStorageClothing, ClothingOuterArmorBasic] + parent: [ClothingOuterStorageBase, AllowSuitStorageClothing, ClothingOuterArmorBase] id: ClothingOuterCoatDetective name: detective trenchcoat description: An 18th-century multi-purpose trenchcoat. Someone who wears this means serious business. diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/vests.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/vests.yml index 994e86b548..accd24dd3c 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/vests.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/vests.yml @@ -42,7 +42,7 @@ #Detective's vest - type: entity - parent: [ClothingOuterArmorBasic, BaseRestrictedContraband] + parent: [ClothingOuterArmorBase, BaseRestrictedContraband] id: ClothingOuterVestDetective name: detective's vest description: A hard-boiled private investigator's armored vest. diff --git a/Resources/Prototypes/Entities/Clothing/Shoes/specific.yml b/Resources/Prototypes/Entities/Clothing/Shoes/specific.yml index 3a17dcde37..a5c32928da 100644 --- a/Resources/Prototypes/Entities/Clothing/Shoes/specific.yml +++ b/Resources/Prototypes/Entities/Clothing/Shoes/specific.yml @@ -104,7 +104,7 @@ sprite: Clothing/Shoes/Specific/cult.rsi - type: entity - parent: ClothingShoesBase + parent: [ ClothingShoesBase, BaseJanitorContraband ] id: ClothingShoesGaloshes name: galoshes description: Rubber boots. diff --git a/Resources/Prototypes/Entities/Objects/Devices/encryption_keys.yml b/Resources/Prototypes/Entities/Objects/Devices/encryption_keys.yml index 7393532654..2d23885bca 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/encryption_keys.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/encryption_keys.yml @@ -170,7 +170,7 @@ - state: robotics_label - type: entity - parent: [ EncryptionKey, BaseSecurityContraband ] + parent: [ EncryptionKey, BaseSecurityLawyerContraband ] id: EncryptionKeySecurity name: security encryption key description: An encryption key used by security. diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/shotgun.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/shotgun.yml index dd00440eec..a2b9fb2737 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/shotgun.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/shotgun.yml @@ -22,7 +22,7 @@ - type: entity id: ShellShotgunBeanbag name: shell (.50 beanbag) - parent: BaseShellShotgun + parent: [ BaseShellShotgun, BaseSecurityBartenderContraband ] components: - type: Tag tags: @@ -55,7 +55,7 @@ - type: entity id: ShellShotgunFlare name: shell (.50 flare) - parent: BaseShellShotgun + parent: [ BaseShellShotgun, BaseSecurityBartenderContraband ] components: - type: Tag tags: diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Shotguns/shotguns.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Shotguns/shotguns.yml index 58cf9eaed3..a927d880ef 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Shotguns/shotguns.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Shotguns/shotguns.yml @@ -103,7 +103,7 @@ - type: entity name: double-barreled shotgun - parent: [BaseWeaponShotgun, BaseGunWieldable, BaseMinorContraband] + parent: [BaseWeaponShotgun, BaseGunWieldable, BaseSecurityBartenderContraband] id: WeaponShotgunDoubleBarreled description: An immortal classic. Uses .50 shotgun shells. components: @@ -181,7 +181,7 @@ - type: entity name: sawn-off shotgun - parent: BaseWeaponShotgun + parent: [ BaseWeaponShotgun, BaseSecurityBartenderContraband ] id: WeaponShotgunSawn description: Groovy! Uses .50 shotgun shells. components: diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml index 59a27ccf0c..2e576e6a50 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml @@ -194,7 +194,6 @@ doAfterDuration: 4.0 - type: Contraband severity: Syndicate - allowedDepartments: null - type: Sprite sprite: Objects/Weapons/Melee/e_dagger.rsi layers: diff --git a/Resources/Prototypes/Entities/Objects/base_contraband.yml b/Resources/Prototypes/Entities/Objects/base_contraband.yml index 6f44767c9f..84df2f8b37 100644 --- a/Resources/Prototypes/Entities/Objects/base_contraband.yml +++ b/Resources/Prototypes/Entities/Objects/base_contraband.yml @@ -5,8 +5,6 @@ components: - type: Contraband severity: Syndicate - # no one should be carrying this around visibly! - allowedDepartments: null # minor contraband not departmentally restricted -- improvised weapons etc - type: entity @@ -15,8 +13,6 @@ components: - type: Contraband severity: Minor - # according to space law no dept is authorized to have - allowedDepartments: null # major contraband, for things like guns or weaponry that don't belong to any department and aren't syndicate specific - type: entity @@ -25,7 +21,6 @@ components: - type: Contraband severity: Major - allowedDepartments: null # minor contraband by default restricted to security only - type: entity @@ -157,6 +152,33 @@ - type: Contraband allowedDepartments: [ Medical, Science ] +# contraband restricted by job by some degree +- type: entity + id: BaseSecurityBartenderContraband + parent: BaseRestrictedContraband + abstract: true + components: + - type: Contraband + allowedDepartments: [ Security ] + allowedJobs: [ Bartender ] + +- type: entity + id: BaseSecurityLawyerContraband + parent: BaseRestrictedContraband + abstract: true + components: + - type: Contraband + allowedDepartments: [ Security ] + allowedJobs: [ Lawyer ] + +- type: entity + id: BaseJanitorContraband + parent: BaseRestrictedContraband + abstract: true + components: + - type: Contraband + allowedJobs: [ Janitor ] + # for ~objective items - type: entity id: BaseGrandTheftContraband diff --git a/Resources/Prototypes/contraband_severities.yml b/Resources/Prototypes/contraband_severities.yml index 54f5cd62ef..c103af5e0a 100644 --- a/Resources/Prototypes/contraband_severities.yml +++ b/Resources/Prototypes/contraband_severities.yml @@ -14,7 +14,7 @@ - type: contrabandSeverity id: Restricted examineText: contraband-examine-text-Restricted - showDepartments: true + showDepartmentsAndJobs: true # Having this as a regular crew member is considered grand theft. (nuke disk, captain's gear, objective items, etc) - type: contrabandSeverity -- 2.51.2