-
Notifications
You must be signed in to change notification settings - Fork 5
Addon Store
HoshinoYumeka edited this page Sep 7, 2026
·
1 revision
自定义应用商店来源。商店中的 App 不必来自 SPI 扫描——远程仓库、数据包或实现方自造的 App 均可。
com.november.mcphone.api.client.store.IAppSource
com.november.mcphone.api.client.store.AppInfo
| 项 | 值 |
|---|---|
| 端 | 仅客户端 |
| 注册 | SPI:META-INF/services/com.november.mcphone.api.client.store.IAppSource
|
| 起于 |
IAppSource 1.0.46 / AppInfo 1.2.12 |
注册后商店中多出一个分组。
| 方法 | 默认 | 说明 |
|---|---|---|
ResourceLocation getId() |
必须实现 | 来源唯一标识,形如 mymod:official_repo
|
Component getDisplayName() |
必须实现 | 商店分组标题上显示的名字 |
void listAvailable(Consumer<List<AppInfo>> callback) |
必须实现 | 列出尚未安装的 App |
void install(AppInfo info, Consumer<IPhoneApp> onSuccess, Consumer<Component> onError) |
必须实现 | 让该 App 真正可用 |
boolean isReady() |
true |
false 时商店把该来源标记为不可用(离线、未登录、加载中) |
列出此来源当前可安装的 App,只返回尚未安装的。
info 来自本来源的 listAvailable。实现方负责让该 App 真正可用,随后:
-
onSuccess交出可用的IPhoneApp实例; -
onError交出一条可直接展示给玩家的错误信息。
listAvailable 与 install 可以在后台线程工作,但回调必须切回客户端主线程——回调中会接触注册表与 GUI 状态:
Minecraft.getInstance().execute(() -> callback.accept(list));商店列表中的一条元数据。只含可序列化字段、不引用实现类,因此远程来源可以在尚无实例时先列出 App。
它是一个 final class,构造函数私有,对外只给 builder —— 按兼容承诺第二条,将来新增字段不会打断已有附属。
| 访问器 | 类型 | 缺省 |
|---|---|---|
id() |
ResourceLocation |
必填,与 IPhoneApp.getId() 对应 |
displayName() |
Component |
必填 |
sourceId() |
ResourceLocation |
必填,见 IAppSource.getId()
|
iconTexture() |
ResourceLocation |
null(远程来源列出的 App 本地还没有贴图;商店画占位方块) |
version() |
String |
"",不是 null
|
author() |
String |
"",不是 null
|
description() |
String |
"",不是 null
|
三个 String 字段的 setter 会把传入的 null 归一化成空串。
AppInfo info = AppInfo.builder(id, displayName, sourceId)
.icon(iconTexture)
.version("1.0.0")
.author("作者名")
.description("一句话简介")
.build();已有 IPhoneApp 实例时(本地来源):
AppInfo info = AppInfo.of(app, sourceId);of 会依次读取该实例的 getId / getDisplayName / getIconTexture / getVersion / getAuthor / getDescription。
of刻意不捕获第三方 App 抛出的异常:调用方已在 SPI 的兜底范围内,在此再兜会吞掉"是哪一个 App 有问题"这一信息。