TileEntityShortRangeTelepad(短程传送机)
事实基准:
/Users/evlos/a/mirror/Galacticraft(master,minecraftVersion = 1.7.10)逐行读源码。
注册信息
| 属性 | 值 | 来源 |
|---|---|---|
| TileEntity 注册名 | Short Range Telepad |
AsteroidsModule.java:319 |
| 注册类 | micdoodle8.mods.galacticraft.planets.asteroids.tile.TileEntityShortRangeTelepad |
同上 |
| 关联方块 | AsteroidBlocks.shortRangeTelepad = new BlockShortRangeTelepad("telepadShort") |
planets/asteroids/blocks/AsteroidBlocks.java:43 |
| 方块→TE 分派 | createTileEntity 无条件返回本 TE |
planets/asteroids/blocks/BlockShortRangeTelepad.java:68 |
| 父类 | TileBaseElectricBlock(→ TileBaseUniversalElectrical → EnergyStorageTile) |
planets/asteroids/tile/TileEntityShortRangeTelepad.java:40、core/energy/tile/TileBaseElectricBlock.java:23-24、core/energy/tile/TileBaseUniversalElectrical.java:34 |
| 实现接口 | IMultiBlock / IInventory / ISidedInventory |
planets/asteroids/tile/TileEntityShortRangeTelepad.java:40-41 |
| 所属 modid | GalacticraftMars(Constants.MOD_ID_PLANETS,Asteroids 模块复用同一 modid) |
core/Constants.java:8 |
| 槽位数 | 1 | 见下节 |
槽位与字段
planets/asteroids/tile/TileEntityShortRangeTelepad.java:71:
private ItemStack[] containingItems = new ItemStack[1];
getSizeInventory()(:506-509,本类覆写)返回 this.containingItems.length,
即恒为 1。
| 槽位 | 用途 | 源码 |
|---|---|---|
| 0 | 电池槽,只收 GC 电力物品 | planets/asteroids/tile/TileEntityShortRangeTelepad.java:373-375 |
| 判定 | 源码 |
|---|---|
isItemValidForSlot = slotID == 0 && ItemElectricBase.isElectricItem(...) |
planets/asteroids/tile/TileEntityShortRangeTelepad.java:373-375 |
getAccessibleSlotsFromSide 恒返回 {0} |
planets/asteroids/tile/TileEntityShortRangeTelepad.java:377-380 |
canInsertItem = isItemValidForSlot |
planets/asteroids/tile/TileEntityShortRangeTelepad.java:382-385 |
canExtractItem = slotID == 0(电池可被漏斗抽出) |
planets/asteroids/tile/TileEntityShortRangeTelepad.java:387-390 |
getInventoryStackLimit() = 64 |
planets/asteroids/tile/TileEntityShortRangeTelepad.java:356-359 |
getElectricalOutputDirections() 返回空集——不能给别人供电 |
planets/asteroids/tile/TileEntityShortRangeTelepad.java:392-395 |
同步字段(@NetworkedField(CLIENT)) |
初值 | 源码 |
|---|---|---|
address |
-1 |
planets/asteroids/tile/TileEntityShortRangeTelepad.java:54-55 |
addressValid |
false |
planets/asteroids/tile/TileEntityShortRangeTelepad.java:57-58 |
targetAddress |
-1 |
planets/asteroids/tile/TileEntityShortRangeTelepad.java:60-61 |
teleportTime |
0 |
planets/asteroids/tile/TileEntityShortRangeTelepad.java:65-66 |
owner |
"" |
planets/asteroids/tile/TileEntityShortRangeTelepad.java:68-69 |
teleporting |
— | planets/asteroids/tile/TileEntityShortRangeTelepad.java:73-74 |
能量
| 项目 | 值 | 来源 |
|---|---|---|
| 缓冲容量 | 16000 gJ(EnergyStorageTile.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 |
| 构造时最大输出 | 50 gJ/t(普通)/ 115 gJ/t(hardMode) | planets/asteroids/tile/TileEntityShortRangeTelepad.java:76-78 |
| 单次传送耗电 | 2500 gJ(ENERGY_USE_ON_TELEPORT) |
planets/asteroids/tile/TileEntityShortRangeTelepad.java:52 |
⚠ 单位是 gJ,不是 RF/t、不是 EU/t。
⚠ maxReceive 是 25,不是 10。 EnergyStorage 的两参构造
(core/energy/tile/EnergyStorage.java:19-21)把第二个参数同时用作
maxReceive = 2.5F * maxTransfer 和 maxExtract = maxTransfer。
tick / 特殊机制
多方块结构(本篇核心)
⚠ 短程传送机是 GC 五大多方块之一:3 × 2 × 3,主块在正下方。
onCreate(BlockVec3)(planets/asteroids/tile/TileEntityShortRangeTelepad.java:301-322):
for (int y = 0; y < 3; y += 2) { // y = 0 和 y = 2
for (int x = -1; x <= 1; x++) { // 3 × 3
for (int z = -1; z <= 1; z++) {
...
((BlockTelepadFake) AsteroidBlocks.fakeTelepad)
.makeFakeBlock(this.worldObj, vecToAdd, placedPosition, y == 0 ? 1 : 0);
| 项目 | 值 / 规则 | 源码 |
|---|---|---|
| 尺寸 | 3 × 2 × 3(y 步长 2 → 底面 + 顶面两层,中间空) |
planets/asteroids/tile/TileEntityShortRangeTelepad.java:304-309 |
| 主块 | 放置位置本身(placedPosition),即下层中心 |
planets/asteroids/tile/TileEntityShortRangeTelepad.java:315 |
| 假方块 | AsteroidBlocks.fakeTelepad(new BlockTelepadFake("telepadFake")) |
planets/asteroids/blocks/AsteroidBlocks.java:44 |
| 上层中心 | 也是假方块(y == 0 ? 1 : 0 给上层 metadata 0) |
planets/asteroids/tile/TileEntityShortRangeTelepad.java:317 |
| 超出世界高度 | placedPosition.y + y > buildHeight 时直接 return(不建) |
planets/asteroids/tile/TileEntityShortRangeTelepad.java:303-307 |
| 拆解 | onDestroy 对同样 18 格调 func_147480_a(y==0 && x==0 && z==0 为 false 表示保留主块) |
planets/asteroids/tile/TileEntityShortRangeTelepad.java:324-337 |
| 渲染包围盒 | (x-1, y, z-1) 到 (x+2, y+4, z+2) |
planets/asteroids/tile/TileEntityShortRangeTelepad.java:339-349 |
假方块 TE 见 TileEntityTelepadFake。
传送判定
| 常量 | 值 | 含义 | 源码 |
|---|---|---|---|
MAX_TELEPORT_TIME |
150 | 一次传送的蓄力 tick 数 | planets/asteroids/tile/TileEntityShortRangeTelepad.java:50 |
TELEPORTER_RANGE |
256 | 目标搜索半径(按平方比较) | planets/asteroids/tile/TileEntityShortRangeTelepad.java:51、:482 |
ENERGY_USE_ON_TELEPORT |
2500 | 单次传送耗电 | planets/asteroids/tile/TileEntityShortRangeTelepad.java:52 |
updateTarget()(:462-493)返回 EnumTelepadSearchResult 四态:
| 状态 | 触发条件 | 源码 |
|---|---|---|
NOT_FOUND |
targetAddress < 0 或地址查无此台 |
planets/asteroids/tile/TileEntityShortRangeTelepad.java:463-474 |
TOO_FAR |
同维度但 distance >= 256² |
planets/asteroids/tile/TileEntityShortRangeTelepad.java:482-488 |
WRONG_DIM |
目标在别的维度 | planets/asteroids/tile/TileEntityShortRangeTelepad.java:489-492 |
VALID |
同维度且在范围内 | planets/asteroids/tile/TileEntityShortRangeTelepad.java:483-484 |
⚠ TOO_FAR / WRONG_DIM 是源码自带的判定结果,不代表「跨维度传送」功能存在。
tick 周期
| 行为 | 频率 | 源码 |
|---|---|---|
| 重新登记地址 / 复查目标 | 每 40 tick | planets/asteroids/tile/TileEntityShortRangeTelepad.java:101-104 |
蓄力判定(范围内有实体且电够 → teleporting = true) |
每 5 tick,或蓄力中每 tick | planets/asteroids/tile/TileEntityShortRangeTelepad.java:106-129 |
teleportTime 累加 / 回退 |
每 tick(else 分支 --teleportTime,下限 0) |
planets/asteroids/tile/TileEntityShortRangeTelepad.java:132、:224 |
蓄满 MAX_TELEPORT_TIME 后执行传送并清零 |
— | planets/asteroids/tile/TileEntityShortRangeTelepad.java:134-222 |
站立检测范围是 3 × 2 × 3 的 AABB(xCoord..xCoord+1, yCoord..yCoord+2),
只搜 EntityLivingBase(:109-117、:142-150)。
⚠ 扣电时主台与目标台各扣 2500,但源码写的是
destTelepad.storage.setEnergyStored(this.storage.getEnergyStoredGC() - ENERGY_USE_ON_TELEPORT)
(:174-177)——第二行用主台的值覆盖了目标台,这是源码原样,不做修正性描述。
canTeleportHere()(:80-97)返回码:0 可用 / 1 地址无效 / 2 电量不足 /
-1 客户端调用。
GUI / Container
| GUI 类 | Container 类 | 分派处 |
|---|---|---|
planets.asteroids.client.gui.GuiShortRangeTelepad |
planets.asteroids.inventory.ContainerShortRangeTelepad |
打开 GUI planets/asteroids/tile/TileEntityShortRangeTelepad.java:291-298(GuiIdsPlanets.MACHINE_ASTEROIDS)、Container AsteroidsModule.java:252-255 |