using System.Linq; namespace Content.Shared.CartridgeLoader; public sealed partial class CartridgeLoaderSystem { private void OnLoaderUiMessage(Entity ent, ref CartridgeLoaderUiMessage message) { var cartridge = GetEntity(message.CartridgeUid); switch (message.Action) { case CartridgeUiMessageAction.Activate: ActivateProgram(ent, cartridge); break; case CartridgeUiMessageAction.Deactivate: DeactivateProgram(ent, cartridge); break; case CartridgeUiMessageAction.Install: InstallCartridge(ent, cartridge); break; case CartridgeUiMessageAction.Uninstall: UninstallProgram(ent, cartridge); break; case CartridgeUiMessageAction.UIReady: if (ent.Comp.ActiveProgram is { } foreground) { var evt = new CartridgeUiReadyEvent(ent); RaiseLocalEvent(foreground, ref evt); } break; default: throw new ArgumentOutOfRangeException($"Unrecognized UI action passed from cartridge loader ui {message.Action}."); } } /// /// Relays ui messages meant for cartridges to the currently active cartridge. /// private void OnUiMessage(Entity ent, ref CartridgeUiMessage args) { var cartridgeEvent = args.MessageEvent; cartridgeEvent.User = args.Actor; cartridgeEvent.LoaderUid = GetNetEntity(ent); cartridgeEvent.Actor = args.Actor; if (ent.Comp.ActiveProgram is { } foreground) RaiseLocalEvent(foreground, cartridgeEvent); } /// /// Updates the programs ui state. /// /// The cartridge loaders entity uid. /// The programs ui state. Programs should use their own ui state class inheriting from . /// The cartridge loader component. /// /// This method is called "UpdateCartridgeUiState" but cartridges and a programs are the same. A cartridge is just a program as a visible item. /// /// public void UpdateCartridgeUiState(EntityUid loaderUid, BoundUserInterfaceState state, CartridgeLoaderComponent? loader = null) { if (!Resolve(loaderUid, ref loader)) return; if (_userInterface.HasUi(loaderUid, loader.UiKey)) _userInterface.SetUiState(loaderUid, loader.UiKey, state); } /// /// Updates the cartridge loaders ui state. /// /// /// Because the cartridge loader integrates with the ui of the entity using it, the entities ui state needs to inherit from /// and use this method to update its state so the cartridge loaders state can be added to it. /// /// public void UpdateUiState(Entity ent) { if (!Resolve(ent, ref ent.Comp)) return; if (!_userInterface.HasUi(ent.Owner, ent.Comp.UiKey)) return; var programs = GetNetEntityList(GetAllPrograms(ent).ToList()); var state = new CartridgeLoaderUiState(programs, GetNetEntity(ent.Comp.ActiveProgram)); _userInterface.SetUiState(ent.Owner, ent.Comp.UiKey, state); } }