{"full_name":"FCL-Team/FoldCraftLauncher","owner":"FCL-Team","name":"FoldCraftLauncher","url":"https://github.com/FCL-Team/FoldCraftLauncher","description":"Fold Craft Launcher, an Android Minecraft : Java Edition launcher.","homepage":"","topics":[],"language":"Java","license":"GPL-3.0","avatar":"https://avatars.githubusercontent.com/u/114871581?v=4","created_at":"2022-10-19T10:12:18Z","pushed_at":"2026-11-10T00:52:48Z","metrics":{"stars":5166,"forks":376,"watchers":58,"issues":1594,"prs":306,"releases":196,"issues_open":null,"issues_closed":null,"prs_open":null,"prs_closed":null,"prs_merged":null,"discussions":0},"growth":{"day":{"stars":3,"forks":2,"base_day":"2026-11-09"}},"history":{"dates":["2026-11-09","2026-11-10"],"stars":[5163,5166],"forks":[374,376],"watchers":[58,58],"issues_open":[null,null],"prs_open":[null,null]},"boards":{},"same_owner":[],"issues":[{"number":514,"title":"Error launching minecraft with volcano mod when using the corresponding library.","comments":85,"created_at":"2024-08-14T22:15:31Z"},{"number":1601,"title":"离线模式部分机型不能切换皮肤","comments":18,"created_at":"2026-05-30T05:53:30Z"},{"number":348,"title":"Create mod 1.20.1 fabric crash 😭😭","comments":17,"created_at":"2024-04-14T03:40:14Z"},{"number":370,"title":"Panfrost OpenGL2/3 render method for Mali graphics ","comments":14,"created_at":"2024-05-11T17:53:36Z"},{"number":2009,"title":"附加的jvm参数使用javaagent打开X11窗口，但是X11窗口不显示","comments":13,"created_at":"2026-11-08T09:12:37Z"},{"number":1598,"title":"[renderer]","comments":13,"created_at":"2026-05-27T09:49:08Z"},{"number":1914,"title":"在红米手机上 启动器刷新率锁帧60帧且无法在系统设置里面更改","comments":12,"created_at":"2026-10-05T16:18:03Z"},{"number":1898,"title":"[Bug] FCL 下载高版本 Forge 进度条卡死，网络速率降为 0.0 B/s","comments":12,"created_at":"2026-10-02T12:58:09Z"}],"discussions":[],"latest_release":{"name":"1.3.4.5","tag":"1.3.4.5","published_at":"2026-11-07T02:00:02Z","body":"\n### 中文\n\n#### ✨ 新功能\n\n1. **文件下载并行续传 (#1960)**：单流读循环新增并行续传钩子，复用 BMCLAPI 慢速节点切换同款的 10 秒速度窗口——单连接持续低于 128KB/s 且剩余量按当前速度还需超过一个窗口时，自动切换多连接分块拉取剩余区间，突破网盘直链等按连接数限速的慢速源（修复 Cleanroom alist 镜像 50KB/s 下载缓慢）；触发前零额外请求，快服务器完全不受影响。链路：1 字节 Range 探测（核对 206 响应与总大小，不支持则维持单流）→ 剩余区间按 ≥2MB/块均分最多 8 连接 → 按绝对偏移 FileChannel 写入同一临时文件（保留已完成前缀）→ 复用原有落盘/ZIP 校验/缓存流程；分块读超时放宽至 30 秒且在 resolveConnection 之后设置（按连接限速的服务器数据间歇性滴流，常规 10 秒会反复掐断正常工作的分块连接）；分块失败按轮次统一重试（retry 轮 + 轮间退避），续传请求从已写偏移发 Range 只补未完成区间；全局进度 = 已完成前缀 + Σ(分块已写偏移)，严格单调，修复分块重试重复计字节把进度顶破 100% 导致整轮报废、进度条反复跑满清零的问题；BMCLAPI 链路原慢速节点切换优先级不变（同命中时仍优先换节点，仅末次尝试由并行接管）；并行续传完成后按最终文件重算校验摘要，修复带完整性校验或 BMCLAPI 兜底哈希的下载触发并行后校验必失败的问题\n2. **整合包补全自动恢复前弹窗确认 (#1990)**：整合包版本每次启动都会执行补全任务，清单内缺失的文件（含被用户主动删除/更新的模组）会被静默装回，无任何提示；现启动补全前先本地探测将被恢复的缺失文件，非空则弹窗列出，可选「继续补全 / 跳过本次 / 不再自动补全」——跳过本次下次启动再询问，不再自动补全持久化到版本设置（版本设置中可随时改回）；探测按 Provider 类型分派并用具体 TypeToken 重读清单（规避 ModpackConfiguration<?> 通配反序列化得到 LinkedTreeMap 的坑），清单源与各补全任务对齐（Curse 读版本根目录 manifest.json、Modrinth 读 modrinth.index.json、Mcbbs/Server 读 modpack.cfg），清单缺失或 Server 的 fileApi 为空时与补全任务同样空转、不弹窗，任何探测异常兜底返回空表，绝不阻断启动\n3. **皮肤模型设置菜单改双指点击触发，新增点击音效**：主界面皮肤模型设置菜单的触发方式由双击改为双指点击（两指几乎同时按下且未移动才触发，避免与旋转/缩放手势冲突），首次使用时显示引导提示「双指点击皮肤模型打开设置菜单」；点击模型新增音效反馈，可在皮肤设置中关闭\n\n#### ⚡ 优化\n\n1. **启动流程重构为协程驱动 (#1877)**：LauncherHelper 迁移至 Kotlin，启动流程由多层 thenComposeAsync 任务链改为单个协程线性执行（版本解析 → mod 扫描 → Java 检查 → 依赖补全 → 解包内置 jar → 登录 → 启动前检查 → 主线程拉起 JVMActivity）；检查与登录弹窗改为挂起式 awaitChoice / awaitLoginChoice，协程取消时一并关闭停留的弹窗；认证失败可反复重试，重试期间保留微软登录进度；启动弹窗以六阶段任务列表展示，阶段按实际进入顺序打勾，跳过依赖补全时不错位；fclcore 任务（游戏文件与整合包补全、GameVerificationFixTask）经 runTracked 接入 TaskExecutor，复用弹窗下载进度展示，协程取消与执行器取消双向级联；TaskDialog 换绑执行器或重设阶段列表时摘除旧监听并释放旧列表，避免监听与视图树残留\n\n#### 🐛 修复\n\n1. **输入法双倍抬升画面致黑屏、软键盘开关需点两次 (#1997)**：三个相关但独立的问题一并修复——(a) 画面抬升与放大镜遮挡高度改读 IME insets 真值（共用 getImeOccludedHeight 工具），矮键盘不再漏判、悬浮键盘（inset 为 0）不再误抬，API 26–29 无专用通道沿用原可视区估算；(b) SDL 编辑框固定左上角 1px、忽略游戏传入的文本输入区域矩形，焦点不再落在键盘覆盖区，系统不再平推窗口，消除「系统平推 + JVMActivity 画面平移」叠加的双倍抬升黑屏（偶发性源于编辑框位置随呼出方漂移）；(c) 接通移植时丢失的 notifyImeVisibilityChanged 真实显隐上报（JVMActivity 布局回调轮询），SdlImeController 缓存标志不再漂移，软键盘开关恢复一次点击生效，「通道关闭时 IME 自行弹出强制按回」安全网随之生效\n2. **背景图息屏启动后比例拉伸**：背景图原先按加载时刻定格的视图尺寸裁出固定 Bitmap，息屏启动等视图尺寸变化后比例错误；新增 CenterCropDrawable 在绘制时按当前 bounds 实时等比缩放居中裁剪，旋转、折叠等尺寸变化场景同样保持正确比例（ImageUtil.loadInto 移除 Glide）\n3. **版本列表切换选中版本时异常动画**：条目入场动画原先在整行重绑时无条件重播，切换选中版本的局部刷新（PAYLOAD_CONTENT 重绑）会让可见条目整体横滑一遍；现入场动画每个条目视图只播一次（tag 标记），并关闭列表 itemAnimator，避免局部刷新被 DefaultItemAnimator 转成 move 动画表现为整列上下弹跳\n\n### English\n\n#### ✨ New Features\n\n1. **Parallel download resumption (#1960)**: The single-stream read loop gained a parallel-resumption hook reusing the same 10-second speed window as BMCLAPI's slow-node switching — when one connection stays under 128KB/s and the remaining data would take more than one window at the current speed, the remaining range is automatically split into chunks fetched over multiple connections, breaking through per-connection speed caps of slow sources such as net-disk direct links (fixes the 50KB/s downloads from the Cleanroom alist mirror); no extra requests are made before triggering, and fast servers are completely unaffected. The chain: a 1-byte Range probe (verifying the 206 response and total size, falling back to a single stream if unsupported) → the remaining range split into chunks of ≥2MB each over up to 8 connections → written by absolute offset into the same temp file with FileChannel (preserving the completed prefix) → the existing finalize/ZIP-check/cache flow reused; chunk read timeouts are relaxed to 30 seconds and set after resolveConnection (per-connection-capped servers trickle intermittently, and the regular 10-second timeout would repeatedly kill working chunk connections); failed chunks are retried uniformly per round (retry round + inter-round backoff), and resumption requests send Range from the written offset to fetch only unfinished ranges; global progress = completed prefix + Σ(chunk written offsets), strictly monotonic, fixing chunk retries double-counting bytes and pushing progress past 100%, wh"},"readme":true,"readme_zh":false,"news":[],"stale":false,"snapshot_at":"2026-11-10T09:35:25Z","history_start":"2026-09-06"}