滚轮物品数量缩放

基本信息

属性 值
配置字段 MTConfig.ScrollItemScaling
类型 int(带 @Config.RangeInt(min = 0, max = 1))
默认值 0(MTConfig.java 字段初始值)
取值 0 / 1
唯一读取点 WheelHandler.getNumItemsToMoveFromWheel
前置条件 目标系统没有加载 lwjgl3ify(Loader.isModLoaded("lwjgl3ify"))

全部取值

值 名称 一次滚轮刻度移动的物品数
0(默认) Multiple Wheel Clicks Move Multiple Items Math.abs(wheel) / 120(整数除法)
1 Always Move One Item (macOS Compatibility) 1

源码

private static int getNumItemsToMoveFromWheel(int wheel) {
    if (!ModCompatibility.isLwjgl3Loaded() && MTConfig.ScrollItemScaling == 0) {
        return Math.abs(wheel) / 120;
    }
    return 1;
}

换算表(值 0 且无 lwjgl3ify)

Math.abs(wheel) 移动数量
1 ~ 119 0
120 1
121 ~ 239 1
240 2
360 3
480 4

整数除法会把不足一格的余量直接截断,因此滚轮增量小于 120 时移动数量为 0, handleWheelTweak 随后会被外层 do { } while (numItemsToMove != 0) 判定为无事可做 (do-while 仍会执行一轮,但因 applicableSlot 判定与 numItemsToMove = 0 而不产生任何点击)。

lwjgl3ify 覆盖

ModCompatibility.initialize() 在启动时执行 Loader.isModLoaded("lwjgl3ify"), 结果存入静态 lwjgl3Loaded(日志中会打印 Detected lwjgl3!)。

一旦 lwjgl3ify 存在,getNumItemsToMoveFromWheel 无条件返回 1**, ScrollItemScaling被完全忽略——即使配成0` 也不会按 120 换算。

这是必要的:LWJGL3 的滚轮事件不再按「每格 120」投递,高精度触控板甚至可能投递 任意小数值,用 120 换算会导致一次微小滚动触发大量物品搬运。值 1 的注释 Always Move One Item (macOS Compatibility) 反映的是同一个问题—— macOS 触控板同样会投递非 120 的增量。

环境 ScrollItemScaling = 0 ScrollItemScaling = 1
无 lwjgl3ify abs(wheel) / 120 格 恒为 1
有 lwjgl3ify 恒为 1(配置被忽略) 恒为 1

数量如何被消耗

numItemsToMove 在 滚轮搬运 中被逐段消耗:

方向 消耗方式
推入 先 Math.min(n, count(光标栏位)) 封顶;每轮扣掉目标栏位实际吸收的数量
拉出 先扣除光标栏位可用容量,再扣除来源栏位实际取走的数量
产物栏位 连点 n 次取产物,仅第 1 个会被送走,然后 break(不进入多轮)

外层 do { ... } while (numItemsToMove != 0); 使得一次滚轮输入可以跨多个栏位连锁搬运, 直到数量耗尽或扫描不到可用栏位。

相关条目