Mesh Filter
基本信息
| 属性 | 值 |
|---|---|
| 注册名 | TMechworks:meshFilter |
| 方块类 | FilterBlock(Block,实现 IBlockWithMetadata) |
| TileEntity | 无 —— FilterLogic 存在但未注册(common/MechContent.java:146 被注释) |
| 材质 | Material.iron |
| 硬度 | 3.0(setHardness(3.0F),blocks/FilterBlock.java:50) |
| 爆炸抗性 | 未调用 setter —— 默认 10.0 |
| subFilter 槽数 | 8(SubFilter[8]),实际只用 0–4 |
| 启用类型 | 5 种(empty / wide / slat / mesh / fine) |
| 厚度 | thickness = 0.1875D(3/16 格) |
| 侧宽 / hack 高度 | sideWidth = 0.2D / hackHeight = 0.05D |
| 阻挡移动 | getBlocksMovement 覆写 —— 不阻挡 |
| 周期 | 每 10 tick 执行一次(ticksPerUpdate = 10) |
| GUI / 库存 | 无(过滤类型由 metadata 决定) |
| 配方 | 无 |
功能
一块薄板过滤器,用来在漏斗/管道/掉落物通路中筛选特定物品。它是纯方块逻辑(无 TE),通过 metadata 决定使用哪种过滤网。
doFilterLogic(World, CoordTuple)(blocks/FilterBlock.java:316-400)每 10 tick 执行一次,三种模式:
| 布局 | 行为 |
|---|---|
下方有容器 且非 isTop |
收集本位置的 EntityItem,canPass(entity) 通过则 insertStackFromEntity(inv, entity) 塞进下方容器 |
上方有容器 且 isTop |
遍历上方容器全部槽,canPass(itemStack) 通过则 decrStackSize 后在板上表面生成 EntityItem 并给一个向下初速 |
| 上下都无容器 | 把本位置(isTop 时为上方 1 格)的实体 motionX/motionZ = 0,并把 Y 移到板面上 —— 即纯物理过滤,让通过/不通过的物品分流 |
isTop(world, position) 决定当前方块是「顶板」还是「底板」,由 setBlockBoundsBasedOnState 的边界方向推断。
5 种过滤网
SubFilter[8] 的索引 0–4 在 MechContent.registerBlocks() 中配置,5–7 永远为 null(对应 metadata 5–7 的方块不执行任何过滤)。详见 过滤网类型。
| 索引 | suffix | 类 | 图标物品 | meta 敏感 |
|---|---|---|---|---|
| 0 | empty |
匿名 SubFilter |
无 | — |
| 1 | wide |
匿名 SubFilter |
ingotBronze |
false |
| 2 | slat |
SlatFilter |
ingotCopper |
true |
| 3 | mesh |
MeshFilter |
ingotAluminum |
false |
| 4 | fine |
FineFilter |
ingotAlumite |
true |
索引 0 与 1 的 canPass 实现完全相同(common/MechContent.java:92-122 两个匿名类方法体逐字一致)—— 差异只有图标与 suffix 名。
数值
| 数值 | 值 |
|---|---|
| 材质 / 硬度 | Material.iron / 3.0 |
| 爆炸抗性 | 10.0(未调用 setter,默认值) |
| subFilter 数组长度 | 8 |
| 实际配置数 | 5(索引 0–4) |
| 空槽行为 | metadata 5–7 → subFilters[getSubFilter(meta)] 为 null → 不做任何过滤 |
| 厚度 | 0.1875D(3/16) |
| 侧宽 | 0.2D |
| hack 高度 | 0.05D |
| 执行周期 | 每 10 tick(totalWorldTime % 10 == 0) |
| 图标贴图 | tmechworks:machines/drawbridge_bottom(复用 Drawbridge 贴图) |
| 各网图标 | tmechworks:filters/{widefilter,slatfilter,meshfilter,finefilter}(索引 0 无图标) |
| 掉落 meta | damageDropped(int meta) 返回 meta(0–4) |
| getRenderType | 覆写(shouldSideBeRendered 走 filter_shouldSideBeRendered) |
| 配方 | 无 |
交互
| 触发 | 行为 |
|---|---|
| 放置 | 记录 metadata 决定过滤网类型 |
| 每 10 tick | 按 metadata 选中的 subFilter 执行过滤(三种布局见上) |
| 破坏 | 掉落自身(metadata 对应 subtype) |
| 右键 | 无 GUI |
配方
无。common/MechRecipes.java 全文 11 条配方中没有任何一条产出 MechContent.filter —— 与 Dynamo 并列为本 mod 两个无配方方块。因此在 survival 中只能靠 /give 获得。
源码缺陷
FilterLogic是死类(blocks/logic/FilterLogic.java,21 行,TileEntity+ISidedInventory):GameRegistry.registerTileEntity那行被注释(common/MechContent.java:146:// GameRegistry.registerTileEntity(FilterLogic.class, "MeshFilter"); //No longer necessary.),FilterBlock.createNewTileEntity也不返回它(:292// return new FilterLogic();)。整个类无引用。- 无配方:11 条配方无一产出本方块。
- 索引 0 与 1 的逻辑重复:
empty与wide两个匿名SubFilter的canPass(Entity)与canPass(ItemStack)实现完全相同(common/MechContent.java:92-122),但注释分别写「Lets through any item or XP orb, but not other entities」—— 两者描述相同却当成两种网,属冗余。 - 索引 5–7 是空槽但可被放置:
subFilters长度 8 而只配了 5 个,getSubFilter(metadata)对 5/6/7 返回自身,该subFilter为 null →doFilterLogic的三处subFilters[...] != null判断全部短路,方块静默不做任何事。玩家通过 creative 拿到 metadata 5–7 会得到一块完全不工作的板。 - 索引 0 无图标:
nilFilter只调了setSuffix("empty"),未调setMeshIconName,registerBlockIcons的if (subFilters[i].getMeshIconName() != null)会跳过 →subMeshIcons[0]保持 null。 - 借 Drawbridge 贴图:
setBlockTextureName("tmechworks:machines/drawbridge_bottom"),与 Drawbridge 共用同一张图;属有意复用但源码无注释说明。 - 周期用
totalWorldTime % 10:不是随机相位而是全局对齐,全世界的过滤器在同一 tick 集中执行,区块大时会造成周期性卡顿尖峰。 isTop语义隐晦:由方块边界方向推断,源码无注释;setBlockBoundsBasedOnState中同时处理有 TE 与无 TE 两套分支(实际无 TE 分支永不可达,因为本方块无 TE)。
相关条目
- 过滤网类型 - 5 种 subFilter 的完整通过规则
- Dynamo - 本 mod 另一个无配方方块
- Drawbridge - 本方块借用的贴图来源
- Signal Bus - 另一个多 meta 方块(但走 TE)