feat(core): LiteLoader 安装路线(官方版本表 + 从零合成 launchwrapper 清单)
按 M218 SURVEY-p1 §4.1 的清单接上 LiteLoader 的安装路线,不动 OptiFine。
- core: 新增 addon::loader::liteloader(官方 versions.json 解析 + 合成清单)与
addon::loader::parent(父版本链读盘定位原版版本);LoaderKind 加 LiteLoader;
LoaderRelease 加 parent_version_id、LoaderPlanInput::vanilla_installed → parent_installed;
LoaderInstallPlan::build 改返回 Result(父版本缺失具名报错);LoaderSource::resolve_on
支持指定父版本(仅 LiteLoader,其它组合具名 unsupported)。
- 继承边界(本 mission 第一步核实):arguments.game 父在前子在后追加,minecraftArguments
子覆盖父,启动顺序 legacy(24) → arguments.game(25)。所以 tweakClass 只写 arguments.game,
绝不写 minecraftArguments(会顶掉 Forge 1.12.2 的 FMLTweaker)。
- maven/fabric 的 `_ =>` 通配改成穷尽分支:非 maven 族不再静默回落 Forge 的仓库;
maven::{metadata_url,installer_url} 改返回 Option<String>。
- presenter: supported() 收 LiteLoader、wizard_choices 六选、dto::instances 按关注点拆成
instances/{loader,runtime,create,tests}.rs(原文件 395 行,动手前先拆)。
- cli: --loader 区分「认不出」(loader_unknown) 与「认得但装不了」(loader_unsupported);
<version> 位写加载器版本 id 时按父版本处理(只有 liteloader 接受);help 只改 install 段。
- app-iced: 下载页加载器 chip 加 LiteLoader(1.5.2~1.12.2,两头按官方没有构建拒),
chip 清单改为委派 Loader::ALL。
- 测试: 真实响应的裁剪夹具(dl.liteloader.com 与 repo.mumfrey.com 的 maven-metadata)
驱动「解析→计划→落盘→继承→启动参数顺序」全链;Forge 父链有回归(FMLTweaker 必须还在
且排在 LiteLoader 之前);父版本缺失/组合不支持/取消/坏表各自具名错误。
This commit is contained in:
1 parent
307d29239a
commit
944b1610c8
37 files changed
+2427
-518
No files matched your search
@@ -22,7 +22,10 @@
|
||||
//! 规则来源(不猜:都是 core 安装管线自己的判据):
|
||||
//! - Fabric/Quilt 的 loader 列表从 `1.14` 起才有(core 走 fabric meta,1.13 及以前没有);
|
||||
//! - NeoForge 的第一个版本是 `1.20.1`(`maven::NEOFORGE_FORGE_LAYOUT_MC`);
|
||||
//! - Forge 从 `1.1` 起有正式构建;远古版(`rd-*` / `a*` / `b*`)与预览版在 maven 表里没有条目。
|
||||
//! - Forge 从 `1.1` 起有正式构建;远古版(`rd-*` / `a*` / `b*`)与预览版在 maven 表里没有条目;
|
||||
//! - LiteLoader 的官方版本表**实测只有 16 个原版版本**(`1.5.2` ~ `1.12.2`,2026-11 取
|
||||
//! `dl.liteloader.com/versions/versions.json`),1.13 起它就不再发版,所以这两头都按
|
||||
//! 「官方没有构建」拒掉(不去查列表)。
|
||||
|
||||
use unlucky_i18n::{Catalog, Key};
|
||||
use unlucky_presenter::dto::{LoaderKind, VersionKind};
|
||||
@@ -41,7 +44,7 @@ pub enum LoaderVersionsView {
|
||||
Failed(String),
|
||||
}
|
||||
|
||||
/// 页面侧的加载器词表:只列 GUI 真能装的五家(与 `dto::LoaderKind::wizard_choices` 同集)。
|
||||
/// 页面侧的加载器词表:只列 GUI 真能装的六家(与 `dto::LoaderKind::wizard_choices` 同集)。
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
|
||||
pub enum Loader {
|
||||
/// 原版(不装加载器)
|
||||
@@ -55,16 +58,19 @@ pub enum Loader {
|
||||
Fabric,
|
||||
/// Quilt
|
||||
Quilt,
|
||||
/// LiteLoader
|
||||
LiteLoader,
|
||||
}
|
||||
|
||||
impl Loader {
|
||||
/// 展示顺序(任务书的口径:原版 / Forge / NeoForge / Fabric / Quilt)。
|
||||
pub const ALL: [Loader; 5] = [
|
||||
/// 展示顺序(任务书的口径:原版 / Forge / NeoForge / Fabric / Quilt,LiteLoader 追加在末尾)。
|
||||
pub const ALL: [Loader; 6] = [
|
||||
Loader::Vanilla,
|
||||
Loader::Forge,
|
||||
Loader::NeoForge,
|
||||
Loader::Fabric,
|
||||
Loader::Quilt,
|
||||
Loader::LiteLoader,
|
||||
];
|
||||
|
||||
/// 对应的 presenter 词表(派 `AppCommand` 时用)。
|
||||
@@ -75,10 +81,11 @@ impl Loader {
|
||||
Loader::NeoForge => LoaderKind::NeoForge,
|
||||
Loader::Fabric => LoaderKind::Fabric,
|
||||
Loader::Quilt => LoaderKind::Quilt,
|
||||
Loader::LiteLoader => LoaderKind::LiteLoader,
|
||||
}
|
||||
}
|
||||
|
||||
/// 从 presenter 词表回来(`OptiFine` / `LiteLoader` 不是本页选项)。
|
||||
/// 从 presenter 词表回来(`OptiFine` 不是本页选项:它没有安装管线)。
|
||||
pub const fn of(kind: LoaderKind) -> Option<Self> {
|
||||
match kind {
|
||||
LoaderKind::Vanilla => Some(Loader::Vanilla),
|
||||
@@ -86,7 +93,8 @@ impl Loader {
|
||||
LoaderKind::NeoForge => Some(Loader::NeoForge),
|
||||
LoaderKind::Fabric => Some(Loader::Fabric),
|
||||
LoaderKind::Quilt => Some(Loader::Quilt),
|
||||
LoaderKind::OptiFine | LoaderKind::LiteLoader => None,
|
||||
LoaderKind::LiteLoader => Some(Loader::LiteLoader),
|
||||
LoaderKind::OptiFine => None,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -102,6 +110,7 @@ impl Loader {
|
||||
Loader::NeoForge => "NeoForge",
|
||||
Loader::Fabric => "Fabric",
|
||||
Loader::Quilt => "Quilt",
|
||||
Loader::LiteLoader => "LiteLoader",
|
||||
}
|
||||
}
|
||||
|
||||
@@ -137,6 +146,12 @@ impl Loader {
|
||||
Some(_) => Err(Incompat::NeedsAtLeast("1.20.1")),
|
||||
None => Err(Incompat::Unsupported),
|
||||
},
|
||||
// LiteLoader 官方版本表只到 1.12.2(最老 1.5.2),两头都是「官方没有构建」。
|
||||
// 预览版/快照同样没有(那 16 个原版版本全是正式版)。
|
||||
Loader::LiteLoader => match rank {
|
||||
Some(version) if version >= (1, 5, 2) && version <= (1, 12, 2) => Ok(()),
|
||||
_ => Err(Incompat::Unsupported),
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -108,13 +108,33 @@ fn loader_support_matrix_is_explicit() {
|
||||
Loader::Forge.supports("24w14a", VersionKind::Snapshot),
|
||||
Err(Incompat::Unsupported)
|
||||
);
|
||||
// 远古版:四家全都不支持
|
||||
// LiteLoader 的官方版本表只有 1.5.2 ~ 1.12.2(16 个原版版本),两头都按「没有构建」拒。
|
||||
for id in ["1.5.2", "1.7.10", "1.12.2"] {
|
||||
assert_eq!(
|
||||
Loader::LiteLoader.supports(id, VersionKind::Release),
|
||||
Ok(()),
|
||||
"{id} 官方的确有 LiteLoader"
|
||||
);
|
||||
}
|
||||
for id in ["1.4.7", "1.13", "1.20.1"] {
|
||||
assert_eq!(
|
||||
Loader::LiteLoader.supports(id, VersionKind::Release),
|
||||
Err(Incompat::Unsupported),
|
||||
"{id} 上游没有 LiteLoader 构建"
|
||||
);
|
||||
}
|
||||
assert_eq!(
|
||||
Loader::LiteLoader.supports("24w14a", VersionKind::Snapshot),
|
||||
Err(Incompat::Unsupported)
|
||||
);
|
||||
// 远古版:五家全都不支持
|
||||
let ancient = ("a1.2.6", VersionKind::Ancient(AncientKind::OldAlpha));
|
||||
for loader in [
|
||||
Loader::Fabric,
|
||||
Loader::Quilt,
|
||||
Loader::Forge,
|
||||
Loader::NeoForge,
|
||||
Loader::LiteLoader,
|
||||
] {
|
||||
assert_eq!(
|
||||
loader.supports(ancient.0, ancient.1),
|
||||
|
||||
@@ -47,14 +47,13 @@ use super::super::frame;
|
||||
use super::super::Message;
|
||||
use super::model::{Loader, LoaderVersionsView, OptionsView};
|
||||
|
||||
/// 五家加载器(一行放得下:实测五枚 chip 合计约 311 dp,正文列 424)。
|
||||
const LOADERS: [Loader; 5] = [
|
||||
Loader::Vanilla,
|
||||
Loader::Forge,
|
||||
Loader::NeoForge,
|
||||
Loader::Fabric,
|
||||
Loader::Quilt,
|
||||
];
|
||||
/// 加载器 chip 的顺序与集合**委派**给 [`Loader::ALL`](原版 / Forge / NeoForge / Fabric /
|
||||
/// Quilt / LiteLoader)。
|
||||
///
|
||||
/// 这里原先是手写的五枚常量——那是同一份清单的第三处副本(`dto::wizard_choices`、
|
||||
/// `Loader::ALL`、这里),M222 加 LiteLoader 时三处都要改,索性改成委派。
|
||||
/// ⚠️ **宽度需 D30 视觉复验**:五枚 chip 实测合计约 311 dp(正文列 424),第六枚(LiteLoader)
|
||||
/// 估算约 +50 dp,理论仍在一行内,但这是估算不是实测——本轮无构建槽位,未出浅/深色截图。
|
||||
|
||||
/// 菜单项高度 = 48(`MenuGeometry` 的项高)×2 行 + 上下留白 8×2 = 112。
|
||||
/// 这么算是为了避免「列表被截掉半行」——滚动区高度必须覆盖整行。
|
||||
@@ -146,7 +145,7 @@ fn loader_row<'a>(ui: &'a Ui, catalog: Catalog, options: &'a OptionsView) -> Ele
|
||||
let mut line = row![]
|
||||
.spacing(ui.space(Space::X1))
|
||||
.align_y(Alignment::Center);
|
||||
for loader in LOADERS.iter() {
|
||||
for loader in Loader::ALL.iter() {
|
||||
line = line.push(chip(
|
||||
ui,
|
||||
Chip::filter(
|
||||
|
||||
Reference in new issue
Block a user