ClayCache

ClayCache

一个原版友好的模组,将Minecraft中的装饰陶罐从静态的装饰方块转变为功能完整、基于物理的容器。

特色功能

动态储存

装饰陶罐现在拥有 9 格物品栏(使用熟悉的发射器风格界面)。你可以用漏斗将物品输入其中、储存贵重物品,打开时还会伴随一声清脆的声响。

潜影盒式提示框

安全拾取陶罐后,在物品栏中悬停鼠标即可看到罐内物品。提示框会以漂亮的颜色编码列表显示其附着的陶片和内部储存的物品,就像潜影盒一样。

完美的多人模式储箱

由于陶罐制作成本极低、可容纳 9 组物品,且能安全运输,因此是多人服务器中玩家交易和经济系统的绝佳沉浸式储箱。

自定义合成与可更换陶片

使用粘土球(像炼药锅一样摆放)合成“未烧制的装饰陶罐”,然后熔炼或高炉烧制。想要装饰它?将裸罐放在工作台中央。上方、下方、左侧和右侧的格子对应陶罐的四个面,让你能精确为每个面选择陶片。 注意:要移除陶片,你必须打碎陶罐!别担心,你一定能拿回陶片和等量的砖块。

物理与重力

装饰陶罐现在像沙子和铁砧一样受重力影响。如果陶罐从过高处掉落,撞击时会动态碎裂,罐内物品和陶片散落一地。如果安全着陆,则会保留所有物品和陶片数据。

交互式碎裂

用剑、斧或镐破坏陶罐会使其瞬间碎裂(与原版一致)。想安全移动?用空手、精准采集工具或在创造模式下破坏它,即可完整拾取,罐内物品也会保留。

弹射物穿透

箭矢、三叉戟和其他弹射物会直接穿透陶罐,使其碎裂。弹射物在穿透过程中会损失一定比例的速度,这意味着单支箭矢可以穿透一整排陶罐,直到最终停下。

压碎与踩碎机制

下落的铁砧会在半空中动态压碎陶罐。更棒的是,如果你(玩家)从足够高的地方坠落并踩在陶罐上,你的重量会将其踩碎在脚下。

花盆配方

你可能会在配方书中发现一个“未烧制的花盆”的随机配方。目前该配方像装饰陶罐一样被替换了,我对此有计划,如果你也想加入这些计划,请告诉我!

使用方法

确保已安装 Forge。将 .jar 文件放入 mods 文件夹。

  1. 在工作台上用 7 个粘土球摆成 U 形(像炼药锅一样)合成未烧制的装饰陶罐。
  2. 熔炼或高炉烧制使其硬化。
  3. 放置陶罐,右键点击打开其物品栏,储存你的物品。
  4. 在工作台上为其附加陶片,或直接将其用作储箱!
  5. 用箭射击、从悬崖扔下或用剑砸碎陶罐,即可取回物品!(或再次右键点击它)。

兼容性

  • 模组弹射物: 模组包含一个高度可配置的 fragileProjectiles 列表。雪球、鸡蛋或模组中的西红柿等物品会安全弹开陶罐,而不会使其碎裂。
  • 优化模组: 自定义物品模型和渲染技术经过专门设计,可与 Embeddium、Rubidium、Sodium 等渲染优化模组 100% 兼容。没有隐形面或纹理拉伸问题。
  • 物品栏增强: 陶罐的 UI 使用标准的 Forge SlotItemHandler 机制,因此能完美兼容物品栏整理模组(如 MouseTweaks 或 Inventory Sorter),不会复制或删除物品。
  • JEI 兼容: 由于为陶罐附加陶片使用的是动态自定义配方,JEI 通常无法显示它。ClayCache 包含一个自定义 JEI 插件,可完美演示该配方的工作原理。查看装饰陶罐或任何陶片配方时,JEI 会显示一个循环展示游戏中所有已加载陶片(包括模组添加的!)的 3x3 网格,输出陶罐的 NBT 会实时更新以匹配!

技术细节

本模组涉及动态方块与实体转换、状态变化时 NBT 的持久化,以及自定义物理交互。以下是内部工作机制:

物品栏系统(DecoratedPotInventoryProvider.java 与 ModCapabilities.java)

模组没有硬编码自定义的 BlockEntity,而是订阅了 Forge 的 AttachCapabilitiesEvent。当放置原版 DecoratedPotBlockEntity 时,模组会附加自己的 ICapabilityProvider,暴露一个 IItemHandler(9 格 ItemStackHandler)。这确保了与原版漏斗、模组管道及自动化系统的 100% 兼容性。

方块与实体转换(FallingDecoratedPotBlock.java 与 CustomFallingBlockEntity.java)

当陶罐需要下落时,不能直接使用原版的 FallingBlockEntity,因为它会丢失 BlockEntity 的 NBT 数据。因此,模组会拦截下落过程,将陶罐的能力数据和陶片装饰序列化为 CompoundTag,然后注入到 CustomFallingBlockEntity 中。当实体安全着陆时,它会重新放置原版陶罐方块,并将 NBT 数据反序列化回去。

渲染魔法(CustomFallingBlockRenderer.java)

渲染一个包含复杂 BlockEntity 数据(如 4 种不同的陶片)的下落方块相当麻烦。解决方案是在自定义 EntityRenderer 中保留一个“虚拟”的 DecoratedPotBlockEntity。每帧将下落实体的 NBT 数据输入这个虚拟陶罐,应用正确的 Y 轴旋转数学以匹配其方块状态的朝向,然后传递给原版的 DecoratedPotRenderer。

物理与混入(FallingBlockEntityMixin.java 与 WorldInteractionEvents.java)

  • 铁砧压碎: 对 FallingBlockEntity#tick 的混入将铁砧的 AABB 沿其 DeltaMovement 向量向下投影。如果数学计算检测到铁砧将在该 tick 内与陶罐相交,则在铁砧注册碰撞之前动态碎裂陶罐。
  • 箭矢穿透: 当弹射物击中陶罐时,模组会取消撞击事件、降低弹射物速度,并强制进行服务器到客户端的脉冲同步。关键在于,客户端会预测性地移除方块(level.removeBlock(pos, false)),以防止箭矢在等待服务器方块破坏数据包时卡在“幽灵方块”上。
  • 战利品上下文黑客(ShatterCache.java 与 PotInventoryModifier.java): Forge 的战利品上下文有时会在方块被破坏后(尤其是在爆炸时)丢失 BlockEntity 的能力数据。为了确保物品安全掉落,模组使用一个以 BlockPos.asLong() 为键的 ConcurrentHashMap,在方块被破坏的瞬间临时缓存物品栏 NBT。全局战利品修改器(GLM)会拦截掉落生成,从缓存中检索 NBT,并将物品注入世界。缓存会在每个 ServerTickEvent 结束时安全清除,以防止内存泄漏。