using Robust.Shared.Prototypes; using System.Linq; namespace Content.Shared.VendingMachines; public abstract class SharedVendingMachineSystem : EntitySystem { [Dependency] private readonly IPrototypeManager _prototypeManager = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnComponentInit); } protected virtual void OnComponentInit(EntityUid uid, VendingMachineComponent component, ComponentInit args) { if (!_prototypeManager.TryIndex(component.PackPrototypeId, out VendingMachineInventoryPrototype? packPrototype)) return; AddInventoryFromPrototype(uid, packPrototype.StartingInventory, InventoryType.Regular, component); AddInventoryFromPrototype(uid, packPrototype.EmaggedInventory, InventoryType.Emagged, component); AddInventoryFromPrototype(uid, packPrototype.ContrabandInventory, InventoryType.Contraband, component); } /// /// Returns all of the vending machine's inventory. Only includes emagged and contraband inventories if /// and /// are true respectively. /// /// /// /// public List GetAllInventory(EntityUid uid, VendingMachineComponent? component = null) { if (!Resolve(uid, ref component)) return new(); var inventory = new List(component.Inventory.Values); if (component.Emagged) inventory.AddRange(component.EmaggedInventory.Values); if (component.Contraband) inventory.AddRange(component.ContrabandInventory.Values); return inventory; } public List GetAvailableInventory(EntityUid uid, VendingMachineComponent? component = null) { if (!Resolve(uid, ref component)) return new(); return GetAllInventory(uid, component).Where(_ => _.Amount > 0).ToList(); } private void AddInventoryFromPrototype(EntityUid uid, Dictionary? entries, InventoryType type, VendingMachineComponent? component = null) { if (!Resolve(uid, ref component) || entries == null) { return; } var inventory = new Dictionary(); foreach (var (id, amount) in entries) { if (_prototypeManager.HasIndex(id)) { inventory.Add(id, new VendingMachineInventoryEntry(type, id, amount)); } } switch (type) { case InventoryType.Regular: component.Inventory = inventory; break; case InventoryType.Emagged: component.EmaggedInventory = inventory; break; case InventoryType.Contraband: component.ContrabandInventory = inventory; break; } } }