左键拖拽(手持物品)
基本信息
| 属性 | 值 |
|---|---|
| 配置字段 | MTConfig.LMBTweakWithItem |
| 类型 | boolean |
| 默认值 | true(MTConfig.java 字段初始值) |
| 实现方法 | yalter.mousetweaks.handlers.ClickHandler#handleLMBTweak(stackOnMouse != null 分支) |
| 触发按键 | 鼠标左键(Mouse.isButtonDown(0)),可选叠加 Shift |
功能
鼠标上已经拿着物品时,按住左键划过其它栏位,Mouse Tweaks 会自动把同类型物品 合并进来(或整体移走),省去逐格点击。
命中条件:
MTConfig.LMBTweakWithItem == true;- 鼠标上拿着物品(
stackOnMouse != null); - 鼠标没有移出栏位区(
selectedSlot != null); - 目标栏位有物品(
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)(鼠标上那堆的最大堆叠), 不是目标栏位那堆的。
相关条目
- 右键拖拽替换(RMBTweak) - 同一套兼容判定下的右键版本
- 左键拖拽(空手 Shift) - 同一个方法的
stackOnMouse == null分支 - 容器兼容性 -
isCraftingOutputSlot的判定来源 - 输入方案 - 左键 = 鼠标键 0,Shift 为硬编码检测