TileEntityTelepadFake(短程传送机假方块)
事实基准:
/Users/evlos/a/mirror/Galacticraft(master,minecraftVersion = 1.7.10)逐行读源码。
注册信息
| 属性 | 值 | 来源 |
|---|---|---|
| TileEntity 注册名 | Fake Short Range Telepad |
AsteroidsModule.java:320 |
| 注册类 | micdoodle8.mods.galacticraft.planets.asteroids.tile.TileEntityTelepadFake |
同上 |
| 关联方块 | AsteroidBlocks.fakeTelepad = new BlockTelepadFake("telepadFake") |
planets/asteroids/blocks/AsteroidBlocks.java:44 |
| 方块→TE 分派 | createNewTileEntity 无条件返回本 TE |
planets/asteroids/blocks/BlockTelepadFake.java:150 |
| 父类 | TileBaseElectricBlock(→ TileBaseUniversalElectrical → EnergyStorageTile) |
planets/asteroids/tile/TileEntityTelepadFake.java:17、core/energy/tile/TileBaseElectricBlock.java:23-24、core/energy/tile/TileBaseUniversalElectrical.java:34 |
| 实现接口 | 无(类声明上不 implements 任何接口) |
planets/asteroids/tile/TileEntityTelepadFake.java:17 |
| 所属 modid | GalacticraftMars(Asteroids 模块复用 Constants.MOD_ID_PLANETS) |
core/Constants.java:8 |
| 槽位数 | 无(不实现 IInventory) |
类声明 planets/asteroids/tile/TileEntityTelepadFake.java:17 |
⚠ 假方块被登记在 hiddenBlocks 里——
planets/asteroids/blocks/AsteroidBlocks.java:49:
GCBlocks.hiddenBlocks.add(AsteroidBlocks.fakeTelepad);
即不能由玩家在创造模式直接取得,只能由
TileEntityShortRangeTelepad 的 onCreate 自动铺设。
槽位与字段
本类没有任何 ItemStack[] 字段,getSizeInventory() 不存在。
| 字段 | 类型 | 含义 | 源码 |
|---|---|---|---|
mainBlockPosition |
BlockVec3,@NetworkedField(CLIENT) |
指向主块(TileEntityShortRangeTelepad)的坐标 |
planets/asteroids/tile/TileEntityTelepadFake.java:19-21(源码注释 // The the position of the main block,原文如此) |
mainTelepad |
WeakReference<TileEntityShortRangeTelepad> |
主块的弱引用缓存 | planets/asteroids/tile/TileEntityTelepadFake.java:23 |
能量
⚠ 本类自己不做能源设备——它的 storage 每 tick 被主块覆写。
planets/asteroids/tile/TileEntityTelepadFake.java:46-58:
public void updateEntity() {
super.updateEntity();
final TileEntityShortRangeTelepad telepad = this.getBaseTelepad();
if (telepad != null) {
this.storage.setCapacity(telepad.storage.getCapacityGC());
this.storage.setMaxExtract(telepad.storage.getMaxExtract());
this.storage.setMaxReceive(telepad.storage.getMaxReceive());
this.extractEnergyGC(null, telepad.receiveEnergyGC(null, this.getEnergyStoredGC(), false), false);
}
}
| 项目 | 值 | 来源 |
|---|---|---|
| 缓冲容量 | 继承默认 16000 gJ,但每 tick 被主块的 getCapacityGC() 覆盖 |
core/energy/tile/EnergyStorageTile.java:18、:21;覆盖见 planets/asteroids/tile/TileEntityTelepadFake.java:53 |
| 最大输入 | 继承默认 25 gJ/t(new EnergyStorage(STANDARD_CAPACITY, 10) 两参构造展开 maxReceive = 2.5F * 10),随后被主块的 getMaxReceive() 覆盖 |
core/energy/tile/EnergyStorage.java:19-21;覆盖见 planets/asteroids/tile/TileEntityTelepadFake.java:55 |
| 最大输出 | 同样每 tick 被主块覆盖(普通 50 / hardMode 115) | planets/asteroids/tile/TileEntityTelepadFake.java:54、planets/asteroids/tile/TileEntityShortRangeTelepad.java:77 |
| 能量流转 | 第 4 行把本块已存的电全部转给主块(telepad.receiveEnergyGC(...)),保证电只记在主块账上 |
planets/asteroids/tile/TileEntityTelepadFake.java:56 |
⚠ 不要给假方块写独立的「16000 gJ 电池」——它的容量、输入、输出三值都每 tick 跟随主块, 独立写死即为编造。
tick / 特殊机制
updateEntity()(:46-58)是本类唯一的 tick 逻辑,做上面那 4 行同步。
主块解析
getBaseTelepad()(:60-,private):
| 步骤 | 行为 | 源码 |
|---|---|---|
| 1 | mainBlockPosition == null → 返回 null |
planets/asteroids/tile/TileEntityTelepadFake.java:61-63 |
| 2 | 弱引用为空则按坐标取 TE,类型对得上才建引用 | planets/asteroids/tile/TileEntityTelepadFake.java:65-71 |
| 3 | 仍拿不到(世界未加载 / 不是主块 TE)→ 把主块坐标处清成空气 | planets/asteroids/tile/TileEntityTelepadFake.java:73-74 |
| 4 | 弱引用已失效 → 返回 null |
planets/asteroids/tile/TileEntityTelepadFake.java:76-80 |
⚠ 第 3 步会主动拆掉主块——这是源码原样行为,用于主块被移除时清理残留假方块, 不是「假方块能拆传送机」。
与方块 / 主块的联动
| 行为 | 触发方 | 源码 |
|---|---|---|
setMainBlock(BlockVec3):记录主块并 markBlockForUpdate |
BlockTelepadFake.makeFakeBlock → BlockTelepadFake.java:91 |
planets/asteroids/tile/TileEntityTelepadFake.java:25-31 |
onBlockRemoval():通知主块拆解 |
BlockTelepadFake 在邻居变化时 |
planets/asteroids/tile/TileEntityTelepadFake.java:33-39、方块侧 BlockTelepadFake.java:119-120 |
onActivated(EntityPlayer):直接转发给主块的 onActivated(玩家右键假方块 = 右键主机) |
玩家交互 | planets/asteroids/tile/TileEntityTelepadFake.java:41-44 |
GUI / Container
无。 假方块没有自己的容器;右键被 onActivated 转发到主块后,
打开的是 TileEntityShortRangeTelepad 的 GUI。