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。

相关条目