using System; using System.Collections.Generic; using System.Linq; using Svelto.ECS; using Svelto.ECS.Serialization; using TechbloxModdingAPI.Utility; namespace TechbloxModdingAPI.Persistence { /// /// Keeps track of serializers. /// This is used to add and retrieve serializers. /// Added IEntitySerializations are used in serializing and deserializing Techblox save files (GameSave.GC). /// public static class SerializerManager { private static Dictionary _serializers = new Dictionary(); private static Dictionary> _registrations = new Dictionary>(); private static EnginesRoot _lastEnginesRoot; public static void AddSerializer(IEntitySerializer serializer) where T : ISerializableEntityDescriptor, new() { string name = typeof(T).FullName; _serializers[name] = serializer; _registrations[name] = (IEntitySerialization ies) => { ies.RegisterSerializationFactory(serializer); }; if (_lastEnginesRoot != null) { _registrations[name].Invoke(_lastEnginesRoot.GenerateEntitySerializer()); _lastEnginesRoot.AddEngine(serializer); } } public static bool ExistsSerializer(string name) { return _serializers.ContainsKey(name); } public static bool ExistsSerializer(IEntitySerializer serializer) where T : ISerializableEntityDescriptor, new() { return ExistsSerializer(typeof(T).FullName); } public static IEntitySerializer GetSerializer(string name) { return _serializers[name]; } public static string[] GetSerializerNames() { return _serializers.Keys.ToArray(); } public static int GetSerializersCount() { return _serializers.Count; } internal static void RegisterSerializers(EnginesRoot enginesRoot) { _lastEnginesRoot = enginesRoot; IEntitySerialization ies = enginesRoot.GenerateEntitySerializer(); foreach (string key in _serializers.Keys) { Logging.MetaDebugLog($"Registering IEntitySerializer for {key}"); _registrations[key].Invoke(ies); enginesRoot.AddEngine(_serializers[key]); } } } }