TileChargingTable
事实基准:
/Users/evlos/a/mirror/BuildCraft(master,minecraftVersion = 1.7.10)逐行读源码。
注册信息
| 属性 | 值 | 来源 |
|---|---|---|
| TileEntity 注册名 | net.minecraft.src.buildcraft.factory.TileChargingTable |
BuildCraftSilicon.java:155 |
| 注册类 | buildcraft.silicon.TileChargingTable |
同上 |
| 所属 modid | BuildCraft|Silicon |
BuildCraftSilicon.java:63 |
| 关联方块 | BlockLaserTable,meta = 3 |
silicon/BlockLaserTable.java:82-83 |
| 父类 | TileLaserTableBase |
silicon/TileChargingTable.java:10 |
| 实现接口 | IHasWork |
同上 |
| 是否配置门控 | 否(无条件注册) | BuildCraftSilicon.java:155 |
槽位数量与布局
silicon/TileChargingTable.java:56-58:
public int getSizeInventory() {
return 1;
}
只有 1 个槽位。
| 槽位 | 类型 | GUI 坐标 | 用途 |
|---|---|---|---|
| 0 | SlotValidated |
(80, 18) |
放入待充电的能量容器物品 |
玩家背包:热键栏 9 槽(silicon/gui/ContainerChargingTable.java:30,y=50)+ 主背包 27 槽(:35,y=108)。
处理速率 / 耗时(本篇核心常量)
updateEntity()(silicon/TileChargingTable.java:19-32)分两条路径:
路径 A:槽内有能量容器物品
:22-27:
if (getEnergy() > 0) {
if (getRequiredEnergy() > 0) {
ItemStack stack = this.getStackInSlot(0);
IEnergyContainerItem containerItem = (IEnergyContainerItem) stack.getItem();
addEnergy(0 - containerItem.receiveEnergy(stack, getEnergy(), false));
this.setInventorySlotContents(0, stack);
}
每 tick 把机器的全部能量灌进物品(receiveEnergy(stack, getEnergy(), false) 传入的是
getEnergy() 本身,不是某个固定速率),再把差额从机器里扣掉。
所以充满速度 = 激光供能速率,本类不额外限速。
路径 B:槽内没有可充电物品 —— 能量直接烧掉
:28-30:
} else {
subtractEnergy(Math.min(getEnergy(), 10));
}
⚠️ 每 tick 固定烧掉 10 点能量(Math.min(getEnergy(), 10),不足则全烧)。
这是本类唯一写死的数值,且语义是能量流失(vent),不是充电速率。
⚠ 语义易写反:路径 B 不是「以 10/tick 充电」,而是 「槽内没有合法容器时,把机器能量白白烧掉,每 tick 最多 10」。 把
10写成充电压率即为编造。
getRequiredEnergy()(:35-43)返回
containerItem.getMaxEnergyStored(stack) - containerItem.getEnergyStored(stack),
即物品的剩余可充容量;物品不是 IEnergyContainerItem 时返回 0(:42)。
canUpdate()(:12-15)明确 return !FMLCommonHandler.instance().getEffectiveSide().isClient();
——仅服务端更新,源码 :17 有注释 // WARNING: run only server-side, see canUpdate()!。
GUI / Container 配对
| GUI 类 | Container 类 | 配对处 |
|---|---|---|
buildcraft.silicon.gui.GuiChargingTable |
buildcraft.silicon.gui.ContainerChargingTable |
silicon/SiliconGuiHandler.java:65 |
网络封包
走 TileLaserTableBase 基类同步。无独立的 Silicon 专用封包 ID。