From f4d2e3551b78203cfa5bb4a068ebfbdc515a2c23 Mon Sep 17 00:00:00 2001 From: Angelo Fallaria Date: Sat, 10 Aug 2024 01:28:01 +0800 Subject: [PATCH] Make Dionas Slow And Steady (#704) # Description Dionas now have 25% slower movement speed in exchange for total slip immunity and slow immunity (except lying down). Note that this also prevents slowdowns from hunger and thirst. This also fixes an existing bug with Sluggish and Snail-Paced related to `TraitSpeedModifierSystem`, as it was not applying the reduced movement speed upon spawning, only when the movement speed has been modified by another source. `TraitSpeedModifierSystem` has been moved from `Content.Server` to `Content.Shared`. This used to be a trait costing 3 points, but is now given for free to all Dionas per request of @VMSolidus. ## Media
Expand **Speed with no items** ![image](https://github.com/user-attachments/assets/b723614a-79fe-401c-ae53-2ad98ff9a6d3) **Speed wearing a jugsuit, wearing a duffel bag, holding one duffel bag in each arm, and walking through a puddle of glue covered in spider webs.** ![image](https://github.com/user-attachments/assets/a934d2c1-437f-463c-8fe3-63b7b54a1f58)
# Changelog :cl: Skubman - add: Dionas have been given a 25% slower movement speed. In exchange for that, they gain absolute slip immunity and movement speed modifier immunity. This makes them immune to slowdown from things like duffelbags, hardsuits, and spider webs. - fix: Sluggish and Snail-Paced will now properly apply their movement penalties upon joining. --- Content.Server/Standing/LayingDownSystem.cs | 2 +- .../Assorted/TraitSpeedModifierSystem.cs | 19 ------------ .../Systems/MovementSpeedModifierSystem.cs | 23 ++++++++++++-- .../SpeedModifierImmunityComponent.cs | 12 +++++++ .../TraitSpeedModifierComponent.cs | 10 +++--- .../Systems/TraitSpeedModifierSystem.cs | 31 +++++++++++++++++++ .../Entities/Mobs/Species/diona.yml | 5 +++ Resources/Prototypes/Traits/disabilities.yml | 8 +++++ Resources/Prototypes/Traits/skills.yml | 4 +++ 9 files changed, 88 insertions(+), 26 deletions(-) delete mode 100644 Content.Server/Traits/Assorted/TraitSpeedModifierSystem.cs create mode 100644 Content.Shared/Traits/Assorted/Components/SpeedModifierImmunityComponent.cs rename {Content.Server/Traits/Assorted => Content.Shared/Traits/Assorted/Components}/TraitSpeedModifierComponent.cs (52%) create mode 100644 Content.Shared/Traits/Assorted/Systems/TraitSpeedModifierSystem.cs diff --git a/Content.Server/Standing/LayingDownSystem.cs b/Content.Server/Standing/LayingDownSystem.cs index 69787ae830..73a929fdfc 100644 --- a/Content.Server/Standing/LayingDownSystem.cs +++ b/Content.Server/Standing/LayingDownSystem.cs @@ -48,7 +48,7 @@ public sealed class LayingDownSystem : EntitySystem if (TryComp(uid, out var standingState) && standingState.Standing) return; - args.ModifySpeed(component.DownedSpeedMultiplier, component.DownedSpeedMultiplier); + args.ModifySpeed(component.DownedSpeedMultiplier, component.DownedSpeedMultiplier, bypassImmunity: true); } private void OnParentChanged(EntityUid uid, LayingDownComponent component, EntParentChangedMessage args) diff --git a/Content.Server/Traits/Assorted/TraitSpeedModifierSystem.cs b/Content.Server/Traits/Assorted/TraitSpeedModifierSystem.cs deleted file mode 100644 index c804592347..0000000000 --- a/Content.Server/Traits/Assorted/TraitSpeedModifierSystem.cs +++ /dev/null @@ -1,19 +0,0 @@ -using Content.Shared.Movement.Systems; -using Content.Server.Traits.Assorted; - -namespace Content.Shared.Traits.Assorted; - -public sealed class TraitSpeedModifierSystem : EntitySystem -{ - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent(OnRefreshMovementSpeed); - } - - private void OnRefreshMovementSpeed(EntityUid uid, TraitSpeedModifierComponent component, RefreshMovementSpeedModifiersEvent args) - { - args.ModifySpeed(component.WalkModifier, component.SprintModifier); - } -} diff --git a/Content.Shared/Movement/Systems/MovementSpeedModifierSystem.cs b/Content.Shared/Movement/Systems/MovementSpeedModifierSystem.cs index 7c793d5eb8..67a238cf60 100644 --- a/Content.Shared/Movement/Systems/MovementSpeedModifierSystem.cs +++ b/Content.Shared/Movement/Systems/MovementSpeedModifierSystem.cs @@ -1,5 +1,6 @@ using Content.Shared.Inventory; using Content.Shared.Movement.Components; +using Content.Shared.Traits.Assorted.Components; using Robust.Shared.Timing; namespace Content.Shared.Movement.Systems @@ -16,7 +17,11 @@ namespace Content.Shared.Movement.Systems if (_timing.ApplyingState) return; - var ev = new RefreshMovementSpeedModifiersEvent(); + var isImmune = false; + if (HasComp(uid)) + isImmune = true; + + var ev = new RefreshMovementSpeedModifiersEvent(isImmune); RaiseLocalEvent(uid, ev); if (MathHelper.CloseTo(ev.WalkSpeedModifier, move.WalkSpeedModifier) && @@ -64,10 +69,24 @@ namespace Content.Shared.Movement.Systems public float WalkSpeedModifier { get; private set; } = 1.0f; public float SprintSpeedModifier { get; private set; } = 1.0f; - public void ModifySpeed(float walk, float sprint) + /// + /// Whether this entity is immune to most movement speed modifiers. + /// Bypassable by setting bypassImmunity to true. + /// +/// This is used to make an entity's movement speed constant and +/// never affected by almost all movement speed modifiers. +/// +[RegisterComponent, NetworkedComponent] +public sealed partial class SpeedModifierImmunityComponent : Component +{ +} diff --git a/Content.Server/Traits/Assorted/TraitSpeedModifierComponent.cs b/Content.Shared/Traits/Assorted/Components/TraitSpeedModifierComponent.cs similarity index 52% rename from Content.Server/Traits/Assorted/TraitSpeedModifierComponent.cs rename to Content.Shared/Traits/Assorted/Components/TraitSpeedModifierComponent.cs index 6acb32e6c1..85dc52a21f 100644 --- a/Content.Server/Traits/Assorted/TraitSpeedModifierComponent.cs +++ b/Content.Shared/Traits/Assorted/Components/TraitSpeedModifierComponent.cs @@ -1,14 +1,16 @@ -namespace Content.Server.Traits.Assorted; +using Robust.Shared.GameStates; + +namespace Content.Shared.Traits.Assorted.Components; /// /// This component is used for traits that modify movement speed. /// -[RegisterComponent] +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] public sealed partial class TraitSpeedModifierComponent : Component { - [DataField(required: true)] + [DataField, AutoNetworkedField] public float WalkModifier = 1.0f; - [DataField(required: true)] + [DataField, AutoNetworkedField] public float SprintModifier = 1.0f; } diff --git a/Content.Shared/Traits/Assorted/Systems/TraitSpeedModifierSystem.cs b/Content.Shared/Traits/Assorted/Systems/TraitSpeedModifierSystem.cs new file mode 100644 index 0000000000..9817ebc156 --- /dev/null +++ b/Content.Shared/Traits/Assorted/Systems/TraitSpeedModifierSystem.cs @@ -0,0 +1,31 @@ +using Content.Shared.Movement.Components; +using Content.Shared.Movement.Systems; +using Content.Shared.Traits.Assorted.Components; + +namespace Content.Shared.Traits.Assorted.Systems; + +public sealed class TraitSpeedModifierSystem : EntitySystem +{ + [Dependency] private readonly MovementSpeedModifierSystem _movement = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnStartup); + SubscribeLocalEvent(OnRefreshMovementSpeed); + } + + private void OnRefreshMovementSpeed(EntityUid uid, TraitSpeedModifierComponent component, RefreshMovementSpeedModifiersEvent args) + { + args.ModifySpeed(component.WalkModifier, component.SprintModifier, bypassImmunity: true); + } + + private void OnStartup(EntityUid uid, TraitSpeedModifierComponent component, ComponentStartup args) + { + if (!TryComp(uid, out var move)) + return; + + _movement.RefreshMovementSpeedModifiers(uid, move); + } +} diff --git a/Resources/Prototypes/Entities/Mobs/Species/diona.yml b/Resources/Prototypes/Entities/Mobs/Species/diona.yml index e1628c620a..42383d9a42 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/diona.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/diona.yml @@ -109,6 +109,11 @@ understands: - GalacticCommon - RootSpeak + - type: TraitSpeedModifier + sprintModifier: 0.75 + walkModifier: 0.75 + - type: SpeedModifierImmunity + - type: NoSlip - type: entity parent: BaseSpeciesDummy diff --git a/Resources/Prototypes/Traits/disabilities.yml b/Resources/Prototypes/Traits/disabilities.yml index 915ea0bf67..ca2453e41a 100644 --- a/Resources/Prototypes/Traits/disabilities.yml +++ b/Resources/Prototypes/Traits/disabilities.yml @@ -105,6 +105,10 @@ traits: - ParkourTraining - SnailPaced + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona components: - type: TraitSpeedModifier sprintModifier: 0.85 @@ -124,6 +128,10 @@ traits: - ParkourTraining - Sluggish + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona components: - type: TraitSpeedModifier sprintModifier: 0.7 diff --git a/Resources/Prototypes/Traits/skills.yml b/Resources/Prototypes/Traits/skills.yml index 0da622da3c..56a8549c93 100644 --- a/Resources/Prototypes/Traits/skills.yml +++ b/Resources/Prototypes/Traits/skills.yml @@ -97,6 +97,10 @@ traits: - Sluggish - SnailPaced + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona components: - type: ClimbDelayModifier climbDelayMultiplier: 0.70