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)。

相关条目