DummyCore 配置

DummyCore 自身的全局配置文件,位于存档 config/DummyCore.cfg,由 DummyConfig.load() 填充。

基本信息

属性 值
类型 特殊机制(配置文件)
文件路径 config/DummyCore.cfg
分组 全部配置项都在 GLOBAL 分组
实现类 DummyCore/Utils/DummyConfig.java
文件名来源 DummyCore/Core/Core.java:55 — new File(path, getModName(getIdForMod(c)) + ".cfg")

文件是在 preInit 阶段由 Core.registerModAbsolute() 间接创建的: CoreInitialiser.java:71 传入 e.getModConfigurationDirectory().getAbsolutePath(), Core.java:56-58 发现文件不存在就 createNewFile() 并立刻 save() 一次,随后 Core.java:160 再次 load() 并回调 DummyConfig.load(config)。

配置项

配置键 类型 默认值 取值范围 作用
removeMissingTexturesErrors boolean true — 把 TextureMap 这个 logger 的等级设为 OFF,屏蔽缺失材质报错
enableNotifierLogging boolean true — 开启 Notifier 的消息输出
shouldChangeImageInCreativeTabs boolean true — 创造模式物品栏图标是否随时间轮换
mainMenuID int 0 0 ~ Integer.MAX_VALUE 当前使用的主菜单在 MainMenuRegistry.menuList 中的下标
hideSwitchMenuButton boolean false — 是否隐藏主菜单上的 “Change Main Menu” 按钮
syncTimer int 100 10 ~ 1000 服务端数据同步间隔,单位 tick

源码:DummyCore/Utils/DummyConfig.java:19-30。

各配置项细节

removeMissingTexturesErrors

实现于 DummyCore/Utils/NetProxy_Client.java:52-57(registerInit(),客户端侧):

Logger logger = LogManager.getLogger(TextureMap.class);
org.apache.logging.log4j.core.Logger log = (org.apache.logging.log4j.core.Logger) logger;
log.setLevel(Level.OFF);

两点值得注意:

  • 这里把 log4j 的接口 Logger 强转成 log4j core 实现 org.apache.logging.log4j.core.Logger。若运行环境中 log4j 绑定的不是 core 实现,该强转会抛 ClassCastException。
  • 关闭的是 TextureMap 这个全局 logger,会连带影响其他 mod 通过同名 logger 输出的材质相关日志,而不仅仅是 DummyCore 自己的。

syncTimer

实现于 DummyCore/Utils/DummyEventHandler.java:203-211:服务端每个 tick 的 Phase.END 累加 syncTime, 一旦 syncTime >= DummyConfig.dummyCoreSyncTimer 就清零并调用 SyncUtils.makeSync_LotsSmallPackets() 批量下发数据同步包。

源码自带的注释说明了取舍(DummyConfig.java:30):数值越大同步越差,但发出的数据包越少、服务器卡顿越轻。 默认 100 tick(5 秒)同步一次,最小 10 tick,最大 1000 tick(50 秒)。

源码缺陷:两个永不赋值的死字段

DummyCore/Utils/DummyConfig.java:7-8

public int MultiItemUID;
public int MultiBlockUID;

这两个 public int 实例字段没有出现在 load() 里,因此既不会被写进 .cfg、也永远保持 Java 默认值 0。 全仓库对这两个名字的引用只有上面两行声明本身,没有任何读取方:

$ grep -rn "MultiItemUID\|MultiBlockUID" src/main/java/
src/main/java/DummyCore/Utils/DummyConfig.java:7:    public int MultiItemUID;
src/main/java/DummyCore/Utils/DummyConfig.java:8:    public int MultiBlockUID;

这是遗留自旧版的 ID 分配方案残留(改用 Core 的 512 槽位制后已废弃),属于纯粹的死代码。

源码缺陷:每次打开主菜单都会重写配置文件

MainMenuRegistry.newMainMenu(int index) 在 MainMenuRegistry.java:54 调用 DummyConfig.setMainMenu(index),而 setMainMenu 的实现是 DummyCore/Utils/DummyConfig.java:33-38:

public static void setMainMenu(int i) {
    cfg.load();
    cfg.get("GLOBAL", "mainMenuID", 0, "").set(i);
    mainMenuID = i;
    cfg.save();
}

而 newMainMenu 会在每次主菜单 InitGuiEvent.Pre 时被调用 (DummyEventHandler.java:56),也就是说玩家每打开一次主菜单,都会完整地 load() 再 save() 一遍 DummyCore.cfg,即使 mainMenuID 的值根本没有变化。这属于不必要的磁盘 I/O,若存档期间崩溃还有写坏配置的风险。

相关条目