控制面板
[!INFO] 源码:
ControlPanelItem.java(物品)/ControlPanelPart.java(部件)/ControlPanelMaterial.java
Project Blue 的核心物品与核心部件。一个控制面板是一个 CodeChicken multipart 部件(pb_controlpanel),贴在方块任意一个面上,内含可缩放的开关/按钮/灯阵列,通过 Project Red 的 Bundled Cable 收发 16 通道信号。
注册信息
| 项 | 值 |
|---|---|
| 物品注册名 | gcewing_projectblue:controlPanel |
| 物品类 | ControlPanelItem extends ItemMultiPartJ |
| 部件类型名 | pb_controlpanel(MultiPartRegistry.registerParts) |
| 部件类 | ControlPanelPart extends PBFacePart,实现 IConnectable、IBundledEmitter |
| 最大堆叠 | 64(Item 默认,未覆盖) |
| 创造模式子项 | 3 个:tile.wood 的 4×4 / 3×3 / 2×2 |
| 显示名 | 本地化名 + (4x4) 尺寸后缀 |
| Tooltip | Made from <基材本地化名> |
尺寸变体
2×2 / 3×3 / 4×4 三档,详见 控制面板尺寸变体。
| 尺寸 | gridSize |
格子数 |
|---|---|---|
| 4×4 | 4 | 16 |
| 3×3 | 3 | 9 |
| 2×2 | 2 | 4 |
安装方式(mounting)
| 值 | 模式 | 说明 |
|---|---|---|
| 0 | flush | 嵌入式,与方块面齐平 |
| 1 | surface | 表面安装,贴附在方块外侧(surfaceMountRotation = rotZ(180)) |
放置时由 FacePlacementGrid.getHitSlot(vhit, sideHit) 判定:若放置槽位 == 点击面(slot == sideHit ^ 1)则 surface,否则 flush;flush 且 slot <= 1 时 rot ^= 2。
用潜行 + 螺丝刀可随时切换(见 控制面板交互动作)。
基材(ControlPanelMaterial)
面板外观与可放置的 BLANK 盖板由微方块材质名决定,存 NBT 字符串 mat:
- 默认材质名
tile.wood ControlPanelMaterial.forName通过MicroMaterialRegistry.getMaterial(name)解析为 Block + metadata- 解析不到时回退为
Blocks.planksmeta 0(不报错) - 允许任何 ForgeMicroblock 材质,所以理论上任意方块都能做面板
物品 NBT 默认结构(ControlPanelMaterial.newStack):mat、controlTypes、controlMetadata、controlStates、channelColors、labels(32 个空串)、gridSize。
通道与颜色
每个格子有独立的 channelColors[i](0–15),决定它监听/输出哪一路 bundled 信号。
- 默认
channelColors[i] = i(格子 i 绑定通道 i) - 用喷漆罐或染料点击可改(详见 控制面板交互动作)
- 用喷漆罐颜色 16(去漆)会把通道重置为
setChannelColor(i, i),即「按格号自动」
标签文字
每格可编辑 2 行文字,每行最多 6 个字符(ControlPanelLabelScreen.numLines = 2、maxLength = 6)。
- 用木炭点击格子打开
ControlPanelLabelScreen - 上下键 / 回车切换行,退格删除,Esc 关闭(关闭不提交以外的校验)
- 光标以
> <包裹并每 6 次 tick 闪烁 - 输入通过
ProjectBlueChannel的EDIT_CONTROL_PANEL_TEXT/UPDATE_CONTROL_PANEL_TEXT同步
合成
制作面板
2×2(CraftControlPanel):
[石锯] [空]
[空] [空心盖板]
- 石锯 = ForgeMicroblock 的
sawStone - 空心盖板 =
itemMicroPart且 meta ==hollowCoverMeta(257)
调整尺寸
2×2,「石锯 + 面板」循环 4→3→2→4,见 控制面板尺寸变体。
制作微型控件
2×2,「石锯 + 全身尺寸控件」→ 8 个微型件(CraftMiniatureItem)。原料对应关系:
| 原料 | 产物 | meta |
|---|---|---|
| 原版拉杆 | miniatureLever | 16 |
| 原版石头按钮 | miniatureButton | 16 |
| 原版木头按钮 | miniatureButton | 17 |
| Project Red Illumination fixture | miniatureLamp | 同 meta |
| 盖板(meta 1) | miniatureCover | 带 mat NBT |
NBT 字段
| 键 | 类型 | 说明 |
|---|---|---|
mat |
String | 基材的微方块材质名 |
gridSize |
int | 2/3/4 |
controlTypes |
byte[16] | 每格控件类型 ordinal |
controlMetadata |
byte[16] | 每格控件附加数据(放置时的 meta) |
controlStates |
byte[16] | 每格当前状态 |
channelColors |
byte[16] | 每格通道色 |
labels |
List[32] | 16 格 × 2 行的字符串 |
部件额外持久化(不进物品):side、rot、mounting、connectionMask。
网络同步
部件用 writeDesc / readDesc 做增量同步:基材名 + mounting + gridSize + 每格 4 字节 + 2 个标签串。信号变化通过 changed() → markDirty() + sendDescUpdate()。