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 的管道分支 |