配方面板方块
[!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对象,供渲染层读取