面板显示设置
[!INFO] 源码
src/main/java/com/neirecipepanels/PanelSettings.java、client/GuiRecipePanelConfig.java
每个已放置的面板可以单独改两样东西:顶部标题文字、以及背景是否透明。这些设置存在 TileEntity 的 cfg NBT 标签里,跟着面板走。
设置项
| 字段 | NBT 键 | 类型 | 默认 | 上限 | 说明 |
|---|---|---|---|---|---|
customName |
name |
String | ""(空) |
48 字符 | 自定义标题。为空时用 NEI handler 自己报的配方名 |
transparent |
transparent |
boolean | false |
— | 背景是否透明 |
PanelSettings.MAX_NAME = 48。trim(name) 在 null 时返回 "",超过 48 字符则截断到 48——服务端与客户端都走这个方法,所以长度上限在两端一致。
toNBT() 是稀疏写入:空标题不写 name,transparent 为 false 时不写 transparent。isEmpty() 判断两者都处于默认态时 setSettings(null) 生效(RecipePanelTile.setSettings 会把空标签也归一为 null),避免给每个面板都塞一份空配置。
配置界面
在 配方面板方块 上潜行右键打开 GuiRecipePanelConfig(由 RecipePanelBlock.onBlockActivated 判断 player.isSneaking() 分流)。
界面元素:
| 控件 | 位置 | 说明 |
|---|---|---|
| 标题文字 | 屏幕正中上方 | neirecipepanels.config.title = Recipe Panel |
| 名称标签 | 输入框上方 | neirecipepanels.config.name = Name |
| 文本输入框 | cx-100, height/2-30,200×20 |
setMaxStringLength(PanelSettings.MAX_NAME),默认聚焦 |
| 背景按钮(id 1) | cx-100, height/2,200×20 |
文字在 Shown / Hidden 之间切换 |
| 完成按钮(id 0) | cx-100, height/2+28,200×20 |
gui.done |
背景按钮的两种文案:
| 状态 | 键 | 文本 |
|---|---|---|
| 有背景 | neirecipepanels.config.background.shown |
Background: Shown |
| 透明 | neirecipepanels.config.background.hidden |
Background: Hidden |
按键行为:ESC 或回车/小键盘回车(输入框聚焦时)直接关闭;nameField.textboxKeyTyped 转发其余按键。initGui / onGuiClosed 各自调 Keyboard.enableRepeatEvents(true/false) 管理长按重复。
doesGuiPauseGame() 返回 false,所以单机世界不会因为开着这个界面而暂停。
什么时候才真的发包
onGuiClosed 里先比较新旧值:标题先 trim() 空白再截断,然后
name.equals(initialName) && transparent == initialTransparent→ 直接返回,一个包都不发- 有任一变化 →
NeiRecipePanels.NETWORK.sendToServer(new ConfigurePanelMessage(tile.xCoord, tile.yCoord, tile.zCoord, name, transparent))
也就是关掉界面即提交,没有单独的"保存"按钮。服务端收到后的校验见 刻印流程 的 ConfigurePanelMessage.Handler.apply(含 8 格距离上限)。
设置在画面上的体现
两个字段都由 面板渲染管线 消费:
customName非空 →drawNamePlate画它;否则用frozen.recipeName(来自handler.getRecipeName())transparent = false→ 先画九宫格拉伸的原版textures/gui/demo_background.png作背景,标题用实色transparent = true→ 跳过背景绘制,标题改用drawStringWithShadow(阴影保证压在墙面上仍可读),且只把各材料格的矩形区域回填为不透明
PanelFboManager.Panel.isStale 用 NBT 标签的对象身份判断是否需要重绘,所以改设置会立刻触发一次重渲染。