左键拖拽(手持物品)

基本信息

属性 值
配置字段 MTConfig.LMBTweakWithItem
类型 boolean
默认值 true(MTConfig.java 字段初始值)
实现方法 yalter.mousetweaks.handlers.ClickHandler#handleLMBTweak(stackOnMouse != null 分支)
触发按键 鼠标左键(Mouse.isButtonDown(0)),可选叠加 Shift

功能

鼠标上已经拿着物品时,按住左键划过其它栏位,Mouse Tweaks 会自动把同类型物品 合并进来(或整体移走),省去逐格点击。

命中条件:

  1. MTConfig.LMBTweakWithItem == true;
  2. 鼠标上拿着物品(stackOnMouse != null);
  3. 鼠标没有移出栏位区(selectedSlot != null);
  4. 目标栏位有物品(targetStack != null)且与鼠标上的物品 areStacksCompatible (isItemEqual + areItemStackTagsEqual,NBT 必须一致)。

两条分支

分支 A:按住 Shift —— 整体快速移动

if (shiftIsDown) {
    if (!isCraftingOutput) {
        context.clickSlot(currentScreen, selectedSlot, 0, true);
    }
}

对每个经过的栏位发一次「鼠标键 0、Shift 置位」的点击,也就是原版 shift-click 的语义 (把整堆一次性送进另一个背包)。合成产物栏位会被跳过,避免在产物栏上重复触发合成。

分支 B:不按 Shift —— 逐个合并

if (asGuiContainer(currentScreen).field_147007_t == false          // 正在拆分拖拽
        && (count(stackOnMouse) + count(targetStack)) <= maxStackSize(stackOnMouse)) {
    context.clickSlot(currentScreen, selectedSlot, 0, false);
    if (!isCraftingOutput) {
        context.clickSlot(currentScreen, selectedSlot, 0, false);
    }
}

对经过的栏位连发两次左键点击,从而把鼠标上的物品整堆并入目标栏位。三重前置条件:

条件 含义
field_147007_t == false 原版没有处于「拆分拖拽」(dragSplitting)状态;该字段经 访问转换器 提升为 public 才可读
count(mouse) + count(target) <= maxStackSize(mouse) 两堆合并后不会溢出该物品的最大堆叠数,溢出时本 mod 不介入,交回原版处理
!isCraftingOutput 第二次点击只在非产物栏位执行;产物栏位只会被点一次

注意堆叠上限取的是 getMaxItemStackSize(stackOnMouse)(鼠标上那堆的最大堆叠), 不是目标栏位那堆的。

相关条目