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 直接绘制。