--- /dev/null
+using Robust.Shared.GameStates;
+
+namespace Content.Shared.Damage.Components;
+
+/// <summary>
+/// This is used for a clothing item that modifies the slowdown from taking damage.
+/// Used for entities with <see cref="SlowOnDamageComponent"/>
+/// </summary>
+[RegisterComponent, NetworkedComponent, Access(typeof(SlowOnDamageSystem))]
+public sealed partial class ClothingSlowOnDamageModifierComponent : Component
+{
+ /// <summary>
+ /// A coefficient modifier for the slowdown
+ /// </summary>
+ [DataField]
+ public float Modifier = 1;
+}
+using Content.Shared.Clothing;
using Content.Shared.Damage.Components;
+using Content.Shared.Examine;
using Content.Shared.FixedPoint;
+using Content.Shared.Inventory;
using Content.Shared.Movement.Systems;
namespace Content.Shared.Damage
SubscribeLocalEvent<SlowOnDamageComponent, DamageChangedEvent>(OnDamageChanged);
SubscribeLocalEvent<SlowOnDamageComponent, RefreshMovementSpeedModifiersEvent>(OnRefreshMovespeed);
+
+ SubscribeLocalEvent<ClothingSlowOnDamageModifierComponent, InventoryRelayedEvent<ModifySlowOnDamageSpeedEvent>>(OnModifySpeed);
+ SubscribeLocalEvent<ClothingSlowOnDamageModifierComponent, ExaminedEvent>(OnExamined);
+ SubscribeLocalEvent<ClothingSlowOnDamageModifierComponent, ClothingGotEquippedEvent>(OnGotEquipped);
+ SubscribeLocalEvent<ClothingSlowOnDamageModifierComponent, ClothingGotUnequippedEvent>(OnGotUnequipped);
}
private void OnRefreshMovespeed(EntityUid uid, SlowOnDamageComponent component, RefreshMovementSpeedModifiersEvent args)
if (closest != FixedPoint2.Zero)
{
var speed = component.SpeedModifierThresholds[closest];
- args.ModifySpeed(speed, speed);
+
+ var ev = new ModifySlowOnDamageSpeedEvent(speed);
+ RaiseLocalEvent(uid, ref ev);
+ args.ModifySpeed(ev.Speed, ev.Speed);
}
}
_movementSpeedModifierSystem.RefreshMovementSpeedModifiers(uid);
}
+
+ private void OnModifySpeed(Entity<ClothingSlowOnDamageModifierComponent> ent, ref InventoryRelayedEvent<ModifySlowOnDamageSpeedEvent> args)
+ {
+ var dif = 1 - args.Args.Speed;
+ if (dif <= 0)
+ return;
+
+ // reduces the slowness modifier by the given coefficient
+ args.Args.Speed += dif * ent.Comp.Modifier;
+ }
+
+ private void OnExamined(Entity<ClothingSlowOnDamageModifierComponent> ent, ref ExaminedEvent args)
+ {
+ var msg = Loc.GetString("slow-on-damage-modifier-examine", ("mod", (1 - ent.Comp.Modifier) * 100));
+ args.PushMarkup(msg);
+ }
+
+ private void OnGotEquipped(Entity<ClothingSlowOnDamageModifierComponent> ent, ref ClothingGotEquippedEvent args)
+ {
+ _movementSpeedModifierSystem.RefreshMovementSpeedModifiers(args.Wearer);
+ }
+
+ private void OnGotUnequipped(Entity<ClothingSlowOnDamageModifierComponent> ent, ref ClothingGotUnequippedEvent args)
+ {
+ _movementSpeedModifierSystem.RefreshMovementSpeedModifiers(args.Wearer);
+ }
+ }
+
+ [ByRefEvent]
+ public record struct ModifySlowOnDamageSpeedEvent(float Speed) : IInventoryRelayEvent
+ {
+ public SlotFlags TargetSlots => SlotFlags.WITHOUT_POCKET;
}
}