Inventory Management

Inventory Management

一键整理并转移物品。

Inventory Management

Modrinth Downloads CurseForge Downloads GitHub Repo stars

Support me on Ko-fi

只需点击按钮即可整理和转移物品,还有更多功能。Inventory Management 为你的物品栏和容器添加了按钮,让你可以整理、转移并自动堆叠物品,还提供了一些实用工具,让你的物品栏始终保持你想要的排列方式。在单人游戏中只需安装在客户端即可使用;在多人游戏中则需要在客户端和服务器上都安装。

功能一览:

  • 整理(Sort):一键整理任意容器或你的物品栏,可按字母顺序或创造模式菜单顺序排列。
  • 全部转移(Transfer all):一键将一个物品栏全部倒入另一个(全部放入或全部取出)。
  • 自动堆叠(Auto-stack):将匹配的堆叠补满容器中已有的同类堆叠,而不影响其他物品。
  • 锁定槽位(Locked slots):用 Ctrl/Cmd+点击保护槽位,使整理、转移和堆叠操作都会跳过它们。
  • 快捷栏切换(Hotbar swapping):按住按键并滚动,即可将整行主物品栏内容即时切换到快捷栏。
  • 物品耐久度(Item durability):装备耐久度偏低时发出提醒,并可选在工具即将损坏前自动替换。
  • 智能物品分组(Smart item grouping):整理时将变体系列(所有羊毛颜色、所有木板等)归聚在一起。

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


配置

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

General(通用)

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

Hotbar Swapping(快捷栏切换)(位于 hotbarSwap 部分下)

hotbarSwap.enableHotbarSwap:true|false(默认 true)- 快捷栏切换的总开关。关闭时,Hotbar swap (hold) 按键绑定不起作用(滚动和数字键都不再切换整行),并且隐藏已切换行的标记。请参阅下面的快捷栏切换章节。

hotbarSwap.hotbarSwapNumberKeys:true|false(默认 true)- 在按住 Hotbar swap (hold) 按键绑定时,允许数字键 1-3 选择要切换到快捷栏的主物品栏行(再次按下当前活动行的数字键则切换回去)。默认开启;关闭后,即使按住该键,数字键仍会正常更改所选的快捷栏槽位。无论如何,按住该键时滚动始终有效。

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

durability.durabilityAlertEnabled:true|false(默认 true)- 当工具或已装备物品的耐久度低于阈值时,显示低耐久度动作栏提醒(并带有铁砧"叮"声)。纯客户端功能:它读取的是已经同步给你的耐久度数据,因此可在任何服务器上使用,甚至原版服务器。请参阅下面的物品耐久度章节。

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

durability.durabilityAlertThreshold2:<Integer>(默认 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:pickaxes、axes、shovels、hoes、swords)的物品。

Sorting/Transfering(整理/转移)(位于 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:"(<Integer>,<Integer>)" - 自定义按钮位置的默认值。

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

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

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

lockedPlayerSlots / sorting.serverLockedPlayerSlots:(默认为空)- 已锁定的玩家主物品栏槽位索引,按每个世界单独记忆。在单人游戏中,它们存放在该存档自己的配置文件(<save>/config/inventorymanagement.toml)中的 lockedPlayerSlots 下,因此会随存档一起携带;在多人服务器上,它们存放在你的全局配置中的 sorting.serverLockedPlayerSlots 下,是一个以服务器地址为键的表。无论哪种方式,它们都通过在游戏内 Ctrl/Cmd+点击槽位来为你管理(没有 GUI 控件),但存放在配置文件中,以便你需要查看或清除它们。

Sorting Groups(整理分组)(位于 grouping 部分下)

grouping.itemGrouping:true|false(默认 true)- 变体分组的总开关:将相关的物品系列(所有羊毛颜色、所有木板等)聚集在一起,而不是纯粹按名称整理每个变体。请参阅下面的物品分组章节。

grouping.dynamicGroups:true|false(默认 true)- 数据包定义的分组系列的总开关(请参阅下面的数据包分组标签章节)。

grouping.disabledDynamicGroups:["<tag id>", ...](默认为空)- 单独禁用的数据包分组系列,按完整标签 id 指定。在配置文件中管理(没有 GUI 控件)。

grouping.<family>:true|false(默认 true)- 每个内置变体系列对应一个开关;关闭某个系列可让其按普通名称整理,而不进行聚集。系列:wool、wool_carpets、beds、candles、banners、shulker_boxes、dyes、terracotta、glazed_terracotta、concrete、concrete_powder、stained_glass、stained_glass_pane、planks、wooden_slabs、wooden_stairs、wooden_doors、wooden_trapdoors、wooden_fences、fence_gates、signs、hanging_signs、leaves、saplings、boats、spawn_eggs、pottery_sherds、horse_armor、coral。

修改按钮位置

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

编辑器打开后,只需用鼠标点击并拖动按钮将它们滑到合适位置,它们会与光标一比一跟随。喜欢精确操作?方向键仍可逐像素微调(按住 Shift 可进行更大跳跃),Ctrl/Cmd+R 可重置为默认值。同样的拖放操作也适用于配置 UI 中的 defaultPosition 编辑器。

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


整理

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

整理前

整理后

全部转移

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

自动堆叠

与全部转移按钮类似,也会有向容器堆叠/从容器堆叠的按钮。点击时,此按钮会将源物品栏中的所有物品堆叠到另一个物品栏中任何未满的堆叠中,仅转移填满这些堆叠所需的物品!

堆叠前

堆叠后

锁定槽位

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

只有主物品栏网格可锁定。你的快捷栏、盔甲、副手以及任何打开的容器槽位都不可锁定(快捷栏本来就被所有操作忽略)。锁定状态按每个世界单独记忆:每个单人存档和每个多人服务器都保留各自的锁定集合(单人游戏的锁定甚至存放在存档文件夹内),并且跨会话持久保存。空的已锁定槽位会保持预留状态,因此转移不会填充它。

默认情况下,已锁定的槽位会以微妙的变暗背景和绘制在物品下方的边框标记,悬停时显示 Locked (Ctrl+click to unlock) 提示。不喜欢这些标记?lockedSlotDisplay 配置选项可让你将其设为始终显示(默认)、隐藏或按住热键时显示。最后一项仅在按住 Peek locked slots 按键绑定时绘制它们,让你的物品栏保持简洁,直到你想查看锁定了什么。悬停提示始终显示,因此已锁定的槽位绝不会让人困惑。

提示:与 Inventory Management 的所有按键绑定一样,Peek locked slots 默认未绑定。如果你想使用 hotkey 显示模式,请在"选项"→"控制"中,在 Inventory Management 类别下分配它。


快捷栏切换

想要在不打开物品栏的情况下,在拇指可及范围内多出一(或两)行物品?按住切换键并滚动。每次滚动会循环将主物品栏三行中的一行与快捷栏交换,从正常到第 1 行、第 2 行、第 3 行,再回到正常,循环往复。物品会实际交换位置,因此快捷栏上原本的东西会落到该行,反之亦然。同一时间只会置换一行,滚动回正常即可让一切归位。

更喜欢按键而非滚动?在 hotbarSwapNumberKeys 选项开启(默认)时,按住切换键的同时,数字键 1-3 可直接跳转到该行;再次按下当前活动行的数字键则将其切换回正常。按住切换键时,数字键不会更改你选择的快捷栏槽位,因此 4-9 会被忽略。如果你希望数字键即使按住切换键时也始终正常工作,请关闭此选项。

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

在后台,每次切换会将某一行的九个槽位与快捷栏的九个槽位逐槽交换,其中第 1 行是主网格的顶部,第 3 行是最靠近快捷栏的一行。移动通过数据包在服务器端进行,与整理按钮的工作方式相同,切换行时总会在应用新行之前将前一行恢复归位。服务器信任客户端关于当前哪一行被移出的视图,因此如果在某行被切换进来时快捷栏内容发生变化(物品损坏、拾取落在那里、/give、另一个模组),下一次切换可能会移动错误的槽位。在做任何会重新打乱被置换快捷栏的操作之前,请先滚动回正常。

如果你曾经不同步,例如在切换过程中退出游戏,请按 Reset hotbar swap 按键绑定。它会在不移动任何物品的情况下将模组的跟踪状态清除回"正常",重新以你快捷栏上当前实际存在的物品为基准。

注意:由于物品会实际交换位置(并且服务器会保存它们),在某行被切换进来时退出游戏会导致这些物品在你重新登录时仍处于被置换状态,即使指示器显示"正常"。要让一切归位,请重新选择该行(滚动或用数字键将其切回),然后滚动回正常。

提示:与 Inventory Management 的所有按键绑定一样,Hotbar swap (hold) 和 Reset hotbar swap 默认均未绑定。要使用此功能,请在"选项"→"控制"中,在 Inventory Management 类别下分配它们。


物品耐久度

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

低耐久度提醒。当工具或已装备物品(包括鞘翅)的耐久度低于阈值时,你会收到动作栏消息 "<item\> durability low! <remaining\> of <max\> remaining",并伴随铁砧"叮"声。它会监视你的主手、副手以及全部四个盔甲槽位,并在物品向下穿过阈值时各触发一次,效仿 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/<namespace>/tags/item/grouping/<name>.json
  • 标签 id:#<namespace>:grouping/<name>,例如 #mymod:grouping/gems
{
  "replace": false,
  "values": [
    "minecraft:diamond",
    "minecraft:emerald",
    "mymod:ruby"
  ]
}
  • 聚簇锚定在标签的语言键上(例如 tag.item.mymod.grouping.gems)。将该键添加到你的整合