BlockLaserTable:一个方块、六个 meta、六个 TileEntity
事实基准:
/Users/evlos/a/mirror/BuildCraft(master,minecraftVersion = 1.7.10)逐行读源码。 本篇是 Silicon 六个 TileEntity 的共同母方块,放在tile/维度是因为它决定了 「哪个 TileEntity 出现在哪个 meta 上」——这是 Silicon 层最易搞错的一张映射表。
注册信息
| 属性 | 值 | 来源 |
|---|---|---|
| 注册变量 | assemblyTableBlock |
BuildCraftSilicon.java:77 |
| 方块类 | buildcraft.silicon.BlockLaserTable |
BuildCraftSilicon.java:104 |
| 所属 modid | BuildCraft|Silicon |
BuildCraftSilicon.java:63 @Mod |
| 注册方式 | BCRegistry.INSTANCE.registerBlock(assemblyTableBlock, ItemLaserTable.class, false) |
BuildCraftSilicon.java:106 |
⚠️ 注册变量叫 assemblyTableBlock,但它一个方块承载 6 种机器。
按变量名以为「装配台专用」是错的。
meta → TileEntity 映射(silicon/BlockLaserTable.java:75-90,集合运算:恰好 6 个分支)
public TileEntity createTileEntity(World world, int metadata) {
switch (metadata) {
case 0: return new TileAssemblyTable();
case 1: return new TileAdvancedCraftingTable();
case 2: return new TileIntegrationTable();
case 3: return new TileChargingTable();
case 4: return new TileProgrammingTable();
case 5: return new TileStampingTable();
}
return null;
}
| meta | 机器 | TileEntity 类 | 是否有 GUI |
|---|---|---|---|
| 0 | Assembly Table(装配台) | TileAssemblyTable |
有 |
| 1 | Advanced Crafting Table(高级工作台) | TileAdvancedCraftingTable |
有 |
| 2 | Integration Table(集成台) | TileIntegrationTable |
有 |
| 3 | Charging Table(充能台) | TileChargingTable |
有 |
| 4 | Programming Table(编程台) | TileProgrammingTable |
有 |
| 5 | Stamping Table(冲压台) | TileStampingTable |
有 |
| 其它 | — | return null(:90) |
— |
⚠️ meta 为 6 及以上直接 return null——createTileEntity 返回 null 会让方块退化为无 TileEntity。
createNewTileEntity(:94-96)则恒返回 null,即本方块不支持「重新生成 TileEntity」。
GUI ID 复用
silicon/BlockLaserTable.java:67-69:
if (!world.isRemote) {
int meta = world.getBlockMetadata(i, j, k);
entityplayer.openGui(BuildCraftSilicon.instance, meta, world, i, j, k);
}
GUI ID 直接等于 meta 值(0–5),SiliconGuiHandler 再按这 6 个 ID 分派到 6 个 GUI/Container。
所以 Silicon 的 GUI ID 不是自增的,而是与方块 meta 一一对应。
⚠️ entityplayer.isSneaking() 时直接返回 false(:63-65),
即潜行右键不会开 GUI(潜行用于放置而不开界面)。
掉落与朝向
damageDropped(int par1)恒返回入参本身(:99-101)→ 掉落物保留 meta,捡回来还是同一种机器。- 该方块不旋转:meta 是机器型号,不是朝向。
⚠ 「多方块几×几×几 / 控制器 / 可否旋转」是这套 wiki 头号易编造字段。
BlockLaserTable不是多方块,是单方块 + meta 变体**;meta 表示型号而非朝向, 源码中没有任何结构尺寸常量,也没有旋转逻辑。