diff --git a/Plain Craft Launcher 2/Modules/Base/ModBase.cs b/Plain Craft Launcher 2/Modules/Base/ModBase.cs index f226359d7..070686f7a 100644 --- a/Plain Craft Launcher 2/Modules/Base/ModBase.cs +++ b/Plain Craft Launcher 2/Modules/Base/ModBase.cs @@ -19,7 +19,6 @@ using System.Xaml; using System.Xml.Linq; using Microsoft.VisualBasic; -using Microsoft.VisualBasic.CompilerServices; using Microsoft.Win32; using System.Text.Json.Nodes; using PCL.Core.App; @@ -250,10 +249,10 @@ public MyColor(object obj) } else { - A = Conversions.ToDouble(((dynamic)obj).A); - R = Conversions.ToDouble(((dynamic)obj).R); - G = Conversions.ToDouble(((dynamic)obj).G); - B = Conversions.ToDouble(((dynamic)obj).B); + A = Convert.ToDouble(((dynamic)obj).A); + R = Convert.ToDouble(((dynamic)obj).R); + G = Convert.ToDouble(((dynamic)obj).G); + B = Convert.ToDouble(((dynamic)obj).B); } } @@ -429,7 +428,7 @@ public override string ToString() public override bool Equals(object obj) { - return Operators.ConditionalCompareObjectEqual(this, obj, false); + return obj is MyColor other && A == other.A && R == other.R && G == other.G && B == other.B; } } @@ -562,7 +561,7 @@ public static string RadixConvert(string Input, int FromRadix, int ToRadix) // 转换为十进制 var RealNum = 0L; var Scale = 1L; - foreach (var Digit in Input.Reverse().Select(l => Digits.IndexOfF(Conversions.ToString(l)))) + foreach (var Digit in Input.Reverse().Select(l => Digits.IndexOfF(l.ToString()))) { RealNum += Digit * Scale; Scale *= FromRadix; @@ -1093,7 +1092,7 @@ public static string GetFileMD5(string FilePath) // 获取 MD5 using (var fs = new FileStream(FilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { - return Conversions.ToString(GetHexString(MD5Provider.Instance.ComputeHash(fs))); + return (string)GetHexString(MD5Provider.Instance.ComputeHash(fs)); } } catch (Exception ex) @@ -1126,7 +1125,7 @@ public static string GetFileSHA512(string FilePath) // 获取 SHA512 using (var fs = new FileStream(FilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { - return Conversions.ToString(GetHexString(SHA512Provider.Instance.ComputeHash(fs))); + return (string)GetHexString(SHA512Provider.Instance.ComputeHash(fs)); } } catch (Exception ex) @@ -1159,7 +1158,7 @@ public static string GetFileSHA256(string FilePath) // 获取 SHA256 using (var fs = new FileStream(FilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { - return Conversions.ToString(GetHexString(SHA256Provider.Instance.ComputeHash(fs))); + return (string)GetHexString(SHA256Provider.Instance.ComputeHash(fs)); } } catch (Exception ex) @@ -1190,7 +1189,7 @@ public static string GetFileSHA1(string FilePath) // 获取 SHA1 using (var fs = new FileStream(FilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { - return Conversions.ToString(GetHexString(SHA1Provider.Instance.ComputeHash(fs))); + return (string)GetHexString(SHA1Provider.Instance.ComputeHash(fs)); } } catch (Exception ex) @@ -1215,7 +1214,7 @@ public static string GetAuthSHA1(Stream inputStream) { try { - return Conversions.ToString(GetHexString(SHA1Provider.Instance.ComputeHash(inputStream))); + return (string)GetHexString(SHA1Provider.Instance.ComputeHash(inputStream)); } catch (Exception ex) { @@ -1355,7 +1354,7 @@ public static void ExtractFile(string CompressFilePath, string DestDirectory, En Directory.CreateDirectory(DestDirectory); DestDirectory = Path.GetFullPath(DestDirectory); if (!DestDirectory.EndsWith(Path.DirectorySeparatorChar.ToString())) - DestDirectory += Conversions.ToString(Path.DirectorySeparatorChar); + DestDirectory += Path.DirectorySeparatorChar.ToString(); if (CompressFilePath.EndsWithF(".gz", true)) // 以 gz 方式解压 using (var compressedFile = new FileStream(CompressFilePath, FileMode.Open, FileAccess.Read)) @@ -1614,7 +1613,7 @@ public static string StrFill(string Str, string Code, byte Length) { if (Str.Length > Length) return Strings.Mid(Str, 1, Length); - return Strings.Mid(Str.PadRight(Length, Conversions.ToChar(Code)), Str.Length + 1) + Str; + return Strings.Mid(Str.PadRight(Length, Code[0]), Str.Length + 1) + Str; } /// @@ -1633,8 +1632,8 @@ public static object StrTrim(string Str, bool RemoveQuote = true) { if (RemoveQuote) Str = Str.Split("(")[0].Split(":")[0].Split("(")[0].Split(":")[0]; - return Str.Trim('.', '。', '!', ' ', '!', '?', '?', Conversions.ToChar("\r"), - Conversions.ToChar("\n")); + return Str.Trim('.', '。', '!', ' ', '!', '?', '?', '\r', + '\n'); } /// @@ -1684,7 +1683,7 @@ public static ulong GetHash(string Str) /// public static string GetStringMD5(string Str) { - return Conversions.ToString(GetHexString(MD5Provider.Instance.ComputeHash(Str))); + return (string)GetHexString(MD5Provider.Instance.ComputeHash(Str)); } /// @@ -2427,7 +2426,7 @@ public static List GetFullList(IList data) if (data[i] is ICollection) GetFullListRet.AddRange((IEnumerable)data[i]); else - GetFullListRet.Add(Conversions.ToGenericParameter(data[i])); + GetFullListRet.Add((T)data[i]); return GetFullListRet; } @@ -3202,8 +3201,7 @@ public static object GetObjectFromXML(string Str) { if (Reader.Type is not null && BlackListType.IsAssignableFrom(Reader.Type.UnderlyingType)) throw new UnauthorizedAccessException($"不允许使用 {BlackListType.Name} 类型。"); - if (Reader.Value is not null && Conversions.ToBoolean( - Operators.ConditionalCompareObjectEqual(Reader.Value, BlackListType.Name, false))) + if (Reader.Value is not null && Equals(Reader.Value, BlackListType.Name)) throw new UnauthorizedAccessException($"不允许使用 {BlackListType.Name} 值。"); } @@ -3681,7 +3679,7 @@ public object ConvertBack(object value, Type targetType, object parameter, Cultu if (value is null) return false; return value is Visibility - ? Operators.ConditionalCompareObjectNotEqual(value, Visibility.Visible, false) + ? (Visibility)value != Visibility.Visible : false; } } diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.cs b/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.cs index b31b67014..512270159 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.cs +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.cs @@ -9,7 +9,6 @@ using System.Text.Json.Nodes; using System.Windows; using Microsoft.VisualBasic; -using Microsoft.VisualBasic.CompilerServices; using PCL.Core.App; using PCL.Core.App.Localization; using PCL.Core.Minecraft; @@ -19,7 +18,6 @@ using PCL.Core.Utils.Secret; using PCL.Network; using PCL.Core.IO.Net.Http; -using PCL; using PCL.Core.Minecraft.IdentityModel.Yggdrasil; using System.Globalization; @@ -2545,7 +2543,7 @@ private static string McLaunchArgumentsJvmNew(ModMinecraft.McInstance instance) var Server = McLoginAuthLoader.Input.BaseUrl.Replace("/authserver", ""); try { - var Response = Conversions.ToString(ModNet.NetGetCodeByRequestRetry(Server, Encoding.UTF8)); + var Response = ModNet.NetGetCodeByRequestRetry(Server, Encoding.UTF8)?.ToString(); DataList.Insert(0, "-javaagent:\"" + Path.Combine(ModBase.PathPure, "authlib-injector.jar") + "\"=" + Server + " -Dauthlibinjector.side=client" + " -Dauthlibinjector.yggdrasil.prefetched=" + diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.cs b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.cs index 082da4ebf..2213d2e67 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.cs +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.cs @@ -3,7 +3,6 @@ using System.IO.Compression; using System.Text; using System.Text.RegularExpressions; -using Microsoft.VisualBasic.CompilerServices; using PCL.Core.App; using PCL.Core.App.Localization; using PCL.Core.UI; @@ -324,13 +323,13 @@ private static void CopyOverrideDirectory(string OverridesFolder, string Version if (File.Exists(OverridesIni)) { ModBase.WriteIni(OverridesIni, "VersionArgumentIndie", 1.ToString()); // 开启版本隔离 - ModBase.WriteIni(OverridesIni, "VersionArgumentIndieV2", Conversions.ToString(true)); + ModBase.WriteIni(OverridesIni, "VersionArgumentIndieV2", true.ToString()); ModBase.CopyFile(OverridesIni, VersionIni); // 覆写已有的 ini } else { ModBase.WriteIni(VersionIni, "VersionArgumentIndie", 1.ToString()); // 开启版本隔离 - ModBase.WriteIni(VersionIni, "VersionArgumentIndieV2", Conversions.ToString(true)); + ModBase.WriteIni(VersionIni, "VersionArgumentIndieV2", true.ToString()); } ModBase.IniClearCache(VersionIni); // 重置缓存,避免被安装过程中写入的 ini 覆盖 @@ -1580,8 +1579,8 @@ private static LoaderCombo InstallPackMMC(string FileAddress, ZipArchive ModBase.WriteFile(MMCSetupFile, Lines.Join("\r\n")); // 读取文件 - if (Conversions.ToBoolean(ModBase.ReadIni(MMCSetupFile, "OverrideCommands", - Conversions.ToString(false)))) + if (Convert.ToBoolean(ModBase.ReadIni(MMCSetupFile, "OverrideCommands", + false.ToString()))) { var PreLaunchCommand = ModBase.ReadIni(MMCSetupFile, "PreLaunchCommand"); if (!string.IsNullOrEmpty(PreLaunchCommand)) @@ -1596,8 +1595,8 @@ private static LoaderCombo InstallPackMMC(string FileAddress, ZipArchive } } - if (Conversions.ToBoolean(ModBase.ReadIni(MMCSetupFile, "JoinServerOnLaunch", - Conversions.ToString(false)))) + if (Convert.ToBoolean(ModBase.ReadIni(MMCSetupFile, "JoinServerOnLaunch", + false.ToString()))) { var ServerAddress = ModBase.ReadIni(MMCSetupFile, "JoinServerOnLaunchAddress") .Replace(@"\""", "\""); @@ -1605,8 +1604,8 @@ private static LoaderCombo InstallPackMMC(string FileAddress, ZipArchive ModBase.Log("[ModPack] 迁移 MultiMC 实例独立设置:自动进入服务器:" + ServerAddress); } - if (Conversions.ToBoolean(ModBase.ReadIni(MMCSetupFile, "IgnoreJavaCompatibility", - Conversions.ToString(false)))) + if (Convert.ToBoolean(ModBase.ReadIni(MMCSetupFile, "IgnoreJavaCompatibility", + false.ToString()))) { Config.Instance.IgnoreJavaCompatibility[VersionFolder] = true; ModBase.Log("[ModPack] 迁移 MultiMC 实例独立设置:忽略 Java 兼容性警告"); @@ -1626,17 +1625,17 @@ private static LoaderCombo InstallPackMMC(string FileAddress, ZipArchive var JvmArgs = ModBase.ReadIni(MMCSetupFile, "JvmArgs"); if (!string.IsNullOrEmpty(JvmArgs)) { - if (Conversions.ToBoolean(ModBase.ReadIni(MMCSetupFile, "OverrideJavaArgs", - Conversions.ToString(false)))) + if (Convert.ToBoolean(ModBase.ReadIni(MMCSetupFile, "OverrideJavaArgs", + false.ToString()))) { Config.Instance.JvmArgs[VersionFolder] = JvmArgs; ModBase.Log("[ModPack] 迁移 MultiMC 实例独立设置:JVM 参数(覆盖):" + JvmArgs); } else { - JvmArgs = Conversions.ToString(JvmArgs + - Operators.ConcatenateObject(" ", - Config.Launch.JvmArgs)); + JvmArgs = JvmArgs + + " " + + Config.Launch.JvmArgs; Config.Instance.JvmArgs[VersionFolder] = JvmArgs; ModBase.Log("[ModPack] 迁移 MultiMC 实例独立设置:JVM 参数(追加):" + JvmArgs); } diff --git a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.cs b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.cs index e086d250b..afbae8b99 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.cs +++ b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.cs @@ -6,7 +6,6 @@ using System.Windows; using System.Windows.Controls; using System.Windows.Controls.Primitives; -using Microsoft.VisualBasic.CompilerServices; using PCL.Core.App; using PCL.Core.App.Localization; using PCL.Core.IO.Net.Http; @@ -15,6 +14,8 @@ using PCL.Core.Utils; using PCL.Network; using PCL.Network.Loaders; +using PCL.Core.IO.Net.Http; +using PCL.Core.App.Localization; namespace PCL; @@ -173,7 +174,7 @@ public static void McDownloadClientCore(string Id, string JsonUrl, NetPreDownloa loaders.Add(new ModLoader.LoaderTask>( Lang.Text("Minecraft.Download.Stage.ObtainVanillaJsonUrl"), task => { - var jsonAddress = Conversions.ToString(ModDownload.DlClientListGet(id)); + var jsonAddress = ModDownload.DlClientListGet(id)?.ToString(); task.Output = new List { new(ModDownload.DlSourceLauncherOrMetaGet(jsonAddress), Path.Combine(instanceFolder, instanceName + ".json")) @@ -197,7 +198,7 @@ public static void McDownloadClientCore(string Id, string JsonUrl, NetPreDownloa { Thread.Sleep(50); // 等待 JSON 文件实际写入硬盘(#3710) ModBase.Log("[Download] 开始分析原版支持库文件:" + instanceFolder); - if (Conversions.ToBoolean(id == "1.16.5" && Config.Download.FixAuthLib != null)) // 1.16.5 Authlib 修复 + if (id == "1.16.5" && Config.Download.FixAuthLib != null) // 1.16.5 Authlib 修复 try { var json = ModBase.ReadFile(Path.Combine(instanceFolder, instanceName + ".json")); @@ -693,8 +694,8 @@ private static void McDownloadOptiFineInstall(string BaseMcFolderHome, string Ta // 添加 Java Wrapper 作为主 Jar string Arguments; - if (Conversions.ToBoolean(UseJavaWrapper && - !(dynamic)Config.Launch.DisableJlw)) // dynamic! + if (UseJavaWrapper && + !(dynamic)Config.Launch.DisableJlw) // dynamic! Arguments = $"-Doolloo.jlw.tmpdir=\"{ModBase.PathPure.TrimEnd('\\')}\" -Duser.home=\"{BaseMcFolderHome.TrimEnd('\\')}\" -cp \"{Target}\" -jar \"{ModLaunch.ExtractJavaWrapper()}\" optifine.Installer"; else @@ -1492,7 +1493,7 @@ public static MyListItem LiteLoaderDownloadListItem(ModDownload.DlLiteLoaderList private static void LiteLoaderSaveContMenuBuild(MyListItem sender, EventArgs e) { - if (Conversions.ToBoolean(((dynamic)sender.Tag).IsLegacy)) + if ((bool)((dynamic)sender.Tag).IsLegacy) { sender.Buttons = Array.Empty(); } @@ -1514,7 +1515,7 @@ private static void LiteLoaderContMenuBuild(MyListItem sender, EventArgs e) ToolTipService.SetVerticalOffset(BtnSave, 30d); ToolTipService.SetHorizontalOffset(BtnSave, 2d); BtnSave.Click += (sender, e) => LiteLoaderSave_Click(sender, (RoutedEventArgs)e); - if (Conversions.ToBoolean(((dynamic)sender.Tag).IsLegacy)) + if ((bool)((dynamic)sender.Tag).IsLegacy) { sender.Buttons = [BtnSave]; } @@ -1665,7 +1666,7 @@ private static void ForgelikeInjector(string Target, ModLoader.LoaderTask= 20d) + if (ForgeType == ModDownload.DlForgelikeEntry.ForgelikeType.NeoForge || Convert.ToDouble(LoaderVersion.BeforeFirst(".")) >= 20d) { ModBase.Log($"[Download] 检测为{(ForgeType == ModDownload.DlForgelikeEntry.ForgelikeType.Forge ? "新版 Forge" : " " + ForgeType)}:" + LoaderVersion); List Libs = null; @@ -2019,7 +2020,7 @@ private static void ForgelikeInjectorLine(string Content, ModLoader.LoaderTask public static void LoaderStateChangedHintOnly(object Loader) { - switch (((dynamic)Loader).State) + var loader = (ModLoader.LoaderBase)Loader; + switch (loader.State) { - case var @case when Operators.ConditionalCompareObjectEqual(@case, ModBase.LoadState.Finished, false): - { - ModMain.Hint( - Conversions.ToString(Operators.ConcatenateObject(((dynamic)Loader).Name, - Lang.Text("Common.Status.Success"))), - ModMain.HintType.Finish); + case ModBase.LoadState.Finished: + ModMain.Hint($"{loader.Name}{Lang.Text("Common.Status.Success")}", ModMain.HintType.Finish); break; - } - case var case1 when Operators.ConditionalCompareObjectEqual(case1, ModBase.LoadState.Failed, false): - { - ModMain.Hint( - Conversions.ToString(Operators.ConcatenateObject( - Operators.ConcatenateObject(((dynamic)Loader).Name, Lang.Text("Common.Status.Failure")), - ((dynamic)Loader).Error.Message)), - ModMain.HintType.Critical); + case ModBase.LoadState.Failed: + ModMain.Hint($"{loader.Name}{Lang.Text("Common.Status.Failure")}{loader.Error.Message}", ModMain.HintType.Critical); break; - } - case var case2 when Operators.ConditionalCompareObjectEqual(case2, ModBase.LoadState.Aborted, false): - { - ModMain.Hint( - Conversions.ToString(Operators.ConcatenateObject(((dynamic)Loader).Name, - Lang.Text("Common.Status.Cancelled"))), - ModMain.HintType.Info); + case ModBase.LoadState.Aborted: + ModMain.Hint($"{loader.Name}{Lang.Text("Common.Status.Cancelled")}"); break; - } } } @@ -3747,62 +3733,54 @@ public static void LoaderStateChangedHintOnly(object Loader) /// public static void McInstallState(object Loader) { - switch (((dynamic)Loader).State) + var loader = (ModLoader.LoaderBase)Loader; + var combo = (ModLoader.LoaderCombo)Loader; + switch (loader.State) { - case var @case when Operators.ConditionalCompareObjectEqual(@case, ModBase.LoadState.Finished, false): + case ModBase.LoadState.Finished: { - if (Conversions.ToBoolean(Config.Download.AutoSelectInstance)) + if (Config.Download.AutoSelectInstance) { - string VersionName = ((dynamic)Loader).Name.ToString(); + var versionName = loader.Name; ModBase.WriteIni(ModMinecraft.McFolderSelected + "PCL.ini", "Version", - VersionName.Remove(VersionName.Length - 3, 3)); + versionName.Remove(versionName.Length - 3, 3)); } ModBase.WriteIni(ModMinecraft.McFolderSelected + "PCL.ini", "InstanceCache", ""); // 清空缓存(合并安装会先生成文件夹,这会在刷新时误判为可以使用缓存) - ModBase.DeleteDirectory( - Conversions.ToString(Operators.ConcatenateObject(((dynamic)Loader).Input, @"PCLInstallBackups\"))); - ModMain.Hint( - Conversions.ToString(Operators.ConcatenateObject(((dynamic)Loader).Name, - Lang.Text("Common.Status.Success"))), + ModBase.DeleteDirectory($"{combo.Input}PCLInstallBackups\\"); + ModMain.Hint($"{loader.Name}{Lang.Text("Common.Status.Success")}", ModMain.HintType.Finish); break; } - case var case1 when Operators.ConditionalCompareObjectEqual(case1, ModBase.LoadState.Failed, false): + case ModBase.LoadState.Failed: { ModMain.Hint( - Conversions.ToString(Operators.ConcatenateObject( - Operators.ConcatenateObject(((dynamic)Loader).Name, Lang.Text("Common.Status.Failure")), - ((dynamic)Loader).Error.Message)), + $"{loader.Name}{Lang.Text("Common.Status.Failure")}{loader.Error.Message}", ModMain.HintType.Critical); break; } - case var case2 when Operators.ConditionalCompareObjectEqual(case2, ModBase.LoadState.Aborted, false): + case ModBase.LoadState.Aborted: { - ModMain.Hint( - Conversions.ToString(Operators.ConcatenateObject(((dynamic)Loader).Name, - Lang.Text("Common.Status.Cancelled"))), - ModMain.HintType.Info); + ModMain.Hint($"{loader.Name}{Lang.Text("Common.Status.Cancelled")}"); break; } - case var case3 when Operators.ConditionalCompareObjectEqual(case3, ModBase.LoadState.Loading, false): + case ModBase.LoadState.Loading: { return; // 不重新加载实例列表 } } - if (Conversions.ToBoolean( - !Operators.ConditionalCompareObjectEqual(((dynamic)Loader).State, ModBase.LoadState.Finished, false) && + if (loader.State != ModBase.LoadState.Finished && Directory.Exists( - Conversions.ToString(Operators.ConcatenateObject(((dynamic)Loader).Input, - @"PCLInstallBackups\"))))) // 实例修改失败回滚 + $"{combo.Input}PCLInstallBackups\\")) // 实例修改失败回滚 { ModBase.CopyDirectory( - Conversions.ToString(Operators.ConcatenateObject(((dynamic)Loader).Input, @"PCLInstallBackups\")), - Conversions.ToString(((dynamic)Loader).Input)); - File.Delete(Conversions.ToString(Operators.ConcatenateObject(((dynamic)Loader).Input, ".pclignore"))); + $"{combo.Input}PCLInstallBackups\\", + (string)combo.Input); + File.Delete($"{combo.Input}.pclignore"); ModBase.DeleteDirectory( - Conversions.ToString(Operators.ConcatenateObject(((dynamic)Loader).Input, @"PCLInstallBackups\"))); + $"{combo.Input}PCLInstallBackups\\"); } else { @@ -3818,31 +3796,26 @@ public static void McInstallFailedClearFolder(object Loader) try { Thread.Sleep(1000); // 防止存在尚未完全释放的文件,导致清理失败(例如整合包安装) - if (Conversions.ToBoolean( - Operators.ConditionalCompareObjectEqual(((dynamic)Loader).State, ModBase.LoadState.Failed, - false)) || Conversions.ToBoolean( - Operators.ConditionalCompareObjectEqual(((dynamic)Loader).State, ModBase.LoadState.Aborted, false))) + if (((ModLoader.LoaderBase)Loader).State == ModBase.LoadState.Failed || + ((ModLoader.LoaderBase)Loader).State == ModBase.LoadState.Aborted) { // 删除实例文件夹 if (Directory.Exists( - Conversions.ToString(Operators.ConcatenateObject(((dynamic)Loader).Input, @"saves\"))) || + $"{((ModLoader.LoaderCombo)Loader).Input}saves\\") || Directory.Exists( - Conversions.ToString(Operators.ConcatenateObject(((dynamic)Loader).Input, @"versions\"))) || + $"{((ModLoader.LoaderCombo)Loader).Input}versions\\") || Directory.Exists( - Conversions.ToString(Operators.ConcatenateObject(((dynamic)Loader).Input, @"mods\"))) || - File.Exists( - Conversions.ToString(Operators.ConcatenateObject(((dynamic)Loader).Input, "server.dat")))) + $"{((ModLoader.LoaderCombo)Loader).Input}mods\\") || + File.Exists($"{((ModLoader.LoaderCombo)Loader).Input}server.dat")) { ModBase.Log( - Conversions.ToString(Operators.ConcatenateObject("[Download] 由于实例已被独立启动,不清理实例文件夹:", - ((dynamic)Loader).Input)), ModBase.LogLevel.Developer); + $"[Download] 由于实例已被独立启动,不清理实例文件夹:{((ModLoader.LoaderCombo)Loader).Input}", ModBase.LogLevel.Developer); } else { ModBase.Log( - Conversions.ToString(Operators.ConcatenateObject("[Download] 由于下载失败或取消,清理实例文件夹:", - ((dynamic)Loader).Input)), ModBase.LogLevel.Developer); - ModBase.DeleteDirectory(Conversions.ToString(((dynamic)Loader).Input)); + $"[Download] 由于下载失败或取消,清理实例文件夹:{((ModLoader.LoaderCombo)Loader).Input}", ModBase.LogLevel.Developer); + ModBase.DeleteDirectory((string)((ModLoader.LoaderCombo)Loader).Input); } } } @@ -4193,7 +4166,7 @@ Request.NeoForgeEntry is null // 补全文件 if (!DontFixLibraries && (Request.OptiFineEntry is not null || (Request.ForgeVersion is not null && - Conversions.ToDouble(Request.ForgeVersion.BeforeFirst(".")) >= 20d) || + Convert.ToDouble(Request.ForgeVersion.BeforeFirst(".")) >= 20d) || Request.NeoForgeVersion is not null || Request.FabricVersion is not null || Request.QuiltVersion is not null || Request.CleanroomVersion is not null || Request.LiteLoaderEntry is not null || Request.LabyModCommitRef is not null)) diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.cs b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.cs index 1cf75ea9e..125c7b4a3 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.cs +++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.cs @@ -6,8 +6,6 @@ using System.Windows.Input; using System.Windows.Media; using System.Windows.Shapes; -using FluentValidation; -using Microsoft.VisualBasic.CompilerServices; using PCL.Core.App; using PCL.Core.Utils.Validate; using PCL.Core.App.Localization; @@ -891,7 +889,7 @@ private void ClearSelected() // 信息栏动画 private void SetPanelVisibility(Grid panel, bool visible) { - if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(panel.Tag, visible.ToString(), false))) + if (Equals(panel.Tag, visible.ToString())) return; panel.Tag = visible.ToString(); if (visible) @@ -1162,8 +1160,7 @@ private string LoadOptiFineGetError() if (LoadOptiFine is null || LoadOptiFine.State.LoadingState == MyLoading.MyLoadingState.Run) return Lang.Text("Download.Install.State.Loading"); if (LoadOptiFine.State.LoadingState == MyLoading.MyLoadingState.Error) - return Lang.Text("Download.Install.State.GetVersionListFailed", - ((dynamic)LoadOptiFine.State).Error.Message); + return $"{Lang.Text("Download.Install.State.GetVersionListFailed")}{((ModLoader.LoaderBase)LoadOptiFine.State).Error.Message}"; // 是否有 Cleanroom if (SelectedCleanroom is not null) return Lang.Text("Download.Install.Compat.IncompatibleWithCleanroom"); @@ -1186,7 +1183,7 @@ private string LoadOptiFineGetError() HasAny = true; if (SelectedForge is null) return null; // 未选择 Forge - if (Conversions.ToBoolean(IsOptiFineSuitForForge(OptiFineVersion, SelectedForge))) + if ((bool)IsOptiFineSuitForForge(OptiFineVersion, SelectedForge)) return null; // 该版本可用 if (OptiFineVersion.RequiredForgeVersion is not null) HasRequiredVersion = true; @@ -1213,7 +1210,7 @@ private object IsOptiFineSuitForForge(ModDownload.DlOptiFineListEntry OptiFine, return ModMinecraft.CompareVersion(Forge.Version.ToString(), OptiFine.RequiredForgeVersion) == 0; // XXXX - return Forge.Version.Revision == Conversions.ToDouble(OptiFine.RequiredForgeVersion); + return Forge.Version.Revision == Convert.ToDouble(OptiFine.RequiredForgeVersion); } // 限制展开 @@ -1237,8 +1234,8 @@ private void OptiFine_Loaded() var Versions = new List(); foreach (var Version in ModDownload.DlOptiFineListLoader.Output.Value) { - if (Conversions.ToBoolean(SelectedForge is not null && - !(bool)IsOptiFineSuitForForge(Version, SelectedForge))) + if (SelectedForge is not null && + !(bool)IsOptiFineSuitForForge(Version, SelectedForge)) continue; if (Version.DisplayName.StartsWith(_vanillaName + " ")) Versions.Add(Version); @@ -1272,8 +1269,8 @@ private void OptiFine_Loaded() private void OptiFine_Selected(MyListItem sender, EventArgs e) { SelectedOptiFine = (ModDownload.DlOptiFineListEntry)(dynamic)sender.Tag; - if (Conversions.ToBoolean(SelectedForge is not null && - !(bool)IsOptiFineSuitForForge(SelectedOptiFine, SelectedForge))) + if (SelectedForge is not null && + !(bool)IsOptiFineSuitForForge(SelectedOptiFine, SelectedForge)) SelectedForge = null; OptiFabric_Loaded(); Forge_Loaded(); @@ -1394,8 +1391,7 @@ private string LoadForgeGetError() if (SelectedOptiFine is not null && ModMinecraft.CompareVersionGe(_vanillaName, "1.13") && ModMinecraft.CompareVersionGe("1.14.3", _vanillaName)) return Lang.Text("Download.Install.Compat.IncompatibleWithOptiFine"); // 1.13 ~ 1.14.3 OptiFine 检查 - if (Conversions.ToBoolean( - SelectedOptiFine is not null && !(bool)IsOptiFineSuitForForge(SelectedOptiFine, Version))) + if (SelectedOptiFine is not null && !(bool)IsOptiFineSuitForForge(SelectedOptiFine, Version)) continue; return null; } @@ -1433,8 +1429,8 @@ private void Forge_Loaded() { if (v.Category == "universal" || v.Category == "client") return false; // 跳过无法自动安装的版本 - if (Conversions.ToBoolean(SelectedOptiFine is not null && - !(bool)IsOptiFineSuitForForge(SelectedOptiFine, v))) + if (SelectedOptiFine is not null && + !(bool)IsOptiFineSuitForForge(SelectedOptiFine, v)) return false; return true; }).OrderByDescending(v => v).ToList(); @@ -1456,8 +1452,8 @@ private void Forge_Selected(MyListItem sender, EventArgs e) SelectedForge = (ModDownload.DlForgeVersionEntry)(dynamic)sender.Tag; SelectedLoaderName = "Forge"; CardForge.IsSwapped = true; - if (Conversions.ToBoolean(SelectedOptiFine is not null && - !(bool)IsOptiFineSuitForForge(SelectedOptiFine, SelectedForge))) + if (SelectedOptiFine is not null && + !(bool)IsOptiFineSuitForForge(SelectedOptiFine, SelectedForge)) SelectedOptiFine = null; OptiFine_Loaded(); ReloadSelected(); @@ -1857,8 +1853,7 @@ private string LoadLegacyFabricGetError() if (LoadLegacyFabric is null || LoadLegacyFabric.State.LoadingState == MyLoading.MyLoadingState.Run) return Lang.Text("Download.Install.State.Loading"); if (LoadLegacyFabric.State.LoadingState == MyLoading.MyLoadingState.Error) - return Lang.Text("Download.Install.State.GetVersionListFailed", - ((dynamic)LoadLegacyFabric.State).Error.Message); + return $"{Lang.Text("Download.Install.State.GetVersionListFailed")}{((ModLoader.LoaderBase)LoadLegacyFabric.State).Error.Message}"; foreach (JsonObject Version in ModDownload.DlLegacyFabricListLoader.Output.Value["game"].AsArray()) if ((Version["version"].ToString() ?? "") == (_vanillaName ?? "")) { @@ -1961,8 +1956,7 @@ private string LoadLegacyFabricApiGetError() if (LoadLegacyFabricApi is null || LoadLegacyFabricApi.State.LoadingState == MyLoading.MyLoadingState.Run) return Lang.Text("Download.Install.State.Loading"); if (LoadLegacyFabricApi.State.LoadingState == MyLoading.MyLoadingState.Error) - return Lang.Text("Download.Install.State.GetVersionListFailed", - ((dynamic)LoadLegacyFabricApi.State).Error.Message); + return $"{Lang.Text("Download.Install.State.GetVersionListFailed")}{((ModLoader.LoaderBase)LoadLegacyFabricApi.State).Error.Message}"; if (SelectedAPIName is not null && !ReferenceEquals(SelectedAPIName, "Legacy Fabric API")) return Lang.Text("Download.Install.Compat.IncompatibleWithLoader", SelectedAPIName); if (ModDownload.DlLegacyFabricApiLoader.Output is null) @@ -2177,8 +2171,7 @@ private string LoadQSLGetError() if (LoadQSL is null || LoadQSL.State.LoadingState == MyLoading.MyLoadingState.Run) return Lang.Text("Download.Install.LoadingVersionList"); if (LoadQSL.State.LoadingState == MyLoading.MyLoadingState.Error) - return Lang.Text("Download.Install.State.GetVersionListFailed", - ((dynamic)LoadQSL.State).Error.Message); + return $"{Lang.Text("Download.Install.State.GetVersionListFailed")}{((ModLoader.LoaderBase)LoadQSL.State).Error.Message}"; if (SelectedAPIName is not null && !ReferenceEquals(SelectedAPIName, "QFAPI / QSL")) return Lang.Text("Download.Install.Compat.IncompatibleWithLoader", SelectedAPIName); if (ModDownload.DlQSLLoader.Output is null) @@ -2420,8 +2413,7 @@ private string LoadLabyModGetError() if (LoadLabyMod is null || LoadLabyMod.State.LoadingState == MyLoading.MyLoadingState.Run) return Lang.Text("Download.Install.State.Loading"); if (LoadLabyMod.State.LoadingState == MyLoading.MyLoadingState.Error) - return Lang.Text("Download.Install.State.GetVersionListFailed", - ((dynamic)LoadLabyMod.State).Error.Message); + return $"{Lang.Text("Download.Install.State.GetVersionListFailed")}{((ModLoader.LoaderBase)LoadLabyMod.State).Error.Message}"; // 检查 Loader if (GetLoaderError(LoadLabyMod) is not null) return GetLoaderError(LoadLabyMod); @@ -2542,10 +2534,8 @@ private void BtnStart_Click() { // 确认版本隔离 if (SelectedLoaderName is not null && - (Conversions.ToBoolean( - Operators.ConditionalCompareObjectEqual(Config.Launch.IndieSolutionV2, 0, false)) || - Conversions.ToBoolean( - Operators.ConditionalCompareObjectEqual(Config.Launch.IndieSolutionV2, 2, false)))) + (Config.Launch.IndieSolutionV2 == 0 || + Config.Launch.IndieSolutionV2 == 2)) if (ModMain.MyMsgBox( Lang.Text("Download.Install.InstanceIsolation.Warning.Message"), Lang.Text("Download.Install.InstanceIsolation.Warning.Title"), diff --git a/Plain Craft Launcher 2/Pages/PageInstance/PageInstanceExport.xaml.cs b/Plain Craft Launcher 2/Pages/PageInstance/PageInstanceExport.xaml.cs index 814b1916b..e9eda7a36 100644 --- a/Plain Craft Launcher 2/Pages/PageInstance/PageInstanceExport.xaml.cs +++ b/Plain Craft Launcher 2/Pages/PageInstance/PageInstanceExport.xaml.cs @@ -4,8 +4,7 @@ using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Input; -using Microsoft.VisualBasic; -using Microsoft.VisualBasic.CompilerServices; +using DotNet.Globbing; using PCL.Core.App; using PCL.Core.UI; using PCL.Core.App.Localization; @@ -240,7 +239,7 @@ bool IsVisible(ExportOption TargetOption) // 检查前两级 try { - if (AllEntries.Any(Entry => LikeOperator.LikeString(Entry, Rule, CompareMethod.Binary))) + if (AllEntries.Any(Entry => LikeString(Entry, Rule))) return true; } catch (Exception ex) @@ -312,18 +311,15 @@ private IEnumerable GetAllOptions(bool IncludeHidden) { foreach (var Element in PanOptions.Children) { - if (!IncludeHidden && - Conversions.ToBoolean(Operators.ConditionalCompareObjectNotEqual(((UIElement)Element).Visibility, - Visibility.Visible, false))) + if (!IncludeHidden && + ((UIElement)Element).Visibility != Visibility.Visible) continue; if (Element is MyCheckBox) yield return (MyCheckBox)Element; else if (Element is StackPanel) foreach (var SubElement in ((StackPanel)Element).Children) { - if (!IncludeHidden && Conversions.ToBoolean( - Operators.ConditionalCompareObjectNotEqual(((UIElement)SubElement).Visibility, - Visibility.Visible, false))) + if (!IncludeHidden && ((UIElement)SubElement).Visibility != Visibility.Visible) continue; if (SubElement is MyCheckBox) yield return (MyCheckBox)SubElement; @@ -556,13 +552,13 @@ private void ReadConfigFile(string configPath) TextExportName.Text = Ini.GetOrDefault("Name", ""); TextExportVersion.Text = Ini.GetOrDefault("Version", ""); CheckOptionsPcl.Checked = - Convert.ToBoolean(Ini.GetOrDefault("IncludeLauncher", Conversions.ToString(true))); + Convert.ToBoolean(Ini.GetOrDefault("IncludeLauncher", true.ToString())); CheckOptionsPclCustom.Checked = - Convert.ToBoolean(Ini.GetOrDefault("IncludeLauncherCustom", Conversions.ToString(true))); + Convert.ToBoolean(Ini.GetOrDefault("IncludeLauncherCustom", true.ToString())); CheckAdvancedModrinth.Checked = - Convert.ToBoolean(Ini.GetOrDefault("ModrinthUploadMode", Conversions.ToString(false))); + Convert.ToBoolean(Ini.GetOrDefault("ModrinthUploadMode", false.ToString())); CheckAdvancedInclude.Checked = - Convert.ToBoolean(Ini.GetOrDefault("DontCheckHostedAssets", Conversions.ToString(false))); + Convert.ToBoolean(Ini.GetOrDefault("DontCheckHostedAssets", false.ToString())); ConfigPackPath = Ini.GetOrDefault("PackPath"); // === 解析导出内容段 === @@ -623,7 +619,7 @@ private void PanAllBack_DragEnter(object sender, DragEventArgs e) // 验证:仅允许单个.txt文件 if (files.Length == 1 && - files[0].EndsWithF(".txt", Conversions.ToBoolean(StringComparison.OrdinalIgnoreCase))) + files[0].EndsWithF(".txt", true)) e.Effects = DragDropEffects.Copy; // 设置拖放效果为“复制” else e.Effects = DragDropEffects.None; // 不允许拖放 @@ -782,7 +778,7 @@ private void StartExport(object sender, MouseButtonEventArgs e) foreach (var Rule in AllRules) { var Revert = Rule.StartsWith("!"); - if (LikeOperator.LikeString(RelativePath, Rule.TrimStart('!'), CompareMethod.Binary)) + if (LikeString(RelativePath, Rule.TrimStart('!'))) ShouldKeep = !Revert; } @@ -1076,4 +1072,12 @@ private void StartExport(object sender, MouseButtonEventArgs e) } #endregion + + private static bool LikeString(string input, string pattern) + { + pattern = pattern.Replace("#", "[0-9]"); + var options = new GlobOptions { Evaluation = { CaseInsensitive = true } }; + var glob = Glob.Parse(pattern, options); + return glob.IsMatch(input); + } } diff --git a/Plain Craft Launcher 2/Pages/PageInstance/PageInstanceInstall.xaml.cs b/Plain Craft Launcher 2/Pages/PageInstance/PageInstanceInstall.xaml.cs index d650bac45..22e3b3878 100644 --- a/Plain Craft Launcher 2/Pages/PageInstance/PageInstanceInstall.xaml.cs +++ b/Plain Craft Launcher 2/Pages/PageInstance/PageInstanceInstall.xaml.cs @@ -6,7 +6,6 @@ using System.Windows.Input; using System.Windows.Media; using System.Windows.Shapes; -using Microsoft.VisualBasic.CompilerServices; using PCL.Core.App; using PCL.Core.App.Localization; using PCL.Core.UI; @@ -84,10 +83,8 @@ private void BtnSelectStart_Click(object sender, MouseButtonEventArgs mouseButto { // 确认版本隔离 if (SelectedLoaderName is not null && - (Conversions.ToBoolean( - Operators.ConditionalCompareObjectEqual(Config.Launch.IndieSolutionV2, 0, false)) || - Conversions.ToBoolean( - Operators.ConditionalCompareObjectEqual(Config.Launch.IndieSolutionV2, 2, false)))) + (Config.Launch.IndieSolutionV2 == 0 || + Config.Launch.IndieSolutionV2 == 2)) if (ModMain.MyMsgBox( "你尚未开启版本隔离,这会导致多个 MC 共用同一个 Mod 文件夹。" + "\r\n" + "因此在切换 MC 实例时,MC 会因为读取到与当前实例不符的 Mod 而崩溃。" + "\r\n" + @@ -930,7 +927,7 @@ private void ClearSelected() // 信息栏动画 private void SetPanelVisibility(Grid panel, bool visible) { - if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(panel.Tag, visible.ToString(), false))) + if (Equals(panel.Tag, visible.ToString())) return; panel.Tag = visible.ToString(); if (visible) @@ -1391,8 +1388,7 @@ private string LoadOptiFineGetError() if (LoadOptiFine is null || LoadOptiFine.State.LoadingState == MyLoading.MyLoadingState.Run) return "加载中……"; if (LoadOptiFine.State.LoadingState == MyLoading.MyLoadingState.Error) - return Conversions.ToString(Operators.ConcatenateObject("获取版本列表失败:", - ((dynamic)LoadOptiFine.State).Error.Message)); + return $"获取版本列表失败:{((ModLoader.LoaderBase)LoadOptiFine.State).Error.Message}"; // 是否有 Cleanroom if (SelectedCleanroom is not null) return "与 Cleanroom 不兼容"; @@ -1415,7 +1411,7 @@ private string LoadOptiFineGetError() HasAny = true; if (SelectedForge is null) return null; // 未选择 Forge - if (Conversions.ToBoolean(IsOptiFineSuitForForge(OptiFineVersion, SelectedForge))) + if ((bool)IsOptiFineSuitForForge(OptiFineVersion, SelectedForge)) return null; // 该版本可用 if (OptiFineVersion.RequiredForgeVersion is not null) HasRequiredVersion = true; @@ -1442,7 +1438,7 @@ private object IsOptiFineSuitForForge(ModDownload.DlOptiFineListEntry OptiFine, return ModMinecraft.CompareVersion(Forge.Version.ToString(), OptiFine.RequiredForgeVersion) == 0; // XXXX - return Forge.Version.Revision == Conversions.ToDouble(OptiFine.RequiredForgeVersion); + return Forge.Version.Revision == Convert.ToDouble(OptiFine.RequiredForgeVersion); } // 限制展开 @@ -1466,8 +1462,8 @@ private void OptiFine_Loaded() var Versions = new List(); foreach (var Version in ModDownload.DlOptiFineListLoader.Output.Value) { - if (Conversions.ToBoolean(SelectedForge is not null && - !(bool)IsOptiFineSuitForForge(Version, SelectedForge))) + if (SelectedForge is not null && + !(bool)IsOptiFineSuitForForge(Version, SelectedForge)) continue; if (Version.DisplayName.StartsWith(_vanillaName + " ")) Versions.Add(Version); @@ -1482,7 +1478,7 @@ private void OptiFine_Loaded() return true; if (Left.IsPreview && !Right.IsPreview) return false; - return Conversions.ToBoolean(ModMinecraft.CompareVersion(Left.DisplayName, Right.DisplayName)); + return ModMinecraft.CompareVersion(Left.DisplayName, Right.DisplayName) != 0; }); // 可视化 PanOptiFine.Children.Clear(); @@ -1501,8 +1497,8 @@ private void OptiFine_Loaded() private void OptiFine_Selected(MyListItem sender, EventArgs e) { SelectedOptiFine = (ModDownload.DlOptiFineListEntry)sender.Tag; - if (Conversions.ToBoolean(SelectedForge is not null && - !(bool)IsOptiFineSuitForForge(SelectedOptiFine, SelectedForge))) + if (SelectedForge is not null && + !(bool)IsOptiFineSuitForForge(SelectedOptiFine, SelectedForge)) SelectedForge = null; OptiFabric_Loaded(); Forge_Loaded(); @@ -1625,8 +1621,7 @@ private string LoadForgeGetError() if (SelectedOptiFine is not null && ModMinecraft.CompareVersionGe(_vanillaName, "1.13") && ModMinecraft.CompareVersionGe("1.14.3", _vanillaName)) return "与 OptiFine 不兼容"; // 1.13 ~ 1.14.3 OptiFine 检查 - if (Conversions.ToBoolean( - SelectedOptiFine is not null && !(bool)IsOptiFineSuitForForge(SelectedOptiFine, Version))) + if (SelectedOptiFine is not null && !(bool)IsOptiFineSuitForForge(SelectedOptiFine, Version)) continue; return null; } @@ -1664,8 +1659,8 @@ private void Forge_Loaded() { if (v.Category == "universal" || v.Category == "client") return false; // 跳过无法自动安装的版本 - if (Conversions.ToBoolean(SelectedOptiFine is not null && - !(bool)IsOptiFineSuitForForge(SelectedOptiFine, v))) + if (SelectedOptiFine is not null && + !(bool)IsOptiFineSuitForForge(SelectedOptiFine, v)) return false; return true; }).OrderByDescending(v => v).ToList(); @@ -1687,8 +1682,8 @@ private void Forge_Selected(MyListItem sender, EventArgs e) SelectedForge = (ModDownload.DlForgeVersionEntry)sender.Tag; SelectedLoaderName = "Forge"; CardForge.IsSwapped = true; - if (Conversions.ToBoolean(SelectedOptiFine is not null && - !(bool)IsOptiFineSuitForForge(SelectedOptiFine, SelectedForge))) + if (SelectedOptiFine is not null && + !(bool)IsOptiFineSuitForForge(SelectedOptiFine, SelectedForge)) SelectedOptiFine = null; OptiFine_Loaded(); ReloadSelected(); @@ -2124,8 +2119,7 @@ private string LoadLegacyFabricGetError() if (LoadLegacyFabric is null || LoadLegacyFabric.State.LoadingState == MyLoading.MyLoadingState.Run) return "加载中……"; if (LoadLegacyFabric.State.LoadingState == MyLoading.MyLoadingState.Error) - return Conversions.ToString(Operators.ConcatenateObject("获取版本列表失败:", - ((dynamic)LoadLegacyFabric.State).Error.Message)); + return $"获取版本列表失败:{((ModLoader.LoaderBase)LoadLegacyFabric.State).Error.Message}"; foreach (JsonObject Version in ModDownload.DlLegacyFabricListLoader.Output.Value["game"].AsArray()) if ((Version["version"].ToString() ?? "") == (_vanillaName ?? "")) { @@ -2228,8 +2222,7 @@ private string LoadLegacyFabricApiGetError() if (LoadLegacyFabricApi is null || LoadLegacyFabricApi.State.LoadingState == MyLoading.MyLoadingState.Run) return "加载中……"; if (LoadLegacyFabricApi.State.LoadingState == MyLoading.MyLoadingState.Error) - return Conversions.ToString(Operators.ConcatenateObject("获取版本列表失败:", - ((dynamic)LoadLegacyFabricApi.State).Error.Message)); + return $"获取版本列表失败:{((ModLoader.LoaderBase)LoadLegacyFabricApi.State).Error.Message}"; if (SelectedAPIName is not null && !ReferenceEquals(SelectedAPIName, "Legacy Fabric API")) return $"与 {SelectedAPIName} 不兼容"; if (ModDownload.DlLegacyFabricApiLoader.Output is null) @@ -2444,8 +2437,7 @@ private string LoadQSLGetError() if (LoadQSL is null || LoadQSL.State.LoadingState == MyLoading.MyLoadingState.Run) return "正在获取版本列表……"; if (LoadQSL.State.LoadingState == MyLoading.MyLoadingState.Error) - return Conversions.ToString(Operators.ConcatenateObject("获取版本列表失败:", - ((dynamic)LoadQSL.State).Error.Message)); + return $"获取版本列表失败:{((ModLoader.LoaderBase)LoadQSL.State).Error.Message}"; if (SelectedAPIName is not null && !ReferenceEquals(SelectedAPIName, "QFAPI / QSL")) return $"与 {SelectedAPIName} 不兼容"; if (ModDownload.DlQSLLoader.Output is null) @@ -2687,8 +2679,7 @@ private string LoadLabyModGetError() if (LoadLabyMod is null || LoadLabyMod.State.LoadingState == MyLoading.MyLoadingState.Run) return "加载中……"; if (LoadLabyMod.State.LoadingState == MyLoading.MyLoadingState.Error) - return Conversions.ToString(Operators.ConcatenateObject("获取版本列表失败:", - ((dynamic)LoadLabyMod.State).Error.Message)); + return $"获取版本列表失败:{((ModLoader.LoaderBase)LoadLabyMod.State).Error.Message}"; // 检查 Loader if (GetLoaderError(LoadLabyMod) is not null) return GetLoaderError(LoadLabyMod); diff --git a/Plain Craft Launcher 2/Plain Craft Launcher 2.csproj b/Plain Craft Launcher 2/Plain Craft Launcher 2.csproj index e390c312d..8f5cf3187 100644 --- a/Plain Craft Launcher 2/Plain Craft Launcher 2.csproj +++ b/Plain Craft Launcher 2/Plain Craft Launcher 2.csproj @@ -67,6 +67,7 @@ +