using Content.Server.PowerCell; using Content.Shared.PowerCell; using Content.Shared.UserInterface; using Robust.Shared.Containers; namespace Content.Server.UserInterface; public sealed partial class ActivatableUISystem { [Dependency] private readonly PowerCellSystem _cell = default!; private void InitializePower() { SubscribeLocalEvent(OnBatteryOpenAttempt); SubscribeLocalEvent(OnBatteryOpened); SubscribeLocalEvent(OnBatteryClosed); SubscribeLocalEvent(OnPowerCellRemoved); } private void OnPowerCellRemoved(EntityUid uid, PowerCellDrawComponent component, EntRemovedFromContainerMessage args) { _cell.SetPowerCellDrawEnabled(uid, false); if (HasComp(uid) && TryComp(uid, out var activatable) && activatable.Key != null) { _uiSystem.TryCloseAll(uid, activatable.Key); } } private void OnBatteryOpened(EntityUid uid, ActivatableUIRequiresPowerCellComponent component, BoundUIOpenedEvent args) { var activatable = Comp(uid); if (!args.UiKey.Equals(activatable.Key)) return; _cell.SetPowerCellDrawEnabled(uid, true); } private void OnBatteryClosed(EntityUid uid, ActivatableUIRequiresPowerCellComponent component, BoundUIClosedEvent args) { var activatable = Comp(uid); if (!args.UiKey.Equals(activatable.Key)) return; // Stop drawing power if this was the last person with the UI open. if (!_uiSystem.IsUiOpen(uid, activatable.Key)) _cell.SetPowerCellDrawEnabled(uid, false); } /// /// Call if you want to check if the UI should close due to a recent battery usage. /// public void CheckUsage(EntityUid uid, ActivatableUIComponent? active = null, ActivatableUIRequiresPowerCellComponent? component = null, PowerCellDrawComponent? draw = null) { if (!Resolve(uid, ref component, ref draw, ref active, false) || active.Key == null) return; if (_cell.HasCharge(uid, draw.UseRate)) return; _uiSystem.TryCloseAll(uid, active.Key); } private void OnBatteryOpenAttempt(EntityUid uid, ActivatableUIRequiresPowerCellComponent component, ActivatableUIOpenAttemptEvent args) { if (!TryComp(uid, out var draw)) return; // Check if we have the appropriate drawrate / userate to even open it. if (args.Cancelled || !_cell.HasCharge(uid, MathF.Max(draw.DrawRate, draw.UseRate), user: args.User)) { args.Cancel(); return; } } }