Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
VersionsManager.cs
浏览该文件的文档.
1using System.Reflection;
2using System.Runtime.InteropServices;
3using System.Xml.Linq;
4using Engine;
5using XmlUtilities;
6
7namespace Game {
8 public static class VersionsManager {
9 public static List<VersionConverter> m_versionConverters;
10
11 public enum Platform {
13 }
14
15 public static string PlatformString => CurrentPlatform.ToString();
16
17 public static Platform CurrentPlatform {
18 get {
19#if WINDOWS
20 return Platform.Windows;
21#elif ANDROID
22 return Platform.Android;
23#elif LINUX
24 return Platform.Linux;
25#elif BROWSER
26 return Platform.Browser;
27#elif IOS
28 return Platform.IOS;
29#else
30 return Platform.Other;
31#endif
32 }
33 }
34
39 public static PlatformID PlatformID = Environment.OSVersion.Platform;
40
41 public static string PlatformTag = RuntimeInformation.OSDescription;
43
44#if DIRECT3D11
45 public static bool IsDirect3D11 = true;
46#else
47 public static bool IsDirect3D11 = false;
48#endif
49
50 public static string Version { get; set; }
51
52 public static string SerializationVersion { get; set; }
53
54 public static string LastLaunchedVersion { get; set; }
55
56 static VersionsManager() {
57 m_versionConverters = []; //List
58 Assembly assembly = typeof(VersionsManager).GetTypeInfo().Assembly;
59 AssemblyName assemblyName = new(assembly.FullName!);
60 Version = $"{assemblyName.Version!.Major}.{assemblyName.Version.Minor}.{assemblyName.Version.Build}.{assemblyName.Version.Revision}";
61 SerializationVersion = $"{assemblyName.Version.Major}.{assemblyName.Version.Minor}";
62#pragma warning disable IL2026
63 foreach (TypeInfo definedType in assembly.DefinedTypes) {
64#pragma warning restore IL2026
65 if (!definedType.IsAbstract
66 && !definedType.IsInterface
67 && typeof(VersionConverter).GetTypeInfo().IsAssignableFrom(definedType)) {
68#pragma warning disable IL2072
69 VersionConverter item = (VersionConverter)Activator.CreateInstance(definedType.AsType());
70#pragma warning restore IL2072
71 m_versionConverters.Add(item);
72 }
73 }
74 }
75
81
82 public static void UpgradeProjectXml(XElement projectNode) {
83 string attributeValue = XmlUtils.GetAttributeValue(projectNode, "Version", "1.0");
84 if (attributeValue != SerializationVersion) {
86 ?? throw new InvalidOperationException(
87 $"Cannot find conversion path from version \"{attributeValue}\" to version \"{SerializationVersion}\""
88 )) {
89 Log.Information($"Upgrading world version \"{item.SourceVersion}\" to \"{item.TargetVersion}\".");
90 item.ConvertProjectXml(projectNode);
91 }
92 string attributeValue2 = XmlUtils.GetAttributeValue(projectNode, "Version", "1.0");
93 if (attributeValue2 != SerializationVersion) {
94 throw new InvalidOperationException(
95 $"Upgrade produced invalid project version. Expected \"{SerializationVersion}\", found \"{attributeValue2}\"."
96 );
97 }
98 }
99 }
100
101 public static void UpgradeWorld(string directoryName) {
102 WorldInfo worldInfo = WorldsManager.GetWorldInfo(directoryName);
103 if (worldInfo == null) {
104 throw new InvalidOperationException($"Cannot determine version of world at \"{directoryName}\"");
105 }
107 ProgressManager.UpdateProgress($"Upgrading World To {SerializationVersion}", 0f);
109 ?? throw new InvalidOperationException(
110 $"Cannot find conversion path from version \"{worldInfo.SerializationVersion}\" to version \"{SerializationVersion}\""
111 )) {
112 Log.Information($"Upgrading world version \"{item.SourceVersion}\" to \"{item.TargetVersion}\".");
113 item.ConvertWorld(directoryName);
114 }
115 WorldInfo worldInfo2 = WorldsManager.GetWorldInfo(directoryName);
116 if (worldInfo2.SerializationVersion != SerializationVersion) {
117 throw new InvalidOperationException(
118 $"Upgrade produced invalid project version. Expected \"{SerializationVersion}\", found \"{worldInfo2.SerializationVersion}\"."
119 );
120 }
121 }
122 }
123
124 public static int CompareVersions(string v1, string v2) {
125 string[] array = v1.Split('.');
126 string[] array2 = v2.Split('.');
127 for (int i = 0; i < MathUtils.Min(array.Length, array2.Length); i++) {
128 int num = !int.TryParse(array[i], out int result) || !int.TryParse(array2[i], out int result2)
129 ? string.CompareOrdinal(array[i], array2[i])
130 : result - result2;
131 if (num != 0) {
132 return num;
133 }
134 }
135 return array.Length - array2.Length;
136 }
137
138 public static List<VersionConverter> FindTransform(string sourceVersion,
139 string targetVersion,
140 IEnumerable<VersionConverter> converters,
141 int depth) {
142 if (depth > 100) {
143 throw new InvalidOperationException(
144 "Too deep recursion when searching for version converters. Check for possible loops in transforms."
145 );
146 }
147 if (sourceVersion == targetVersion) {
148 return [];
149 }
150 List<VersionConverter> result = null;
151 int num = 2147483647;
152 IEnumerable<VersionConverter> versionConverters = converters as List<VersionConverter> ?? converters.ToList();
153 foreach (VersionConverter converter in versionConverters) {
154 if (converter.SourceVersion == sourceVersion) {
155 List<VersionConverter> list = FindTransform(converter.TargetVersion, targetVersion, versionConverters, depth + 1);
156 if (list != null
157 && list.Count < num) {
158 num = list.Count;
159 list.Insert(0, converter);
160 result = list;
161 }
162 }
163 }
164 return result;
165 }
166 }
167}
System.Environment Environment
static void Information(object message)
定义 Log.cs:56
static int Min(int x1, int x2)
static void UpdateProgress(string operationName, float progress)
virtual void ConvertProjectXml(XElement projectNode)
virtual void ConvertWorld(string directoryName)
static BuildConfiguration BuildConfiguration
static List< VersionConverter > FindTransform(string sourceVersion, string targetVersion, IEnumerable< VersionConverter > converters, int depth)
static Platform CurrentPlatform
static List< VersionConverter > m_versionConverters
static int CompareVersions(string v1, string v2)
static void UpgradeWorld(string directoryName)
static PlatformID PlatformID
Win32NT:Windows Unix:Linux
static void UpgradeProjectXml(XElement projectNode)
string SerializationVersion
static WorldInfo GetWorldInfo(string directoryName)
static object GetAttributeValue(XElement node, string attributeName, Type type)