【免费下载链接】Launcher
This fork of Prism Launcher adds integrated support for Ely.by accounts.
Ely Prism Launcher是一个为 Minecraft 打造的开源多实例启动器,它在 Prism Launcher 的基础上深度集成了Ely.by 账号支持。本文带你完整走一遍它的会话生命周期:从一次 Ely.by 账号登录、AuthSession的构建、ClaimAccount锁定账号,到最终java游戏进程被拉起并持续监控的每一步,帮助新手和进阶用户理解启动器内部的完整链路 🚀
一、一次“点击启动”背后的 5 个阶段
Ely Prism Launcher 把启动过程拆成了职责清晰的 5 个阶段,每个阶段都有对应的核心源码文件:
| 阶段 | 做什么 | 核心文件 |
|---|---|---|
| ① 账号决策 | 选择账号、判定 Normal / Offline / Demo 模式 | launcher/LaunchController.cpp |
| ② 认证刷新 | Ely.by OAuth2 登录、获取游戏 Profile | launcher/minecraft/auth/AuthFlow.cpp |
| ③ 会话构建 | 生成AuthSession,标记是否应用 Ely 补丁 | launcher/minecraft/auth/MinecraftAccount.cpp |
| ④ 启动流水线 | 组装十几步LaunchStep顺序执行(含ClaimAccount) | launcher/minecraft/MinecraftInstance.cpp |
| ⑤ 进程拉起 | 用 NewLaunch.jar 启动 Java 进程并跟踪日志 | launcher/minecraft/launch/LauncherPartLaunch.cpp |
下面按链路顺序逐一拆解。
二、登录起点:选账号 + 判定启动模式
一切从 LaunchController::executeTask() 开始。它会先校验 Java 参数是否合法,然后进入login(),执行两个关键决策:
1.decideAccount()—— 用哪个账号?
优先级非常直观:
- 实例配置里绑定了专属账号(
InstanceAccountId)→ 用它; - 否则使用全局默认账号;
- 连一个账号都没有 → 弹窗引导你打开账号管理页添加账号。
2.decideLaunchMode()—— 以什么模式启动?
这一步会检查账号的“健康状况”(AccountState)。如果账号处于Unchecked、Errored、Offline状态或标记了shouldRefresh(),启动器会先触发refresh()刷新令牌,并在进度弹窗中等待刷新完成。根据刷新结果,最终落到三种模式之一:
- Normal:令牌有效,正常在线游玩;
- Offline:认证服务器不可达或断网,询问玩家名后离线启动;
- Demo:账号未购买游戏,询问后以试玩版启动。
💡 如果刷新后账号
Expired或Gone,reauthenticateAccount()会弹出“是否重新认证”的提示,让你用新凭据登录。
三、Ely.by 账号登录:一条精简的 4 步认证流
Ely Prism Launcher 的核心特色就在这里。在 AuthFlow 的构造函数中,按账号类型分流:MSA(微软)账号需要 7 步(Microsoft OAuth → Xbox → 权益 → Profile → 皮肤),而Ely.by 账号只需要 4 步,明显更轻:
| 步骤 | 类 | 作用 |
|---|---|---|
| 1. OAuth 授权 | ElyStep | 打开浏览器跳转account.ely.by完成授权,换取 access token |
| 2. 令牌转换 | ElyYggdrasilTokenStep | 将 Ely 的 OAuth 令牌直接用作 Yggdrasil(游戏服务端)令牌 |
| 3. 获取 Profile | MinecraftProfileStepEly | 拉取玩家名、UUID 等游戏身份信息 |
| 4. 拉取皮肤 | GetSkinStep | 预下载皮肤纹理 |
在无浏览器环境(比如 SSH 远程机器)下,Action::DeviceCode分支会改用 ElyDeviceCodeStep:向account.ely.by申请一个设备码,你在任意设备的浏览器上输入该码即可完成登录,令牌通过轮询/api/oauth2/v1/token拿回。
AuthFlow本身是一个简单的状态机驱动队列:nextStep()逐个弹出步骤执行,任一步骤返回失败状态(如STATE_FAILED_HARD→ 会话过期)就会终止整条流程,并在账号上标记对应的AccountState。
四、AuthSession:贯穿整个会话的“通行证”
登录成功后,账号会调用 MinecraftAccount::fillSession() 生成一个AuthSession对象——它是整个会话生命周期的载体,结构定义在 launcher/minecraft/auth/AuthSession.h:
access_token:易失的认证令牌,只存在于本次会话;player_name/uuid:玩家名与 UUID;session:组合会话 ID,写进启动参数;launchMode:本次实际采用的启动模式;wantsElyPatch:Ely 分支特有的标志位,决定是否替换游戏内的认证库。
wantsElyPatch的值由实例设置项ElyPatchPreference决定(0~2 三档策略),例如档位 2 表示“仅 Ely.by 账号时启用补丁”。这个标志会一路传递到启动流水线,触发下一节的 Ely 补丁准备步骤。
五、ClaimAccount:启动流水线中的“账号守卫”
在线模式下,createLaunchTask()组装步骤时会插入ClaimAccount:
if (session->launchMode != LaunchMode::Offline) { process->appendStep(makeShared<ClaimAccount>(pptr, session)); ... }这段代码位于 MinecraftInstance::createLaunchTask()。它的实现极其克制,却作用关键(见 launcher/minecraft/launch/ClaimAccount.cpp):
executeTask():对即将使用的账号加一把UseLock独占锁。这把锁的意义是——游戏整个运行期间,任何“切换默认账号”“刷新令牌”“登出”等会触碰账号的操作都会被阻塞,保证会话令牌在游戏进程存活期间不会被悄悄作废;finalize():流水线结束(无论成败)时释放锁,账号重新可操作。
注意ClaimAccount::canAbort()恒返回false——拿锁和放锁是原子性的,中途不能被打断,否则可能留下死锁或令牌竞态。
六、LaunchTask:一条十几步的启动流水线
LaunchTask 是整个启动过程的中枢。executeTask()从第 0 步开始,每步通过start()异步执行,完成后onStepFinished()检查wasSuccessful():成功则推进下一步,失败则回滚调用所有已完成步骤的finalize()并终止(LaunchTask.cpp)。
由 createLaunchTask() 组装出的标准步骤序列如下(📦 为常规步骤,🔑 为 Ely 相关):
| # | 步骤 | 说明 |
|---|---|---|
| 0 | PrintServers | 在线模式先检查关键服务器可达性(🔑 Ely 模式检查ely.by/account.ely.by/skinsystem.ely.by,MSA 模式检查微软域名) |
| 1 | TextPrint | 打印实例目录、启动模式(online/offline/demo)、启动器版本 |
| 2 | CreateGameFolders | 创建.minecraft等必备目录 |
| 3 | MinecraftLoadAndCheck | 加载并校验版本元数据 |
| 4 | AutoInstallJava→CheckJava→VerifyJavaInstall | 自动装 Java、检查路径与版本满足度 |
| 5 | PreLaunchCommand(可选) | 执行用户自定义的启动前命令 |
| 6 | 🔑ElyPatchTask | 若wantsElyPatch为真,从元数据索引解析com.mojang:authlib或authlib-injector,把 Ely 认证库注入游戏 classpath(ElyPatchTask.cpp) |
| 7 | 🔑ClaimAccount | 锁定账号(上节详解) |
| 8 | LibrariesTask等更新任务 | 下载缺失的游戏库与资源 |
| 9 | ModMinecraftJar→ScanModFolders | 打包 jar mod、扫描 mods 目录 |
| 10 | EnsureAvailableMemory | 检查系统内存是否足够,不足则告警 |
| 11 | PrintInstanceInfo | 打印实例信息(含玩家名等,敏感字段会被脱敏) |
| 12 | ExtractNatives→ReconstructAssets | 解压原生库、校验重组资源索引 |
| 13 | LauncherPartLaunch | ⭐ 真正拉起游戏进程 |
| 14 | PostLaunchCommand(可选) | 游戏退出后执行后置命令 |
两个值得了解的设计细节:
- 日志脱敏:
LaunchController会调用setCensorFilter(),把 access token 等敏感串注册进过滤器,censorPrivateInfo()在每一条控制台输出写入 LogModel 前完成替换,避免令牌泄露到日志文件; - 两段式推进:
LauncherPartLaunch前任务会发出readyForLaunch()进入Waiting状态,若配置了 Profiler(如 JProfiler),启动器会暂停等待用户完成配置后proceed(),否则直接放行。
七、LauncherPartLaunch:脚本 → 命令行 → 游戏进程
最后一步 LauncherPartLaunch 把“一切准备就绪”变成“进程跑起来”:
- 选启动器 jar:常规实例使用
NewLaunch.jar;老版本或需要在线修复的实例额外挂上NewLaunchLegacy.jar; - 生成启动脚本:
instance->createLaunchScript(m_session, m_targetToJoin)将AuthSession(令牌、UUID、会话 ID、目标服务器)渲染成最终命令行; - 环境配置:
createLaunchEnvironment()注入-Djava.library.path、classpath,并把进程设为setDetachable(true)—— 即使启动器侧的对象被销毁,游戏进程依然独立存活; - 状态跟踪:
LoggedProcess的stateChanged信号驱动成败判定;日志逐行回传LaunchTask,支持解析 log4j XML 结构化日志; - 可选联动:若勾选
CloseAfterLaunch,启动器会监听游戏日志中的Setting user行,玩家加载完成后自动关闭所有窗口,让体验接近官方客户端。
游戏进程退出后,LaunchTask::emitSucceeded()会把实例状态setRunning(false),整个会话生命周期至此闭环 🎮
八、常见问题速查
| 现象 | 原因定位 | 建议 |
|---|---|---|
| 启动卡在 "Updating Yggdrasil token" | Ely 令牌步骤阻塞 | 检查account.ely.by网络可达性 |
| 提示 "Launcher library could not found" | NewLaunch.jar缺失 | 重新安装或修复启动器文件 |
| 游戏启动后账号被登出/刷新异常 | ClaimAccount锁未生效(自定义账号类型) | 确认账号类型为 Ely/MSA 而非 Offline |
| 断网仍想玩 | 认证服务器不可达 | 会自动降级 Offline 模式,输入玩家名即可 |
控制台日志出现*** | 脱敏过滤器正常工作 | 属预期行为,令牌已被遮蔽 |
九、核心文件索引
想深入源码的同学,可以从这几个入口读起:
- 启动总控:launcher/LaunchController.cpp
- 流水线编排:launcher/minecraft/MinecraftInstance.cpp(
createLaunchTask) - 步骤引擎:launcher/launch/LaunchTask.cpp
- 账号守卫:launcher/minecraft/launch/ClaimAccount.cpp
- Ely 认证流:launcher/minecraft/auth/AuthFlow.cpp 及 launcher/minecraft/auth/steps/ 目录
- Ely 补丁注入:launcher/minecraft/update/ElyPatchTask.cpp
- 进程拉起:launcher/minecraft/launch/LauncherPartLaunch.cpp
小结:Ely Prism Launcher 的会话生命周期是一条“账号决策 → OAuth 认证 → 会话封装 → 流水线准备 → 进程拉起”的单向链路。ClaimAccount看似简单的一步,实则是保证“登录态”与“游戏进程”生命周期严格对齐的守门人——理解了这条链路,你排查任何启动问题都有了地图。
【免费下载链接】Launcher
This fork of Prism Launcher adds integrated support for Ely.by accounts.
相关推荐
TaskingAI Python SDK 会话管理实战:从 create_chat 到 Chat 会话的完整生命周期
TaskingAI Python SDK 会话管理实战:从 create_chat 到 Chat 会话的完整生命周期 Chat(会话)是 TaskingAI A
人工智能大模型AI AgentRAG后端前端如何用Ely Prism Launcher配置内存与JVM参数:提升游戏FPS的完整教程
如何用Ely Prism Launcher配置内存与JVM参数:提升游戏FPS的完整教程 Ely Prism Launcher(PineconeMC)是一款基于
如何将Jar Mod合进Minecraft主程序:Ely Prism Launcher的ModMinecraftJar完整指南
如何将Jar Mod合进Minecraft主程序:Ely Prism Launcher的ModMinecraftJar完整指南 Ely Prism Launch
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考