Inventory Management

Inventory Management

点击按钮即可排序和转移物品。

Inventory Management

Modrinth Downloads CurseForge Downloads GitHub Repo stars

Support me on Ko-fi

只需点击按钮即可整理和转移物品,以及更多功能。Inventory Management 在你的物品栏和容器中添加了按钮,让你可以整理、转移和自动堆叠物品,此外还有一些实用小工具,让你的物品栏始终保持你想要的状态。在单人游戏中,只需在客户端安装即可使用;在多人游戏中,则需要在客户端服务端同时安装。

功能概览:

  • 整理 单击即可按字母顺序或创造模式物品栏顺序整理任何容器或你的物品栏。
  • 全部转移 单击即可将一个物品栏中的所有物品倾倒到另一个物品栏(全部放入或全部取出)。
  • 自动堆叠 将物品堆叠到容器中已有的匹配堆叠中,而不会干扰其他物品。
  • 锁定槽位 使用 Ctrl/Cmd+点击来保护槽位,整理、转移和堆叠操作都会跳过这些槽位。
  • 快捷栏交换 按住一个键并滚动鼠标滚轮,即可将主物品栏的一整行物品即时交换到快捷栏。
  • 物品耐久度 当装备耐久度不足时发出提醒,并可选择在工具即将损坏前自动替换。
  • 智能物品分组 整理时将变体家族(所有羊毛颜色、所有木板等)保持在一起。

每个功能都可以在配置中独立开关,因此你可以只运行需要的部分。


配置

你可以通过配置文件夹中的 inventorymanagement.toml 文件来配置模组的行为。如果你安装了 ModMenu,还可以通过 ModMenu 模组列表中的界面访问配置,悬停每个选项时都会显示描述提示。

常规

modEnabled: true|false(默认 true)- 模组的总开关。关闭后,不显示任何按钮,也不运行任何功能。

快捷栏交换(位于 hotbarSwap 部分)

hotbarSwap.enableHotbarSwap: true|false(默认 true)- 快捷栏交换的总开关。关闭后,快捷栏交换(按住) 按键绑定将不起作用(滚动鼠标滚轮和数字键不再交换行),并且交换行徽章将被隐藏。请参阅下方的快捷栏交换部分。

hotbarSwap.hotbarSwapNumberKeys: true|false(默认 true)- 在按住 快捷栏交换(按住) 按键绑定时,允许数字键 1-3 选择要交换到快捷栏的主物品栏行(再次按下当前活动行的数字键可交换回来)。默认开启;关闭后,即使按住该键,数字键仍会更改你选中的快捷栏槽位。按住该键时滚动鼠标滚轮始终有效。

物品耐久度(位于 durability 部分)

durability.durabilityAlertEnabled: true|false(默认 true)- 当工具或已装备物品的耐久度低于阈值时,在动作栏显示低耐久度提醒(并伴有铁砧“叮”声)。纯客户端功能:它读取已同步到你的耐久度数据,因此可在任何服务器上运行,即使是原版服务器。请参阅下方的物品耐久度部分。

durability.durabilityAlertThreshold1: <整数>(默认 10)- 触发提醒的第一个耐久度百分比阈值(0-99),当耐久度向下穿过该阈值时触发一次。设置为 0 可跳过此阈值。

durability.durabilityAlertThreshold2: <整数>(默认 5)- 触发提醒的第二个耐久度百分比阈值(0-99),当耐久度向下穿过该阈值时触发一次。设置为 0 可跳过此阈值。

durability.durabilityAlertAtOne: true|false(默认 true)- 除了百分比阈值外,在耐久度恰好剩余 1 点时也触发提醒。

durability.durabilityAlertSound: true|false(默认 true)- 提醒时播放铁砧叮声。动作栏消息始终显示。

durability.durabilityAutoReplace: true|false(默认 false)- 在手持或穿戴的物品即将损坏前,从你的物品栏中交换一个匹配的替代品。客户端驱动:你的客户端检测到即将损坏并请求交换,因此在多人游戏中模组必须安装在服务端(不会同步任何设置)。

durability.durabilityAutoReplaceSimilar: true|false(默认 false)- 将自动替换的匹配规则从严格(相同物品 + 附魔)放宽为相似(相同类别,忽略材质/附魔):任何滑翔翼替换滑翔翼,任何物品替换相同护甲槽位的物品,任何共享损坏工具的工具标签(#minecraft:pickaxesaxesshovelshoesswords)的物品。

整理/转移(位于 sorting 部分)

sorting.showSort: true|false(默认 true)- 是否显示整理按钮。

sorting.showTransfer: true|false(默认 true)- 是否显示全部转移(放入/取出)按钮。

sorting.showStack: true|false(默认 true)- 是否显示自动堆叠按钮。

sorting.sortMode: "alphabetical"|"creative"(默认 "alphabetical")- 整理时物品的排序方式。alphabetical 按物品名称排序;creative 使用创造模式物品栏顺序。

sorting.containersFirst: true|false(默认 false)- 将容纳物品的物品(潜影盒、收纳袋等)放在其他物品之前。仅在 alphabetical 模式下适用。

sorting.defaultPosition: "(<整数>,<整数>)" - 自定义按钮位置的默认值。

sorting.screenPositions: {"ID": "(<整数>,<整数>)"} - 按屏幕自定义按钮位置。虽然可以在配置文件中手动修改,但推荐通过配置界面进行修改。请参阅下文!

sorting.enableSlotLocking: true|false(默认 true)- 锁定玩家物品栏槽位的总开关。关闭后,Ctrl/Cmd+点击不再锁定槽位,不绘制标记或提示,整理、自动堆叠和转移也不会跳过锁定槽位。已锁定的槽位会被记住,以便你重新开启时恢复。请参阅下方的锁定槽位部分。

sorting.lockedSlotDisplay: "shown"|"hidden"|"hotkey"(默认 "shown")- 何时在锁定槽位上绘制标记(边框 + 变暗的背景)。shown 始终绘制;hidden 从不绘制;hotkey 仅在按住 查看锁定槽位 按键绑定时绘制。锁定本身(Ctrl/Cmd+点击)和悬停提示不受影响。

lockedPlayerSlots / sorting.serverLockedPlayerSlots:(默认空)- 锁定的玩家主物品栏槽位索引,按世界记住。在单人游戏中,它们保存在该存档自己的配置文件中(<存档>/config/inventorymanagement.toml)的 lockedPlayerSlots 下,因此会随存档一起移动;在多人游戏服务器上,它们保存在你的全局配置中的 sorting.serverLockedPlayerSlots 下,这是一个按服务器地址索引的表。无论哪种方式,它们都由你在游戏中通过 Ctrl/Cmd+点击槽位来管理(无 GUI 控制),但如果你需要检查或清除它们,它们会存在于配置文件中。

整理分组(位于 grouping 部分)

grouping.itemGrouping: true|false(默认 true)- 变体分组的总开关:将相关的物品家族(所有羊毛颜色、所有木板等)聚集在一起,而不是纯粹按名称对每个变体进行排序。请参阅下方的物品分组部分。

grouping.dynamicGroups: true|false(默认 true)- 数据包定义的分组家族的总开关(请参阅下方的数据包分组标签部分)。

grouping.disabledDynamicGroups: ["<标签 id>", ...](默认空)- 单独禁用的数据包分组家族,按完整标签 id。在配置文件中管理(无 GUI 控制)。

grouping.<family>: true|false(默认 true)- 每个内置变体家族一个开关;关闭一个,该家族将按普通名称排序而不是聚集在一起。家族:woolwool_carpetsbedscandlesbannersshulker_boxesdyesterracottaglazed_terracottaconcreteconcrete_powderstained_glassstained_glass_paneplankswooden_slabswooden_stairswooden_doorswooden_trapdoorswooden_fencesfence_gatessignshanging_signsleavessaplingsboatsspawn_eggspottery_sherdshorse_armorcoral

修改按钮位置

为了与其他模组保持兼容,你现在可以调整库存管理按钮的位置!要调整所有按钮的位置,请查看配置中 sorting.defaultPosition 的选项,或者如果你安装了 ModMenu,可以在配置界面中调整。如果你有某个特定界面需要调整(例如其他模组增加了更多物品栏空间),你可以按住 Ctrl/Cmd 并点击其中一个界面按钮,打开按屏幕位置编辑器!该编辑器仅调整当前屏幕的按钮位置,因此你可以随意调整位置,使其与你的炫酷背包模组界面完美对齐!;)

编辑器打开后,只需用鼠标点击并拖动按钮 即可将它们滑到合适位置,按钮会与光标一一对应。追求精确?方向键仍可以逐像素微调(按住 Shift 可更大步长移动),Ctrl/Cmd+R 可重置为默认位置。相同的拖放操作也适用于配置界面中的 defaultPosition 编辑器。

Ctrl/Cmd+点击是主要进入方式,但也有专门的按键绑定来打开编辑器(一个用于玩家物品栏按钮,一个用于容器按钮)。Inventory Management 的所有按键绑定默认都是未绑定的。 如果你想使用它们,请在选项、控制、Inventory Management 类别下分配按键。


整理

所有容器(足够大的)和你的物品栏中现在都会出现一个整理按钮。点击此按钮将自动整理物品栏!大多数情况下,这是按字母顺序排序,有少数手动输入的例外。整理会忽略你的快捷栏,因此你不必担心它会弄乱你的主要物品!

之前

之后

全部转移

全部放入/取出按钮将一个物品栏中的全部物品转移到另一个物品栏!它从左上角槽位开始,逐个处理物品,直到另一个物品栏装满。与整理类似,此机制会忽略你的快捷栏(和已装备物品)。

自动堆叠

与全部转移按钮类似,也会有按钮用于向容器堆叠或从容器的堆叠中取出。点击此按钮后,将源物品栏中的所有物品堆叠到另一个物品栏中任何未满的堆叠中,只转移填满堆叠所需的物品!

之前

之后

锁定槽位

有没有一个你永远不想被打扰的槽位,比如你的备用方块、食物,或者那组你习惯放在同一位置的东西?锁定它。 按住 Ctrl/Cmd 并点击主物品栏中的任何槽位即可切换锁定。锁定槽位会被 整理自动堆叠全部转移(放入/取出) 跳过,因此这些操作永远不会移动、重新排序或从锁定槽位中取出物品。锁定和解锁使用相同的 Ctrl/Cmd+点击操作,并且鼠标左键或右键均可。

只有主物品栏网格可以锁定。你的快捷栏、护甲、副手以及任何打开的容器的槽位不可锁定(无论如何,所有操作都已经忽略快捷栏)。锁定状态按世界记住:每个单人存档和每个多人服务器都保留自己的一套(单人存档的锁定甚至会保存在存档文件夹内),并且跨会话保留。空的锁定槽位保持保留状态,因此转移不会填满它。

默认情况下,锁定槽位会以物品下方微暗的背景和边框标记,悬停时显示 已锁定(Ctrl+点击解锁) 提示。不喜欢标记?lockedSlotDisplay 配置选项允许你将它们设置为 始终显示(默认)、隐藏按住热键时显示。最后一种模式仅在按住 查看锁定槽位 按键绑定时绘制标记,让你的物品栏保持整洁,直到你想检查哪些已锁定。悬停提示始终显示,因此锁定槽位永远不会成为谜。

提示: 与所有 Inventory Management 的按键绑定一样,查看锁定槽位 默认未绑定。如果你想使用 hotkey 显示模式,请在选项、控制、Inventory Management 类别下分配它。


快捷栏交换

想在不打开物品栏的情况下,在拇指可及的范围内拥有第二(或第三)条物品栏?按住交换键并滚动鼠标滚轮。 每次滚动都会循环切换你的三个主物品栏行与快捷栏交换,从正常到第 1 行、第 2 行、第 3 行,再回到正常,循环往复。物品会物理交换位置,因此快捷栏上的物品会落到该行,反之亦然。一次只会移动一行,滚动回正常状态会将所有物品复位。

喜欢按键而不是滚动?通过 hotbarSwapNumberKeys 选项(默认开启),在按住交换键时,数字键 1-3 可直接跳转到该行;再次按下活动行的数字键可交换回正常状态。在按住交换键时,数字键不会更改你选中的快捷栏槽位,因此 4-9 会被忽略。如果你希望数字键即使在按住交换键时也始终正常运作,可以关闭此选项。

一个小标记显示当前活动行:在物品栏/容器界面中,交换行的左侧会出现一个彩色标签;在游戏 HUD 上,快捷栏左侧会出现一个带有行号(1-3)的不显眼徽章。

在幕后,每次交换都会将一行的九个槽位与快捷栏的九个槽位逐槽交换,其中第 1 行是主网格的顶部,第 3 行是靠近快捷栏的行。移动通过数据包在服务端进行,与整理按钮相同,切换行时总是先将之前的行复位,然后再应用新行。服务端信任客户端对当前哪行被移出的视图,因此如果在交换行期间快捷栏内容发生变化(物品损坏、拾取物品落入、/give、其他模组),下一次交换可能会移动错误的槽位。在进行任何会打乱被移出快捷栏的操作之前,请先滚动回正常状态。

如果你不同步了,例如在交换中途退出游戏,请按下 重置快捷栏交换 按键绑定。它会将模组的跟踪清除回“正常”状态,不移动任何物品,以当前快捷栏上的实际物品为基准重新校准。

注意: 因为物品会物理交换位置(并且服务端会保存它们),如果在行被交换时退出,登录回来后这些物品会保持被移出状态,即使指示器显示“正常”。要恢复所有物品,请重新选择该行(滚动或数字键换回),然后再滚动回正常状态。

提示: 与所有 Inventory Management 的按键绑定一样,快捷栏交换(按住)重置快捷栏交换 默认都未绑定。请在选项、控制、Inventory Management 类别下分配它们以使用此功能。


物品耐久度

厌倦了因为没注意到工具即将损坏而失去来之不易的工具?物品耐久度 选项为你提供了两种独立的方式来照看你的装备。每个选项都在配置中单独开关;提醒默认开启,自动替换默认关闭。

低耐久度提醒。 当工具或已装备物品(包括鞘翅)的耐久度低于阈值时,你会收到一条动作栏消息,"<物品> 耐久度低!剩余 <剩余> 点,共 <最大> 点",并伴有铁砧“叮”声。它会监视你的主手、副手以及所有四个护甲槽,每当物品在下降过程中穿过阈值时触发一次,灵感来自 Vanilla Tweaks 的“Durability Ping”数据包。有两个可配置的百分比阈值(默认为 10%5%),以及一个单独的 剩余 1 点提醒 选项用于最后一刻。它纯客户端运行:读取已同步到你的耐久度数据,因此可在任何服务器上运行,即使是原版服务器。如果你只想要消息,可以使用 durabilityAlertSound 关闭声音,或者调整配置中的两个阈值滑块(将任一设置为 0 可跳过)。

损坏前自动替换。 在手持或穿戴的物品即将损坏前,模组会从你的物品栏中交换一个匹配的替代品。磨损的物品会回到替代品所在的槽位,因此你几乎不会错过任何动作,也不会在动作中丢失旧物品。默认情况下,匹配是严格的(相同物品,相同附魔),但 durabilityAutoReplaceSimilar 将其放宽为相似:任何滑翔翼替换滑翔翼,任何护甲片替换相同护甲槽位,或任何共享损坏工具类别的工具(镐、斧、锹、锄、剑)。它会扫描你的主物品栏和副手,并选择剩余耐久度最高的候选物品。由于它只是两个槽位的交换,因此永远不会重复或丢失物品。

有一点需要了解:自动替换在物品的最后一点耐久度时触发,因此一次性消耗超过一点耐久度的动作仍可能在替换发生之前损坏物品。提醒和快速手动替换仍然可以帮助你。

多人游戏。 自动替换是客户端驱动的:你的客户端已经能看到装备的耐久度,它检测到物品即将损坏,选择替代品,并请求服务端执行交换,就像整理和转移按钮一样。你的设置不会同步任何内容,请求携带服务端所需的一切。在多人游戏中,模组必须安装在服务端才能进行交换,服务端会验证并应用它。提醒是纯客户端功能,服务端不需要任何东西。

所有耐久度选项都位于配置的 durability 部分。


物品分组

itemGrouping 开启时(默认开启),字母顺序 整理会将相关物品家族聚集在一起,而不是按每个变体自己的名称分散排列,因此所有 16 种羊毛颜色会放在一起,所有木板类型也会放在一起,等等。每个内置家族都有自己的 grouping.<id> 开关(全部默认开启);关闭一个,则该家族仅按普通名称排序。

一个家族在排序结果中“落地”在其锚点的显示名称槽位处(对于颜色家族,锚点是白色变体,例如整个羊毛簇会排在白色羊毛应该在的位置)。内置家族列表请参阅上面的配置部分。

分组按 先匹配先得 的顺序进行:内置,然后是模组注册的分组,然后是数据包分组。内置始终优先考虑,因此模组或数据包添加的内容无法劫持原版家族。


对于模组与整合包开发者

Inventory Management 提供了一个小巧、与加载器无关 的 API(包 me.roundaround.inventorymanagement.api.sorting,不包含 Fabric/NeoForge/Forge 类型,因此一个调用即可在三种加载器上运行),以及一个数据包惯例,用于为整理功能贡献你自己的物品变体分组。变体分组将相关物品聚集在一起,使它们作为一个块进行排序。

分组注册表(供模组使用)

从你的模组初始化入口点调用 ItemVariantRegistry.registerModGroup(VariantGroup)。使用 VariantGroup 工厂构建分组:

工厂方法 使用场景
VariantGroup.by(tag) 成员是物品标签;锚点是标签的语言键
VariantGroup.by(rootItem, tag) 成员是物品标签;锚点是一个代表性物品
VariantGroup.by(anchorKey, tag) 成员是物品标签;锚点是一个显式翻译键
VariantGroup.byPredicate(pred, anchorDescId, enabled) 成员匹配谓词;锚点是一个描述 id
import me.roundaround.inventorymanagement.api.sorting.ItemVariantRegistry;
import me.roundaround.inventorymanagement.api.sorting.VariantGroup;

// 将所有宝石物品分组在一起,落在 Ruby 的显示名称槽位处。
ItemVariantRegistry.registerModGroup(
    VariantGroup.byPredicate(
        stack -> stack.is(MyItems.RUBY) || stack.is(MyItems.SAPPHIRE),
        MyItems.RUBY.getDescriptionId(),
        () -> true));

// 或者,对于一个锚定在代表性物品上的物品标签:
ItemVariantRegistry.registerModGroup(VariantGroup.by(MyItems.RED_CRYSTAL, MyTags.CRYSTALS));
  • 锚点:分组产生的第一个排序键;整个簇落在该物品/键的字母顺序槽位上,成员在其内部排序。
  • 排序:模组分组在所有内置之后数据包分组之前被考虑(因此它们永远不会遮蔽原版家族)。在模组之间,注册顺序决定重叠,因此注册一个窄谓词(或不相交的标签)以避免与其他模组争夺相同的物品。
  • 时机:在模组初始化入口点注册,第一次物品栏整理之前
  • 启用:模组分组默认始终开启。要为用户提供开关,请将 enabled BooleanSupplier 绑定到你自己的模组配置,并传递给工厂;Inventory Management 不会为模组注册的分组创建配置选项或 GUI 部分。
  • 不要 通过 ItemVariantRegistry.register(Identifier) 创建自己的注册表,期望整理功能读取它;只有 registerModGroup(...) 会被考虑。

比较器注册表(供模组使用)

为排序功能贡献一个原始的 Comparator<ItemStack> 排序。这不同于分组注册表:分组聚集相关物品;比较器贡献细化排序功能已经认为相等的物品之间的顺序。

这是决胜比较。 比较器注册表仅在用户的主要排序(字母/创造)和所有内置元数据比较器对一对物品都平局之后才被考虑。贡献永远不能重新排列主要或元数据键已经区分的物品;它只在其他看起来相同的堆叠之间细化顺序。任何优先级值,无论多低,都不能覆盖用户选择的排序。

SortComparatorRegistry 有两个入口点:

方法 使用场景
registerKey(id, priority, applies, key) 安全路径:你的比较器仅影响你的 applies 谓词接受的堆叠(两个操作数都必须匹配);其他一切返回 0 并继续。
register(id, priority, comparator) 原始/高级路径:一个完整的 Comparator<ItemStack>。你负责确保任何它无法识别的配对返回 0
import me.roundaround.inventorymanagement.api.sorting.SortComparatorRegistry;
import net.minecraft.resources.Identifier;

// 在看起来相同的弹药堆叠中,先放更满的堆叠。
SortComparatorRegistry.registerKey(
    Identifier.fromNamespaceAndPath("mymod", "ammo_by_fullness"),
    100,
    stack -> stack.is(MyItems.ARROW_QUIVER),
    stack -> -stack.getCount());   // 负值 => 数量更高的排序更靠前
  • 优先级数字越小 = 越先被考虑 = 越早赢得平局。注册表是第一个非零值获胜,因此具有最低优先级数字且对一对物品返回非零值的贡献决定结果。相同优先级按注册顺序决胜(先注册者获胜)。
  • 时机:在模组初始化入口点注册,第一次物品栏整理之前。注册表实时读取(每次整理都会看到当前注册),但在整理进行中注册不受支持。
  • 身份id 只是一个标签(用于诊断)。重新注册相同的 id 追加另一个贡献;它不会替换。
  • 启用:贡献始终开启。要为用户提供开关,请在你自己模组的谓词/比较器内使用配置来限制它;Inventory Management 不会为它们添加 GUI。

数据包分组标签(无需代码)

数据包(或附带数据的资源包)可以定义分组家族而无需代码:任何路径以 grouping/ 开头的物品标签都会自动成为一个家族。

  • 文件:data/<命名空间>/tags/item/grouping/<名称>.json
  • 标签 id:#<命名空间>:grouping/<名称>,例如 #mymod:grouping/gems
{
  "replace": false,
  "values": [
    "minecraft:diamond",
    "minecraft:emerald",
    "mymod:ruby"
  ]
}
  • 该簇锚定在标签的语言键处(例如 tag.item.mymod.grouping.gems)。将该键添加到你的包中的 en_us.json,为簇提供一个友好的落地名称;否则使用原始键。锚点在重载时保持稳定(当标签成员改变时不会移动)。
  • 重载感知:物品标签会同步到客户端,因此数据包家族集会在加入世界和 /reload 时重建。
  • 开关grouping.dynamicGroups 配置选项(默认开启)一次性控制所有数据包家族;grouping.disabledDynamicGroups(配置文件中的标签 id 列表)单独禁用。