using System.Diagnostics.CodeAnalysis; using Robust.Shared.Prototypes; namespace Content.Shared.Markings { public sealed class MarkingManager { [Dependency] private readonly IPrototypeManager _prototypeManager = default!; private readonly List _index = new(); private readonly Dictionary> _markingDict = new(); private readonly Dictionary _markings = new(); public void Initialize() { _prototypeManager.PrototypesReloaded += OnPrototypeReload; foreach (var category in Enum.GetValues()) _markingDict.Add(category, new List()); foreach (var prototype in _prototypeManager.EnumeratePrototypes()) { _index.Add(prototype); _markingDict[prototype.MarkingCategory].Add(prototype); _markings.Add(prototype.ID, prototype); } } public IReadOnlyDictionary Markings() => _markings; public IReadOnlyDictionary> CategorizedMarkings() => _markingDict; public IReadOnlyDictionary> MarkingsBySpecies(string species) { var result = new Dictionary>(_markingDict); foreach (var list in result.Values) { list.RemoveAll(marking => marking.SpeciesRestrictions != null && marking.SpeciesRestrictions.Contains(species)); } return result; } public bool IsValidMarking(Marking marking, [NotNullWhen(true)] out MarkingPrototype? markingResult) { return _markings.TryGetValue(marking.MarkingId, out markingResult); } private void OnPrototypeReload(PrototypesReloadedEventArgs args) { if(!args.ByType.TryGetValue(typeof(MarkingPrototype), out var set)) return; _index.RemoveAll(i => set.Modified.ContainsKey(i.ID)); foreach (var prototype in set.Modified.Values) { var markingPrototype = (MarkingPrototype) prototype; _index.Add(markingPrototype); } } } }