TileEntityLaunchController(发射控制器)
事实基准:
/Users/evlos/a/mirror/Galacticraft(master,minecraftVersion = 1.7.10)逐行读源码。
注册信息
| 属性 | 值 | 来源 |
|---|---|---|
| TileEntity 注册名 | Launch Controller |
planets/mars/MarsModule.java:250 |
| 所属 modid | GalacticraftMars |
core/Constants.java:8,@Mod 见 planets/GalacticraftPlanets.java:37-38 |
| 注册方法入口 | MarsModule.registerTileEntities(),由 planets/mars/MarsModule.java:153 调用 |
planets/mars/MarsModule.java:241-252 |
| 关联方块 | MarsBlocks.machine = new BlockMachineMars().setBlockName("marsMachine") |
planets/mars/blocks/MarsBlocks.java:35 |
| 方块→TE 分派 | metadata >= LAUNCH_CONTROLLER_METADATA(=8)时装发射控制器 |
planets/mars/blocks/BlockMachineMars.java:307-310、:49 |
| 父类 | TileBaseElectricBlockWithInventory(→ TileBaseElectricBlock → TileBaseUniversalElectrical → EnergyStorageTile) |
planets/mars/tile/TileEntityLaunchController.java:38-39 |
| 实现接口 | IChunkLoader / ISidedInventory / ILandingPadAttachable(父类另带 IInventory / IDisableableMachine / IConnector / IWrenchable) |
planets/mars/tile/TileEntityLaunchController.java:38-39、core/energy/tile/TileBaseElectricBlock.java:22-24 |
| 槽位数 | 1 | 见下节 |
槽位与字段
planets/mars/tile/TileEntityLaunchController.java:42:
private ItemStack[] containingItems = new ItemStack[1];
getSizeInventory() 本类未覆写,继承
core/energy/tile/TileBaseElectricBlockWithInventory.java:46-48
→ return this.getContainingItems().length; → 恒为 1(getContainingItems() 见 planets/mars/tile/TileEntityLaunchController.java:267-270)。
| 槽位 | 用途 | 源码 |
|---|---|---|
| 0 | 唯一的电池槽(isItemValidForSlot 只认 slotID == 0 的 GC 电力物品) |
planets/mars/tile/TileEntityLaunchController.java:283-285 |
| 可接受性 | 源码 |
|---|---|
侧面可达槽 {0};canExtractItem 对槽 0 恒为 true |
planets/mars/tile/TileEntityLaunchController.java:288-300 |
能量
| 项目 | 值 | 来源 |
|---|---|---|
| 缓冲容量 | 16000 gJ(STANDARD_CAPACITY,本类未覆写) |
core/energy/tile/EnergyStorageTile.java:18、:21 |
| 最大输入 | 25 gJ/t——new EnergyStorage(STANDARD_CAPACITY, 10) 两参构造展开为 maxReceive = 2.5F * 10 |
core/energy/tile/EnergyStorageTile.java:21、core/energy/tile/EnergyStorage.java:19-21 |
| 最大输出 | 10 gJ/t——构造里 setMaxExtract(10) 与默认值相同,是显式重写而非改动 |
planets/mars/tile/TileEntityLaunchController.java:81-84 |
⚠ 类里有个 public static final int WATTS_PER_TICK = 1(planets/mars/tile/TileEntityLaunchController.java:41),
但全源码库中除声明处与 TileEntityTerraformer 的同名常量外无任何引用,不能据此推断耗电速率。
构造时 this.noRedstoneControl = true(:83)——不受红石控制,但 getDisabled(0)(扳手)仍生效(:303-305)。
tick / 特殊机制
| 行为 | 频率 | 源码 |
|---|---|---|
| 校验本机 / 目标频率 | 每 40 tick | planets/mars/tile/TileEntityLaunchController.java:129-132 |
| 清理已失效的着陆台票 | 每 20 tick,台方块不是 GCBlocks.landingPadFull 就 unforceChunk |
planets/mars/tile/TileEntityLaunchController.java:134-146 |
| 客户端频率占位请求 | 客户端侧、且本机与目标频率都为 −1 时才发 | planets/mars/tile/TileEntityLaunchController.java:147-152 |
区块加载(IChunkLoader)
- 开关:
ConfigManagerMars.launchControllerChunkLoad(:176)。 - 扫描自身 5×5(x/z 各 −2…+2)找
BlockLandingPadFull,只记录跨区块的台(:190-196)。 - 票据存在
chunkLoadTicket,invalidate()时releaseTicket(:165-172)。 - 客户端侧频率与目标频率用
PacketSimpleMars同步(:147-152)。
频率机制
setFrequency / checkDestFrequencyValid(:347-408)遍历所有世界的 loadedTileEntityList,
找 frequency 相同的其它发射控制器,据此置 frequencyValid / destFrequencyValid——
同频率不能重复。validFrequency() 还要求未被扳手禁用且有电(:410-413)。
⚠ getDisabled / setDisabled 被重载成三路开关(:307-338):
index 0 = 机器禁用、index 1 = 发射计划启用、index 2 = 隐藏目标目的地。
后两者共用 disableCooldown = 10 的冷却。
GUI / Container
| GUI 类 | Container 类 | 分派处 |
|---|---|---|
planets.mars.client.gui.GuiLaunchController |
planets.mars.inventory.ContainerLaunchController |
Container planets/mars/MarsModule.java:318-319、Gui planets/mars/MarsModuleClient.java:150-151 |
两者都挂在 GuiIdsPlanets.MACHINE_MARS 下(planets/mars/MarsModule.java:314、planets/mars/MarsModuleClient.java:146)。