From: EnDecc <33369477+Endecc@users.noreply.github.com> Date: Sun, 23 Apr 2023 10:17:21 +0000 (-0400) Subject: Advanced Mop is now More Advanced + SolutionPurge Component (#15532) X-Git-Url: https://git.smokeofanarchy.ru/gitweb.cgi?a=commitdiff_plain;h=0f905486002e904cfbc5efd1ce7341a6730c3bc1;p=space-station-14.git Advanced Mop is now More Advanced + SolutionPurge Component (#15532) Co-authored-by: Arimah --- diff --git a/Content.Server/Chemistry/Components/SolutionPurgeComponent.cs b/Content.Server/Chemistry/Components/SolutionPurgeComponent.cs new file mode 100644 index 0000000000..d4a71b9dde --- /dev/null +++ b/Content.Server/Chemistry/Components/SolutionPurgeComponent.cs @@ -0,0 +1,46 @@ +using Content.Server.Chemistry.EntitySystems; +using Content.Shared.Chemistry.Reagent; +using Content.Shared.FixedPoint; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List; + +namespace Content.Server.Chemistry.Components; + +/// +/// Passively decreases a solution's quantity of reagent(s). +/// +[RegisterComponent] +[Access(typeof(SolutionPurgeSystem))] +public sealed class SolutionPurgeComponent : Component +{ + /// + /// The name of the solution to detract from. + /// + [DataField("solution", required: true), ViewVariables(VVAccess.ReadWrite)] + public string Solution = string.Empty; + + /// + /// The reagent(s) to be ignored when purging the solution + /// + [DataField("preserve", customTypeSerializer: typeof(PrototypeIdListSerializer))] + [ViewVariables(VVAccess.ReadWrite)] + public List Preserve = new(); + + /// + /// Amount of reagent(s) that are purged + /// + [DataField("quantity", required: true), ViewVariables(VVAccess.ReadWrite)] + public FixedPoint2 Quantity = default!; + + /// + /// How long it takes to purge once. + /// + [DataField("duration"), ViewVariables(VVAccess.ReadWrite)] + public TimeSpan Duration = TimeSpan.FromSeconds(1); + + /// + /// The time when the next purge will occur. + /// + [DataField("nextPurgeTime", customTypeSerializer: typeof(TimeOffsetSerializer)), ViewVariables(VVAccess.ReadWrite)] + public TimeSpan NextPurgeTime = TimeSpan.FromSeconds(0); +} diff --git a/Content.Server/Chemistry/EntitySystems/SolutionContainerSystem.cs b/Content.Server/Chemistry/EntitySystems/SolutionContainerSystem.cs index 2166b9c7f3..e84271981e 100644 --- a/Content.Server/Chemistry/EntitySystems/SolutionContainerSystem.cs +++ b/Content.Server/Chemistry/EntitySystems/SolutionContainerSystem.cs @@ -129,12 +129,12 @@ public sealed partial class SolutionContainerSystem : EntitySystem } /// - /// Splits a solution without the specified reagent. + /// Splits a solution without the specified reagent(s). /// public Solution SplitSolutionWithout(EntityUid targetUid, Solution solutionHolder, FixedPoint2 quantity, - string reagent) + params string[] reagents) { - var splitSol = solutionHolder.SplitSolutionWithout(quantity, reagent); + var splitSol = solutionHolder.SplitSolutionWithout(quantity, reagents); UpdateChemicals(targetUid, solutionHolder); return splitSol; } diff --git a/Content.Server/Chemistry/EntitySystems/SolutionPurgeSystem.cs b/Content.Server/Chemistry/EntitySystems/SolutionPurgeSystem.cs new file mode 100644 index 0000000000..41bde84870 --- /dev/null +++ b/Content.Server/Chemistry/EntitySystems/SolutionPurgeSystem.cs @@ -0,0 +1,48 @@ +using Content.Server.Chemistry.Components; +using Content.Server.Chemistry.Components.SolutionManager; +using Content.Shared.FixedPoint; +using Robust.Shared.Timing; + +namespace Content.Server.Chemistry.EntitySystems; + +public sealed class SolutionPurgeSystem : EntitySystem +{ + [Dependency] private readonly SolutionContainerSystem _solutionContainer = default!; + [Dependency] private readonly IGameTiming _timing = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnUnpaused); + SubscribeLocalEvent(OnMapInit); + } + + public override void Update(float frameTime) + { + base.Update(frameTime); + + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var purge, out var manager)) + { + if (_timing.CurTime < purge.NextPurgeTime) + continue; + + // timer ignores if it's empty, it's just a fixed cycle + purge.NextPurgeTime += purge.Duration; + if (_solutionContainer.TryGetSolution(uid, purge.Solution, out var solution, manager)) + _solutionContainer.SplitSolutionWithout(uid, solution, purge.Quantity, purge.Preserve.ToArray()); + } + } + + private void OnUnpaused(EntityUid uid, SolutionPurgeComponent comp, ref EntityUnpausedEvent args) + { + comp.NextPurgeTime += args.PausedTime; + } + + private void OnMapInit(EntityUid uid, SolutionPurgeComponent comp, MapInitEvent args) + { + if (comp.NextPurgeTime < _timing.CurTime) + comp.NextPurgeTime = _timing.CurTime; + } +} diff --git a/Content.Shared/Chemistry/Components/Solution.cs b/Content.Shared/Chemistry/Components/Solution.cs index 353733e715..8aaf9582ff 100644 --- a/Content.Shared/Chemistry/Components/Solution.cs +++ b/Content.Shared/Chemistry/Components/Solution.cs @@ -435,12 +435,20 @@ namespace Content.Shared.Chemistry.Components /// /// Splits a solution without the specified reagent. /// - public Solution SplitSolutionWithout(FixedPoint2 toTake, string without) + public Solution SplitSolutionWithout(FixedPoint2 toTake, params string[] without) { - TryGetReagent(without, out var existing); - RemoveReagent(without, toTake); + var existing = new FixedPoint2[without.Length]; + for (var i = 0; i < without.Length; i++) + { + TryGetReagent(without[i], out existing[i]); + RemoveReagent(without[i], existing[i]); + } + var sol = SplitSolution(toTake); - AddReagent(without, existing); + + for (var i = 0; i < without.Length; i++) + AddReagent(without[i], existing[i]); + return sol; } diff --git a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml index 2f058caa28..4e4d1b57ef 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml @@ -38,7 +38,7 @@ parent: BaseItem name: advanced mop id: AdvMopItem - description: Motorized mop that have a bigger reservoir and can mop multiple puddles at once. Automatic Clown Countermeasure no included. + description: Motorized mop that has a bigger reservoir and quickly replaces reagents inside with water. Automatic Clown Countermeasure not included. components: - type: Sprite sprite: Objects/Specific/Janitorial/advmop.rsi @@ -56,6 +56,17 @@ pickupAmount: 100 - type: UseDelay delay: 1.0 + - type: SolutionRegeneration + solution: absorbed + generated: + reagents: + - ReagentId: Water + Quantity: 5 + - type: SolutionPurge + solution: absorbed + preserve: + - Water + quantity: 10 - type: SolutionContainerManager solutions: absorbed: diff --git a/Resources/Prototypes/Recipes/Lathes/janitorial.yml b/Resources/Prototypes/Recipes/Lathes/janitorial.yml index f05b060447..a9a2866c1d 100644 --- a/Resources/Prototypes/Recipes/Lathes/janitorial.yml +++ b/Resources/Prototypes/Recipes/Lathes/janitorial.yml @@ -61,6 +61,6 @@ result: AdvMopItem completetime: 2 materials: - Plastic: 100 + Plastic: 400 Steel: 100 Glass: 100