using Content.Server.Chemistry.Components; using Content.Server.Power.Components; using Content.Server.Power.EntitySystems; using Content.Shared.Chemistry.EntitySystems; using Content.Shared.Chemistry; using Content.Shared.Chemistry.Components.SolutionManager; using Content.Shared.Placeable; using Content.Shared.Power; namespace Content.Server.Chemistry.EntitySystems; public sealed class SolutionHeaterSystem : EntitySystem { [Dependency] private readonly PowerReceiverSystem _powerReceiver = default!; [Dependency] private readonly SharedAppearanceSystem _appearance = default!; [Dependency] private readonly SharedSolutionContainerSystem _solutionContainer = default!; /// public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnPowerChanged); SubscribeLocalEvent(OnItemPlaced); SubscribeLocalEvent(OnItemRemoved); } private void TurnOn(EntityUid uid) { _appearance.SetData(uid, SolutionHeaterVisuals.IsOn, true); EnsureComp(uid); } public bool TryTurnOn(EntityUid uid, ItemPlacerComponent? placer = null) { if (!Resolve(uid, ref placer)) return false; if (placer.PlacedEntities.Count <= 0 || !_powerReceiver.IsPowered(uid)) return false; TurnOn(uid); return true; } public void TurnOff(EntityUid uid) { _appearance.SetData(uid, SolutionHeaterVisuals.IsOn, false); RemComp(uid); } private void OnPowerChanged(Entity entity, ref PowerChangedEvent args) { var placer = Comp(entity); if (args.Powered && placer.PlacedEntities.Count > 0) { TurnOn(entity); } else { TurnOff(entity); } } private void OnItemPlaced(Entity entity, ref ItemPlacedEvent args) { TryTurnOn(entity); } private void OnItemRemoved(Entity entity, ref ItemRemovedEvent args) { var placer = Comp(entity); if (placer.PlacedEntities.Count == 0) // Last entity was removed TurnOff(entity); } public override void Update(float frameTime) { base.Update(frameTime); var query = EntityQueryEnumerator(); while (query.MoveNext(out _, out _, out var heater, out var placer)) { foreach (var heatingEntity in placer.PlacedEntities) { if (!TryComp(heatingEntity, out var container)) continue; var energy = heater.HeatPerSecond * frameTime; foreach (var (_, soln) in _solutionContainer.EnumerateSolutions((heatingEntity, container))) { _solutionContainer.AddThermalEnergy(soln, energy); } } } } }