Infinity Chest

基本信息

属性 值
注册名 avaritiaddons:InfinityChest
TileEntity TileEntityInfinityChest
GUI ID 1(Avaritiaddons.GUI_ID_INFINITY_CHEST)
硬度 50.0
爆炸抗性 2000.0
亮度 1.0(满发光)
工具等级 镐(pickaxe)等级 3
材质 铁(Material.iron)
摆放边界 0.0625–0.9375(标准箱子尺寸)
朝向 跟随玩家放置时的水平朝向(4 向)

功能

243 个真实槽位 + 第 244 个虚拟聚合槽(仅 GUI 显示),单槽位理论最大堆叠数 Integer.MAX_VALUE(≈ 21 亿)。任何相同物品(item + damage + NBT 全部相同)放入第 244 槽会被自动合并到已有同物品的槽位(findSlotFor / setInventorySlotContents),溢出 Integer.MAX_VALUE 时拒绝入库。整箱物品数据通过自定义网络包同步(InfinityChestClick / InfinityChestSlotSync / InfinityChestSyncAllSlots),客户端 GUI 拥有独立 ContainerInfinityChest.slotClick 逻辑直接走本地,不经标准 Container 流程。贴图使用 ComplexHalfAnimation 动画(30 帧),按 Avaritia 的 block_infinity 纹理由 WanionLib 客户端 tick 驱动。

摆放要求

  • 任何实心面皆可放置;放置时根据玩家水平朝向记录 FacingSide。
  • 不透光(isOpaqueCube=false / renderAsNormalBlock=false / getRenderType=-1),需 TESR 渲染。
  • 满亮度 1.0,无论是否打开 GUI 都持续发光。

数值

数值 值
槽位数 244(含 1 个虚拟聚合槽)
单槽最大堆叠 Integer.MAX_VALUE(≈ 2,147,483,647)
GUI 尺寸 500×276(继承自 GuiAvaritiaddonsChest)
纹理 textures/entity/InfinityChest/0.png ~ 8.png(9 帧动画)
icon avaritia:block_infinity
动画 ComplexHalfAnimation(30 帧半复杂动画,30 阶段 0–8)

交互

触发 行为
左键 无直接效果
右键 打开 GUI(GUI_ID_INFINITY_CHEST),服务端注册客户端打开
被打掉 掉落带 NBT 的方块物品,TileEntity 内容完整保存
玩家放入物品 setInventorySlotContents 自动合并相同物品到已有槽位,溢出 Integer.MAX_VALUE 拒绝
玩家丢出物品 物品继承 EntityImmortalItem(不受虚空/消失计时器影响)

配方(Config 控制)

默认(简单)配方(仅当 hardInfinityChestRecipe=false 且未加载 GTNH/dreamcraft)

TNT
ICI
TIT
T = avaritia:resource meta=5
N = ore:blockCosmicNeutronium
I = ore:ingotInfinity
C = CompressedChest

硬核(Hard)配方(仅当 hardInfinityChestRecipe=true 且未加载 GTNH/dreamcraft)

INI
BCB
IBI
I = ore:ingotInfinity
N = ore:blockCosmicNeutronium
B = ore:blockInfinity
C = CompressedChest

双重开关

当 fox.spiteful.avaritia.Config.craftingOnly=true(Avaritia 自带的 craft-only 模式)时,Infinity Chest 与 ExtremeAutoCrafter 配方完全跳过注册。

自定义网络包同步

消息 方向 用途
InfinityChestClick (ID 2/3) 双向 客户端 slotClick 后回放操作到服务器、服务器回执更新客户端
InfinityChestSlotSync (ID 0/1) 双向 单槽位 stack size 变化广播
InfinityChestSyncAllSlots (ID 6/7) 双向 全槽位批量同步(GUI 打开时初始化)
InfinityChestConfirmation (ID 4/5) 双向 事务确认(用于延迟事务的安全网)

服务器端在 ContainerInfinityChest.detectAndSendChanges 中检测到任意槽位变化即发送 InfinityChestSlotSync 增量包给所有监听玩家。

自定义 Slot 点击逻辑

  • 0–242 槽在 modifier==0 时被 ContainerInfinityChest.slotClick 拦截,绕过标准 Container 逻辑直接处理:putStack / decrStackSize / mergeItemStack 全部走无限堆叠语义;
  • 第 243 槽(虚拟聚合槽)始终返回 null;
  • 鼠标中键 (modifier==2) 在 0–242 槽上被忽略;
  • canDragIntoSlot 仅允许槽位号 > 242(即玩家背包区)参与 drag;
  • 客户端 GuiInfinityChest.handleMouseClick 总是先在本地执行 slotClick 再通过 InfinityChestClick 包通知服务器。

渲染

  • TESR:RendererAvaritiaddonsChest 绘制标准 ModelChest,盖子根据 lidAngle 开合;
  • 纹理每 tick 由 WanionLib.getClientTickHandler() 驱动 ComplexHalfAnimation 切换 0.png–8.png;
  • 物品栏渲染用 RenderItemInfinity,堆叠数显示为 K/M/B 缩写(>999)以适配 21 亿级数字。

NBT 持久化

  • 自定义 NBT 字段 intCount:保存 ItemStack.stackSize 的实际数值(因为 NBT 默认 stackSize 是 byte,存不下大数);
  • 自定义字段 tag:保存 stackTagCompound,处理 NBT 标签堆叠;
  • 单个 ItemStack 写入 NBT 时拆出 intCount 与 tag 两段,读取时还原;
  • 整箱掉落:ItemBlockAvaritiaddonsChest 把整箱 NBT 写入 ItemStack.stackTagCompound;
  • 物品 entity:使用 EntityImmortalItem,永远不会被虚空/消失计时器清除。

第三方 mod 集成

  • Avaritia:LudicrousBlocks.dire_crafting 用于合成 Extreme Auto Crafter;LudicrousItems.resource meta=5 与 LudicrousItems.singularity meta=3 用于合成。
  • AE2(Applied Energistics 2):通过 gametests/InfinityChestTest.java 的 canExtractStacks 测试验证 AE2 ME 网络可以从 Infinity Chest 抽取 256 个 dirt,证明 Infinity Chest 实现了 AE2 的 IItemDisplayable/IStorageMonitorable 接口,可被 AE2 ME 网络当作存储单元读取。

相关条目