using System.Collections; using Content.Shared.Research.Prototypes; using Robust.Shared.GameStates; using Robust.Shared.Prototypes; using Robust.Shared.Serialization; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List; namespace Content.Shared.Lathe { [NetworkedComponent()] public abstract class SharedLatheDatabaseComponent : Component, IEnumerable, ISerializationHooks { [DataField("recipes", customTypeSerializer: typeof(PrototypeIdListSerializer))] private List _recipeIds = new(); public readonly List _recipes = new(); void ISerializationHooks.BeforeSerialization() { var list = new List(); foreach (var recipe in _recipes) { list.Add(recipe.ID); } _recipeIds = list; } void ISerializationHooks.AfterDeserialization() { var prototypeManager = IoCManager.Resolve(); foreach (var id in _recipeIds) { if (prototypeManager.TryIndex(id, out LatheRecipePrototype? recipe)) { _recipes.Add(recipe); } } } /// /// Removes all recipes from the database if it's not static. /// /// Whether it could clear the database or not. public virtual void Clear() { _recipes.Clear(); } /// /// Adds a recipe to the database if it's not static. /// /// The recipe to be added. /// Whether it could be added or not public virtual void AddRecipe(LatheRecipePrototype recipe) { if (!Contains(recipe)) _recipes.Add(recipe); } /// /// Removes a recipe from the database if it's not static. /// /// The recipe to be removed. /// Whether it could be removed or not public virtual bool RemoveRecipe(LatheRecipePrototype recipe) { return _recipes.Remove(recipe); } /// /// Returns whether the database contains the recipe or not. /// /// The recipe to check /// Whether the database contained the recipe or not. public virtual bool Contains(LatheRecipePrototype recipe) { return _recipes.Contains(recipe); } /// /// Returns whether the database contains the recipe or not. /// /// The recipe id to check /// Whether the database contained the recipe or not. public virtual bool Contains(string id) { foreach (var recipe in _recipes) { if (recipe.ID == id) return true; } return false; } public List GetRecipeIdList() { var list = new List(); foreach (var recipe in this) { list.Add(recipe.ID); } return list; } public IEnumerator GetEnumerator() { return _recipes.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } } [NetSerializable, Serializable] public sealed class LatheDatabaseState : ComponentState { public readonly List Recipes; public LatheDatabaseState(List recipes) { Recipes = recipes; } } }