滚轮方向语义

基本信息

属性 值
配置字段 MTConfig.WheelScrollDirection
类型 int(带 @Config.RangeInt(min = 0, max = 3))
默认值 0(MTConfig.java 字段初始值)
取值 0 / 1 / 2 / 3
唯一读取点 WheelHandler.shouldPushItems

全部取值

值 名称 推入(从光标栏位 → 另一侧) 拉出(从另一侧 → 光标栏位)
0(默认) Down to Push, Up to Pull 滚轮向下 滚轮向上
1 Up to Push, Down to Pull 滚轮向上 滚轮向下
2 Inventory Position Aware 取决于光标所在区域,见下 见下
3 Inventory Position Aware, Inverted 2 的全部行为取反 2 的全部行为取反

判定算法

boolean pushItems = (wheel < 0);                                      // 基准:滚轮向下 = 推入
if ((dir == 2 || dir == 3) && otherInventoryIsAbove(selectedSlot, context.getContainerSlots())) {
    pushItems = !pushItems;                                           // 位置感知:先按区域取反
}
if (dir == 1 || dir == 3) {
    pushItems = !pushItems;                                           // 反向档:再取反一次
}
return pushItems;

wheel 取自 Mouse.getDWheel(),负值表示向下滚(wheel < 0)。 注意 2 / 3 会连着取反两次(先按区域、再按反向档),因此值 3 在 「另一背包在上方」和「另一背包在下方」两种布局下都会得到与 2 相反的结果—— 这与 README 里对 3 的描述(把 2 的两条规则都反过来)一致。

值 2 / 3 的区域判定(otherInventoryIsAbove)

判定「另一个背包是否位于光标栏位的上方」:

  1. selectedIsInPlayerInventory = 光标栏位所属的 IInventory 是否为 mc.thePlayer.inventory (即光标是否在玩家自己的背包里);
  2. 遍历容器全部栏位,凡是与光标栏位归属不同(一个在玩家背包、一个不在)的栏位, 按 yDisplayPosition 统计:y < 光标栏位 y 计入 otherInventorySlotsAbove, 否则(>=,含同一行)计入 otherInventorySlotsBelow;
  3. 返回 otherInventorySlotsAbove > otherInventorySlotsBelow。

即「另一个背包里位于光标上方的格子比位于下方的多」就认为另一背包在上方。 源码注释强调该逻辑必须与「哪边算另一个背包」的其它判定保持一致, 因此 滚轮搬运 的搜索区间也用同一套 slotCount - 36 划分。

各值下的实际行为表

假设「另一背包」指机器/箱子一侧(栏位下标 [0, slotCount-36)), 玩家背包为 [slotCount-36, slotCount):

值 光标位置 滚轮向上 滚轮向下
0 任意 拉出(取货) 推入(送货)
1 任意 推入 拉出
2 玩家背包(下方) 另一背包在上方 → 取反 → 推入 拉出
2 机器/箱子(上方) otherInventoryIsAbove 为 true → 取反 → 拉出 推入
2 机器/箱子,但同区域内上方格更多 → 仍视为 true 拉出 推入
3 玩家背包 拉出 推入
3 机器/箱子(上方) 推入 拉出

简言之,值 2 的效果是「滚轮方向始终远离光标所在区域、朝另一侧操作」: 光标在上半区就向下滚推入,光标在下半区就向上滚推入——无论哪边是上、哪边是下都一致。

与其它选项的关系

选项 关系
滚轮搜索顺序 pushItems 决定走正序还是倒序扫描分支;pushItems == true 时本选项无效
滚轮物品数量缩放 无关,只影响数量
滚轮搬运 pushItems 决定 slotTo / slotFrom 的方向以及空栏位是否可作目标

已知文档不一致

本仓库 README.md 对值 3 的第二条描述把光标在玩家背包时写成了 「scroll up to pull / scroll down to push」,其中第二行与值 2 完全相同 (照抄未改),应为 pull。本页表格以 WheelHandler.shouldPushItems 的实际算法为准。

相关条目