diff --git a/Content.Shared/Hands/EntitySystems/SharedHandsSystem.Relay.cs b/Content.Shared/Hands/EntitySystems/SharedHandsSystem.Relay.cs new file mode 100644 index 0000000000..9e8e0fa744 --- /dev/null +++ b/Content.Shared/Hands/EntitySystems/SharedHandsSystem.Relay.cs @@ -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(RelayEvent); + } + + private void RelayEvent(Entity entity, ref T args) where T : EntityEventArgs + { + var ev = new HeldRelayedEvent(args); + foreach (var held in EnumerateHeld(entity, entity.Comp)) + { + RaiseLocalEvent(held, ref ev); + } + } +} diff --git a/Content.Shared/Hands/EntitySystems/SharedHandsSystem.cs b/Content.Shared/Hands/EntitySystems/SharedHandsSystem.cs index 6b786fdfaa..4f34d6fc54 100644 --- a/Content.Shared/Hands/EntitySystems/SharedHandsSystem.cs +++ b/Content.Shared/Hands/EntitySystems/SharedHandsSystem.cs @@ -31,6 +31,7 @@ public abstract partial class SharedHandsSystem InitializeDrop(); InitializePickup(); InitializeVirtual(); + InitializeRelay(); } public override void Shutdown() diff --git a/Content.Shared/Hands/HandEvents.cs b/Content.Shared/Hands/HandEvents.cs index 059728ff4d..0499c05f42 100644 --- a/Content.Shared/Hands/HandEvents.cs +++ b/Content.Shared/Hands/HandEvents.cs @@ -319,4 +319,15 @@ namespace Content.Shared.Hands public EntityUid Sender { get; } } + + [ByRefEvent] + public sealed class HeldRelayedEvent : EntityEventArgs + { + public TEvent Args; + + public HeldRelayedEvent(TEvent args) + { + Args = args; + } + } } diff --git a/Content.Shared/Item/HeldSpeedModifierComponent.cs b/Content.Shared/Item/HeldSpeedModifierComponent.cs new file mode 100644 index 0000000000..1fbe7437ea --- /dev/null +++ b/Content.Shared/Item/HeldSpeedModifierComponent.cs @@ -0,0 +1,34 @@ +using Content.Shared.Clothing; +using Robust.Shared.GameStates; + +namespace Content.Shared.Item; + +/// +/// This is used for items that change your speed when they are held. +/// +/// +/// This is separate from because things like boots increase/decrease speed when worn, but +/// shouldn't do that when just held in hand. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +[Access(typeof(HeldSpeedModifierSystem))] +public sealed partial class HeldSpeedModifierComponent : Component +{ + /// + /// A multiplier applied to the walk speed. + /// + [DataField] [ViewVariables(VVAccess.ReadWrite), AutoNetworkedField] + public float WalkModifier = 1.0f; + + /// + /// A multiplier applied to the sprint speed. + /// + [DataField] [ViewVariables(VVAccess.ReadWrite), AutoNetworkedField] + public float SprintModifier = 1.0f; + + /// + /// If true, values from will attempted to be used before the ones in this component. + /// + [DataField, ViewVariables(VVAccess.ReadWrite), AutoNetworkedField] + public bool MirrorClothingModifier = true; +} diff --git a/Content.Shared/Item/HeldSpeedModifierSystem.cs b/Content.Shared/Item/HeldSpeedModifierSystem.cs new file mode 100644 index 0000000000..d7afa8f40f --- /dev/null +++ b/Content.Shared/Item/HeldSpeedModifierSystem.cs @@ -0,0 +1,44 @@ +using Content.Shared.Clothing; +using Content.Shared.Hands; +using Content.Shared.Movement.Systems; + +namespace Content.Shared.Item; + +/// +/// This handles +/// +public sealed class HeldSpeedModifierSystem : EntitySystem +{ + [Dependency] private readonly MovementSpeedModifierSystem _movementSpeedModifier = default!; + + /// + public override void Initialize() + { + SubscribeLocalEvent(OnGotEquippedHand); + SubscribeLocalEvent(OnGotUnequippedHand); + SubscribeLocalEvent>(OnRefreshMovementSpeedModifiers); + } + + private void OnGotEquippedHand(Entity ent, ref GotEquippedHandEvent args) + { + _movementSpeedModifier.RefreshMovementSpeedModifiers(args.User); + } + + private void OnGotUnequippedHand(Entity ent, ref GotUnequippedHandEvent args) + { + _movementSpeedModifier.RefreshMovementSpeedModifiers(args.User); + } + + private void OnRefreshMovementSpeedModifiers(EntityUid uid, HeldSpeedModifierComponent component, HeldRelayedEvent args) + { + var walkMod = component.WalkModifier; + var sprintMod = component.SprintModifier; + if (component.MirrorClothingModifier && TryComp(uid, out var clothingSpeedModifier)) + { + walkMod = clothingSpeedModifier.WalkModifier; + sprintMod = clothingSpeedModifier.SprintModifier; + } + + args.Args.ModifySpeed(walkMod, sprintMod); + } +} diff --git a/Resources/Prototypes/Entities/Clothing/Back/duffel.yml b/Resources/Prototypes/Entities/Clothing/Back/duffel.yml index 9a2c3f62f3..ca1281eb9d 100644 --- a/Resources/Prototypes/Entities/Clothing/Back/duffel.yml +++ b/Resources/Prototypes/Entities/Clothing/Back/duffel.yml @@ -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 diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/armor.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/armor.yml index 84db1e8e8b..fdaee45ccc 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/armor.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/armor.yml @@ -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 diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml index 4fbdc88526..38c1fa1126 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml @@ -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 diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml index e71c503e92..f65ecc0877 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml @@ -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 diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/softsuits.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/softsuits.yml index 3d0adacf7e..e46db13bd2 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/softsuits.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/softsuits.yml @@ -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 diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/suits.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/suits.yml index f0aa96f613..57d100fd9a 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/suits.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/suits.yml @@ -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