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