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.resourcemeta=5 与LudicrousItems.singularitymeta=3 用于合成。 - AE2(Applied Energistics 2):通过
gametests/InfinityChestTest.java的canExtractStacks测试验证 AE2 ME 网络可以从 Infinity Chest 抽取 256 个 dirt,证明 Infinity Chest 实现了 AE2 的IItemDisplayable/IStorageMonitorable接口,可被 AE2 ME 网络当作存储单元读取。
相关条目
- Compressed Chest - 243 槽、最大 64 堆叠的普通大型箱子
- Extreme Auto Crafter - 9×9 自动合成台,消耗 81 输入槽材料批量合成