TileEntityTreasureChest(太空宝箱 / 一级宝箱)
事实基准:
/Users/evlos/a/mirror/Galacticraft(master,minecraftVersion = 1.7.10)逐行读源码。
注册信息
| 属性 | 值 | 来源 |
|---|---|---|
| TileEntity 注册名 | Treasure Chest;若 CompatibilityManager.isAIILoaded() 则为 Space Treasure Chest |
GalacticraftCore.java:703-705 |
| 注册类 | micdoodle8.mods.galacticraft.core.tile.TileEntityTreasureChest |
同上(:704) |
| 关联方块 | GCBlocks.treasureChestTier1 = new BlockT1TreasureChest("treasureChest") |
core/blocks/GCBlocks.java:96 |
| 方块→TE 分派 | createNewTileEntity 无条件返回 new TileEntityTreasureChest(1)(显式传 tier = 1) |
core/blocks/BlockT1TreasureChest.java:390-393 |
| 父类 | TileEntityAdvanced(→ 原版 TileEntity) |
core/tile/TileEntityTreasureChest.java:25、core/tile/TileEntityAdvanced.java:23 |
| 实现接口 | IInventory / IKeyable / ISidedInventory |
core/tile/TileEntityTreasureChest.java:25 |
| 所属 modid | GalacticraftCore |
core/Constants.java:7 |
| 槽位数 | 27 | 见下节 |
⚠ 注册名是条件表达式(GalacticraftCore.java:703-705),不是单一字符串——
装了 AII(Advanced Ironclad / CompatibilityManager.isAIILoaded())时改叫
Space Treasure Chest。抄成固定的 Treasure Chest 会在该兼容分支下出错。
槽位与字段
core/tile/TileEntityTreasureChest.java:27:
private ItemStack[] chestContents = new ItemStack[27];
getSizeInventory()(:89-92)硬编码返回 27,不是 chestContents.length:
@Override
public int getSizeInventory() {
return 27;
}
本类因此不存在「双箱合并成 54 格」的路径——双箱靠 InventoryLargeChest
在方块侧包装(见下节),TE 本身永远是 27 格。
readFromNBT(:164)用 new ItemStack[this.getSizeInventory()] 重新分配,长度仍是 27。
| 其它字段 | 值 / 含义 | 源码 |
|---|---|---|
tier |
int = 1(字段默认 :76,方块侧显式传 1 见 BlockT1TreasureChest.java:392) |
core/tile/TileEntityTreasureChest.java:76、:82-83 |
locked |
boolean = true(默认上锁) |
core/tile/TileEntityTreasureChest.java:74 |
getTierOfKeyRequired() |
return this.tier;(开哪一级钥匙) |
core/tile/TileEntityTreasureChest.java:483-484 |
getInventoryStackLimit() |
64 | core/tile/TileEntityTreasureChest.java:202-205 |
getInventoryName() |
container.treasurechest.name |
core/tile/TileEntityTreasureChest.java:473-474 |
hasCustomInventoryName() |
true |
core/tile/TileEntityTreasureChest.java:458-459 |
isNetworkedTile() |
true |
core/tile/TileEntityTreasureChest.java:548 |
| 侧面判定 | 源码 |
|---|---|
getAccessibleSlotsFromSide = IntStream.range(0, getSizeInventory()),即 0–26 全开 |
core/tile/TileEntityTreasureChest.java:552-555 |
canInsertItem = !this.locked |
core/tile/TileEntityTreasureChest.java:557-560 |
canExtractItem = !this.locked |
core/tile/TileEntityTreasureChest.java:562-565 |
⚠ 漏斗能否抽出全部取决于 locked——宝箱默认 locked = true,
canInsertItem / canExtractItem 都返回 false;
用钥匙开锁时(:489-503)会连带把四个相邻宝箱一起解锁。
能量
无。 父类链是
TileEntityTreasureChest → TileEntityAdvanced → 原版 TileEntity
(core/tile/TileEntityTreasureChest.java:25、core/tile/TileEntityAdvanced.java:23),
不经过 EnergyStorageTile,没有 gJ 容量、不耗电、不接电网。
tick / 特殊机制
| 行为 | 频率 | 源码 |
|---|---|---|
箱盖开合动画 lidAngle |
每 tick,钳在 0.0–1.0 | core/tile/TileEntityTreasureChest.java:379-416 |
| 服务端同步 | ticksSinceSync,注释标注 once per 20 ticks(仅见于源码注释) |
core/tile/TileEntityTreasureChest.java:352 附近字段注释(:70-73 同类注释) |
| 邻居箱检测 | adjacentChestChecked + updateContainingBlockInfo();方块侧 onNeighborBlockChange 触发 |
core/blocks/BlockT1TreasureChest.java:276-284 |
| 拆箱掉货 | breakBlock 遍历 getSizeInventory() 抛 EntityItem |
core/blocks/BlockT1TreasureChest.java:286-291 |
开锁
core/tile/TileEntityTreasureChest.java:489-503:用对等级钥匙时
this.locked = false,并把 adjacentChestXNeg / XPos / ZNeg / ZPos
四个非空相邻箱一并解锁。
GUI / Container
无 GC 自有 Container。 用原版箱子界面:
core/blocks/BlockT1TreasureChest.java:383-385 调 par5EntityPlayer.displayGUIChest(...)。
双箱在方块侧用 net.minecraft.inventory.InventoryLargeChest 包装
(container.chestDouble,core/blocks/BlockT1TreasureChest.java:353-381),
四向各判一次(−X / +X / −Z / +Z)。
⚠ 开箱前会做三重遮挡检查,任一命中就不开箱:
上方固体方块 / 猫(豹猫)挡路 / 四个水平邻居有任何一个被挡
(core/blocks/BlockT1TreasureChest.java:335-352,判据
BlockT1TreasureChest.isOcelotBlockingChest)。