Files
wwdpublic/Content.Shared/Movement/Components/InputMoverComponent.cs
DEATHB4DEFEAT ac2fc06e10 Invert the Running/Walking States (#485)
# Description

Ports
https://github.com/Simple-Station/Parkstation-Friendly-Chainsaw/pull/39

A change made to encourage people to [stop and smell the
roses](https://www.urbandictionary.com/define.php?term=slow+down+and+smell+the+roses),
instead of sprinting everywhere trying to get shit done.
This goes well with #486, so people don't actually *have* to rush places
to try to get things done before the shift ends fatally.
It's weird anyway how we're all constantly sprinting everywhere and have
to *very actively* choose not to (and why would you?).
Increases the default speeds so that walking isn't painfully slow and
sprinting feels more like sprinting in combination with the active
choice to sprint.

Someone needs to PR changing the default sprint or examine buttons, so
people can fight and sprint with this change.
(A lot of other default keybinds suck or conflict too and need to
change)

# Media

Terrible video but whatever


https://github.com/user-attachments/assets/5ff3863d-92c8-4df3-b76b-82874b5e1ae3

# Changelog

🆑
- tweak: The station's crew hivemind has decided to slow down their
movement and enjoy The Park instead of sprinting everywhere

---------

Signed-off-by: DEATHB4DEFEAT <77995199+DEATHB4DEFEAT@users.noreply.github.com>
Co-authored-by: Pspritechologist <81725545+Pspritechologist@users.noreply.github.com>
2024-08-01 09:30:47 +01:00

100 lines
4.0 KiB
C#

using System.Numerics;
using Content.Shared.Alert;
using Content.Shared.CCVar;
using Content.Shared.Movement.Systems;
using Robust.Shared.Configuration;
using Robust.Shared.GameStates;
using Robust.Shared.Serialization;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom;
using Robust.Shared.Timing;
using Robust.Shared.Prototypes;
namespace Content.Shared.Movement.Components
{
[RegisterComponent, NetworkedComponent]
public sealed partial class InputMoverComponent : Component
{
// This class has to be able to handle server TPS being lower than client FPS.
// While still having perfectly responsive movement client side.
// We do this by keeping track of the exact sub-tick values that inputs are pressed on the client,
// and then building a total movement vector based on those sub-tick steps.
//
// We keep track of the last sub-tick a movement input came in,
// Then when a new input comes in, we calculate the fraction of the tick the LAST input was active for
// (new sub-tick - last sub-tick)
// and then add to the total-this-tick movement vector
// by multiplying that fraction by the movement direction for the last input.
// This allows us to incrementally build the movement vector for the current tick,
// without having to keep track of some kind of list of inputs and calculating it later.
//
// We have to keep track of a separate movement vector for walking and sprinting,
// since we don't actually know our current movement speed while processing inputs.
// We change which vector we write into based on whether we were sprinting after the previous input.
// (well maybe we do but the code is designed such that MoverSystem applies movement speed)
// (and I'm not changing that)
/// <summary>
/// Should our velocity be applied to our parent?
/// </summary>
[ViewVariables(VVAccess.ReadWrite), DataField("toParent")]
public bool ToParent = false;
public GameTick LastInputTick;
public ushort LastInputSubTick;
public Vector2 CurTickWalkMovement;
public Vector2 CurTickSprintMovement;
public MoveButtons HeldMoveButtons = MoveButtons.None;
/// <summary>
/// Entity our movement is relative to.
/// </summary>
public EntityUid? RelativeEntity;
/// <summary>
/// Although our movement might be relative to a particular entity we may have an additional relative rotation
/// e.g. if we've snapped to a different cardinal direction
/// </summary>
[ViewVariables]
public Angle TargetRelativeRotation = Angle.Zero;
/// <summary>
/// The current relative rotation. This will lerp towards the <see cref="TargetRelativeRotation"/>.
/// </summary>
[ViewVariables]
public Angle RelativeRotation;
/// <summary>
/// If we traverse on / off a grid then set a timer to update our relative inputs.
/// </summary>
[DataField(customTypeSerializer: typeof(TimeOffsetSerializer))]
[ViewVariables(VVAccess.ReadWrite)]
public TimeSpan LerpTarget;
public const float LerpTime = 1.0f;
//NOTE I don't think I'm supposed to do this
public bool Sprinting => IoCManager.Resolve<IConfigurationManager>().GetCVar(CCVars.GamePressToSprint)
? (HeldMoveButtons & MoveButtons.Walk) != 0x0
: (HeldMoveButtons & MoveButtons.Walk) == 0x0;
[ViewVariables(VVAccess.ReadWrite)]
public bool CanMove = true;
[DataField]
public ProtoId<AlertPrototype> WalkingAlert = "Walking";
}
[Serializable, NetSerializable]
public sealed class InputMoverComponentState : ComponentState
{
public MoveButtons HeldMoveButtons;
public NetEntity? RelativeEntity;
public Angle TargetRelativeRotation;
public Angle RelativeRotation;
public TimeSpan LerpTarget;
public bool CanMove;
}
}