Skip to content

1.3.4.4

Choose a tag to compare

@ShirosakiMio ShirosakiMio released this 02 Nov 02:38
· 12 commits to main since this release

中文

✨ 新功能

  1. 游戏放大镜 (#1981):输入法激活且遮挡超过约三分之一游戏画面时,提供放大镜窗口查看被遮挡区域——开启「输入时默认弹出放大镜」时直接弹出(宽为屏幕 60%),否则显示放大镜按钮手动打开,同一次输入中手动关闭后不再自动弹出;该开关可在游戏右侧菜单与放大镜设置面板中切换(手动打开时重置自动收起状态,避免输入法动画抖动将其收回);取样区域按「视口 × 适配比 ÷ 缩放」等比计算,缩放为 1 时为整帧概览,任意放大即裁切并可拖动平移(平移带 0.5 阻尼,小窗口内更易定位),游戏自定义分辨率过小时同样等比不拉伸;画面回读按 33ms 节流、打开时强制捕获,白色 3dp 圆角描边(foreground 绘制,不被画面覆盖)标示当前为放大画面
  2. SFPEW 改造为兼容层组合模式 (#1983):SFPEW(SimpleFPEWrapper)官方定位是 OpenGL 固定管线(FPE)兼容包装层而非完整驱动,此前作为独立渲染器与 gl4es/Zink/MobileGlues 并列可选属定位误用;现移除独立 SFPEW 渲染器条目,改为叠加在真实后端之上的兼容层——内置渲染器按已知行为硬编码,默认叠加,仅自带 FPE/完整 GL 的 Krypton Wrapper、Holy GL4ES、VGPU、Kopper Zink 不叠加;外部渲染器插件由渲染器选择对话框左下角新增的「高级设置」页控制(「SFPEW 兼容层(渲染器插件)」全局开关与 SFPEW_RELAXED_CONTEXT 均默认关闭,即严格模式);启动链路注入 SFPEW_LAYER=1 与 SFPEW_EGL=POJAVEXEC_EGL(后端与底座 EGL 同源),${gl_lib_name} / SDL_OPENGL_LIBRARY 换为包装层路径,游戏 GL 符号经 LWJGL libname 从 SFPEW 句柄解析;native 桥按 SFPEW 宿主集成指引将 eglMakeCurrent/eglSwapBuffers 路由进包装层(记录上下文切换、swap 前清空立即模式批次),解析失败回落系统 EGL,进程退出先 drain 再销毁上下文;装有自实现 FPE 模拟的模组(Angelica/Actinium,仅统计启用中的模组)时整层自动跳过并记录检测日志;版本门控按组合后能力修正——层启用时跳过渲染器最低版本警告(最高版本限制保留,层不扩展渲染器的现代 GL 上限),渲染器列表中无版本边界的内置渲染器显示「全部版本」,未声明版本的插件仍显示「未知」
  3. SFPEW 自动选择 EGL Context 模式:SFPEW 升级至 26.11-dev,导出面从 5 个符号扩展为完整 EGL(CreateContext/ChooseConfig/GetDisplay/Initialize/Sync 等);兼容层启用时 eglCreateContext/eglDestroyContext 一并经包装层解析,建上下文与销毁上下文同源(与 makeCurrent/swap 解析成功绑定,避免包装层创建、底座销毁的所有权错配,失败回落底座入口),SFPEW 由此可逐上下文自动选择 Context 模式;SDL_EGL_LIBRARY 同步指向包装库,SDL 的 EGL 栈整体经包装层
  4. 内置 MobileGlues 升级至 2.0.1,新增 MultiDraw 方案排序配置:替换四 ABI 的 libmobileglues.so;借助 SFPEW 兼容层补齐旧版固定管线(1.8.9 实测可跑),移除 1.17 最低版本限制与名称中的「1.17+」,同时不再声明最高版本,渲染器列表显示「全部版本」;渲染器设置新增「方案排序」配置类型,对齐 MG 2.0.1 上游 settings.cpp 的 6 个 multidraw 配置键——全局 multidrawOrder(原生 / 原生 EXT、multiindirect、multibasevertex、multiarrays、indirect、basevertex、逐条绘制、计算着色器,越靠前越优先,运行中某方案失效时按此顺序向后回退)与 Arrays/Elements/ElementsBaseVertex/ArraysIndirect/ElementsIndirect 五个函数级异常条目(默认关闭跟随全局;启用时快照当前全局排序作为独立排序,此后不再跟随),界面为可折叠编号列表 + 上移/下移,已保存的排序自动规整(剔除未知项、去重、缺项按默认顺序补尾);启动合并配置时函数级条目显式关闭则从 config.json 摘除残留键交还全局排序,从未配置则不触碰(保留手动编辑与 MG 自管值);enableANGLE 默认值由 1 改为 0,对齐 MG 2.0.1 起的缺省语义 DisableIfPossible

⚡ 优化

  1. NeoForge 相关文件支持 CurseForge CDN 镜像候选(同步 HMCL #7092):新增 neoforged.forgecdn.net 镜像——NeoForge 元数据请求改用「原地址 + 镜像地址」双候选;maven.neoforged.net 的 installer.jar 与库文件下载在官方源与 BMCLAPI 下载源下均追加 forgecdn 候选(/releases/ 路径按下载源优先级在官方源与 BMCLAPI 间排序)
  2. 过滤模组中文名中的 Emoji(同步 HMCL #7077):模组/整合包翻译数据(addon/mod.csv、modpack.csv)的中文名列移除 Emoji(如「玉 🔍」→「玉」、「Kiwi 🥝」→「Kiwi」),英文名列保持不变

🐛 修复

  1. MultiMC 整合包启动崩溃 (#1984):meta.multimc.org 对 net.neoforged 等加载器的 Json-Patch 以旧式 minecraftArguments 承载全套标准参数与加载器附加项,导入合并后版本 json 同时存在旧式 minecraftArguments 与新式 arguments.game,启动时两代格式各拼一遍并再补一份默认分辨率参数,--gameDir/--username/--width 等重复出现,ModLauncher 直接抛出 MultipleArgumentsForOptionException;DefaultLauncher 改为两代格式互斥(旧式非空时只拼旧式并补一次默认分辨率参数,否则走新式),已导入的实例无需重新导入即可正常启动;导入时合成参数按基座格式选择承载方式——1.13+ 新式基座剥离官方标准占位参数对、仅以新式参数承载加载器附加项(显式指定具体值的参数视为有意覆盖,原样保留),1.13 以下旧式基座保持完整 minecraftArguments 整体覆盖,确保老版 Forge/LiteLoader 的 --tweakClass 等参数不丢失
  2. 整合包版本特定设置无法被用户关闭:两处锁死——每次刷新版本都对含 modpack.cfg 的版本无条件开启特定设置,用户关闭后下次刷新即被覆盖回来;版本设置页对整合包版本直接禁用「启用游戏特定设置」开关。现仅在首次检测(尚无 fclversion.cfg)时自动开启,已有设置文件则尊重用户选择,新装/外部导入的整合包行为不变,开关恢复可用;「版本隔离」开关保持禁用(整合包的模组加载依赖版本目录下的 mods,放开会直接导致整合包损坏),显示值改为恒为开启,避免关闭特定设置后显示全局设置的「关闭」而实际仍强制隔离造成误导
  3. 键盘开关状态与输入法真实显隐不同步:经输入法自带按键收起键盘后,游戏内键盘开关仍停留在开启状态,再次呼出需点两次;现 Android 11+ 按系统 WindowInsets 真实值判断键盘可见性,更低版本按可视区域高度估算(与 JVMActivity 画面上推同源同阈值),布局回调中检测到键盘出现后又消失且输入框仍有焦点时,认定输入法自行收起,走统一清理(清空输入、隐藏、焦点与指针捕获交还游戏视图);呼出期间加闩锁防止动画过程误判
  4. 绑定控件组显隐对话框显示异常 (#1982):列表区由固定 320dp 改为按权重自适应,内容少时收紧、超出屏幕时收缩列表区,小屏横屏下确认/取消按钮始终可见;允许返回键关闭对话框,避免被困;条目下拉框关闭自动文字着色、继承默认文字色,修复亮色模式下文字与白底对比度不足
  5. 「使用系统Vulkan驱动」开关无动画 (#1993):切换该开关会触发列表全量重绑,复用重绑发生在 detach 状态下,对开关重复设置相同状态时走进 SwitchCompat 的吸附分支,取消滑块动画、直接跳变;现仅对随开关显隐的自定义驱动行做局部插入/移除刷新,开关行不再重绑,并在状态一致时跳过 setChecked,防御其他全量刷新路径

➖ 移除

  1. MultiMC 整合包导出功能:导出类型选择页移除 MultiMC 选项及对应导出任务;导入侧不受影响——安装任务、清单解析与启动参数修复(#1984)均原样保留,HMCL 等外部工具导出的 MultiMC 整合包仍可正常导入

English

✨ New Features

  1. Game magnifier (#1981): When input is active and the input method covers more than about a third of the game screen, a magnifier window shows the covered area — with "Show Magnifier by Default While Typing" enabled it pops up directly (60% of the screen width); otherwise a magnifier button opens it manually, and once dismissed it won't auto-show again during the same input session; the toggle is available in the in-game right menu and the magnifier's settings panel (opening it manually resets the auto-dismiss state so the input method's animation jitter doesn't close it again); the sampled area is computed proportionally as viewport × fit scale ÷ zoom — zoom 1 shows the whole frame, any zoom in crops and allows drag-to-pan (with 0.5 damping for easier positioning in the small window), and it stays undistorted even when the game's custom resolution is very small; frame readback is throttled to 33ms with a forced capture on open, and a white 3dp rounded outline (drawn as a foreground so the frame doesn't cover it) marks the magnified view
  2. SFPEW reworked into a compatibility-layer composition model (#1983): SFPEW (SimpleFPEWrapper) is officially an OpenGL fixed-function pipeline (FPE) compatibility wrapper rather than a full driver, so offering it as a standalone renderer alongside gl4es/Zink/MobileGlues was a misuse; the standalone SFPEW renderer entry was removed and it now stacks on top of the actual backend as a compatibility layer — built-in renderers are hardcoded by known behavior: layered by default, except Krypton Wrapper, Holy GL4ES, VGPU and Kopper Zink, which ship their own FPE/full GL; external renderer plugins are controlled from a new "Advanced" page at the bottom-left of the renderer selection dialog (both the "SFPEW compatibility layer (renderer plugins)" global toggle and SFPEW_RELAXED_CONTEXT default to off, i.e. strict mode); the launch chain injects SFPEW_LAYER=1 and SFPEW_EGL=POJAVEXEC_EGL (backend and base EGL from the same source), swaps ${gl_lib_name} / SDL_OPENGL_LIBRARY for the wrapper path, and resolves the game's GL symbols from the SFPEW handle via the LWJGL libname; following SFPEW's host integration guide, the native bridge routes eglMakeCurrent/eglSwapBuffers through the wrapper (recording context switches and flushing immediate-mode batches before swap), falling back to the system EGL when resolution fails and draining before destroying contexts on process exit; the whole layer is skipped automatically (with a detection log) when a mod with its own FPE emulation (Angelica/Actinium, only enabled mods count) is installed; version gating now reflects the combined capability — with the layer enabled the renderer's minimum-version warning is skipped (the maximum-version limit stays, since the layer doesn't raise the renderer's modern GL ceiling), built-in renderers without version bounds show "All versions" in the renderer list, and plugins without declared versions still show "Unknown"
  3. SFPEW chooses the EGL context mode automatically: SFPEW was updated to 26.11-dev, expanding its exported surface from 5 symbols to full EGL (CreateContext/ChooseConfig/GetDisplay/Initialize/Sync, etc.); with the layer enabled, eglCreateContext/eglDestroyContext are also resolved through the wrapper so contexts are created and destroyed by the same side (tied to successful makeCurrent/swap resolution to avoid the wrapper creating a context the base destroys, falling back to the base entry points on failure), which lets SFPEW choose the context mode per context automatically; SDL_EGL_LIBRARY now points to the wrapper as well, routing SDL's entire EGL stack through it
  4. Built-in MobileGlues upgraded to 2.0.1, with configurable MultiDraw strategy ordering: libmobileglues.so was replaced for all four ABIs; with the SFPEW compatibility layer supplying the legacy fixed-function pipeline (1.8.9 verified to run), the 1.17 minimum version and the "1.17+" in its name were removed and no maximum version is declared anymore, so the renderer list shows "All versions"; renderer settings gained an "ordered strategy" config type matching the 6 multidraw keys of MG 2.0.1's upstream settings.cpp — the global multidrawOrder (Native / Native EXT, multiindirect, multibasevertex, multiarrays, indirect, basevertex, Draw One by One, Compute Shader; higher strategies are preferred and failed strategies fall back in this order at runtime) plus five per-function exception entries for Arrays/Elements/ElementsBaseVertex/ArraysIndirect/ElementsIndirect (off by default, following the global order; when enabled they snapshot the current global order as an independent order and stop following it), presented as a collapsible numbered list with move up/down, and saved orders are normalized automatically (unknown items dropped, duplicates removed, missing items appended in default order); when merging the config at launch, explicitly disabled per-function entries have their leftover keys removed from config.json to hand control back to the global order, while never-configured entries are left untouched (preserving hand edits and MG-managed values); the enableANGLE default changed from 1 to 0 to match the DisableIfPossible default semantics since MG 2.0.1

⚡ Improvements

  1. CurseForge CDN mirror candidate for NeoForge-related files (synced from HMCL #7092): Added the neoforged.forgecdn.net mirror — NeoForge metadata requests now use both the original and the mirror URL as candidates; installer.jar and library downloads from maven.neoforged.net gain a forgecdn candidate under both the official and BMCLAPI download sources (for /releases/ paths the official source and BMCLAPI are ordered by the download source's priority)
  2. Emoji filtered out of mod Chinese names (synced from HMCL #7077): Emoji were removed from the Chinese-name column of the mod/modpack translation data (addon/mod.csv, modpack.csv) — e.g. "玉 🔍" → "玉", "Kiwi 🥝" → "Kiwi" — while the English-name column is unchanged

🐛 Bug Fixes

  1. MultiMC modpacks crashing on launch (#1984): meta.multimc.org's Json-Patch for loaders such as net.neoforged carries the full set of standard arguments plus loader extras in the legacy minecraftArguments, so after import the merged version json had both legacy minecraftArguments and modern arguments.game; at launch both generations were concatenated, plus another copy of the default resolution arguments, duplicating --gameDir/--username/--width and more, and ModLauncher threw MultipleArgumentsForOptionException; DefaultLauncher now treats the two formats as mutually exclusive (when legacy arguments are present only they are used, plus the default resolution arguments once; otherwise the modern arguments are used), so already-imported instances launch normally without re-importing; at import time, the synthesized arguments now pick their carrier by the base format — for 1.13+ modern bases the official standard placeholder argument pairs are stripped and only the loader extras are carried as modern arguments (arguments with explicit concrete values are treated as intentional overrides and kept as-is), while pre-1.13 legacy bases keep the full minecraftArguments as a whole override, so arguments such as --tweakClass for old Forge/LiteLoader are not lost
  2. Version-specific settings of modpack versions could not be turned off: Two locks — every version refresh unconditionally enabled per-instance settings for versions containing modpack.cfg, so turning them off was overwritten on the next refresh; and the version settings page disabled the "Enable per-instance settings" switch outright for modpack versions. They are now enabled automatically only on first detection (when no fclversion.cfg exists yet), the user's choice is respected once a settings file exists, newly installed/externally imported modpacks behave as before, and the switch is usable again; the "Isolate Working Directory" switch stays disabled (modpack mod loading depends on the mods folder inside the version directory, so allowing it would break the modpack outright), and its displayed value is now always on, avoiding the misleading global "off" value shown after turning per-instance settings off while isolation was still enforced
  3. Keyboard toggle out of sync with the input method's actual visibility: After closing the keyboard with the input method's own key, the in-game keyboard toggle stayed on and reopening it required two taps; keyboard visibility is now determined from the system WindowInsets on Android 11+ and estimated from the visible display height on older versions (same source and threshold as JVMActivity's screen shift), and when a layout callback detects that the keyboard appeared and then disappeared while the input field still has focus, it is treated as closed by the input method and goes through the unified cleanup (clearing input, hiding, and returning focus and pointer capture to the game view); a latch during opening prevents misjudgment mid-animation
  4. Control-group visibility binding dialog layout issues (#1982): The list area changed from a fixed 320dp to weighted sizing — it shrinks to fit when content is short and gives way when the screen runs out, so the confirm/cancel buttons stay visible on small landscape screens; the back key can now close the dialog so users don't get stuck; item dropdowns no longer auto-tint their text and inherit the default text color, fixing poor text contrast against the white background in light mode
  5. "Use System Vulkan driver" switch toggling without animation (#1993): Toggling it triggered a full list rebind while the reused row was detached, and setting the same checked state again hit SwitchCompat's snap branch, cancelling the thumb animation so it jumped instantly; now only the custom driver row that shows/hides with the switch is inserted/removed locally, the switch row itself is no longer rebound, and setChecked is skipped when the state is unchanged to guard other full-refresh paths

➖ Removals

  1. MultiMC modpack export: The MultiMC option and its export task were removed from the export type selection page; importing is unaffected — the install task, manifest parsing and launch argument fix (#1984) are all kept, so MultiMC modpacks exported by external tools such as HMCL still import normally