配方面板方块

[!INFO] 注册名 neirecipepanels:recipe_panel | 类 RecipePanelBlock | 源码 src/main/java/com/neirecipepanels/block/RecipePanelBlock.java

基本信息

属性 值
注册名 neirecipepanels:recipe_panel
方块类 RecipePanelBlock(继承 BlockContainer)
TileEntity RecipePanelTile(注册 ID neirecipepanels:recipe_panel)
材质 Material.wood
硬度 0.3F
爆炸抗性 未覆写,继承基类默认 0
脚步声 soundTypeWood
渲染类型 getRenderType() 返回 -1,不进区块渲染器
区块图标 neirecipepanels:recipe_blueprint
碰撞箱 getCollisionBoundingBoxFromPool 返回 null(完全不碰撞)
不透明度 isOpaqueCube() = false,renderAsNormalBlock() = false

方块本体不可见(isOpaqueCube / renderAsNormalBlock 均为 false),所有画面由 RecipePanelRenderer 这个 TileEntity 特殊渲染器绘制。区块图标虽然指向 recipe_blueprint,但因为不走普通方块渲染,游戏中看不到。

放置朝向(metadata)

metadata 0–5 复用 ForgeDirection 的序号,含义是面板正面朝向,而支撑方块在相反方向:

metadata 朝向 面板贴片所在的那一面
0 下(DOWN) 顶面(Y 15/16 处)
1 上(UP) 底面
2 北(NORTH) 南面
3 南(SOUTH) 北面
4 西(WEST) 东面
5 东(EAST) 西面
其他值 — default 分支给出整方块边界

setBoundsForFace 把边界压成贴墙的 1/16 薄片,DEPTH = 1F/16F。贴片紧贴支撑方块那一侧,玩家从正面(metadata 指定方向)观看。

放置时 metadata 直接取被点击面的数值:ItemRecipePanel.onItemUse 调用 world.setBlock(px, py, pz, ModBlocks.recipePanel, side, 3),side 既是 ForgeDirection.getOrientation(side) 的输入,也是写入的 metadata。

支撑方块要求

onNeighborBlockChange(仅服务端)按 metadata 反推支撑方块并检查其对应面:

  • 取 face = ForgeDirection.getOrientation(metadata)
  • 检查 world.isSideSolid(x - face.offsetX, y - face.offsetY, z - face.offsetZ, face, true)
  • 该面不是实心就把方块替换为空气(setBlockToAir)

所以贴住的那面墙被挖掉时面板自动掉落消失。

交互

触发 行为
右键(未潜行) 客户端调用 NeiRecipePanels.proxy.openPanelRecipe(snapshot, false),在 NEI 中打开该面板编码的合成配方
潜行右键 客户端调用 NeiRecipePanels.proxy.openPanelConfig(x, y, z),打开面板配置界面
破坏 breakBlock 手动生成掉落物,保留 snapshot 与设置 NBT

onBlockActivated 整段包在 if (world.isRemote) 内且无论是否成功都返回 true(吞掉这次点击,防止放置物品或开容器)。

掉落物

getItemDropped 返回 null(不参与普通掉落判定),改由 breakBlock 主动生成:

  • 取 panelFor(world, x, y, z):从 TileEntity 读 snapshot 与 settings,复制一份 NBT 重新组装成物品
  • 在方块中心 x+0.5, y+0.5, z+0.5 生成 EntityItem
  • delayBeforeCanPickup = 10(10 tick 后才能捡)

getPickBlock 同样返回带 NBT 的面板物品,所以中键取物能拿回正确的面板。

TileEntity 数据

RecipePanelTile 继承 TileEntity,canUpdate() 返回 false(不参与随机刻)。两个字段写入 NBT:

字段 NBT 键 说明
snapshot snapshot 刻印下来的配方快照,见刻印流程
settings cfg 显示设置;空或无子标签时存为 null
  • setSnapshot / setSettings 都会调 sync():markDirty() + worldObj.markBlockForUpdate(x, y, z)
  • getDescriptionPacket 返回 S35PacketUpdateTileEntity(携带坐标、metadata 与完整 NBT)
  • onDataPacket 走 readFromNBT(packet.func_148857_g())(SRG 名 func_148857_g 即 S35PacketUpdateTileEntity.getChatComponent())
  • settings() 把 cfg 反序列化为 PanelSettings 对象,供渲染层读取

相关条目