Repository navigation
PCL Lite 1.7.0
PCL Lite 1.7.0。
这是自 1.6.4-hotfix-5 以来的第一个正式版。下面按主题把这一路的全部改动列一遍,最后一节是这一版相对上一个预发布(1.7.0-early-3)新增的内容。
一、Lunar 页面:账号独立,且能导入令牌
为什么必须独立
以前 Lunar 页面直接复用 PCL 主页面的登录。选一个账号启动,游戏端会卡在 Connecting... 进不去。
根因不在网络,在令牌身份对不上。Lunar 游戏端拿到 accessToken 会解 JWT,按里面的 aid(应用标识)挑刷新实现;PCL 主页面用的是自己的应用注册,签出来的 aid 三个分支全命中不了,落到最后那条需要 deviceToken 和密钥对的路上 —— PCL 造不出来,刷新失败,界面就永远停在 Connecting...。
现在 Lunar 页面是独立的一套:
| 主页面 | Lunar 页面 | |
|---|---|---|
| 应用身份 | PCL 自己的 | Lunar 的 |
| 账号存哪 | ProfileService 的档案列表 |
%LOCALAPPDATA%\PCLLite\Lunar\identities.json |
| 怎么产生 | 主页面点登录 | Lunar 页面点「登录」 |
没登录时不再偷偷拿 PCL 的登录顶上,而是明确提示去登录。主页面登录、普通账号刷新、离线登录一行没动。
令牌导入
登录页底下多了「使用令牌登录」,粘进去就行,三种凭据自动识别:
| 粘进去的东西 | 会发生什么 | 能续期 |
|---|---|---|
| Refresh Token | 换出整套新令牌,和正常登录完全等价 | 能,一直有效 |
| Minecraft 令牌 | 直接用,不换 | 不能,24 小时后失效 |
| 微软 Cookie | 走授权码流程换出整套令牌 | 能 |
输入框改成了多行可滚动,长令牌不会再被 MaxLength 静默截断。
Cookie 现在认浏览器扩展导出的 cookies.txt:那种文件是 Netscape 格式(7 列、制表符分隔),以前一条规则都不中,整份文件掉进 refresh token 分支去兑换,报错指向完全错误的方向。现在会只取 login.live.com 那部分、同名以更具体的域为准、过期条目丢弃;一条都用不上时直接说「这份 Cookie 已经失效」。
档案列表
- 匹配键明确成「UUID + 登录方式」:同一个号用设备码登一次、用令牌导入一次,就是两条档案,各自独立
- 同一个号用同一种方式再登一次,认定是续期,就地替换,不新增条目
- 启动时自动合并历史遗留的重复条目(先看有没有 Refresh Token,再看到期时间)
- 每条标出是怎么登进来的:设备代码 / Access Token / Refresh Token / Cookie
- 登录方式挂在第二行的「正版验证 · xxx」里,不再跟账号名抢位置被省略号吃掉
- 续期记住了「谁签发的」(
RefreshClientId),依次试 PCL Lite / Lunar 启动器 / In-Game Account Switcher,都不是就明说换不了,而不是丢一个AADSTS70000让人猜
二、Discord 状态:时长不再莫名归零
设置里那个「应用 ID」输入框删了,改成本项目自己的应用写死在代码里 —— 那个框除了让人填错之外没有任何用处。
时长归零 / 从头开始的几个独立原因都修了:
| 原因 | 修法 |
|---|---|
| 取内存失败被当成游戏没在跑 | 只有「进程已退出」才判定没在运行 |
| 单次读不到快照就清空起点 | 连续 15 秒都读不到才算真的退出 |
| 起点是「第一次发现游戏在跑的时刻」 | 改用游戏进程自己的启动时间 |
| 管道报「已连接」其实对端已经没了 | 超过 90 秒没成功发出去过就强制重连 |
| 被 Discord 限流一次就断开 30 秒 | 限流只记错误不断连接;重连间隔 30 秒 → 15 秒 |
三、启动器公告真的能用了
以前这条链路是死的:公告走 GitHub Releases,而代码里直接返回空列表,设置项选哪一档都没区别。
现在公告来自清单仓库根目录的 notice.json:改文件就等于发一条公告,不用发版。走和更新清单同一套多通道抢答,拉不到 / 文件不存在 / JSON 写坏一律当作没有公告,不影响启动。公告用 id 去重,important: true 的条目在「仅重要」档也会收到。
公告只走准实时通道(Contents API / raw 直连 / 反代),跳过 jsDelivr —— 它对 GitHub 路径默认缓存 12 小时,命中缓存时反而最快,会把旧内容顶上来。清单文件(update.json)行为不变。
四、隐私:用户文件夹名打码(默认开)
界面和启动日志里到处是 C:\Users\xxx\AppData\...,随手截图就把 Windows 用户名带出去了。现在 Users 后面那一段统一显示成 *****:
改前:C:\Users\18857\AppData\Roaming\.minecraft
改后:C:\Users\*****\AppData\Roaming\.minecraft
- 按路径结构打码,不是整串替换,用户名恰好是纯数字时不会牵连版本号和文件大小
- 所有用户文件夹都打(别人的账号、
Public、正斜杠写法一并处理) - 固定五个星号,不按名字长度补 —— 星号个数本身也是信息
- 崩溃报告始终打码,不受开关影响
- 实例列表左栏、设置 → Java 的路径也都覆盖了
需要看真实路径排查问题时:设置 → 个性化 → 基础 → 取消勾选「界面上的用户文件夹名打码」,立刻生效。
五、界面
- 滚动条重做(这一版新增,见下)
- 「新建档案」的方框整块都能点,不再只有中间那个小圆生效
- 设置 → 启动器 → 游戏选项里那个灰着的「正版验证方式」整行隐藏(代码里被强制成设备代码流,选另一个不改变任何行为)
- Lunar 页那张卡原来列了 8 行实现细节(含一句早已过时的「好友与社交面板还没做」),改成一句概述 + 「查看完整说明 →」跳仓库里的
docs/LUNAR.md
六、这一版相对 1.7.0-early-3 新增
滚动条改成随主题的细胶囊
原来的原生滚动条又宽又灰,深色主题下尤其扎眼。现在:
- 平时是一条 4px 半透明细边,鼠标移进这一列就滑出到 8px 并变实
- 颜色取
ColorBrush3/ColorBrush4,跟随主题色相,不再是一根灰条 - 去掉上下箭头按钮,保留 PageUp / PageDown 命中区,点击空白仍可翻页
- 整列 12px 都是命中区,不用精确压在那 4px 上
- 横向滚动条单独给模板,保持满宽、同色系
- 顺带修掉右下角那块白方块:WPF 默认
ScrollViewer模板在两条滚动条交汇处画了一个SystemColors.ControlBrush的矩形,深色界面下就是一块白 —— 重写模板去掉它,PART 名字与默认模板保持一致,ScrollViewerNoMargin/ScrollViewerFullMargin/MyScrollViewer不受影响
Lunar 上报的启动器版本改为在线查
launcherVersion.semver 以前取本机 Lunar Client.exe 的 FileVersion,没装就 4.0.0。Lunar 服务端只校验下限、下限跟着官方启动器往上涨,这个值迟早过期被 1008 踢掉。
现在走官方启动器自己的更新源:
GET /launcher/metadata/misc?installation_id=<uuid> → updater.feedUrl + updater.channel
GET <feedUrl>/latest-ow.yml → version: x.y.z-ow,剪掉 -ow
结果缓存 6 小时、并发去重,查失败保留上一次的好值;优先级是 在线最新正式版 → 本机 exe FileVersion → 4.0.0。两处 UA 与 /launch 请求体的 launcher_version 一并改用该值。
注意:传给 Genesis 的 --launcherVersion 仍然是 3.3.0,没跟着改。 那是「游戏侧」的参数,只被游戏打日志用;上报服务端的是另一回事。代码里已经改名成 GameLauncherVersion 并写了注释,防止以后又混在一起。
七、其它修复
- 导入的 Refresh Token 档案刷新一次就变成「设备代码」:
McProfile.Clone()是手写字段清单,漏拷LoginMethod与RefreshClientId,后者还会让下一次续期拿 PCL 的身份去换别人的令牌 - 更新时并发启动两个更新器导致替换失败
AddAccount应答与页面切换撕裂- Lunar 账户库不再跟着物料根目录走
- 删掉 Lunar 的「回到游戏」按钮:
FocusGamePush在外部进程里被前台锁定挡住,点了没反应
八、更新通道新增 early
给「正式版马上要发了,先放出来给人试」留了个位置:
hotfix(+1) > 正式版(0) > early(-1) > pre(-2) > snapshot(-3) > nightly(-4)
比同号正式版旧(正式版一发出来会再升一次落地,不会被卡住),比 pre 新,同时属于正式版通道 —— 选「稳定版」的用户也收得到。序号写法用 - 隔开:early-1、early-2。
九、许可协议打包进 exe
以前 csproj 里写的是 <Content Include="LICENCE" />,而仓库里的文件叫 LICENSE 且放在仓库根目录,那个配置项一直指向不存在的文件。现在改成嵌入资源(PCL.LICENSE),协议正文编进程序集,单文件产物照旧只有一个 exe。
校验
SHA-256(签名后):BA810B25B7DFFAD4791CC6572C6B4E585CD36362A1BF867D7795B10F58961B8C
大小:19,394,856 字节
签名:Valid(PCL Lite,DigiCert 时间戳)
已知问题
- Cookie 登录仍然没有在「真实且未过期的会话」下跑通过一次。格式识别(含
cookies.txt)已经补齐,但手上那份导出里的MSPAuth/MSPProf都是Disabled(登出状态留下的),验证不到最后一步。真遇到回login_required,先在浏览器里重新登一次login.live.com再导出 - 令牌导入的账号 24 小时后必须重新导入,这是微软定的,没有绕法
- 之前被误标成「设备代码」的旧档案,数据上已经还原不出原始登录方式了,需要删掉后用同一个 Refresh Token 重新导入一次
- Lunar 的独立登录走的是 Lunar 自己的 Azure 应用注册,授权记录会记在 Lunar 名下(account.microsoft.com 的「应用权限」里看到的是 Lunar Client,不是 PCL);Lunar 单方面改那个注册会让这条路直接失效,PCL 无法自救
- 反代(ghproxy 之类)如果自己带缓存,理论上也可能返回旧公告。遇到「改了没生效」先等一两分钟再试
更早的分步说明
1.7.0 一路发过若干预发布版,每一步的细节都在各自的发布说明里:snapshot → snapshot-2 → snapshot-3 → snapshot-4 → snapshot-5 → pre-1 → pre-2 → pre-3 → pre-4 → early-1 → early-2 → early-3。