自动切换工具

自动切换工具

执行操作时自动切换工具。

client Fabric API

AutoSwitch 是一个适用于 Fabric 和 NeoForge 的 Minecraft 模组,可在攻击或与方块、实体交互时自动将当前工具切换为正确的工具——你攻击石头方块时,它会切换到镐,然后当你打到烦人的砂砾区域时,它会切换到锹。选择哪种工具以及何时选择都是可配置的,会考虑工具当前的附魔、目标的 blockstate 或实体的装备等信息。

AutoSwitch 使用 HOCON 配置文件 autoswitch.conf,位于资源包文件夹旁边的 config 文件夹中。快速前往该位置的方法是:选项 > 资源包 > 向上导航一个文件夹。

该模组可以在游戏中通过按 R(默认)来开关。


配置

本节仅适用于 AutoSwitch 12+。早期版本使用了不同的配置格式。

配置文件中有四个部分——三个用于定义各种动作发生时的选择器和目标,一个用于通用功能配置:

  • attack-action - 用于攻击(实体或方块)时的规则。
  • interact-action - 用于交互(右键点击实体或方块)时的规则。
  • stat-change-action - 由 stat 事件触发的规则(例如不死图腾激活,仅在单人游戏中有效)。
  • feature-config - 控制模组的整体行为。

每条规则包含:

  • priority - 整数;当多个目标匹配时,数值更高的优先。
  • target - 一个 IdSelector,类型为 BLOCK、ENTITY、STAT,或一个 EXPRESSION(允许组合其他目标)。
  • tools - 有序的 IdSelector 或 ITEM 类型的 EXPRESSION 数组,表示要切换到的工具,或为空列表(禁用该目标的切换)。

IdSelector 可以引用标签或特定的显式 ID(#minecraft:stone、minecraft:ender_chest)。它们有一个可选的 data 字段,允许匹配特定物品附魔或 blockstate 等内容。 player 数据字段可以应用于任何类型的选择器,允许根据玩家状况进行匹配,例如他们是否蹲下或与目标的特定距离。

EXPRESSION 可以有任意多的元素或任意深度,提供极大的控制能力。 默认配置涵盖了广泛的情况,应作为扩展的良好基础。

实时编辑

只需在游戏运行时重新保存配置文件,它就会自动重新加载。

配置详情

表达式

表达式可以嵌套到你想要的任意深度。

表达式支持以下操作:

  • OR - 匹配其任意一个子项
  • AND - 匹配其所有子项
  • NOT - 不匹配其任何子项
  • XOR - 仅匹配其一个子项

数据

目前支持以下数据类型:

  • BlockState - 要匹配的方块状态
  • Component - 目前仅支持物品上的 POTION_CONTENTS
  • Enchantment - 物品拥有的附魔
  • EntityEquipment - 实体穿戴的装备,例如带鞍的猪
  • Player - 玩家的状况,例如是否潜行、是否拥有特定物品、是否骑乘某物,或与目标的特定距离。

选择优先级

首先,AutoSwitch 会检查目标是否有任何匹配,优先选择具有匹配工具的最高优先级匹配。 如果有多个相同优先级的匹配,它会开始查看配置的具体程度—— 例如,如果配置定义了目标 #minecraft:stone(一个标签)和 minecraft:stone(一个方块),且两者都匹配并具有相同优先级,它会优先选择非标签的 minecraft:stone 目标。如果该目标没有任何匹配的工具,那么它会查看标签目标指定的工具。如果指定了任何可选数据,这也会被认为使匹配更具体。指定的数据越多,匹配被认为越具体。

如果匹配的目标具有相同的优先级和具体程度,那么它将使用上下文感知的类型评级来优先选择。对于方块,它们的评级都相同,但附魔将基于附魔等级,或者对于攻击生物时的物品,将基于估计造成的伤害。指定的数据也可以有自己的评级(例如工具上的附魔)。类型的评级优先于数据评级。

一旦选择了目标,工具选择遵循与上述大致相同的过程。工具的优先级基于它在给定目标的工具列表中出现的位置越靠前,否则具体程度、类型评级和数据评级与目标相同。

如果此时没有首选工具,并且手持物品是这些并列工具之一,那么它将优先选择手持物品。否则,它将优先选择最靠左快捷栏槽位的并列工具。

基于文本的流程图
START: candidate inventory slots (all slots that matched a selector)
|
v
Compare Target Priority
|-- if different --> choose highest Target Priority --> END
|
v (same)
Compare Target Rating (levels 0..N)
For each level:
- compare: isGroup? (non-group preferred)
- compare: hasData? (with data preferred)
- compare: typeRating (higher wins)
- compare: dataRating (higher wins)
|-- if difference found --> choose winner --> END
|
v (no difference)
Compare Tool Priority
|-- if different --> choose highest Tool Priority --> END
|
v (same)
Compare Tool Rating (levels 0..N)
(same per-level rules as Target Rating)
|-- if difference found --> choose winner --> END
|
v (still tied)
Prefer currently selected slot?
|-- Yes --> choose currently selected --> END
|-- No  --> choose smallest (leftmost) slot --> END