public void When_document_has_no_attribute_Then_return_null()
        {
            // Arrange
            var locator = new VersionLocator();

            // Act
            var currentVersion = locator.GetCurrentVersion(typeof(TestDocumentWithoutAttribute));

            // Assert
            currentVersion.Should().BeNull();
        }
        public void Then_find_current_version_of_document()
        {
            // Arrange
            var locator = new VersionLocator();

            // Act
            var currentVersion = locator.GetCurrentVersion(typeof(TestDocumentWithOneMigration));

            // Assert
            currentVersion.ToString().Should().Be("0.0.1");
        }
        /// <summary>
        /// 解析游戏JVM参数
        /// </summary>
        /// <returns></returns>
        public string ParseJvmArguments()
        {
            var jvmArgumentsDic = new Dictionary <string, string>
            {
                { "${natives_directory}", $"\"{NativeRoot}\"" },
                { "${launcher_name}", $"\"{LaunchSettings.LauncherName}\"" },
                { "${launcher_version}", "21" },
                { "${classpath}", $"\"{ClassPath}\"" },
            };

            if (!string.IsNullOrWhiteSpace(VersionInfo.JvmArguments))
            {
                return(StringHelper.ReplaceByDic(VersionInfo.JvmArguments, jvmArgumentsDic));
            }

            const string preset          = "[{rules: [{action: \"allow\",os:{name: \"osx\"}}],value: [\"-XstartOnFirstThread\"]},{rules: [{action: \"allow\",os:{name: \"windows\"}}],value: \"-XX:HeapDumpPath=MojangTricksIntelDriversForPerformance_javaw.exe_minecraft.exe.heapdump\"},{rules: [{action: \"allow\",os:{name: \"windows\",version: \"^10\\\\.\"}}],value: [\"-Dos.name=Windows 10\",\"-Dos.version=10.0\"]},\"-Djava.library.path=${natives_directory}\",\"-Dminecraft.launcher.brand=${launcher_name}\",\"-Dminecraft.launcher.version=${launcher_version}\",\"-cp\",\"${classpath}\"]";
            var          preJvmArguments = VersionLocator.ParseJvmArguments(JsonConvert.DeserializeObject <List <object> >(preset));

            return(StringHelper.ReplaceByDic(preJvmArguments, jvmArgumentsDic));
        }
Пример #4
0
        /// <summary>
        /// 启动游戏。
        /// Launch the game.
        /// </summary>
        /// <param name="settings">启动设置。Launch Settings.</param>
        /// <returns>启动结果。如果成功则包含消耗的时间,如果失败则包含异常信息。The result contains elapsed time(if successful) or elapsed time plus exception info(if failed).</returns>
        public async Task <LaunchResult> LaunchTaskAsync(LaunchSettings settings)
        {
            try
            {
                //逐步测量启动时间。
                //To measure the launch time step by step.
                var prevSpan  = new TimeSpan();
                var stopwatch = new Stopwatch();
                stopwatch.Start();

                #region 解析游戏 Game Info Resolver
                var version = VersionLocator.GetGame(settings.Version);

                //在以下方法中,我们存储前一个步骤的时间并且重置秒表,以此逐步测量启动时间。
                //In the method InvokeLaunchLogThenStart(args), we storage the time span of the previous process and restart the watch in order that the time used in each step is recorded.
                InvokeLaunchLogThenStart("解析游戏", ref prevSpan, ref stopwatch);

                //错误处理
                //Error processor
                if (version == null)
                {
                    return(new LaunchResult
                    {
                        ErrorType = LaunchErrorType.OperationFailed,
                        Error = new ErrorModel
                        {
                            Error = "解析游戏失败",
                            ErrorMessage = "我们在解析游戏时出现了错误",
                            Cause = "这有可能是因为您的游戏JSON文件损坏所导致的问题"
                        }
                    });
                }
                #endregion

                #region 验证账户凭据 Legal Account Verifier

                //以下代码实现了账户模式从离线到在线的切换。
                //The following code switches account mode between offline and yggdrasil.
                var authResult = settings.Authenticator switch
                {
                    OfflineAuthenticator off => off.Auth(false),
                    YggdrasilAuthenticator ygg => await ygg.AuthTaskAsync(true).ConfigureAwait(true),
                    _ => null
                };
                InvokeLaunchLogThenStart("验证账户凭据", ref prevSpan, ref stopwatch);

                //错误处理
                //Error processor
                if (authResult == null || authResult.AuthStatus == AuthStatus.Failed ||
                    authResult.AuthStatus == AuthStatus.Unknown)
                {
                    return(new LaunchResult
                    {
                        LaunchSettings = settings,
                        Error = new ErrorModel
                        {
                            Error = "验证失败",
                            Cause = authResult == null ? "未知的验证器" : authResult.AuthStatus switch
                            {
                                AuthStatus.Failed => "可能是因为用户名或密码错误,或是验证服务器暂时未响应",
                                AuthStatus.Unknown => "未知错误",
                                _ => "未知错误"
                            },
                            ErrorMessage = "无法验证凭据的有效性"
                        }