Remove IMoveSpeedModifier in favor of events (#5212)

* Remove IMoveSpeedModifier

* fucking magboots

* yope

* rabiews
This commit is contained in:
mirrorcult
2021-11-07 22:17:35 -07:00
committed by GitHub
parent 3612d25539
commit 2d3077f560
26 changed files with 236 additions and 277 deletions

View File

@@ -1,3 +1,5 @@
using Content.Shared.Movement.EntitySystems;
using Robust.Shared.Analyzers;
using Robust.Shared.Containers;
using Robust.Shared.GameObjects;
using Robust.Shared.GameStates;
@@ -7,7 +9,7 @@ using Robust.Shared.ViewVariables;
namespace Content.Shared.Movement.Components
{
[RegisterComponent]
[NetworkedComponent]
[NetworkedComponent, Friend(typeof(MovementSpeedModifierSystem))]
public sealed class MovementSpeedModifierComponent : Component
{
public const float DefaultBaseWalkSpeed = 4.0f;
@@ -15,26 +17,11 @@ namespace Content.Shared.Movement.Components
public override string Name => "MovementSpeedModifier";
private float _cachedWalkSpeedModifier = 1.0f;
[ViewVariables]
public float WalkSpeedModifier
{
get
{
RecalculateMovementSpeedModifiers();
return _cachedWalkSpeedModifier;
}
}
private float _cachedSprintSpeedModifier;
public float WalkSpeedModifier = 1.0f;
[ViewVariables]
public float SprintSpeedModifier
{
get
{
RecalculateMovementSpeedModifiers();
return _cachedSprintSpeedModifier;
}
}
public float SprintSpeedModifier = 1.0f;
[ViewVariables(VVAccess.ReadWrite)]
public float BaseWalkSpeedVV
@@ -68,52 +55,5 @@ namespace Content.Shared.Movement.Components
public float CurrentWalkSpeed => WalkSpeedModifier * BaseWalkSpeed;
[ViewVariables]
public float CurrentSprintSpeed => SprintSpeedModifier * BaseSprintSpeed;
/// <summary>
/// set to warn us that a component's movespeed modifier has changed
/// </summary>
private bool _movespeedModifiersNeedRefresh = true;
public void RefreshMovementSpeedModifiers()
{
_movespeedModifiersNeedRefresh = true;
}
public static void RefreshItemModifiers(IEntity item)
{
if (item.TryGetContainer(out var container) &&
container.Owner.TryGetComponent(out MovementSpeedModifierComponent? mod))
{
mod.RefreshMovementSpeedModifiers();
}
}
/// <summary>
/// Recalculate movement speed with current modifiers, or return early if no change
/// </summary>
private void RecalculateMovementSpeedModifiers()
{
{
if (!_movespeedModifiersNeedRefresh)
return;
var movespeedModifiers = Owner.GetAllComponents<IMoveSpeedModifier>();
float walkSpeedModifier = 1.0f;
float sprintSpeedModifier = 1.0f;
foreach (var component in movespeedModifiers)
{
walkSpeedModifier *= component.WalkSpeedModifier;
sprintSpeedModifier *= component.SprintSpeedModifier;
}
_cachedWalkSpeedModifier = walkSpeedModifier;
_cachedSprintSpeedModifier = sprintSpeedModifier;
}
_movespeedModifiersNeedRefresh = false;
}
}
public interface IMoveSpeedModifier
{
float WalkSpeedModifier { get; }
float SprintSpeedModifier { get; }
}
}

View File

@@ -1,4 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Content.Shared.Movement.Components;
using Robust.Shared.GameObjects;
using Robust.Shared.GameStates;
@@ -8,6 +10,18 @@ namespace Content.Shared.Movement.EntitySystems
{
public sealed class MovementSpeedModifierSystem : EntitySystem
{
private readonly HashSet<EntityUid> _needsRefresh = new();
public override void Update(float frameTime)
{
foreach (var uid in _needsRefresh)
{
RecalculateMovementSpeedModifiers(uid);
}
_needsRefresh.Clear();
}
public override void Initialize()
{
base.Initialize();
@@ -31,6 +45,25 @@ namespace Content.Shared.Movement.EntitySystems
component.BaseSprintSpeed = state.BaseSprintSpeed;
}
public void RefreshMovementSpeedModifiers(EntityUid uid)
{
_needsRefresh.Add(uid);
}
private void RecalculateMovementSpeedModifiers(EntityUid uid, MovementSpeedModifierComponent? move = null)
{
if (!Resolve(uid, ref move, false))
return;
var ev = new RefreshMovementSpeedModifiersEvent();
RaiseLocalEvent(uid, ev, false);
move.WalkSpeedModifier = ev.WalkSpeedModifier;
move.SprintSpeedModifier = ev.SprintSpeedModifier;
move.Dirty();
}
[Serializable, NetSerializable]
private sealed class MovementSpeedModifierComponentState : ComponentState
{
@@ -38,4 +71,21 @@ namespace Content.Shared.Movement.EntitySystems
public float BaseSprintSpeed;
}
}
/// <summary>
/// Raised on an entity to determine its new movement speed. Any system that wishes to change movement speed
/// should hook into this event and set it then. If you want this event to be raised,
/// call <see cref="MovementSpeedModifierSystem.RefreshMovementSpeedModifiers"/>.
/// </summary>
public class RefreshMovementSpeedModifiersEvent : EntityEventArgs
{
public float WalkSpeedModifier { get; private set; } = 1.0f;
public float SprintSpeedModifier { get; private set; } = 1.0f;
public void ModifySpeed(float walk, float sprint)
{
WalkSpeedModifier *= walk;
SprintSpeedModifier *= sprint;
}
}
}