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 上。

相关条目