diff --git a/Content.Shared/Clothing/ClothingSpeedModifierSystem.cs b/Content.Shared/Clothing/ClothingSpeedModifierSystem.cs index 8910d461da4..fe17e94e163 100644 --- a/Content.Shared/Clothing/ClothingSpeedModifierSystem.cs +++ b/Content.Shared/Clothing/ClothingSpeedModifierSystem.cs @@ -25,6 +25,8 @@ public override void Initialize() SubscribeLocalEvent(OnGetState); SubscribeLocalEvent(OnHandleState); SubscribeLocalEvent>(OnRefreshMoveSpeed); + SubscribeLocalEvent>(OnRefreshFriction); // Mono + SubscribeLocalEvent>(OnRefreshWeightless); // Mono SubscribeLocalEvent>(OnClothingVerbExamine); SubscribeLocalEvent(OnToggled); } @@ -49,7 +51,7 @@ private void OnHandleState(EntityUid uid, ClothingSpeedModifierComponent compone // We'll still set the values in case they're slightly different but within tolerance. if (diff && _container.TryGetContainingContainer((uid, null, null), out var container)) { - _movementSpeed.RefreshMovementSpeedModifiers(container.Owner); + _movementSpeed.RefreshMovementSpeedModifiers(container.Owner, alsoFriction: true); // Mono } } @@ -73,6 +75,44 @@ private void OnRefreshMoveSpeed(EntityUid uid, ClothingSpeedModifierComponent co // DeltaV End - Introduce ClothingSlowResistance to Species } + // Mono + private void OnRefreshFriction(Entity ent, ref InventoryRelayedEvent args) + { + if (!_toggle.IsActivated(ent.Owner)) + return; + Log.Info($"got"); + + if (_container.TryGetContainingContainer(ent.Owner, out var container)) + { + var ev = new ModifyClothingSlowdownEvent(ent.Comp.WalkModifier, ent.Comp.SprintModifier); + RaiseLocalEvent(container.Owner, ref ev); + args.Args.ModifyAcceleration(ev.RunModifier); + } + else + { + args.Args.ModifyAcceleration(ent.Comp.SprintModifier); + } + } + + // Mono + private void OnRefreshWeightless(Entity ent, ref InventoryRelayedEvent args) + { + if (!_toggle.IsActivated(ent.Owner)) + return; + Log.Info($"got"); + + if (_container.TryGetContainingContainer(ent.Owner, out var container)) + { + var ev = new ModifyClothingSlowdownEvent(ent.Comp.WalkModifier, ent.Comp.SprintModifier); + RaiseLocalEvent(container.Owner, ref ev); + args.Args.ModifyAcceleration(ev.RunModifier); + } + else + { + args.Args.ModifyAcceleration(ent.Comp.SprintModifier); + } + } + private void OnClothingVerbExamine(EntityUid uid, ClothingSpeedModifierComponent component, GetVerbsEvent args) { if (!args.CanInteract || !args.CanAccess) @@ -128,12 +168,12 @@ private void OnClothingVerbExamine(EntityUid uid, ClothingSpeedModifierComponent private void OnToggled(Entity ent, ref ItemToggledEvent args) { // make sentient boots slow or fast too - _movementSpeed.RefreshMovementSpeedModifiers(ent); + _movementSpeed.RefreshMovementSpeedModifiers(ent, alsoFriction: true); // Mono if (_container.TryGetContainingContainer((ent.Owner, null, null), out var container)) { // inventory system will automatically hook into the event raised by this and update accordingly - _movementSpeed.RefreshMovementSpeedModifiers(container.Owner); + _movementSpeed.RefreshMovementSpeedModifiers(container.Owner, alsoFriction: true); // Mono } } } diff --git a/Content.Shared/Inventory/InventorySystem.Equip.cs b/Content.Shared/Inventory/InventorySystem.Equip.cs index 94a4d08db11..dda443d8860 100644 --- a/Content.Shared/Inventory/InventorySystem.Equip.cs +++ b/Content.Shared/Inventory/InventorySystem.Equip.cs @@ -195,7 +195,7 @@ public bool TryEquip(EntityUid actor, EntityUid target, EntityUid itemUid, strin Dirty(target, inventory); - _movementSpeed.RefreshMovementSpeedModifiers(target); + _movementSpeed.RefreshMovementSpeedModifiers(target, alsoFriction: true); // Mono return true; } @@ -519,7 +519,7 @@ private bool TryUnequip( Dirty(target, inventory); - _movementSpeed.RefreshMovementSpeedModifiers(target); + _movementSpeed.RefreshMovementSpeedModifiers(target, alsoFriction: true); // Mono return true; } diff --git a/Content.Shared/Inventory/InventorySystem.Relay.cs b/Content.Shared/Inventory/InventorySystem.Relay.cs index 00a89043696..66e5e037e04 100644 --- a/Content.Shared/Inventory/InventorySystem.Relay.cs +++ b/Content.Shared/Inventory/InventorySystem.Relay.cs @@ -53,6 +53,7 @@ public void InitializeRelay() // by-ref events SubscribeLocalEvent(RefRelayInventoryEvent); + SubscribeLocalEvent(RefRelayInventoryEvent); // Mono SubscribeLocalEvent(RefRelayInventoryEvent); SubscribeLocalEvent(RefRelayInventoryEvent); SubscribeLocalEvent(RefRelayInventoryEvent); diff --git a/Content.Shared/Movement/Systems/MovementSpeedModifierSystem.cs b/Content.Shared/Movement/Systems/MovementSpeedModifierSystem.cs index 55997f9bc5f..4749bb96c5e 100644 --- a/Content.Shared/Movement/Systems/MovementSpeedModifierSystem.cs +++ b/Content.Shared/Movement/Systems/MovementSpeedModifierSystem.cs @@ -77,7 +77,8 @@ public void RefreshWeightlessModifiers(EntityUid uid, MovementSpeedModifierCompo Dirty(uid, move); } - public void RefreshMovementSpeedModifiers(EntityUid uid, MovementSpeedModifierComponent? move = null) + public void RefreshMovementSpeedModifiers(EntityUid uid, MovementSpeedModifierComponent? move = null, + bool alsoFriction = false) // Mono { if (!Resolve(uid, ref move, false)) return; @@ -88,6 +89,13 @@ public void RefreshMovementSpeedModifiers(EntityUid uid, MovementSpeedModifierCo var ev = new RefreshMovementSpeedModifiersEvent(); RaiseLocalEvent(uid, ev); + // Mono + if (alsoFriction) + { + RefreshFrictionModifiers(uid, move); + RefreshWeightlessModifiers(uid, move); + } + if (MathHelper.CloseTo(ev.WalkSpeedModifier, move.WalkSpeedModifier) && MathHelper.CloseTo(ev.SprintSpeedModifier, move.SprintSpeedModifier)) return; @@ -173,7 +181,7 @@ public void ModifySpeed(float mod) } [ByRefEvent] - public record struct RefreshWeightlessModifiersEvent + public record struct RefreshWeightlessModifiersEvent : IInventoryRelayEvent // Mono { public float WeightlessAcceleration; public float WeightlessAccelerationMod; @@ -207,6 +215,7 @@ public void ModifyAcceleration(float modifier) { ModifyAcceleration(modifier, modifier); } + SlotFlags IInventoryRelayEvent.TargetSlots => ~SlotFlags.POCKET; } [ByRefEvent] public record struct RefreshFrictionModifiersEvent : IInventoryRelayEvent