Storage Drawers Key Items
Key items are special tools used to modify and interact with drawer behavior. Each serves a distinct purpose.
本条目聚合了 5 个注册为 Item 的钥匙/工具。StorageDrawers 共注册 12 个物品,其余 7 个(upgradeTemplate / upgradeStatus / upgradeVoid / upgradeCreative / upgradeRedstone / upgradeDowngrade / upgrade)属于升级系统,目前无独立条目(见覆盖率报告)。
注册一览
| 物品 |
注册名 |
类 |
关键属性 |
| 遮蔽钥匙 |
StorageDrawers:shroudKey |
ItemShroudKey |
+2 攻击,全 3D,setMaxDamage(0) |
| 数量钥匙 |
StorageDrawers:quantifyKey |
ItemQuantifyKey |
setMaxDamage(0) |
| 个人钥匙 |
StorageDrawers:personalKey |
ItemPersonalKey |
setHasSubtypes(true),setMaxDamage(0) |
| 胶带 |
StorageDrawers:tape |
ItemTape |
堆叠 1,setMaxDamage(8) |
| 升级锁 |
StorageDrawers:upgradeLock |
ItemUpgradeLock |
+2 攻击,全 3D,setMaxDamage(0) |
所有注册名均取自 GameRegistry.registerItem(item, "<name>") 的字符串实参(ModItems.java:52-67),modid 前缀为 StorageDrawers(StorageDrawers.java:47)。注意 makeName() 用的是 MOD_ID.toLowerCase(),那只影响未本地化名(storagedrawers.xxx)与贴图路径,不是注册名。
Shroud Key
A key used to toggle the “shroud” mode on a drawer, hiding its contents from view.
基本信息
| 属性 |
值 |
| 注册名 |
StorageDrawers:shroudKey |
| 最大堆叠 |
64(未调用 setMaxStackSize) |
| 耐久度 |
setMaxDamage(0) → 无 |
| 附魔适用 |
否 |
| 攻击伤害加成 |
+2.0(AttributeModifier 硬编码) |
| 全 3D 渲染 |
isFull3D() = true |
| 贴图 |
StorageDrawers:drawer_key_shroud |
| 合成 |
无序:upgradeLock + Items.ender_eye |
功能
切换抽屉的"遮蔽"模式。启用后,抽屉不再显示内部物品的图标。
使用方式
| 使用方式 |
触发条件 |
使用效果 |
条件/限制 |
| 右键点击抽屉方块 |
手中持有该物品 |
tileDrawers.setIsShrouded(!tileDrawers.isShrouded()) 切换该抽屉的遮蔽 |
需先通过 SecurityManager.hasAccess |
| 右键点击控制器 |
手中持有该物品 |
te.toggleShroud(profile) 切换整个网络的遮蔽 |
判定在方向检查之前,任意面都生效 |
| 作为武器攻击 |
— |
+2 攻击伤害(getAttributeModifiers) |
无消耗 |
数值
| 属性 |
值 |
来源 |
| 攻击伤害加成 |
+2.0 |
ItemShroudKey.java:41-47 |
| 全 3D 渲染 |
isFull3D() = true |
ItemShroudKey.java:35-38 |
| 贴图 |
StorageDrawers:drawer_key_shroud |
ItemShroudKey.java:24 |
耐久与消耗
| 项目 |
值 |
| 最大耐久 |
无 |
| 每次使用消耗 |
无 |
| 使用后是否消失 |
否 |
相关条目
Quantify Key
A key used to toggle item count display mode on drawers.
基本信息
| 属性 |
值 |
| 注册名 |
StorageDrawers:quantifyKey |
| 最大堆叠 |
64(未调用 setMaxStackSize) |
| 耐久度 |
setMaxDamage(0) → 无 |
| 附魔适用 |
否 |
| 攻击伤害加成 |
无(ItemQuantifyKey 未覆写 getAttributeModifiers) |
| 全 3D 渲染 |
否 |
| 合成 |
无序:upgradeLock + Items.writable_book |
功能
切换抽屉的物品数量显示模式。在显示数量和不显示数量之间切换。
使用方式
| 使用方式 |
触发条件 |
使用效果 |
条件/限制 |
| 右键点击抽屉方块 |
手中持有该物品 |
tileDrawers.setIsQuantified(!tileDrawers.isQuantified()) 切换该抽屉的数量显示 |
需先通过 SecurityManager.hasAccess |
| 右键点击控制器 |
手中持有该物品 |
te.toggleQuantify(profile) 切换整个网络的数量显示 |
任意面都生效 |
耐久与消耗
| 项目 |
值 |
| 最大耐久 |
无 |
| 每次使用消耗 |
无 |
| 使用后是否消失 |
否 |
相关条目
Personal Key
A key used to set personal ownership on a drawer, restricting access to specific players.
基本信息
| 属性 |
值 |
| 注册名 |
StorageDrawers:personalKey |
| 最大堆叠 |
64(未调用 setMaxStackSize) |
| 耐久度 |
setMaxDamage(0) → 无(此处 damage 字段被当作子类型用) |
| 子类型 |
setHasSubtypes(true) |
| 附魔适用 |
否 |
| 合成 |
无序:upgradeLock + Items.name_tag |
功能
为抽屉设置个人所有权。不同颜色的 Personal Key 对应不同的安全提供者 (security provider),通过 metadata (damage) 值区分。
使用方式
| 使用方式 |
触发条件 |
使用效果 |
条件/限制 |
| 右键点击抽屉方块 |
getOwner() == null |
setOwner(player.getPersistentID()) + setSecurityProvider(provider) |
首次点击 = 认领 |
| 右键点击抽屉方块 |
getOwner() != null 且 SecurityManager.hasOwnership 通过 |
setOwner(null) + setSecurityProvider(null) → 解除保护 |
非所有者点击 return false |
| 右键点击控制器 |
手中持有该物品 |
te.toggleProtection(profile, provider) 切换整个网络的保护 |
任意面都生效 |
数值
| 属性 |
值 |
来源 |
| metadata 含义 |
安全提供者字符串键,经 getSecurityProviderKey(meta) 解析后再查 StorageDrawers.securityRegistry.getProvider(key) |
BlockDrawers.java:421-422 |
| provider 数量上限 |
无法核实——ItemPersonalKey 未在本仓库中展开显式 subtype 表,实际 provider 数取决于 security 包的动态注册 |
— |
⚠️ 订正:原文"通过 metadata (damage) 值区分安全提供者索引"方向对,但源码是先用 metadata 取字符串键,再在 SecurityRegistry 里查 ISecurityProvider,并非直接拿 metadata 当数组索引。原文"需要对应的安全系统支持"也过于含糊:未注册 provider 时 getProvider 返回 null,仍会写入 owner,只是保护能力为空。
耐久与消耗
| 项目 |
值 |
| 最大耐久 |
无 |
| 每次使用消耗 |
无 |
| 使用后是否消失 |
否 |
相关条目
Tape
An item used to visually mark drawers as “taped”.
基本信息
| 属性 |
值 |
| 注册名 |
StorageDrawers:tape |
| 最大堆叠 |
1(setMaxStackSize(1)) |
| 耐久度 / 可用次数 |
8(setMaxDamage(8)) |
| 贴图 |
StorageDrawers:tape_roll |
| 开关 |
enableTape(默认 true,需重启) |
| 合成 |
" x " / "yyy":'x' = "slimeball" ×1,'y' = Items.paper ×3 |
| 附魔适用 |
否 |
功能
胶带不是装饰品,而是"密封"工具。 ⚠️ 订正(严重):原文"为抽屉添加胶带视觉标记效果,属于纯装饰性功能"“使用后是否消失:否”"最大堆叠 64""耐久度 无"四项全错。
ItemTape.onItemUse(ItemTape.java:38-59)的真实逻辑:
player.canPlayerEdit(...) 不通过 → return false
- 取
world.getTileEntity(...);若为 IProtectable 先校验 SecurityManager.hasOwnership
- 若为
ISealable 且 isSealed() 已为 true → return false(不能重复封)
- 否则
setIsSealed(true) + stack.damageItem(1, player),每次使用消耗 1 点耐久(共 8 次)
| 使用方式 |
触发条件 |
使用效果 |
条件/限制 |
| 右键点击抽屉方块 |
目标 TE 实现 ISealable 且未密封 |
密封该抽屉(setIsSealed(true)),阻止放物 |
需通过 canPlayerEdit 与所有权校验;已密封则无效 |
| 右键点击控制器 |
— |
无效果:BlockController.onBlockActivated 不处理 tape |
— |
拿着胶带对抽屉按 useKey 路径 |
— |
无效果:if (item.getItem() == ModItems.tape) return false; 显式排除 |
BlockDrawers.java:433 |
耐久与消耗
| 项目 |
值 |
来源 |
| 最大耐久 / 使用次数 |
8 |
ItemTape.java:26 |
| 每次使用消耗 |
1 点耐久 |
ItemTape.java:53 |
| 使用后是否消失 |
8 次用尽后消失(堆叠上限 1) |
— |
解除密封
- 空手 + 潜行右键抽屉:若
isSealed() 为 true,则 setIsSealed(false) 并直接返回(BlockDrawers.java:368-370)——这才是解除密封的唯一方式,胶带不能用来解封
- 被密封的抽屉同时拒绝升级以外的存取:
if (tileDrawers.isSealed()) return false;(BlockDrawers.java:379)
相关条目
Upgrade Lock
An item used to lock or unlock drawers, preventing accidental upgrades or changes.
基本信息
| 属性 |
值 |
| 注册名 |
StorageDrawers:upgradeLock |
| 最大堆叠 |
64(未调用 setMaxStackSize) |
| 耐久度 |
setMaxDamage(0) → 无 |
| 攻击伤害加成 |
+2.0(AttributeModifier 硬编码) |
| 全 3D 渲染 |
isFull3D() = true |
| 贴图 |
StorageDrawers:drawer_key(与通用钥匙同贴图) |
| 开关 |
enableLockUpgrades(默认 true) |
| 合成 |
"xyx" / "yzy" / "xyx":'x' = Items.flint ×4,'y' = "stickWood" ×4,'z' = upgradeTemplate ×1 |
| 附魔适用 |
否 |
功能
锁定 / 解锁抽屉的存取操作。
使用方式
| 使用方式 |
触发条件 |
使用效果 |
条件/限制 |
| 右键点击抽屉方块 |
手中持有该物品 |
同时切换 LockAttribute.LOCK_POPULATED 和 LockAttribute.LOCK_EMPTY 为 !locked |
需先通过 SecurityManager.hasAccess |
右键点击抽屉且当前已锁定,命中槽位 getStoredItemCount() == 0 且 getStoredItemPrototype() != null |
先执行 drawer.setStoredItemRedir(null, 0) 清除该空槽记录,然后 return true(不切换锁定状态) |
特殊分支 |
BlockDrawers.java:400-408 |
| 右键点击控制器 |
手中持有该物品 |
te.toggleLock(EnumSet.allOf(LockAttribute.class), LockAttribute.LOCK_POPULATED, profile) —— 锁定全部属性 |
任意面都生效 |
⚠️ 订正(语义写反):原文"锁定或解锁抽屉的升级功能""锁定的抽屉无法安装或移除升级"写反了。升级安装走 addUpgrade 分支,位于 useKey 与 isSealed() 判定之前,不受这把锁影响。这把锁控制的是 ILockable 的存取属性(LOCK_POPULATED / LOCK_EMPTY),约束"已装满的抽屉 / 空抽屉"的插入提取。
耐久与消耗
| 项目 |
值 |
来源 |
| 最大耐久 |
无(setMaxDamage(0)) |
ItemUpgradeLock.java:25 |
| 每次使用消耗 |
无(切换不消耗) |
— |
| 使用后是否消失 |
否 |
— |
衍生物品
upgradeLock 是三把钥匙的共同材料(ModRecipes.java:392-403):
| 产物 |
配方 |
StorageDrawers:shroudKey |
无序:upgradeLock + Items.ender_eye |
StorageDrawers:personalKey |
无序:upgradeLock + Items.name_tag |
StorageDrawers:quantifyKey |
无序:upgradeLock + Items.writable_book |
相关条目
第三方集成
| 集成 Mod |
集成类型 |
功能 |
| Waila |
工具提示 |
显示钥匙类型和效果 |
| NEI |
配方/隐藏 |
物品显示和隐藏 |
| MineTweaker |
脚本集成 |
OreDictionary 黑/白名单 |
| GTNH |
配方注册 |
GTNH/dreamcraft 配方系统 |
| Backhand |
副手兼容 |
副手交互兼容性 |