diff --git a/Content.Server/Chemistry/TileReactions/SpillTileReaction.cs b/Content.Server/Chemistry/TileReactions/SpillTileReaction.cs index 78457386d5..1f2a3d8b4f 100644 --- a/Content.Server/Chemistry/TileReactions/SpillTileReaction.cs +++ b/Content.Server/Chemistry/TileReactions/SpillTileReaction.cs @@ -4,6 +4,7 @@ using Content.Shared.Chemistry.Reaction; using Content.Shared.Chemistry.Reagent; using Content.Shared.FixedPoint; using Content.Shared.Movement.Components; +using Content.Shared.Movement.Systems; using Content.Shared.Slippery; using Content.Shared.StepTrigger.Components; using Content.Shared.StepTrigger.Systems; @@ -39,9 +40,7 @@ namespace Content.Server.Chemistry.TileReactions var slow = entityManager.EnsureComponent(puddleUid); var speedModifier = 1 - reagent.Viscosity; - slow.WalkSpeedModifier = speedModifier; - slow.SprintSpeedModifier = speedModifier; - entityManager.Dirty(slow); + entityManager.EntitySysManager.GetEntitySystem().ChangeModifiers(puddleUid, speedModifier, slow); return reactVolume; } diff --git a/Content.Server/Fluids/EntitySystems/PuddleSystem.cs b/Content.Server/Fluids/EntitySystems/PuddleSystem.cs index 631a57ce52..2bbf139230 100644 --- a/Content.Server/Fluids/EntitySystems/PuddleSystem.cs +++ b/Content.Server/Fluids/EntitySystems/PuddleSystem.cs @@ -25,6 +25,8 @@ using Solution = Content.Shared.Chemistry.Components.Solution; using Robust.Shared.Prototypes; using Robust.Shared.Random; using Robust.Shared.Timing; +using Content.Shared.Movement.Components; +using Content.Shared.Movement.Systems; namespace Content.Server.Fluids.EntitySystems; @@ -47,6 +49,7 @@ public sealed partial class PuddleSystem : SharedPuddleSystem [Dependency] private readonly StepTriggerSystem _stepTrigger = default!; [Dependency] private readonly SolutionContainerSystem _solutionContainerSystem = default!; [Dependency] private readonly TileFrictionController _tile = default!; + [Dependency] private readonly SlowContactsSystem _slowContacts = default!; public static float PuddleVolume = 1000; @@ -242,6 +245,7 @@ public sealed partial class PuddleSystem : SharedPuddleSystem _deletionQueue.Remove(uid); UpdateSlip(uid, component, args.Solution); + UpdateSlow(uid, args.Solution); UpdateEvaporation(uid, args.Solution); UpdateAppearance(uid, component); } @@ -319,6 +323,26 @@ public sealed partial class PuddleSystem : SharedPuddleSystem } } + private void UpdateSlow(EntityUid uid, Solution solution) + { + var maxViscosity = 0f; + foreach (var reagent in solution.Contents) + { + var reagentProto = _prototypeManager.Index(reagent.ReagentId); + maxViscosity = Math.Max(maxViscosity, reagentProto.Viscosity); + } + if (maxViscosity > 0) + { + var comp = EnsureComp(uid); + var speed = 1 - maxViscosity; + _slowContacts.ChangeModifiers(uid, speed, comp); + } + else + { + RemComp(uid); + } + } + private void HandlePuddleExamined(EntityUid uid, PuddleComponent component, ExaminedEvent args) { if (TryComp(uid, out var slippery) && slippery.Active) diff --git a/Content.Shared/Movement/Components/SlowContactsComponent.cs b/Content.Shared/Movement/Components/SlowContactsComponent.cs index 2870c7c454..00cbc55d19 100644 --- a/Content.Shared/Movement/Components/SlowContactsComponent.cs +++ b/Content.Shared/Movement/Components/SlowContactsComponent.cs @@ -1,32 +1,22 @@ +using Content.Shared.Movement.Systems; using Content.Shared.Whitelist; using Robust.Shared.GameStates; -using Robust.Shared.Serialization; namespace Content.Shared.Movement.Components; [NetworkedComponent, RegisterComponent] -public sealed class SlowContactsComponent : Component +[AutoGenerateComponentState] +[Access(typeof(SlowContactsSystem))] +public sealed partial class SlowContactsComponent : Component { - [DataField("walkSpeedModifier")] - public float WalkSpeedModifier { get; set; } = 1.0f; + [DataField("walkSpeedModifier"), ViewVariables(VVAccess.ReadWrite)] + [AutoNetworkedField] + public float WalkSpeedModifier = 1.0f; - [DataField("sprintSpeedModifier")] - public float SprintSpeedModifier { get; set; } = 1.0f; + [AutoNetworkedField] + [DataField("sprintSpeedModifier"), ViewVariables(VVAccess.ReadWrite)] + public float SprintSpeedModifier = 1.0f; [DataField("ignoreWhitelist")] public EntityWhitelist? IgnoreWhitelist; } - -[Serializable, NetSerializable] -public sealed class SlowContactsComponentState : ComponentState -{ - public readonly float WalkSpeedModifier; - - public readonly float SprintSpeedModifier; - - public SlowContactsComponentState(float walkSpeedModifier, float sprintSpeedModifier) - { - WalkSpeedModifier = walkSpeedModifier; - SprintSpeedModifier = sprintSpeedModifier; - } -} diff --git a/Content.Shared/Movement/Systems/SlowContactsSystem.cs b/Content.Shared/Movement/Systems/SlowContactsSystem.cs index 44e64218e0..3118e80a20 100644 --- a/Content.Shared/Movement/Systems/SlowContactsSystem.cs +++ b/Content.Shared/Movement/Systems/SlowContactsSystem.cs @@ -1,5 +1,4 @@ using Content.Shared.Movement.Components; -using Robust.Shared.GameStates; using Robust.Shared.Physics.Components; using Robust.Shared.Physics.Events; using Robust.Shared.Physics.Systems; @@ -21,9 +20,6 @@ public sealed class SlowContactsSystem : EntitySystem SubscribeLocalEvent(OnEntityExit); SubscribeLocalEvent(MovementSpeedCheck); - SubscribeLocalEvent(OnHandleState); - SubscribeLocalEvent(OnGetState); - UpdatesAfter.Add(typeof(SharedPhysicsSystem)); } @@ -46,18 +42,20 @@ public sealed class SlowContactsSystem : EntitySystem _toUpdate.Clear(); } - private void OnGetState(EntityUid uid, SlowContactsComponent component, ref ComponentGetState args) + public void ChangeModifiers(EntityUid uid, float speed, SlowContactsComponent? component = null) { - args.State = new SlowContactsComponentState(component.WalkSpeedModifier, component.SprintSpeedModifier); + ChangeModifiers(uid, speed, speed, component); } - private void OnHandleState(EntityUid uid, SlowContactsComponent component, ref ComponentHandleState args) + public void ChangeModifiers(EntityUid uid, float walkSpeed, float sprintSpeed, SlowContactsComponent? component = null) { - if (args.Current is not SlowContactsComponentState state) + if (!Resolve(uid, ref component)) + { return; - - component.WalkSpeedModifier = state.WalkSpeedModifier; - component.SprintSpeedModifier = state.SprintSpeedModifier; + } + component.WalkSpeedModifier = walkSpeed; + component.SprintSpeedModifier = sprintSpeed; + Dirty(component); } private void MovementSpeedCheck(EntityUid uid, SlowedByContactComponent component, RefreshMovementSpeedModifiersEvent args)