ClientConfigurationHandler
客户端子类 + 资源重载监听
基本信息
| 属性 | 值 |
|---|---|
| 路径 | com.github.lunatrius.ingameinfo.handler.ClientConfigurationHandler |
| 行数 | 21(handler 包最短) |
| 父类 | ConfigurationHandler |
| 实现 | IResourceManagerReloadListener |
全文职责
public class ClientConfigurationHandler extends ConfigurationHandler implements IResourceManagerReloadListener {
public static final ClientConfigurationHandler INSTANCE = new ClientConfigurationHandler();
private ClientConfigurationHandler() { super(); }
@Override
public void onResourceManagerReload(IResourceManager p_110549_1_) {
InGameInfoCore.INSTANCE.setConfigFileWithLocale();
InGameInfoCore.INSTANCE.reloadConfig();
}
}
唯一方法 onResourceManagerReload
在资源包重载时重新定位并重载配置文件:
| 步骤 | 调用 | 作用 |
|---|---|---|
| 1 | setConfigFileWithLocale() |
无参版,用已存的 baseConfigFileName 重新做本地化查找 |
| 2 | reloadConfig() |
重新解析 |
⚠️ 步骤 1 走的是 InGameInfoCore 的
无参重载(:69-73),它只在 baseConfigFileName != null 时才动作。
所以若从未成功加载过配置文件(baseConfigFileName 为 null),
资源重载时什么都不做。
⚠️ 本方法不重读 Forge 配置(loadConfiguration())。
资源包重载(如切换资源包、进入世界触发)与本 mod 的 cfg 文件无关,
所以不重读是对的。
为什么是 static INSTANCE
ClientProxy 把同一个实例
注册到两个不同的总线(:53 和 :56-57):
| 总线 | 注册位置 | 监听的事件 |
|---|---|---|
FMLCommonHandler.instance().bus() |
:53 |
ConfigChangedEvent |
| 客户端资源管理器 | :56-57 |
IResourceManagerReloadListener |
因为 @SubscribeEvent 是按实例扫描注解方法的,
若两处各 new 一个实例,就会注册两个监听器;
用单例则各一个。
⚠️ 父类 ConfigurationHandler 也有
public static final ConfigurationHandler INSTANCE,
两个类各有一个同名但不同类型的 INSTANCE ——
ConfigurationHandler.INSTANCE 是基类类型,
ClientConfigurationHandler.INSTANCE 是子类类型。
实际只有后者被注册使用,前者是死字段。
父类的 protected 构造器
ClientConfigurationHandler 的私有构造器调 super(),
而父类构造器是 protected ConfigurationHandler() {}(:49)——
空实现。所以「单例」是靠两个私有/protected 构造器保证的。
相关
- ConfigurationHandler - 父类,7 项配置与 9 项偏移
- ClientProxy - 两处注册的调用方
- InGameInfoCore - 被本类驱动的两个方法