using Content.Shared.PowerCell; using Robust.Shared.Containers; namespace Content.Shared.UserInterface; public sealed partial class ActivatableUISystem { [Dependency] private readonly SharedPowerCellSystem _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 ActivatableUIComponent? activatable)) { return; } if (activatable.Key == null) { Log.Error($"Encountered null key in activatable ui on entity {ToPrettyString(uid)}"); return; } _uiSystem.CloseUi(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)) return; if (active.Key == null) { Log.Error($"Encountered null key in activatable ui on entity {ToPrettyString(uid)}"); return; } if (_cell.HasActivatableCharge(uid)) return; _uiSystem.CloseUi(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.HasActivatableCharge(uid, draw, user: args.User) || !_cell.HasDrawCharge(uid, draw, user: args.User)) { args.Cancel(); } } }