diff --git a/Content.Server/Chemistry/Components/SolutionRegenerationComponent.cs b/Content.Server/Chemistry/Components/SolutionRegenerationComponent.cs new file mode 100644 index 0000000000..d84f9365c7 --- /dev/null +++ b/Content.Server/Chemistry/Components/SolutionRegenerationComponent.cs @@ -0,0 +1,39 @@ +using Content.Server.Chemistry.EntitySystems; +using Content.Shared.Chemistry.Components; +using Content.Shared.FixedPoint; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; + +namespace Content.Server.Chemistry.Components; + +/// +/// Passively increases a solution's quantity of a reagent. +/// +[RegisterComponent] +[Access(typeof(SolutionRegenerationSystem))] +public sealed class SolutionRegenerationComponent : Component +{ + /// + /// The name of the solution to add to. + /// + [DataField("solution", required: true), ViewVariables(VVAccess.ReadWrite)] + public string Solution = string.Empty; + + /// + /// The reagent(s) to be regenerated in the solution. + /// + [DataField("generated", required: true), ViewVariables(VVAccess.ReadWrite)] + public Solution Generated = default!; + + /// + /// How long it takes to regenerate once. + /// + [DataField("duration"), ViewVariables(VVAccess.ReadWrite)] + public TimeSpan Duration = TimeSpan.FromSeconds(1); + + /// + /// The time when the next regeneration will occur. + /// + [DataField("nextChargeTime", customTypeSerializer: typeof(TimeOffsetSerializer)), ViewVariables(VVAccess.ReadWrite)] + public TimeSpan NextRegenTime = TimeSpan.FromSeconds(0); +} diff --git a/Content.Server/Chemistry/EntitySystems/SolutionRegenerationSystem.cs b/Content.Server/Chemistry/EntitySystems/SolutionRegenerationSystem.cs new file mode 100644 index 0000000000..d6d74820d1 --- /dev/null +++ b/Content.Server/Chemistry/EntitySystems/SolutionRegenerationSystem.cs @@ -0,0 +1,40 @@ +using Content.Server.Chemistry.Components; +using Content.Server.Chemistry.Components.SolutionManager; +using Robust.Shared.Timing; + +namespace Content.Server.Chemistry.EntitySystems; + +public sealed class SolutionRegenerationSystem : EntitySystem +{ + [Dependency] private readonly SolutionContainerSystem _solutionContainer = default!; + [Dependency] private readonly IGameTiming _timing = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnUnpaused); + } + + public override void Update(float frameTime) + { + base.Update(frameTime); + + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var regen, out var manager)) + { + if (_timing.CurTime < regen.NextRegenTime) + continue; + + // timer ignores if its full, it's just a fixed cycle + regen.NextRegenTime = _timing.CurTime + regen.Duration; + if (_solutionContainer.TryGetSolution(uid, regen.Solution, out var solution, manager)) + _solutionContainer.TryAddSolution(uid, solution, regen.Generated); + } + } + + private void OnUnpaused(EntityUid uid, SolutionRegenerationComponent comp, ref EntityUnpausedEvent args) + { + comp.NextRegenTime += args.PausedTime; + } +} diff --git a/Resources/Prototypes/Entities/Objects/Tools/welders.yml b/Resources/Prototypes/Entities/Objects/Tools/welders.yml index 0834b192b0..4a38583c84 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/welders.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/welders.yml @@ -127,6 +127,12 @@ enabled: false radius: 1.5 color: lightblue + - type: SolutionRegeneration + solution: Welder + generated: + reagents: + - ReagentId: WeldingFuel + Quantity: 1 - type: entity name: emergency welding tool