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 无关。
真实工作方式
- 先用工作台合成出
fullCustom1/2/4、halfCustom2/4或trimCustom物品(ModRecipes.java:422-480,受enableFramedDrawers开关控制,默认true) - 放置一个 Framing Table
- 左键或右键点击它(
onBlockActivated对两种键都只开 GUI),打开配方面板 - 槽 0 放入自定义抽屉物品(
fullCustom1等),槽 1/2/3 放入想要的材质方块 - 槽 4 输出
ItemCustomDrawers.makeItemStack(block, 1, matSide, matTrim, matFront)或ItemCustomTrim.makeItemStack(block, 1, matSide, matTrim)—— 产出的是物品栈,不是世界方块 - 用配好的物品右键放置,即得到带自定义材质的抽屉
可配色的方块(不是"转换",是"重新配色")
| 输入物品 | 说明 |
|---|---|
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)
相关条目
- Trim Custom - 自定义材质装饰条
- Custom Drawers - 自定义材质抽屉的整体说明
第三方集成
| 集成 Mod | 集成类型 | 功能 |
|---|---|---|
| Chisel | 变体注册 | 镶框桌变体的 Chisel 变体注册 |
| MineTweaker | 脚本集成 | OreDictionary 黑/白名单 |
| GTNH | 配方注册 | GTNH/dreamcraft 配方系统 |
| Backhand | 副手兼容 | 副手交互兼容性 |