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

相关条目