From b24ec257b7e551027bc49a7df8bbe56a703557f0 Mon Sep 17 00:00:00 2001 From: BarryNorfolk Date: Fri, 23 Jan 2026 08:38:17 +0100 Subject: [PATCH] Extend DV trait system to handle status effects --- .../Tests/_DV/TraitSystemTest.cs | 3 +++ Content.Server/_DV/Traits/TraitSystem.cs | 4 ++++ .../Traits/Conditions/BaseTraitCondition.cs | 2 ++ .../_DV/Traits/Effects/ApplyStatusEffect.cs | 23 +++++++++++++++++++ .../_DV/Traits/Effects/BaseTraitEffect.cs | 2 ++ .../Prototypes/_DV/Traits/disabilities.yml | 6 ++--- 6 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 Content.Shared/_DV/Traits/Effects/ApplyStatusEffect.cs diff --git a/Content.IntegrationTests/Tests/_DV/TraitSystemTest.cs b/Content.IntegrationTests/Tests/_DV/TraitSystemTest.cs index 5daf838b25..670b443de2 100644 --- a/Content.IntegrationTests/Tests/_DV/TraitSystemTest.cs +++ b/Content.IntegrationTests/Tests/_DV/TraitSystemTest.cs @@ -7,6 +7,7 @@ using Content.Shared._DV.Traits.Effects; using Content.Shared.Hands.Components; using Content.Shared.Hands.EntitySystems; using Content.Shared.Nutrition.Components; +using Content.Shared.StatusEffectNew; using Robust.Shared.GameObjects; using Robust.Shared.IoC; using Robust.Shared.Log; @@ -773,6 +774,7 @@ public sealed partial class TraitSystemTest LogMan = IoCManager.Resolve(), JobId = jobId, SpeciesId = speciesId, + StatusEffects = IoCManager.Resolve(), }; } @@ -790,6 +792,7 @@ public sealed partial class TraitSystemTest CompFactory = factory, LogMan = IoCManager.Resolve(), Transform = entMan.GetComponent(player), + StatusEffects = IoCManager.Resolve(), }; } diff --git a/Content.Server/_DV/Traits/TraitSystem.cs b/Content.Server/_DV/Traits/TraitSystem.cs index f3d67e2571..d43cfe1f2e 100644 --- a/Content.Server/_DV/Traits/TraitSystem.cs +++ b/Content.Server/_DV/Traits/TraitSystem.cs @@ -9,6 +9,7 @@ using Content.Shared.Humanoid; using Content.Shared.Humanoid.Prototypes; using Content.Shared.Preferences; using Content.Shared.Roles; +using Content.Shared.StatusEffectNew; using Robust.Shared.Configuration; using Robust.Shared.Player; using Robust.Shared.Prototypes; @@ -25,6 +26,7 @@ public sealed class TraitSystem : EntitySystem [Dependency] private readonly ILogManager _log = default!; [Dependency] private readonly IPrototypeManager _prototype = default!; [Dependency] private readonly SharedHandsSystem _hands = default!; + [Dependency] private readonly StatusEffectsSystem _statusEffects = default!; private int _maxTraitCount; private int _maxTraitPoints; @@ -104,6 +106,7 @@ public sealed class TraitSystem : EntitySystem JobId = jobId, SpeciesId = speciesId, Profile = profile, + StatusEffects = _statusEffects }; foreach (var traitId in selectedTraits) @@ -272,6 +275,7 @@ public sealed class TraitSystem : EntitySystem CompFactory = _factory, LogMan = _log, Transform = transform, + StatusEffects = _statusEffects, }; foreach (var effect in trait.Effects) diff --git a/Content.Shared/_DV/Traits/Conditions/BaseTraitCondition.cs b/Content.Shared/_DV/Traits/Conditions/BaseTraitCondition.cs index 293dceeb7e..68781af5d2 100644 --- a/Content.Shared/_DV/Traits/Conditions/BaseTraitCondition.cs +++ b/Content.Shared/_DV/Traits/Conditions/BaseTraitCondition.cs @@ -1,4 +1,5 @@ using Content.Shared.Preferences; +using Content.Shared.StatusEffectNew; using JetBrains.Annotations; using Robust.Shared.Player; using Robust.Shared.Prototypes; @@ -48,6 +49,7 @@ public sealed class TraitConditionContext public required IPrototypeManager Proto { get; init; } public required IComponentFactory CompFactory { get; init; } public required ILogManager LogMan { get; init; } + public required StatusEffectsSystem StatusEffects { get; init; } /// /// The job ID of the player, if available. diff --git a/Content.Shared/_DV/Traits/Effects/ApplyStatusEffect.cs b/Content.Shared/_DV/Traits/Effects/ApplyStatusEffect.cs new file mode 100644 index 0000000000..712d628825 --- /dev/null +++ b/Content.Shared/_DV/Traits/Effects/ApplyStatusEffect.cs @@ -0,0 +1,23 @@ +using Robust.Shared.Prototypes; + +namespace Content.Shared._DV.Traits.Effects; + +/// +/// Effect that adds status effects to the player entity. +/// +public sealed partial class ApplyStatusEffect : BaseTraitEffect +{ + /// + /// The status effects to add to the entity. + /// + [DataField(required: true)] + public HashSet StatusEffects = new(); + + public override void Apply(TraitEffectContext ctx) + { + foreach (var effect in StatusEffects) + { + ctx.StatusEffects.TrySetStatusEffectDuration(ctx.Player, effect); + } + } +} diff --git a/Content.Shared/_DV/Traits/Effects/BaseTraitEffect.cs b/Content.Shared/_DV/Traits/Effects/BaseTraitEffect.cs index a901e626d1..8e3118258e 100644 --- a/Content.Shared/_DV/Traits/Effects/BaseTraitEffect.cs +++ b/Content.Shared/_DV/Traits/Effects/BaseTraitEffect.cs @@ -1,3 +1,4 @@ +using Content.Shared.StatusEffectNew; using JetBrains.Annotations; using Robust.Shared.Prototypes; @@ -28,4 +29,5 @@ public sealed class TraitEffectContext public required IComponentFactory CompFactory { get; init; } public required ILogManager LogMan { get; init; } public required TransformComponent Transform { get; init; } + public required StatusEffectsSystem StatusEffects { get; init; } } diff --git a/Resources/Prototypes/_DV/Traits/disabilities.yml b/Resources/Prototypes/_DV/Traits/disabilities.yml index a8f6635fc1..b021d5c9ca 100644 --- a/Resources/Prototypes/_DV/Traits/disabilities.yml +++ b/Resources/Prototypes/_DV/Traits/disabilities.yml @@ -117,9 +117,9 @@ description: trait-painnumbness-desc category: Disabilities effects: - - !type:AddCompsEffect - components: - - type: PainNumbness + - !type:ApplyStatusEffect + statusEffects: + - PainNumbnessTraitStatusEffect - type: trait id: Hemophilia