using System; using System.Collections; using System.Collections.Generic; using Robust.Shared.GameObjects; using Robust.Shared.GameStates; using Robust.Shared.IoC; using Robust.Shared.Log; using Robust.Shared.Prototypes; using Robust.Shared.Serialization; using Robust.Shared.Serialization.Manager.Attributes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List; namespace Content.Shared.Cargo.Components { [NetworkedComponent()] public abstract class SharedGalacticMarketComponent : Component, IEnumerable, ISerializationHooks { [DataField("products", customTypeSerializer: typeof(PrototypeIdListSerializer))] 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)) { Logger.ErrorS("cargo", $"Unable to find {nameof(CargoProductPrototype)} for {id}"); 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 sealed class GalacticMarketState : ComponentState { public List Products; public GalacticMarketState(List technologies) { Products = technologies; } } }