From 1578a32fa144987175d6460af0da93ee6649f290 Mon Sep 17 00:00:00 2001 From: Pieter-Jan Briers Date: Sat, 18 Apr 2020 13:46:35 +0200 Subject: [PATCH] Put base movement in control of MovementSpeedModifierComponent. PlayerInputMoverComponent was unsuitable because it gets added/removed dynamically and is specific to players (AIs don't use it). --- .../Movement/AiControllerComponent.cs | 29 ++++-------- .../MovementSpeedModifierComponent.cs | 25 ++++++++++ .../Movement/PlayerInputMoverComponent.cs | 46 ++++--------------- 3 files changed, 42 insertions(+), 58 deletions(-) diff --git a/Content.Server/GameObjects/Components/Movement/AiControllerComponent.cs b/Content.Server/GameObjects/Components/Movement/AiControllerComponent.cs index 755d00dee7..f5e947d3d3 100644 --- a/Content.Server/GameObjects/Components/Movement/AiControllerComponent.cs +++ b/Content.Server/GameObjects/Components/Movement/AiControllerComponent.cs @@ -56,18 +56,6 @@ namespace Content.Server.GameObjects.Components.Movement serializer.DataField(ref _visionRadius, "vision", 8.0f); } - /// - /// Movement speed (m/s) that the entity walks, before modifiers - /// - [ViewVariables(VVAccess.ReadWrite)] - public float BaseWalkSpeed { get; set; } = PlayerInputMoverComponent.DefaultBaseWalkSpeed; - - /// - /// Movement speed (m/s) that the entity sprints, before modifiers - /// - [ViewVariables(VVAccess.ReadWrite)] - public float BaseSprintSpeed { get; set; } = PlayerInputMoverComponent.DefaultBaseSprintSpeed; - /// /// Movement speed (m/s) that the entity walks, after modifiers /// @@ -76,14 +64,15 @@ namespace Content.Server.GameObjects.Components.Movement { get { - float speed = BaseWalkSpeed; - if (Owner.TryGetComponent(out MovementSpeedModifierComponent component)) + if (Owner.TryGetComponent(out MovementSpeedModifierComponent component)) { - speed *= component.WalkSpeedModifier; + return component.CurrentWalkSpeed; } - return speed; + + return MovementSpeedModifierComponent.DefaultBaseWalkSpeed; } } + /// /// Movement speed (m/s) that the entity walks, after modifiers /// @@ -92,12 +81,12 @@ namespace Content.Server.GameObjects.Components.Movement { get { - float speed = BaseSprintSpeed; - if (Owner.TryGetComponent(out MovementSpeedModifierComponent component)) + if (Owner.TryGetComponent(out MovementSpeedModifierComponent component)) { - speed *= component.SprintSpeedModifier; + return component.CurrentSprintSpeed; } - return speed; + + return MovementSpeedModifierComponent.DefaultBaseSprintSpeed; } } diff --git a/Content.Server/GameObjects/Components/Movement/MovementSpeedModifierComponent.cs b/Content.Server/GameObjects/Components/Movement/MovementSpeedModifierComponent.cs index aaa6a38261..738884f463 100644 --- a/Content.Server/GameObjects/Components/Movement/MovementSpeedModifierComponent.cs +++ b/Content.Server/GameObjects/Components/Movement/MovementSpeedModifierComponent.cs @@ -1,14 +1,20 @@ using Robust.Shared.GameObjects; +using Robust.Shared.Serialization; +using Robust.Shared.ViewVariables; namespace Content.Server.GameObjects.Components.Movement { [RegisterComponent] public class MovementSpeedModifierComponent : Component { + public const float DefaultBaseWalkSpeed = 4.0f; + public const float DefaultBaseSprintSpeed = 7.0f; + public override string Name => "MovementSpeedModifier"; private float _cachedWalkSpeedModifier = 1.0f; + [ViewVariables] public float WalkSpeedModifier { get @@ -18,6 +24,7 @@ namespace Content.Server.GameObjects.Components.Movement } } private float _cachedSprintSpeedModifier; + [ViewVariables] public float SprintSpeedModifier { get @@ -27,6 +34,16 @@ namespace Content.Server.GameObjects.Components.Movement } } + [ViewVariables(VVAccess.ReadWrite)] + public float BaseWalkSpeed { get; set; } + [ViewVariables(VVAccess.ReadWrite)] + public float BaseSprintSpeed { get; set; } + + [ViewVariables] + public float CurrentWalkSpeed => WalkSpeedModifier * BaseWalkSpeed; + [ViewVariables] + public float CurrentSprintSpeed => SprintSpeedModifier * BaseSprintSpeed; + /// /// set to warn us that a component's movespeed modifier has changed /// @@ -37,6 +54,14 @@ namespace Content.Server.GameObjects.Components.Movement _movespeedModifiersNeedRefresh = true; } + public override void ExposeData(ObjectSerializer serializer) + { + base.ExposeData(serializer); + + serializer.DataField(this, p => p.BaseWalkSpeed, "baseWalkSpeed", 4); + serializer.DataField(this, p => p.BaseSprintSpeed, "baseSprintSpeed", 7); + } + /// /// Recalculate movement speed with current modifiers, or return early if no change /// diff --git a/Content.Server/GameObjects/Components/Movement/PlayerInputMoverComponent.cs b/Content.Server/GameObjects/Components/Movement/PlayerInputMoverComponent.cs index 969b071bd8..f3229c82ac 100644 --- a/Content.Server/GameObjects/Components/Movement/PlayerInputMoverComponent.cs +++ b/Content.Server/GameObjects/Components/Movement/PlayerInputMoverComponent.cs @@ -22,9 +22,6 @@ namespace Content.Server.GameObjects.Components.Movement [ComponentReference(typeof(IMoverComponent))] public class PlayerInputMoverComponent : Component, IMoverComponent, ICollideSpecial { - public const float DefaultBaseWalkSpeed = 4.0f; - public const float DefaultBaseSprintSpeed = 7.0f; - #pragma warning disable 649 [Dependency] private readonly IConfigurationManager _configurationManager; #pragma warning restore 649 @@ -37,19 +34,6 @@ namespace Content.Server.GameObjects.Components.Movement /// public override string Name => "PlayerInputMover"; - - /// - /// Movement speed (m/s) that the entity walks, before modifiers - /// - [ViewVariables(VVAccess.ReadWrite)] - public float BaseWalkSpeed { get; set; } = DefaultBaseWalkSpeed; - - /// - /// Movement speed (m/s) that the entity sprints, before modifiers - /// - [ViewVariables(VVAccess.ReadWrite)] - public float BaseSprintSpeed { get; set; } = DefaultBaseSprintSpeed; - /// /// Movement speed (m/s) that the entity walks, after modifiers /// @@ -58,12 +42,12 @@ namespace Content.Server.GameObjects.Components.Movement { get { - float speed = BaseWalkSpeed; - if (Owner.TryGetComponent(out MovementSpeedModifierComponent component)) + if (Owner.TryGetComponent(out MovementSpeedModifierComponent component)) { - speed *= component.WalkSpeedModifier; + return component.CurrentWalkSpeed; } - return speed; + + return MovementSpeedModifierComponent.DefaultBaseWalkSpeed; } } /// @@ -74,12 +58,12 @@ namespace Content.Server.GameObjects.Components.Movement { get { - float speed = BaseSprintSpeed; - if (Owner.TryGetComponent(out MovementSpeedModifierComponent component)) + if (Owner.TryGetComponent(out MovementSpeedModifierComponent component)) { - speed *= component.SprintSpeedModifier; + return component.CurrentSprintSpeed; } - return speed; + + return MovementSpeedModifierComponent.DefaultBaseSprintSpeed; } } @@ -114,20 +98,6 @@ namespace Content.Server.GameObjects.Components.Movement base.OnAdd(); } - /// - public override void ExposeData(ObjectSerializer serializer) - { - base.ExposeData(serializer); - - //only save the base speeds - the current speeds are transient. - serializer.DataReadWriteFunction("wspd", DefaultBaseWalkSpeed, value => BaseWalkSpeed = value, () => BaseWalkSpeed); - serializer.DataReadWriteFunction("rspd", DefaultBaseSprintSpeed, value => BaseSprintSpeed = value, () => BaseSprintSpeed); - - // The velocity and moving directions is usually set from player or AI input, - // so we don't want to save/load these derived fields. - } - - /// /// Toggles one of the four cardinal directions. Each of the four directions are /// composed into a single direction vector, . Enabling