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 网络当作存储单元读取。
相关条目