registerConfig
基本信息
| 属性 | 值 |
|---|---|
| 入口类 | com.jadarstudios.developercapes.DevCapes |
| 获取单例 | DevCapes.getInstance() |
| 登记存储 | CapeConfigManager.getInstance().addConfig(id, config) |
| 客户端专属 | 必须在客户端代理的初始化阶段调用 |
单例
public static DevCapes getInstance() {
if (instance == null) instance = new DevCapes();
return instance;
}
构造 DevCapes 的唯一副作用是向 Forge 事件总线注册渲染处理器:
protected DevCapes() {
MinecraftForge.EVENT_BUS.register(new RenderEventHandler());
}
所以第一次调用 getInstance() 就完成了 渲染管线 的挂载。README 特别提醒:早期版本曾声称不必放进客户端代理,这条说明已被作者划掉并改为要求放回客户端代理。
4 个重载
| 签名 | 状态 | 说明 |
|---|---|---|
int registerConfig(String jsonURL, String identifier) |
@Deprecated |
直接忽略 identifier,转调 registerConfig(String) |
int registerConfig(String jsonUrl) |
现行 | 把字符串当 URL,捕获 MalformedURLException 后返回 -1 |
int registerConfig(URL url, String identifier) |
@Deprecated |
直接忽略 identifier,转调 registerConfig(URL) |
int registerConfig(URL jsonUrl) |
现行 | 核心实现 |
[!WARNING] 源码缺陷
DevCapes.java:75-89与DevCapes.java:109-122两处的 Javadoc 注释块写在了@Deprecated注解之后,Java 规范要求 Javadoc 必须紧邻声明(且在所有注解之前)。写成/** ... */之后再跟注解的顺序,会让该注释被当作普通块注释,不会挂到方法上,IDE 与 Javadoc 工具都读不到。
identifier 参数是 4.x 时代的残留:早期每个接入 mod 靠它把组隔离开,现在分组信息直接来自 JSON 里的组名,因此重载保留了形参但完全不读它。
核心流程(registerConfig(URL))
int id = -1;
InputStream is = this.getStreamForURL(jsonUrl);
if (is == null) {
DevCapes.logger.error(String.format("Unable to establish a connection to the server, %s", jsonUrl.getHost()));
return id;
}
CapeConfig config = CapeConfigManager.getInstance().parse(is);
try {
id = CapeConfigManager.getUniqueId();
CapeConfigManager.getInstance().addConfig(id, config);
} catch (CapeConfigManager.InvalidCapeConfigIdException e) {
e.printStackTrace();
}
silentClose(is);
return id;
| 步骤 | 行为 |
|---|---|
| 1 | getStreamForURL 打开连接,失败返回 null |
| 2 | null → ERROR 日志 + 返回 -1(不抛异常) |
| 3 | parse(is) 解析成 CapeConfig(见 披风配置 JSON) |
| 4 | getUniqueId() 取新 ID(从 1 起,见 UUID 身份模型) |
| 5 | addConfig 把 config 写进双向映射,并把 users / groups 分发给 UserManager / GroupManager |
| 6 | silentClose(is) 吞掉 IOException 关闭流 |
[!NOTE]
addConfig成功时返回正整数 ID;失败或无法连接时返回-1。接入方应以返回值判定成败,不要假设非负。
网络流获取
getStreamForURL 用 URL.openConnection() 并设置 User-Agent 为 JVM 版本字符串(System.getProperty("java.version")):
connection.setRequestProperty("User-Agent", System.getProperty("java.version"));
异常处理是 e.printStackTrace(),返回 null 而不抛出,因此调用方必须处理 null(如上)。
getStreamForFile(File) 是对应的本地文件版本,包内没有任何地方调用它——它是留给接入方直接取流的公开辅助方法。
[!WARNING] 每次
registerConfig都在主线程同步下载整个 JSON。配置不可达时连接会阻塞整个客户端;README 也因此说明配置必须放在能直连的服务器 / Dropbox / GitHub raw 上。