#nullable enable using System; using System.Collections; using System.Collections.Generic; using Content.Shared.Prototypes.Cargo; using Robust.Shared.GameObjects; using Robust.Shared.IoC; using Robust.Shared.Prototypes; using Robust.Shared.Serialization; using Robust.Shared.Serialization.Manager.Attributes; namespace Content.Shared.GameObjects.Components.Cargo { public class SharedGalacticMarketComponent : Component, IEnumerable, ISerializationHooks { public sealed override string Name => "GalacticMarket"; public sealed override uint? NetID => ContentNetIDs.GALACTIC_MARKET; [DataField("products")] protected List _productIds = new(); protected readonly List _products = new(); /// /// A read-only list of products. /// public IReadOnlyList Products => _products; void ISerializationHooks.AfterDeserialization() { var prototypeManager = IoCManager.Resolve(); _products.Clear(); foreach (var id in _productIds) { if (!prototypeManager.TryIndex(id, out CargoProductPrototype? product)) { continue; } _products.Add(product); } } void ISerializationHooks.BeforeSerialization() { _productIds.Clear(); foreach (var product in _products) { _productIds.Add(product.ID); } } public IEnumerator GetEnumerator() { return _products.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } /// /// Returns a product from the string id; /// /// Product public CargoProductPrototype? GetProduct(string productId) { var prototypeManager = IoCManager.Resolve(); if (!prototypeManager.TryIndex(productId, out CargoProductPrototype? product) || !_products.Contains(product)) { return null; } return product; } /// /// Returns a list with the IDs of all products. /// /// A list of product IDs public List GetProductIdList() { var productIds = new List(); foreach (var product in _products) { productIds.Add(product.ID); } return productIds; } } [Serializable, NetSerializable] public class GalacticMarketState : ComponentState { public List Products; public GalacticMarketState(List technologies) : base(ContentNetIDs.GALACTIC_MARKET) { Products = technologies; } } }