TileEntityScreen(屏幕方块)

事实基准:/Users/evlos/a/mirror/Galacticraft(master,minecraftVersion = 1.7.10)逐行读源码。

注册信息

属性 值 来源
TileEntity 注册名 View Screen GalacticraftCore.java:741
注册类 micdoodle8.mods.galacticraft.core.tile.TileEntityScreen 同上
关联方块 GCBlocks.screen = new BlockScreen("viewScreen") core/blocks/GCBlocks.java:129
方块→TE 分派 createNewTileEntity 无条件返回本 TE core/blocks/BlockScreen.java:137-140
父类 原版 net.minecraft.tileentity.TileEntity core/tile/TileEntityScreen.java:21
实现接口 无(类声明上不 implements 任何接口) core/tile/TileEntityScreen.java:21
所属 modid GalacticraftCore core/Constants.java:7
槽位数 无(不实现 IInventory) 类声明 core/tile/TileEntityScreen.java:21

⚠ 屏幕方块直接继承原版 TileEntity,不经 TileEntityAdvanced—— 所以它没有 GC 的 @NetworkedField 同步,没有 IPacketReceiver, 也不存在 16000 gJ 电容。

槽位与字段

本类没有任何 ItemStack[] 字段,getSizeInventory() 不存在。

字段 类型 / 初值 含义 源码
FRAMEBORDER static float = 0.098F 边框宽度,仅用于渲染 core/tile/TileEntityScreen.java:23(源码注释即 // used for rendering)
imageType int 当前显示的屏幕类型编号 core/tile/TileEntityScreen.java:24
screen DrawGameScreen 仅客户端持有的渲染器 core/tile/TileEntityScreen.java:25、:39-40
connectedUp/Down/Left/Right boolean 四面是否与同朝向屏幕相连 core/tile/TileEntityScreen.java:26-29
connectionsUp/Down/Left/Right int 该方向上连了几块(可 >1) core/tile/TileEntityScreen.java:30-33
isMultiscreen boolean 是否是多屏拼接体 core/tile/TileEntityScreen.java:34
screenOffsetx / screenOffsetz int = 0 多屏拼接时的像素偏移 core/tile/TileEntityScreen.java:36-37
refreshOnUpdate boolean = false 仅客户端:下一 tick 强制重连 core/tile/TileEntityScreen.java:39-40

能量

无。 父类是原版 TileEntity(core/tile/TileEntityScreen.java:21), 不继承 EnergyStorageTile,没有 gJ 容量、不耗电、不能接电网。

tick / 特殊机制

core/tile/TileEntityScreen.java:248-251:

public boolean canUpdate() {
    return false;
}

⚠ 屏幕方块的 updateEntity() 根本不会被调用(canUpdate() 返回 false)—— 它完全靠事件驱动更新,不是 tick 驱动。

行为 触发方式 源码
客户端请求屏幕数据 validate() 时发 S_UPDATE_VIEWSCREEN_REQUEST core/tile/TileEntityScreen.java:42-53
广播连接状态 updateClients() 发 C_UPDATE_VIEWSCREEN(坐标 + imageType + 4 位连接 flag) core/tile/TileEntityScreen.java:55-74
切频道 右键 → BlockScreen.onMachineActivated → changeChannel() core/blocks/BlockScreen.java:147-156
邻居变化后重连 onNeighborBlockChange → refreshConnections(true) core/blocks/BlockScreen.java:158-164
拆块 / 旋转时拆散多屏 invalidate() → breakScreen(meta) core/tile/TileEntityScreen.java:76-81、:88

屏幕类型编号

changeChannel()(:256-260)的循环上界来自 GalacticraftRegistry.getMaxScreenTypes()(api/GalacticraftRegistry.java:224-226), 而它返回的 maxScreenTypes 是一个运行时计数器(api/GalacticraftRegistry.java:37), 每注册一个 IGameScreen 就 ++(:217-222)。

GC 本体在 core/GalacticraftCore.java:503-507 注册了 5 个内置屏幕类型:

imageType 渲染器 源码注释描述
0 GameScreenBasic // Type 0 - blank
1 GameScreenBasic // Type 1 - local satellite view
2 GameScreenCelestial // Type 2 - solar system
3 GameScreenCelestial // Type 3 - local planet
4 GameScreenCelestial // Type 4 - render test

⚠ 「总共有 5 种屏幕」不准确——core/GalacticraftCore.java:585 还注册了第 6 个 new GameScreenText()(源码注释 // Screen API demo),且 core/GalacticraftCore.java:586-587 的注释明确说明附属 mod 可在 postInit 里继续 registerScreen(IGameScreen) 追加。 所以频道总数随整合包而变,上表只是 GC 自带的 6 个中的前 5 个。

多屏拼接

相邻屏幕按相同 metadata(朝向)沿水平面连成一片(breakScreen 的判定见 :111)。 getScaledOxygenLevel 式的尺寸常量在源码里是运行时算的(checkScreenSize(),:305), 源码中不存在固定的「几×几」拼接上限常量——不要写成定值。

GUI / Container

无 Container、无 GuiHandler 分派。 屏幕内容由客户端 core/client/gui/screen/DrawGameScreen.java(driver 字段见 :33、:46) 与 core/client/gui/screen/GameScreenText.java 直接绘制。

相关条目