using System; using System.Reflection; using RobocraftX.Common; using Svelto.ECS; using Svelto.ECS.Serialization; using GamecraftModdingAPI.Persistence; using GamecraftModdingAPI.Events; namespace GamecraftModdingAPI.Utility { /// <summary> /// Tracks the API version the current game was built for. /// For compatibility reasons, this must be enabled before it will work. /// </summary> public static class VersionTracking { private static readonly VersionTrackingEngine versionEngine = new VersionTrackingEngine(); private static bool isEnabled = false; /// <summary> /// Gets the API version saved in the current game. /// </summary> /// <returns>The version.</returns> public static uint GetVersion() { if (!isEnabled) return 0u; return versionEngine.GetGameVersion(); } /// <summary> /// Enable API version tracking. /// </summary> public static void Enable() { EventManager.AddEventEmitter(versionEngine); isEnabled = true; } /// <summary> /// Disable API version tracking. /// </summary> public static void Disable() { EventManager.AddEventEmitter(versionEngine); isEnabled = false; } public static void Init() { SerializerManager.AddSerializer<ModVersionDescriptor>(new SimpleEntitySerializer<ModVersionDescriptor>( (_) => { return new EGID[1] { new EGID(0u, ApiExclusiveGroups.versionGroup) }; } )); } } internal class VersionTrackingEngine : IEventEmitterEngine { public string Name { get; } = "GamecraftModdingAPIVersionTrackingGameEngine"; public EntitiesDB entitiesDB { set; private get; } public int type => -1; public bool isRemovable => false; public IEntityFactory Factory { set; private get; } public void Dispose() { } public void Ready() { EGID egid = new EGID(0u, ApiExclusiveGroups.versionGroup); if (!entitiesDB.Exists<ModVersionStruct>(egid)) { Version currentVersion = Assembly.GetExecutingAssembly().GetName().Version; int v = (currentVersion.Major * 1000) + (currentVersion.Minor); Factory.BuildEntity<ModVersionDescriptor>(egid).Init<ModVersionStruct>(new ModVersionStruct { version = (uint)v }); } } public uint GetGameVersion() { return entitiesDB.QueryUniqueEntity<ModVersionStruct>(ApiExclusiveGroups.versionGroup).version; } public void Emit() { } } public struct ModVersionStruct : IEntityComponent { public uint version; } public class ModVersionDescriptor: SerializableEntityDescriptor<ModVersionDescriptor._ModVersionDescriptor> { [HashName("GamecraftModdingAPIVersionV0")] public class _ModVersionDescriptor : IEntityDescriptor { public IComponentBuilder[] componentsToBuild { get; } = new IComponentBuilder[]{ new SerializableComponentBuilder<SerializationType, ModVersionStruct>(((int)SerializationType.Network, new DefaultSerializer<ModVersionStruct>()), ((int)SerializationType.Storage, new DefaultSerializer<ModVersionStruct>())), }; } } }