API 参考 / capability 包:服务、状态与游玩访问
ModServiceRegistry
跨模组命名服务注册表(进程级)。每个模组 jar 运行在独立 ClassLoader,无法在编译期互相引用对方的类型;模组把「对外读写的状态 / 参数」注册为命名服务,其它模组按全局 id 查询后用统一方法读写,无需编译期耦合。经 ctx.modServices() 获取。
方法速览
| 方法 | 用途 |
|---|---|
register(String, ModService) | 注册本模组对外暴露的服务 |
unregister(String) | 注销本模组的指定服务 |
find(String) | 按全局 id 查询任意模组的服务 |
完整签名
java
public interface ModServiceRegistry {
void register(String name, ModService service);
void unregister(String name);
ModService find(String globalId);
}register(String name, ModService service)
签名:
java
void register(String name, ModService service);行为:注册当前模组对外暴露的服务,全局 id 自动拼接为 "<本模组id>:<name>",模组无需手写前缀。
name为null、空串或含:时静默忽略(:会破坏全局 id 结构);service为null时静默忽略。- 同
<modId, name>重复注册由后注册者覆盖。 - 模组停用 / 注销时宿主自动移除该模组注册的全部服务,无需在
onUnload手动清理。 - 消费者若需保证查询时目标服务已注册,应在
Mod.loadOrder()中声明loadAfter目标模组 id。
示例:
java
ctx.modServices().register("background", myController); // 全局 id:mymod:backgroundunregister(String name)
签名:
java
void unregister(String name);行为:按模组内服务名注销本模组的服务,幂等;name 为 null 时无操作。只影响本模组名下该服务,不触碰其它模组。
示例:
java
ctx.modServices().unregister("background");find(String globalId)
签名:
java
ModService find(String globalId);行为:按全局 id("<modId>:<name>")查询服务;无该服务或 globalId 为 null 时返回 null。全局 id 对任意模组可见——既可查自己注册的服务,也可查其它模组的服务。
示例:
java
ModService svc = ctx.modServices().find("other_mod:background");
if (svc != null && svc.has("visible")) {
boolean visible = svc.boolValue("visible", true);
}线程:宿主实现的注册 / 注销以 synchronized 保护;find 为无锁直接读表。建议在 onInit 阶段解析并缓存服务引用;服务实例本身的线程安全由提供方负责。
稳定性:2.0 起冻结:2.x 内只增不破。