Information Panel 阵列
基本信息
| 属性 | 值 |
|---|---|
| 组成方块 | IC2NuclearControl:blockNuclearControlMain |
| 核心(Core)变体 | metadata 4(TileEntityInfoPanel)或 metadata 9(TileEntityAdvancedInfoPanel) |
| 扩展(Extender)变体 | metadata 5(TileEntityInfoPanelExtender)或 metadata 10(TileEntityAdvancedInfoPanelExtender) |
| 管理类 | shedar.mods.ic2.nuclearcontrol.panel.ScreenManager |
| 阵列数据结构 | shedar.mods.ic2.nuclearcontrol.panel.Screen(持有 minX/minY/minZ–maxX/maxY/maxZ 六个边界) |
| 成员接口 | shedar.mods.ic2.nuclearcontrol.IScreenPart |
本条目描述的是由主方块 4 个变体拼成的可扩展显示阵列,不是独立注册的方块。metadata 4/5/9/10 的注册证据见 Nuclear Control 主方块。
功能
一块单独的 Information Panel 只能显示一行很窄的内容。把核心面板周围贴满扩展方块,阵列会自动合并成一个更大的「屏幕」,把核心面板上定义的字符串按行列铺开显示。
阵列的合并与重建全部由 ScreenManager 负责,且只在服务端执行:registerInfoPanel 与 registerInfoPanelExtender 开头都有 if (FMLCommonHandler.instance().getEffectiveSide().isClient()) return;(panel/ScreenManager.java:189-190、:206-207),客户端只按服务端同步来的 Screen 边界渲染。
Screen 用 6 个整数字段记录轴对齐包围盒(panel/Screen.java:12-21),并实现 isBlockPartOf(坐标落在盒内即成员,Screen.java:45-50)与 isBlockNearby(坐标贴在该盒 6 个面之一的正外侧、且在其余两轴的跨度内,Screen.java:34-43)。
拼装规则
扩展方块被接受为阵列成员需同时满足 4 个条件(isValidExtender,panel/ScreenManager.java:44-52):
| 条件 | 判定依据 |
|---|---|
| 方块必须是主方块 | world.getBlock(...) != blockNuclearControlMain 直接返回 false |
| 必须是 Extender 的 TileEntity | instanceof TileEntityInfoPanelExtender |
| 普通与高级扩展不可混用 | advanced ^ (tileEntity instanceof TileEntityAdvancedInfoPanelExtender),异或判定 |
| 朝向与核心一致且尚未归属其它屏幕 | facing != core.facing 返回 false;getScreen() != null 返回 false |
包围盒扩张算法见 updateScreenBound(panel/ScreenManager.java:54-101):每次只沿一个轴推进一步,并且整层新切片必须全部由合法扩展方块填满才接受该步(allOk 任一格失败即 break)。单个方向最多推进 20 步(while (steps < 20))。
放置扩展方块时会触发一次重建:先收集贴边且朝向一致的既有屏幕,销毁后与「尚未使用的核心面板」一起重新尝试构建(panel/ScreenManager.java:206-248)。
数值
| 数值名 | 值 |
|---|---|
| 单方向最大扩张步数 | 20(ScreenManager.java:64 的循环上界) |
| 核心面板数量 | 每块 Screen 恰好 1 个核心(Screen.getCore / setCore) |
| 阵列光照 | 核心通电时整块屏幕返回光照等级 7(BlockNuclearControlMain.java:565-574) |
| 序列化字段 | minX minY minZ maxX maxY maxZ(Screen.toTag,Screen.java:113-124) |
交互
| 触发 | 行为 |
|---|---|
| 阵列建立 / 变更 | Screen.init(force, world) 遍历包围盒,对每个 IScreenPart 调用 setScreen(this) 并 markBlockForUpdate + func_147451_t(Screen.java:52-66) |
| 阵列拆除 | Screen.destroy 把成员的 Screen 引用置空并调用 updateData()(Screen.java:68-85) |
| 核心面板通电状态变化 | Screen.turnPower(on, world) 在状态翻转时重刷整块屏幕(Screen.java:87-98) |
| 成员数据更新 | 成员通过 IScreenPart.updateData() 自行刷新(IScreenPart.java:11) |
| 区块卸载 / 重载 | registerInfoPanel 检测到 screen.isBlockPartOf(panel) 时先销毁旧屏幕再重建(panel/ScreenManager.java:194-199) |
已知限制
- 扩展方块与核心必须朝向相同,否则永远不会被并入(
ScreenManager.java:50)。 - 普通扩展与高级扩展通过异或判定互斥,混用会导致整层扩张失败(
ScreenManager.java:48)。 TileEntityInfoPanel/TileEntityInfoPanelExtender之外的其他 7 个变体都不实现IScreenPart的角色,不能参与阵列。
相关条目
- Nuclear Control 主方块 - 构成阵列的 4 个变体及其余 7 个变体
- Information Panel Memory Card - 用来远程下载面板显示内容的物品
- 卡片与面板 API -
IScreenPart所在接口的完整说明