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 的角色,不能参与阵列。

相关条目