BuildCraft GUI 层:7 个 IGuiHandler + 19 个 GUI ID

事实基准:/Users/evlos/a/mirror/BuildCraft(master,minecraftVersion = 1.7.10)逐行读源码。

GUI ID(core/GuiIds.java,集合运算:恰好 19 个)

ID 常量 所属 modid 行
10 ARCHITECT_TABLE BuildCraft|Builders :11
11 BUILDER BuildCraft|Builders :12
12 FILLER BuildCraft|Builders :13
13 BLUEPRINT_LIBRARY BuildCraft|Builders :14
15 MAP BuildCraft|Core :15
16 REQUESTER BuildCraft|Robotics :16
17 LIST_OLD BuildCraft|Core :17
18 TABLET BuildCraft|Core :18
19 LIST_NEW BuildCraft|Core :19
20 ENGINE_IRON BuildCraft|Energy :21
21 ENGINE_STONE BuildCraft|Energy :22
30 AUTO_CRAFTING_TABLE BuildCraft|Factory :24
31 REFINERY BuildCraft|Factory :25
32 HOPPER BuildCraft|Factory :26
50 PIPE_DIAMOND BuildCraft|Transport :28
51 GATES BuildCraft|Transport :29
52 PIPE_EMERALD_ITEM BuildCraft|Transport :30
53 PIPE_LOGEMERALD_ITEM BuildCraft|Transport :31
54 PIPE_EMERALD_FLUID BuildCraft|Transport :32
60 FILTERED_BUFFER BuildCraft|Transport :34

⚠ ID 分 5 段:10–13(Builders)、15–19(Core)、20–21(Energy)、30–32(Factory)、50–60(Transport)。 ID 不连续,最大 60,但只有 19 个。 「最大 ID 60 → 61 个 GUI」是典型的枚举虚高。

⚠ Silicon 的 6 个 BlockLaserTable 机器不在 GuiIds 里—— 它们的 GUI ID 直接等于方块 meta(0–5),见 BlockLaserTable meta 映射。 RobotStation 也没有 GUI ID。

7 个 IGuiHandler(registerGuiHandler 调用点)

GuiHandler 所属 modid registerGuiHandler 调用处
core.CoreGuiHandler BuildCraft|Core BuildCraftCore.java:591
energy.EnergyGuiHandler BuildCraft|Energy BuildCraftEnergy.java:454
factory.FactoryGuiHandler BuildCraft|Factory BuildCraftFactory.java:101
builders.BuildersGuiHandler BuildCraft|Builders BuildCraftBuilders.java:380
robotics.RoboticsGuiHandler BuildCraft|Robotics BuildCraftRobotics.java:306
silicon.SiliconGuiHandler BuildCraft|Silicon BuildCraftSilicon.java:144
transport.TransportGuiHandler BuildCraft|Transport BuildCraftTransport.java:614

7 个 registerGuiHandler 调用点 = 7 个 modid 全覆盖(集合运算核对)。

⚠ 7 个 modid 各有 1 个 GuiHandler,但覆盖面差别很大: Core 的 CoreGuiHandler.getClientGuiElement 只处理 LIST_OLD / LIST_NEW(core/CoreGuiHandler.java:23、:25), MAP(ID 15)与 TABLET(ID 18)不由它分派。

GUI / Container 配对表(逐个核对了 getClientGuiElement / getServerGuiElement)

ID GUI 类 Container 类 配对处
10 ARCHITECT_TABLE builders.gui.GuiArchitect builders.gui.ContainerArchitect builders/BuildersGuiHandler.java:39
11 BUILDER builders.gui.GuiBuilder builders.gui.ContainerBuilder :51
12 FILLER builders.gui.GuiFiller builders.gui.ContainerFiller :57
13 BLUEPRINT_LIBRARY builders.gui.GuiBlueprintLibrary builders.gui.ContainerBlueprintLibrary :45
16 REQUESTER robotics.gui.GuiRequester robotics.gui.ContainerRequester robotics/RoboticsGuiHandler.java:41
20 ENGINE_IRON energy.gui.GuiCombustionEngine energy.gui.ContainerEngine energy/EnergyGuiHandler.java:38 / :64
21 ENGINE_STONE energy.gui.GuiStoneEngine energy.gui.ContainerEngine :41 / :67
30 AUTO_CRAFTING_TABLE factory.gui.GuiAutoCrafting factory.gui.ContainerAutoWorkbench factory/FactoryGuiHandler.java:38 / :74
31 REFINERY factory.gui.GuiRefinery factory.gui.ContainerRefinery :45 / :81
32 HOPPER factory.gui.GuiHopper factory.gui.ContainerHopper :52 / :88
50 PIPE_DIAMOND transport.gui.GuiDiamondPipe transport.gui.ContainerDiamondPipe transport/TransportGuiHandler.java:112
51 GATES transport.gui.GuiGateInterface transport.gui.ContainerGateInterface :124
52 PIPE_EMERALD_ITEM transport.gui.GuiEmeraldPipe transport.gui.ContainerEmeraldPipe :115
53 PIPE_LOGEMERALD_ITEM transport.gui.GuiEmzuliPipe transport.gui.ContainerEmzuliPipe :118
54 PIPE_EMERALD_FLUID transport.gui.GuiEmeraldFluidPipe transport.gui.ContainerEmeraldFluidPipe :121
60 FILTERED_BUFFER transport.gui.GuiFilteredBuffer transport.gui.ContainerFilteredBuffer :97

三个关键事实

1. Iron 与 Stone 引擎共用一个 Container

两者都返回 new ContainerEngine(player.inventory, engine) (energy/EnergyGuiHandler.java:64、:67), 只有 GuiCombustionEngine / GuiStoneEngine 不同。

ContainerEngine 的构造签名是 public ContainerEngine(InventoryPlayer inventoryplayer, TileEngineWithInventory tileEngine) (energy/gui/ContainerEngine.java:22)——第二参是接口 TileEngineWithInventory, 所以两种引擎都能传入。

2. Transport 的分派靠 IPipeTile + 具体类型双重判定

transport/TransportGuiHandler.java:87 起先取 TileEntity, :95 先判 tile instanceof TileFilteredBuffer(FILTERED_BUFFER,:97 返回 GuiFilteredBuffer), :100 才用 if (!(tile instanceof IPipeTile)) 排除非管道, 再按具体管道类型分派 5 个管道 GUI(:112–:124)。

3. 没有 GUI 的 TileEntity(占 GuiIds 的空位)

以下 TileEntity 注册了但不占 GuiIds:

TileEntity 原因
TileMarker / TilePathMarker 纯坐标标记
TileQuarry 无 GUI(BuildersGuiHandler 无分支)
TileConstructionMarker 靠激光 + 命令驱动
TileMiningWell 产物直接掉落
TilePump FactoryGuiHandler 无分支
TileFloodGate 同上
TileTank 同上
TileLaser 纯供能设备
TileZonePlan 走 Map ID(15)
TileGenericPipe 走 50–54 的管道分支

相关条目