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,若存档期间崩溃还有写坏配置的风险。
相关条目
- 主菜单替换系统 —
mainMenuID与hideSwitchMenuButton的作用对象 - 创造模式物品栏图标轮换 —
shouldChangeImageInCreativeTabs的作用对象 - /DummyCore.Transfer 指令 — 同一份配置所属 mod 的另一项玩家可见功能