跳到正文
烈焰甘蔗Wiki

Framing Table(镶框桌)

基本信息

属性 值
注册名 StorageDrawers:framingTable
TileEntity TileEntityFramingTable
硬度 2.5
爆炸抗性 构造器只调用 setHardness(2.5f),从未调用 setResistance,也未覆写 getExplosionResistance;材质 Material.wood,具体数值取父类默认值(本仓库源码中无此数值)
透明性 否
声音 木质

功能

镶框桌(Framing Table)是一个5 格配方的 GUI 工作台,用于给已经合成好的自定义抽屉物品(fullCustom* / trimCustom)重新指定外观材质。

⚠️ 订正:原文"把标准木质抽屉转换成自定义材质版本"“右键点击抽屉完成转换”“转换是永久的”"物品自动保留到新方块"全部错误。BlockFramingTable.onBlockActivated(BlockFramingTable.java:63-72)唯一的动作是 player.openGui(..., GuiHandler.framingGuiID, ...),源码中不存在任何"右键直接替换世界方块"的逻辑,也不存在"保留原方块物品"的代码路径。

核心功能

ContainerFramingTable 定义了 5 个槽位(inventory/ContainerFramingTable.java:49-64):

槽位 变量 作用 接受什么
0 inputSlot 待配色的自定义抽屉物品 isItemValidDrawer:block instanceof BlockDrawersCustom || block instanceof BlockTrimCustom(TileEntityFramingTable.java:108-113)
1 materialSideSlot 侧面材质 isItemValidMaterial:任意 block.isOpaqueCube() == true 的方块
2 materialTrimSlot 装饰条材质 同上
3 materialFrontSlot 正面材质 同上
4 outputSlot 输出 不可放入物品(slot == 4 直接 return false)

材质不是"任意木板":isItemValidMaterial 只检查 block.isOpaqueCube(),因此黑曜石、石头、金属块等任何不透明方块都能当材质,与 BlockWood 无关。

真实工作方式

  1. 先用工作台合成出 fullCustom1/2/4、halfCustom2/4 或 trimCustom 物品(ModRecipes.java:422-480,受 enableFramedDrawers 开关控制,默认 true)
  2. 放置一个 Framing Table
  3. 左键或右键点击它(onBlockActivated 对两种键都只开 GUI),打开配方面板
  4. 槽 0 放入自定义抽屉物品(fullCustom1 等),槽 1/2/3 放入想要的材质方块
  5. 槽 4 输出 ItemCustomDrawers.makeItemStack(block, 1, matSide, matTrim, matFront) 或 ItemCustomTrim.makeItemStack(block, 1, matSide, matTrim) —— 产出的是物品栈,不是世界方块
  6. 用配好的物品右键放置,即得到带自定义材质的抽屉

可配色的方块(不是"转换",是"重新配色")

输入物品 说明
StorageDrawers:fullCustom1 满深 1 槽自定义抽屉
StorageDrawers:fullCustom2 满深 2 槽自定义抽屉
StorageDrawers:fullCustom4 满深 4 槽自定义抽屉
StorageDrawers:halfCustom2 半深 2 槽自定义抽屉
StorageDrawers:halfCustom4 半深 4 槽自定义抽屉
StorageDrawers:trimCustom 自定义装饰条

基础抽屉(fullDrawers* / halfDrawers*)和标准 trim 都不能放进槽 0,因为它们不是 BlockDrawersCustom / BlockTrimCustom。原文那张 “fullDrawers-1×1 → fullCustom-1×1” 的转换表在源码中不存在对应实现。

摆放要求

  • 可放置于任意位置
  • 建议放置在工作区或工厂的加工区
  • 只需要一个,多个抽屉可共用同一个 Framing Table

交互

左键与右键行为完全相同:onBlockActivated 不区分按键,也不检查手持物,两种键都只开同一个 GUI。

前置校验:先用 getXOff/getZOff(rightOffset[6][2])定位配对方块,只有当对侧也是 framingTable 且其 meta & 0x8 == 0(主块)时才 openGui,否则 return false。

触发 行为
左键 打开 framingGuiID 配方面板(GuiFraming / ContainerFramingTable)
右键 与左键完全相同,同样只开 GUI;不会因手持木板而执行任何转换
对侧半块缺失或主块标记不符 return false,无 GUI
GUI 内槽 0 放非 *Custom 物品 isItemValidDrawer 拒绝放入
GUI 内槽 1-3 放非不透明方块 isItemValidMaterial 拒绝放入

数值

数值名 值 来源
挖掘难度 2.5 BlockFramingTable.java:52
材质 / 声音 Material.wood,setStepSound(soundTypeWood) BlockFramingTable.java:49-53
TileEntity 槽位数 5(new ItemStack[5]) TileEntityFramingTable.java:21
isOpaqueCube false BlockFramingTable.java:87-89
renderAsNormalBlock false BlockFramingTable.java:91-94
getMobilityFlag 1(活塞可推) BlockFramingTable.java:136-139
合成配方 "xxx" / "x x",'x' = trim ModRecipes.java:418

多方块结构

Framing Table 本身是一个双方块结构(此节原文正确,补充来源):

  • 两个半方块组成一个完整框架,占据 2 个方块坐标
  • meta & 0x8 区分主块(primary)与从块;getItemDropped 仅主块掉落
  • 朝向由 metadata 低位决定,rightOffset[6][2] / leftOffset[6][2] 给出 6 个方向的对侧偏移
  • 拆半联动由 onNeighborBlockChange 实现:主块找不到左半则 setBlockToAir + dropBlockAsItem;从块找不到主块则 setBlockToAir(从块破坏不额外掉落,掉落已由主块承担)

注意事项

  • 不是转换,是配色:输入槽只接受 *Custom 物品;不存在"变回标准木质"的反向操作,也无法把基础抽屉转成自定义抽屉
  • 产出是物品栈:槽 4 输出 ItemCustomDrawers.makeItemStack(...) / ItemCustomTrim.makeItemStack(...),需要玩家自己拿走再放置
  • 可反复改色:因为是物品级配方,同一件 fullCustom1 可以进出手持不同材质重复配色,不存在"永久绑定"
  • 材质判定只看 isOpaqueCube:StorageDrawers.blockRegistry.getPlankBlock() 属于 BlockDrawers.retrimBlock(潜行手持 Trim 换色)那条独立路径,与 Framing Table 无关
  • 整个系统的开关:enableFramedDrawers(默认 true)同时控制 framingTable、fullCustom*、trimCustom 六个方块的注册(ModBlocks.java:103-118)

相关条目

第三方集成

集成 Mod 集成类型 功能
Chisel 变体注册 镶框桌变体的 Chisel 变体注册
MineTweaker 脚本集成 OreDictionary 黑/白名单
GTNH 配方注册 GTNH/dreamcraft 配方系统
Backhand 副手兼容 副手交互兼容性
浏览全部模组