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 构造器保证的。

相关