Mirror speed penalty for worn duffels and hardsuits when in-hand (#22168)

* Add speed penalty for holding hardsuits and duffels

* just inherit from ClothingSpeedModifier

* comment godo
This commit is contained in:
Nemanja 2023-12-06 22:41:29 -05:00 committed by Debug
parent 2d3e32f209
commit 94c3a7019d
11 changed files with 150 additions and 0 deletions

View File

@ -0,0 +1,21 @@
using Content.Shared.Hands.Components;
using Content.Shared.Movement.Systems;
namespace Content.Shared.Hands.EntitySystems;
public abstract partial class SharedHandsSystem
{
private void InitializeRelay()
{
SubscribeLocalEvent<HandsComponent, RefreshMovementSpeedModifiersEvent>(RelayEvent);
}
private void RelayEvent<T>(Entity<HandsComponent> entity, ref T args) where T : EntityEventArgs
{
var ev = new HeldRelayedEvent<T>(args);
foreach (var held in EnumerateHeld(entity, entity.Comp))
{
RaiseLocalEvent(held, ref ev);
}
}
}

View File

@ -31,6 +31,7 @@ public abstract partial class SharedHandsSystem
InitializeDrop();
InitializePickup();
InitializeVirtual();
InitializeRelay();
}
public override void Shutdown()

View File

@ -319,4 +319,15 @@ namespace Content.Shared.Hands
public EntityUid Sender { get; }
}
[ByRefEvent]
public sealed class HeldRelayedEvent<TEvent> : EntityEventArgs
{
public TEvent Args;
public HeldRelayedEvent(TEvent args)
{
Args = args;
}
}
}

View File

@ -0,0 +1,34 @@
using Content.Shared.Clothing;
using Robust.Shared.GameStates;
namespace Content.Shared.Item;
/// <summary>
/// This is used for items that change your speed when they are held.
/// </summary>
/// <remarks>
/// This is separate from <see cref="ClothingSpeedModifierComponent"/> because things like boots increase/decrease speed when worn, but
/// shouldn't do that when just held in hand.
/// </remarks>
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
[Access(typeof(HeldSpeedModifierSystem))]
public sealed partial class HeldSpeedModifierComponent : Component
{
/// <summary>
/// A multiplier applied to the walk speed.
/// </summary>
[DataField] [ViewVariables(VVAccess.ReadWrite), AutoNetworkedField]
public float WalkModifier = 1.0f;
/// <summary>
/// A multiplier applied to the sprint speed.
/// </summary>
[DataField] [ViewVariables(VVAccess.ReadWrite), AutoNetworkedField]
public float SprintModifier = 1.0f;
/// <summary>
/// If true, values from <see cref="ClothingSpeedModifierComponent"/> will attempted to be used before the ones in this component.
/// </summary>
[DataField, ViewVariables(VVAccess.ReadWrite), AutoNetworkedField]
public bool MirrorClothingModifier = true;
}

View File

@ -0,0 +1,44 @@
using Content.Shared.Clothing;
using Content.Shared.Hands;
using Content.Shared.Movement.Systems;
namespace Content.Shared.Item;
/// <summary>
/// This handles <see cref="HeldSpeedModifierComponent"/>
/// </summary>
public sealed class HeldSpeedModifierSystem : EntitySystem
{
[Dependency] private readonly MovementSpeedModifierSystem _movementSpeedModifier = default!;
/// <inheritdoc/>
public override void Initialize()
{
SubscribeLocalEvent<HeldSpeedModifierComponent, GotEquippedHandEvent>(OnGotEquippedHand);
SubscribeLocalEvent<HeldSpeedModifierComponent, GotUnequippedHandEvent>(OnGotUnequippedHand);
SubscribeLocalEvent<HeldSpeedModifierComponent, HeldRelayedEvent<RefreshMovementSpeedModifiersEvent>>(OnRefreshMovementSpeedModifiers);
}
private void OnGotEquippedHand(Entity<HeldSpeedModifierComponent> ent, ref GotEquippedHandEvent args)
{
_movementSpeedModifier.RefreshMovementSpeedModifiers(args.User);
}
private void OnGotUnequippedHand(Entity<HeldSpeedModifierComponent> ent, ref GotUnequippedHandEvent args)
{
_movementSpeedModifier.RefreshMovementSpeedModifiers(args.User);
}
private void OnRefreshMovementSpeedModifiers(EntityUid uid, HeldSpeedModifierComponent component, HeldRelayedEvent<RefreshMovementSpeedModifiersEvent> args)
{
var walkMod = component.WalkModifier;
var sprintMod = component.SprintModifier;
if (component.MirrorClothingModifier && TryComp<ClothingSpeedModifierComponent>(uid, out var clothingSpeedModifier))
{
walkMod = clothingSpeedModifier.WalkModifier;
sprintMod = clothingSpeedModifier.SprintModifier;
}
args.Args.ModifySpeed(walkMod, sprintMod);
}
}

View File

@ -11,6 +11,7 @@
- type: ClothingSpeedModifier
walkModifier: 1
sprintModifier: 0.9
- type: HeldSpeedModifier
- type: entity
parent: ClothingBackpackDuffel
@ -232,6 +233,7 @@
capacity: 9999
- type: ClothingSpeedModifier
sprintModifier: 1 # makes its stats identical to other variants of bag of holding
- type: HeldSpeedModifier
- type: entity
parent: ClothingBackpackDuffel
@ -244,3 +246,4 @@
- type: ClothingSpeedModifier
walkModifier: 1
sprintModifier: 1
- type: HeldSpeedModifier

View File

@ -230,6 +230,7 @@
- type: ClothingSpeedModifier
walkModifier: 1.0
sprintModifier: 1.0
- type: HeldSpeedModifier
- type: ExplosionResistance
damageCoefficient: 0.65
- type: GroupExamine
@ -255,6 +256,7 @@
- type: ClothingSpeedModifier
walkModifier: 0.7
sprintModifier: 0.65
- type: HeldSpeedModifier
- type: ExplosionResistance
damageCoefficient: 0.5
- type: GroupExamine
@ -277,6 +279,7 @@
Piercing: 0.4
- type: ClothingSpeedModifier
walkModifier: 0.8
- type: HeldSpeedModifier
- type: ExplosionResistance
damageCoefficient: 0.4
- type: GroupExamine

View File

@ -22,6 +22,7 @@
- type: ClothingSpeedModifier
walkModifier: 0.9
sprintModifier: 0.9
- type: HeldSpeedModifier
- type: entity
abstract: true
@ -71,6 +72,7 @@
- type: ClothingSpeedModifier
walkModifier: 0.4
sprintModifier: 0.6
- type: HeldSpeedModifier
- type: Item
size: 121
- type: Armor
@ -106,6 +108,7 @@
- type: ClothingSpeedModifier
walkModifier: 0.8
sprintModifier: 0.8
- type: HeldSpeedModifier
- type: Item
size: 80

View File

@ -24,6 +24,7 @@
- type: ClothingSpeedModifier
walkModifier: 0.80
sprintModifier: 0.80
- type: HeldSpeedModifier
- type: ToggleableClothing
clothingPrototype: ClothingHeadHelmetHardsuitBasic
@ -57,6 +58,7 @@
- type: ClothingSpeedModifier
walkModifier: 0.7
sprintModifier: 0.7
- type: HeldSpeedModifier
- type: ToggleableClothing
clothingPrototype: ClothingHeadHelmetHardsuitAtmos
- type: ReverseEngineering # Nyano
@ -95,6 +97,7 @@
- type: ClothingSpeedModifier
walkModifier: 0.7
sprintModifier: 0.7
- type: HeldSpeedModifier
- type: ToggleableClothing
clothingPrototype: ClothingHeadHelmetHardsuitEngineering
@ -123,6 +126,7 @@
- type: ClothingSpeedModifier
walkModifier: 0.9
sprintModifier: 0.8
- type: HeldSpeedModifier
- type: ToggleableClothing
clothingPrototype: ClothingHeadHelmetHardsuitSpatio
@ -153,6 +157,7 @@
- type: ClothingSpeedModifier
walkModifier: 0.75
sprintModifier: 0.75
- type: HeldSpeedModifier
- type: ToggleableClothing
clothingPrototype: ClothingHeadHelmetHardsuitSalvage
@ -182,6 +187,7 @@
- type: ClothingSpeedModifier
walkModifier: 0.75
sprintModifier: 0.75
- type: HeldSpeedModifier
- type: ToggleableClothing
clothingPrototype: ClothingHeadHelmetHardsuitSecurity
@ -208,6 +214,7 @@
- type: ClothingSpeedModifier
walkModifier: 0.65
sprintModifier: 0.65
- type: HeldSpeedModifier
- type: ToggleableClothing
clothingPrototype: ClothingHeadHelmetHardsuitBrigmedic
@ -237,6 +244,7 @@
- type: ClothingSpeedModifier
walkModifier: 0.7
sprintModifier: 0.7
- type: HeldSpeedModifier
- type: ToggleableClothing
clothingPrototype: ClothingHeadHelmetHardsuitWarden
@ -268,6 +276,7 @@
- type: ClothingSpeedModifier
walkModifier: 0.8
sprintModifier: 0.8
- type: HeldSpeedModifier
- type: ToggleableClothing
clothingPrototype: ClothingHeadHelmetHardsuitCap
@ -299,6 +308,7 @@
- type: ClothingSpeedModifier
walkModifier: 0.75
sprintModifier: 0.8
- type: HeldSpeedModifier
- type: ToggleableClothing
clothingPrototype: ClothingHeadHelmetHardsuitEngineeringWhite
@ -323,6 +333,7 @@
- type: ClothingSpeedModifier
walkModifier: 0.9
sprintModifier: 0.95
- type: HeldSpeedModifier
- type: ToggleableClothing
clothingPrototype: ClothingHeadHelmetHardsuitMedical
@ -354,6 +365,7 @@
- type: ClothingSpeedModifier
walkModifier: 0.75
sprintModifier: 0.75
- type: HeldSpeedModifier
- type: Item
size: 50
- type: Tag
@ -392,6 +404,7 @@
- type: ClothingSpeedModifier
walkModifier: 0.8
sprintModifier: 0.8
- type: HeldSpeedModifier
- type: ToggleableClothing
clothingPrototype: ClothingHeadHelmetHardsuitSecurityRed
@ -422,6 +435,7 @@
- type: ClothingSpeedModifier
walkModifier: 0.85
sprintModifier: 0.9
- type: HeldSpeedModifier
- type: ToggleableClothing
clothingPrototype: ClothingHeadHelmetHardsuitLuxury
@ -454,6 +468,7 @@
- type: ClothingSpeedModifier
walkModifier: 0.9
sprintModifier: 0.9
- type: HeldSpeedModifier
- type: ToggleableClothing
clothingPrototype: ClothingHeadHelmetHardsuitSyndie
- type: ReverseEngineering # Nyano
@ -506,6 +521,7 @@
- type: ClothingSpeedModifier
walkModifier: 1.0
sprintModifier: 1.0
- type: HeldSpeedModifier
- type: ToggleableClothing
clothingPrototype: ClothingHeadHelmetHardsuitSyndieElite
@ -537,6 +553,7 @@
- type: ClothingSpeedModifier
walkModifier: 1.0
sprintModifier: 1.0
- type: HeldSpeedModifier
- type: ToggleableClothing
clothingPrototype: ClothingHeadHelmetHardsuitSyndieCommander
@ -568,6 +585,7 @@
- type: ClothingSpeedModifier
walkModifier: 0.9
sprintModifier: 0.65
- type: HeldSpeedModifier
- type: ToggleableClothing
clothingPrototype: ClothingHeadHelmetHardsuitCybersun
@ -599,6 +617,7 @@
- type: ClothingSpeedModifier
walkModifier: 0.8
sprintModifier: 0.8
- type: HeldSpeedModifier
- type: ToggleableClothing
clothingPrototype: ClothingHeadHelmetHardsuitWizard
@ -628,6 +647,7 @@
- type: ClothingSpeedModifier
walkModifier: 0.8
sprintModifier: 0.8
- type: HeldSpeedModifier
- type: ToggleableClothing
clothingPrototype: ClothingHeadHelmetHardsuitLing
@ -657,6 +677,7 @@
- type: ClothingSpeedModifier
walkModifier: 0.6
sprintModifier: 0.6
- type: HeldSpeedModifier
- type: ToggleableClothing
clothingPrototype: ClothingHeadHelmetHardsuitPirateEVA
- type: StaticPrice
@ -689,6 +710,7 @@
- type: ClothingSpeedModifier
walkModifier: 0.8
sprintModifier: 0.8
- type: HeldSpeedModifier
- type: ToggleableClothing
clothingPrototype: ClothingHeadHelmetHardsuitPirateCap
- type: StaticPrice
@ -795,6 +817,7 @@
- type: ClothingSpeedModifier
walkModifier: 1.0
sprintModifier: 1.0
- type: HeldSpeedModifier
- type: ToggleableClothing
clothingPrototype: ClothingHeadHelmetHardsuitDeathsquad
@ -830,6 +853,7 @@
- type: ClothingSpeedModifier
walkModifier: 1.0
sprintModifier: 1.0
- type: HeldSpeedModifier
- type: ToggleableClothing
clothingPrototype: ClothingHeadHelmetCBURN
@ -863,5 +887,6 @@
# - type: Construction # DeltaV - Prevent clowns from making the hardsuit
# graph: ClownHardsuit
# node: clownHardsuit
- type: HeldSpeedModifier
- type: ToggleableClothing
clothingPrototype: ClothingHeadHelmetHardsuitClown

View File

@ -44,6 +44,7 @@
- type: ClothingSpeedModifier
walkModifier: 0.5
sprintModifier: 0.5
- type: HeldSpeedModifier
- type: TemperatureProtection
coefficient: 0.5
- type: ToggleableClothing
@ -83,6 +84,7 @@
- type: ClothingSpeedModifier
walkModifier: 0.85
sprintModifier: 0.85
- type: HeldSpeedModifier
#Paramedic Voidsuit
#Despite having resistances and looking like one, this is two-piece and parents off the EVA suit so it goes here.
@ -102,6 +104,7 @@
- type: ClothingSpeedModifier
walkModifier: 0.9
sprintModifier: 0.9
- type: HeldSpeedModifier
- type: TemperatureProtection
coefficient: 0.1
- type: Armor

View File

@ -46,6 +46,7 @@
- type: ClothingSpeedModifier
walkModifier: 0.8
sprintModifier: 0.7
- type: HeldSpeedModifier
- type: GroupExamine
- type: entity
@ -72,6 +73,7 @@
- type: ClothingSpeedModifier
walkModifier: 0.8
sprintModifier: 0.8
- type: HeldSpeedModifier
- type: GroupExamine
- type: entity