From 241d0e12e27f086e6ccab8a1f6f5a614e0c2676a Mon Sep 17 00:00:00 2001 From: Zachary Higgs Date: Mon, 17 Feb 2025 16:53:23 -0400 Subject: [PATCH] Fix SuperSlippery And StepTriggers persisting when UpdateSlip is called (#34525) * Fix superSlippery and stepTrigger values persist - made values in SpillTileReaction's public so we can query the prototype - made the default values for slippery component and StepTriggerComponent based on default constants for easier resetting - added a calculation and check in UpdateSlips to check if a super slip is present as well as Update relevant steptrigger and slip values based on the contents of the solution * The worlds biggest change --------- Co-authored-by: Myra --- .../TileReactions/SpillTileReaction.cs | 16 ++++---- .../Fluids/EntitySystems/PuddleSystem.cs | 39 +++++++++++++++---- Content.Shared/Slippery/SlipperyComponent.cs | 6 ++- .../Components/StepTriggerComponent.cs | 3 +- 4 files changed, 45 insertions(+), 19 deletions(-) diff --git a/Content.Server/Chemistry/TileReactions/SpillTileReaction.cs b/Content.Server/Chemistry/TileReactions/SpillTileReaction.cs index f9fb2b90d0be..68c1966de847 100644 --- a/Content.Server/Chemistry/TileReactions/SpillTileReaction.cs +++ b/Content.Server/Chemistry/TileReactions/SpillTileReaction.cs @@ -17,14 +17,14 @@ namespace Content.Server.Chemistry.TileReactions [DataDefinition] public sealed partial class SpillTileReaction : ITileReaction { - [DataField("launchForwardsMultiplier")] private float _launchForwardsMultiplier = 1; - [DataField("requiredSlipSpeed")] private float _requiredSlipSpeed = 6; - [DataField("paralyzeTime")] private float _paralyzeTime = 1; + [DataField("launchForwardsMultiplier")] public float LaunchForwardsMultiplier = 1; + [DataField("requiredSlipSpeed")] public float RequiredSlipSpeed = 6; + [DataField("paralyzeTime")] public float ParalyzeTime = 1; /// /// /// - [DataField("superSlippery")] private bool _superSlippery; + [DataField("superSlippery")] public bool SuperSlippery; public FixedPoint2 TileReact(TileRef tile, ReagentPrototype reagent, @@ -39,13 +39,13 @@ public FixedPoint2 TileReact(TileRef tile, .TrySpillAt(tile, new Solution(reagent.ID, reactVolume, data), out var puddleUid, false, false)) { var slippery = entityManager.EnsureComponent(puddleUid); - slippery.LaunchForwardsMultiplier = _launchForwardsMultiplier; - slippery.ParalyzeTime = _paralyzeTime; - slippery.SuperSlippery = _superSlippery; + slippery.LaunchForwardsMultiplier = LaunchForwardsMultiplier; + slippery.ParalyzeTime = ParalyzeTime; + slippery.SuperSlippery = SuperSlippery; entityManager.Dirty(puddleUid, slippery); var step = entityManager.EnsureComponent(puddleUid); - entityManager.EntitySysManager.GetEntitySystem().SetRequiredTriggerSpeed(puddleUid, _requiredSlipSpeed, step); + entityManager.EntitySysManager.GetEntitySystem().SetRequiredTriggerSpeed(puddleUid, RequiredSlipSpeed, step); var slow = entityManager.EnsureComponent(puddleUid); var speedModifier = 1 - reagent.Viscosity; diff --git a/Content.Server/Fluids/EntitySystems/PuddleSystem.cs b/Content.Server/Fluids/EntitySystems/PuddleSystem.cs index 3889be11743e..8267b8e97179 100644 --- a/Content.Server/Fluids/EntitySystems/PuddleSystem.cs +++ b/Content.Server/Fluids/EntitySystems/PuddleSystem.cs @@ -1,4 +1,6 @@ +using System.Linq; using Content.Server.Administration.Logs; +using Content.Server.Chemistry.TileReactions; using Content.Server.DoAfter; using Content.Server.Fluids.Components; using Content.Server.Spreader; @@ -387,23 +389,36 @@ private void UpdateAppearance(EntityUid uid, PuddleComponent? puddleComponent = private void UpdateSlip(EntityUid entityUid, PuddleComponent component, Solution solution) { var isSlippery = false; + var isSuperSlippery = false; // The base sprite is currently at 0.3 so we require at least 2nd tier to be slippery or else it's too hard to see. var amountRequired = FixedPoint2.New(component.OverflowVolume.Float() * LowThreshold); var slipperyAmount = FixedPoint2.Zero; + // Utilize the defaults from their relevant systems... this sucks, and is a bandaid + var launchForwardsMultiplier = SlipperyComponent.DefaultLaunchForwardsMultiplier; + var paralyzeTime = SlipperyComponent.DefaultParalyzeTime; + var requiredSlipSpeed = StepTriggerComponent.DefaultRequiredTriggeredSpeed; + foreach (var (reagent, quantity) in solution.Contents) { var reagentProto = _prototypeManager.Index(reagent.Prototype); - if (reagentProto.Slippery) - { - slipperyAmount += quantity; + if (!reagentProto.Slippery) + continue; + slipperyAmount += quantity; - if (slipperyAmount > amountRequired) - { - isSlippery = true; - break; - } + if (slipperyAmount <= amountRequired) + continue; + isSlippery = true; + + foreach (var tileReaction in reagentProto.TileReactions) + { + if (tileReaction is not SpillTileReaction spillTileReaction) + continue; + isSuperSlippery = spillTileReaction.SuperSlippery; + launchForwardsMultiplier = launchForwardsMultiplier < spillTileReaction.LaunchForwardsMultiplier ? spillTileReaction.LaunchForwardsMultiplier : launchForwardsMultiplier; + requiredSlipSpeed = requiredSlipSpeed > spillTileReaction.RequiredSlipSpeed ? spillTileReaction.RequiredSlipSpeed : requiredSlipSpeed; + paralyzeTime = paralyzeTime < spillTileReaction.ParalyzeTime ? spillTileReaction.ParalyzeTime : paralyzeTime; } } @@ -413,6 +428,14 @@ private void UpdateSlip(EntityUid entityUid, PuddleComponent component, Solution _stepTrigger.SetActive(entityUid, true, comp); var friction = EnsureComp(entityUid); _tile.SetModifier(entityUid, TileFrictionController.DefaultFriction * 0.5f, friction); + + if (!TryComp(entityUid, out var slipperyComponent)) + return; + slipperyComponent.SuperSlippery = isSuperSlippery; + _stepTrigger.SetRequiredTriggerSpeed(entityUid, requiredSlipSpeed); + slipperyComponent.LaunchForwardsMultiplier = launchForwardsMultiplier; + slipperyComponent.ParalyzeTime = paralyzeTime; + } else if (TryComp(entityUid, out var comp)) { diff --git a/Content.Shared/Slippery/SlipperyComponent.cs b/Content.Shared/Slippery/SlipperyComponent.cs index 154ca6c51a45..a6bf0fce91d3 100644 --- a/Content.Shared/Slippery/SlipperyComponent.cs +++ b/Content.Shared/Slippery/SlipperyComponent.cs @@ -13,6 +13,8 @@ namespace Content.Shared.Slippery [RegisterComponent, NetworkedComponent, AutoGenerateComponentState] public sealed partial class SlipperyComponent : Component { + public const float DefaultParalyzeTime = 1.5f; + public const float DefaultLaunchForwardsMultiplier = 1.5f; /// /// Path to the sound to be played when a mob slips. /// @@ -25,14 +27,14 @@ public sealed partial class SlipperyComponent : Component /// [DataField, AutoNetworkedField] [Access(Other = AccessPermissions.ReadWrite)] - public float ParalyzeTime = 1.5f; + public float ParalyzeTime = DefaultParalyzeTime; /// /// The entity's speed will be multiplied by this to slip it forwards. /// [DataField, AutoNetworkedField] [Access(Other = AccessPermissions.ReadWrite)] - public float LaunchForwardsMultiplier = 1.5f; + public float LaunchForwardsMultiplier = DefaultLaunchForwardsMultiplier; /// /// If this is true, any slipping entity loses its friction until diff --git a/Content.Shared/StepTrigger/Components/StepTriggerComponent.cs b/Content.Shared/StepTrigger/Components/StepTriggerComponent.cs index b8483d021a4a..87d6d37a7f33 100644 --- a/Content.Shared/StepTrigger/Components/StepTriggerComponent.cs +++ b/Content.Shared/StepTrigger/Components/StepTriggerComponent.cs @@ -8,6 +8,7 @@ namespace Content.Shared.StepTrigger.Components; [Access(typeof(StepTriggerSystem))] public sealed partial class StepTriggerComponent : Component { + public const float DefaultRequiredTriggeredSpeed = 3.5f; /// /// List of entities that are currently colliding with the entity. /// @@ -37,7 +38,7 @@ public sealed partial class StepTriggerComponent : Component /// Entities will only be triggered if their speed exceeds this limit. /// [DataField, AutoNetworkedField] - public float RequiredTriggeredSpeed = 3.5f; + public float RequiredTriggeredSpeed = DefaultRequiredTriggeredSpeed; /// /// If any entities occupy the blacklist on the same tile then steptrigger won't work.