using Content.Shared.Containers.ItemSlots; using Robust.Shared.Containers; using Robust.Shared.GameStates; using Robust.Shared.Map; namespace Content.Shared.CartridgeLoader; public abstract class SharedCartridgeLoaderSystem : EntitySystem { [Dependency] private readonly ItemSlotsSystem _itemSlotsSystem = default!; [Dependency] private readonly SharedAppearanceSystem _appearanceSystem = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnComponentInit); SubscribeLocalEvent(OnComponentRemove); SubscribeLocalEvent(OnItemInserted); SubscribeLocalEvent(OnItemRemoved); SubscribeLocalEvent(OnGetState); SubscribeLocalEvent(OnHandleState); } private void OnComponentInit(EntityUid uid, SharedCartridgeLoaderComponent loader, ComponentInit args) { _itemSlotsSystem.AddItemSlot(uid, SharedCartridgeLoaderComponent.CartridgeSlotId, loader.CartridgeSlot); } /// /// Marks installed program entities for deletion when the component gets removed /// private void OnComponentRemove(EntityUid uid, SharedCartridgeLoaderComponent loader, ComponentRemove args) { _itemSlotsSystem.RemoveItemSlot(uid, loader.CartridgeSlot); foreach (var program in loader.InstalledPrograms) { EntityManager.QueueDeleteEntity(program); } } protected virtual void OnItemInserted(EntityUid uid, SharedCartridgeLoaderComponent loader, EntInsertedIntoContainerMessage args) { UpdateAppearanceData(uid, loader); } protected virtual void OnItemRemoved(EntityUid uid, SharedCartridgeLoaderComponent loader, EntRemovedFromContainerMessage args) { UpdateAppearanceData(uid, loader); } private void OnGetState(EntityUid uid, CartridgeComponent component, ref ComponentGetState args) { var state = new CartridgeComponentState(); state.InstallationStatus = component.InstallationStatus; args.State = state; } private void OnHandleState(EntityUid uid, CartridgeComponent component, ref ComponentHandleState args) { if (args.Current is not CartridgeComponentState state) return; component.InstallationStatus = state.InstallationStatus; } private void UpdateAppearanceData(EntityUid uid, SharedCartridgeLoaderComponent loader) { _appearanceSystem.SetData(uid, CartridgeLoaderVisuals.CartridgeInserted, loader.CartridgeSlot.HasItem); } } /// /// Gets sent to program / cartridge entities when they get inserted or installed /// public sealed class CartridgeAddedEvent : EntityEventArgs { public readonly EntityUid Loader; public CartridgeAddedEvent(EntityUid loader) { Loader = loader; } } /// /// Gets sent to cartridge entities when they get ejected /// public sealed class CartridgeRemovedEvent : EntityEventArgs { public readonly EntityUid Loader; public CartridgeRemovedEvent(EntityUid loader) { Loader = loader; } } /// /// Gets sent to program / cartridge entities when they get activated /// /// /// Don't update the programs ui state in this events listener /// public sealed class CartridgeActivatedEvent : EntityEventArgs { public readonly EntityUid Loader; public CartridgeActivatedEvent(EntityUid loader) { Loader = loader; } } /// /// Gets sent to program / cartridge entities when they get deactivated /// public sealed class CartridgeDeactivatedEvent : EntityEventArgs { public readonly EntityUid Loader; public CartridgeDeactivatedEvent(EntityUid loader) { Loader = loader; } } /// /// Gets sent to program / cartridge entities when the ui is ready to be updated by the cartridge. /// /// /// This is used for the initial ui state update because updating the ui in the activate event doesn't work /// public sealed class CartridgeUiReadyEvent : EntityEventArgs { public readonly EntityUid Loader; public CartridgeUiReadyEvent(EntityUid loader) { Loader = loader; } }