配置文件系统

基本信息

属性 值
配置类 yalter.mousetweaks.config.MTConfig
框架 GTNHLib(com.gtnewhorizon.gtnhlib.config.Config 注解)
modid MouseTweaks
配置文件 config/MouseTweaks.cfg
配置界面类 yalter.mousetweaks.config.MTGuiConfig(继承 SimpleGuiConfig)
界面工厂 yalter.mousetweaks.config.MTGuiConfigFactory(@Mod.guiFactory)
选项总数 7(4 个 boolean + 3 个 int)

功能

本 mod 是一个纯客户端、纯配置驱动的工具 mod,没有任何方块 / 物品 / 实体 / 热键注册。 它的全部行为都由 MTConfig 里的 7 个静态字段控制,配置文件通过 GTNHLib 的 ConfigurationManager 自动注册与读写。

@Mod 注解声明了 guiFactory,因此在 Minecraft 模组列表中点击「配置」即可打开 MTGuiConfig 界面(标题为 Mouse Tweaks),所有带注解注释的选项都会在界面上直接编辑。

全部配置选项

字段名 类型 默认值 取值范围 作用
RMBTweak boolean true true / false 替换原版右键拖拽机制
LMBTweakWithItem boolean true true / false 手上拿着物品时的左键拖拽
LMBTweakWithoutItem boolean true true / false 手上没有物品时的 Shift+左键拖拽
WheelTweak boolean true true / false 滚轮快速跨栏位搬运物品
WheelSearchOrder int 1 @RangeInt(min = 0, max = 1) 滚轮搜索目标栏位的方向
WheelScrollDirection int 0 @RangeInt(min = 0, max = 3) 滚轮「推入 / 拉出」的方向语义
ScrollItemScaling int 0 @RangeInt(min = 0, max = 1) 一格滚轮刻度对应几个物品

上表所有默认值均取自 MTConfig.java 中字段的字段初始值(例如 public static boolean RMBTweak = true;), 不是从 README 反推的。

加载与生命周期

MouseTweaksForge 中只有客户端分支会执行配置与初始化逻辑:

阶段 事件 行为
preinit FMLPreInitializationEvent 仅客户端:调用 Config.handleOldConfig(event.getSuggestedConfigurationFile()) 处理旧配置,然后 ConfigurationManager.registerConfig(MTConfig.class);ConfigException 会被包成 RuntimeException 抛出
init FMLInitializationEvent 仅客户端:Main.initialise(),随后把自身注册到 FML 事件总线
运行期 TickEvent.RenderTickEvent phase == START 时调用 Main.onUpdateInGame();END 阶段不做任何事

旧配置迁移(Config.handleOldConfig)

这是从旧版 Mouse Tweaks 迁移到 GTNHLib 配置体系时的一次性清理:

  1. 目标文件不存在 → 直接返回,不做任何事;
  2. 存在 → 逐行读取,若没有任何一行包含 general 这个子串, 就 delete() 删除该文件;
  3. 删除失败才会打出 warn 日志(Failed to delete outdated config file {});
  4. 读取过程抛 IOException 则打 error 日志。

也就是说:凡是不含 general 段的残留配置都视为过期格式并被删除,删除后 GTNHLib 会按 MTConfig 的字段默认值重新生成新配置文件。玩家的实际选项设置不会被继承。

访问转换器(Access Transformer)

src/main/resources/META-INF/mousetweaks_at.cfg 把 3 个原版 GuiContainer 成员提升为 public, 这是本 mod 关闭原版右键拖拽的前置条件:

public net.minecraft.client.gui.inventory.GuiContainer field_146995_H
public net.minecraft.client.gui.inventory.GuiContainer field_147007_t

public net.minecraft.client.gui.inventory.GuiContainer func_146981_a(Lnet/minecraft/inventory/Slot;II)Z #isMouseOverSlot
  • 前两个是 DeobfuscationLayer.disableVanillaRMBDrag() 用来写 true / false 的两个状态字段 (源码在 ClickHandler 中以 field_147007_t == false // dragSplitting 的形式读取其中一个);
  • func_146981_a 即 isMouseOverSlot,被提升后 getSelectedSlot() 才能逐槽位调用它来定位鼠标下的栏位。

⚠️ 本 mod 依赖混淆字段名 field_146995_H / field_147007_t,因此只能运行在 1.7.10(acceptedMinecraftVersions = "[1.7.10]"), 换版本需要重新对照映射。

相关条目