CatStation/Content.Shared/Item/HeldSpeedModifierSystem.cs
Princess Cheeseballs d25c783183
Better API for Weightless Movement Modifiers (#38773)
* Make IsWeightless event based

* Extremely stupid bugfix how did I not catch this

* Ancient forbidden bugfix

* Merge conflicts?

* Fix merge conflicts

* Push

* fix

* AAAAAAAAAAAAA

* AAAAAAAAAAAAAAAA 2

---------

Co-authored-by: Princess Cheeseballs <66055347+Pronana@users.noreply.github.com>
2026-07-15 02:41:43 +00:00

57 lines
2.4 KiB
C#

using Content.Shared.Clothing;
using Content.Shared.Hands;
using Content.Shared.Movement.Components;
using Content.Shared.Movement.Systems;
namespace Content.Shared.Item;
/// <summary>
/// This handles <see cref="HeldSpeedModifierComponent"/>
/// </summary>
public sealed partial class HeldSpeedModifierSystem : EntitySystem
{
[Dependency] private MovementSpeedModifierSystem _movementSpeedModifier = default!;
/// <inheritdoc/>
public override void Initialize()
{
SubscribeLocalEvent<HeldSpeedModifierComponent, GotEquippedHandEvent>(OnGotEquippedHand);
SubscribeLocalEvent<HeldSpeedModifierComponent, GotUnequippedHandEvent>(OnGotUnequippedHand);
SubscribeLocalEvent<HeldSpeedModifierComponent, HeldRelayedEvent<RefreshMovementSpeedModifiersEvent>>(OnRefreshMovementSpeedModifiers);
SubscribeLocalEvent<HeldSpeedModifierComponent, HeldRelayedEvent<RefreshWeightlessModifiersEvent>>(OnRefreshWeightlessModifiers);
}
private void OnGotEquippedHand(Entity<HeldSpeedModifierComponent> ent, ref GotEquippedHandEvent args)
{
_movementSpeedModifier.RefreshMovementModifiers(args.User);
}
private void OnGotUnequippedHand(Entity<HeldSpeedModifierComponent> ent, ref GotUnequippedHandEvent args)
{
_movementSpeedModifier.RefreshMovementModifiers(args.User);
}
public (float,float) GetHeldMovementSpeedModifiers(EntityUid uid, HeldSpeedModifierComponent component)
{
var walkMod = component.WalkModifier;
var sprintMod = component.SprintModifier;
if (component.MirrorClothingModifier && TryComp<ClothingSpeedModifierComponent>(uid, out var clothingSpeedModifier))
{
walkMod = clothingSpeedModifier.WalkModifier;
sprintMod = clothingSpeedModifier.SprintModifier;
}
return (walkMod, sprintMod);
}
private void OnRefreshMovementSpeedModifiers(EntityUid uid, HeldSpeedModifierComponent component, HeldRelayedEvent<RefreshMovementSpeedModifiersEvent> args)
{
var (walkMod, sprintMod) = GetHeldMovementSpeedModifiers(uid, component);
args.Args.ModifySpeed(walkMod, sprintMod);
}
private void OnRefreshWeightlessModifiers(Entity<HeldSpeedModifierComponent> ent, ref HeldRelayedEvent<RefreshWeightlessModifiersEvent> args)
{
args.Args.ModifyAcceleration(ent.Comp.WeightlessAcceleration);
}
}