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 GitHub
parent 6509681f00
commit fb10dff335
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

@@ -13,6 +13,7 @@
- type: ClothingSpeedModifier
walkModifier: 1
sprintModifier: 0.9
- type: HeldSpeedModifier
- type: entity
parent: ClothingBackpackDuffel
@@ -236,6 +237,7 @@
- 0,0,19,9
- type: ClothingSpeedModifier
sprintModifier: 1 # makes its stats identical to other variants of bag of holding
- type: HeldSpeedModifier
- type: entity
parent: ClothingBackpackDuffel
@@ -248,3 +250,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
@@ -70,6 +71,7 @@
- type: ClothingSpeedModifier
walkModifier: 0.4
sprintModifier: 0.6
- type: HeldSpeedModifier
- type: Item
size: Ginormous
- type: Armor
@@ -105,6 +107,7 @@
- type: ClothingSpeedModifier
walkModifier: 0.8
sprintModifier: 0.8
- type: HeldSpeedModifier
- type: Item
size: Huge

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
@@ -90,6 +92,7 @@
- type: ClothingSpeedModifier
walkModifier: 0.7
sprintModifier: 0.7
- type: HeldSpeedModifier
- type: ToggleableClothing
clothingPrototype: ClothingHeadHelmetHardsuitEngineering
@@ -118,6 +121,7 @@
- type: ClothingSpeedModifier
walkModifier: 0.9
sprintModifier: 0.8
- type: HeldSpeedModifier
- type: ToggleableClothing
clothingPrototype: ClothingHeadHelmetHardsuitSpatio
@@ -148,6 +152,7 @@
- type: ClothingSpeedModifier
walkModifier: 0.75
sprintModifier: 0.75
- type: HeldSpeedModifier
- type: ToggleableClothing
clothingPrototype: ClothingHeadHelmetHardsuitSalvage
@@ -177,6 +182,7 @@
- type: ClothingSpeedModifier
walkModifier: 0.75
sprintModifier: 0.75
- type: HeldSpeedModifier
- type: ToggleableClothing
clothingPrototype: ClothingHeadHelmetHardsuitSecurity
@@ -203,6 +209,7 @@
- type: ClothingSpeedModifier
walkModifier: 0.65
sprintModifier: 0.65
- type: HeldSpeedModifier
- type: ToggleableClothing
clothingPrototype: ClothingHeadHelmetHardsuitBrigmedic
@@ -232,6 +239,7 @@
- type: ClothingSpeedModifier
walkModifier: 0.7
sprintModifier: 0.7
- type: HeldSpeedModifier
- type: ToggleableClothing
clothingPrototype: ClothingHeadHelmetHardsuitWarden
@@ -263,6 +271,7 @@
- type: ClothingSpeedModifier
walkModifier: 0.8
sprintModifier: 0.8
- type: HeldSpeedModifier
- type: ToggleableClothing
clothingPrototype: ClothingHeadHelmetHardsuitCap
@@ -294,6 +303,7 @@
- type: ClothingSpeedModifier
walkModifier: 0.75
sprintModifier: 0.8
- type: HeldSpeedModifier
- type: ToggleableClothing
clothingPrototype: ClothingHeadHelmetHardsuitEngineeringWhite
@@ -318,6 +328,7 @@
- type: ClothingSpeedModifier
walkModifier: 0.9
sprintModifier: 0.95
- type: HeldSpeedModifier
- type: ToggleableClothing
clothingPrototype: ClothingHeadHelmetHardsuitMedical
@@ -349,6 +360,7 @@
- type: ClothingSpeedModifier
walkModifier: 0.75
sprintModifier: 0.75
- type: HeldSpeedModifier
- type: Item
size: Normal
- type: Tag
@@ -387,6 +399,7 @@
- type: ClothingSpeedModifier
walkModifier: 0.8
sprintModifier: 0.8
- type: HeldSpeedModifier
- type: ToggleableClothing
clothingPrototype: ClothingHeadHelmetHardsuitSecurityRed
@@ -417,6 +430,7 @@
- type: ClothingSpeedModifier
walkModifier: 0.85
sprintModifier: 0.9
- type: HeldSpeedModifier
- type: ToggleableClothing
clothingPrototype: ClothingHeadHelmetHardsuitLuxury
@@ -451,6 +465,7 @@
- type: ClothingSpeedModifier
walkModifier: 0.9
sprintModifier: 0.9
- type: HeldSpeedModifier
- type: ToggleableClothing
clothingPrototype: ClothingHeadHelmetHardsuitSyndie
@@ -498,6 +513,7 @@
- type: ClothingSpeedModifier
walkModifier: 1.0
sprintModifier: 1.0
- type: HeldSpeedModifier
- type: ToggleableClothing
clothingPrototype: ClothingHeadHelmetHardsuitSyndieElite
@@ -529,6 +545,7 @@
- type: ClothingSpeedModifier
walkModifier: 1.0
sprintModifier: 1.0
- type: HeldSpeedModifier
- type: ToggleableClothing
clothingPrototype: ClothingHeadHelmetHardsuitSyndieCommander
@@ -560,6 +577,7 @@
- type: ClothingSpeedModifier
walkModifier: 0.9
sprintModifier: 0.65
- type: HeldSpeedModifier
- type: ToggleableClothing
clothingPrototype: ClothingHeadHelmetHardsuitCybersun
@@ -591,6 +609,7 @@
- type: ClothingSpeedModifier
walkModifier: 0.8
sprintModifier: 0.8
- type: HeldSpeedModifier
- type: ToggleableClothing
clothingPrototype: ClothingHeadHelmetHardsuitWizard
@@ -620,6 +639,7 @@
- type: ClothingSpeedModifier
walkModifier: 0.8
sprintModifier: 0.8
- type: HeldSpeedModifier
- type: ToggleableClothing
clothingPrototype: ClothingHeadHelmetHardsuitLing
@@ -649,6 +669,7 @@
- type: ClothingSpeedModifier
walkModifier: 0.6
sprintModifier: 0.6
- type: HeldSpeedModifier
- type: ToggleableClothing
clothingPrototype: ClothingHeadHelmetHardsuitPirateEVA
- type: StaticPrice
@@ -681,6 +702,7 @@
- type: ClothingSpeedModifier
walkModifier: 0.8
sprintModifier: 0.8
- type: HeldSpeedModifier
- type: ToggleableClothing
clothingPrototype: ClothingHeadHelmetHardsuitPirateCap
- type: StaticPrice
@@ -787,6 +809,7 @@
- type: ClothingSpeedModifier
walkModifier: 1.0
sprintModifier: 1.0
- type: HeldSpeedModifier
- type: ToggleableClothing
clothingPrototype: ClothingHeadHelmetHardsuitDeathsquad
@@ -822,6 +845,7 @@
- type: ClothingSpeedModifier
walkModifier: 1.0
sprintModifier: 1.0
- type: HeldSpeedModifier
- type: ToggleableClothing
clothingPrototype: ClothingHeadHelmetCBURN
@@ -852,6 +876,7 @@
- type: ClothingSpeedModifier
walkModifier: 0.9
sprintModifier: 0.9
- type: HeldSpeedModifier
- type: Construction
graph: ClownHardsuit
node: clownHardsuit

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