跳到正文
烈焰甘蔗Wiki

Fish Trap(鱼陷阱)

事实基准:harvestcraft-1.3.14-GTNH.jar(MC 1.7.10 / Forge 10.13.4.1614)CFR 0.152 反编译源码。

基本信息

属性 值 来源
注册名 harvestcraft:fishtrap BlockRegistry.java:651
方块类 BlockPamFishTrap extends BlockContainer BlockPamFishTrap.java:24-25
字段 BlockRegistry.pamfishTrap BlockRegistry.java:53
构造 new BlockPamFishTrap() BlockRegistry.java:462
显示名 tile.fishtrap.name = Fish Trap en_US.lang:55
硬度 1.0f BlockRegistry.java:462
TileEntity TileEntityPamFishTrap BlockPamFishTrap.java:37-39
GUI ID 9 BlockPamFishTrap.java:77
条件注册 无,无条件注册 BlockRegistry.java:651
多方块 否,源码未定义任何多方块结构 —
朝向 不支持(无 func_149689_a),贴图上/中/下均为同一张 harvestcraft:fishtrap BlockPamFishTrap.java:82-86

文件更名说明:旧 wiki 的 block/watertrap.md 记录的是 harvestcraft:watertrap —— 1.7.10 中不存在这个注册名。本条目已改名为 fishtrap.md,与真实注册名 fishtrap 一致。旧文件名已改写为废止说明页。

槽位布局(TileEntityPamFishTrap.java:29,inventory = new ItemStack[19])

槽位 内容
0–17 捕获物(18 个产物槽,自动填充)
18 鱼饵 ItemRegistry.fishtrapbaitItem
  • 容器:ContainerPamFishTrap。
  • 布局与 Animal Trap 逐行一致(两者同源复制),但鱼陷阱只需 1 种诱饵。

工作条件(两者同时满足,TileEntityPamFishTrap.java:185)

(槽18 是 fishtrapbaitItem) && countFlowers() >= 5
条件 判定 来源
有鱼饵 槽 18 为 ItemRegistry.fishtrapbaitItem :185
周围有足够水 countFlowers() >= 5 :185
countFlowers() 统计什么 半径 2 圆内、同一 Y 层的 BlockLiquid(水或岩浆)数量 :123-132

只统计液体方块,水与岩浆一视同仁——在岩浆里放鱼陷阱同样有效(源码不做流体类型区分)。

半径判定(:132):圆内排除 4 个角格 → 最多 20 格。

命名缺陷:countFlowers()(TileEntityPamFishTrap.java:123)统计的是液体,与花无关;TileEntityPamAnimalTrap.countFlowers() 统计的却是泥土/草。同名方法语义完全相反,是跨类复制粘贴的残留。

速率:两个数字

TileEntityPamFishTrap.java:

概念 公式 含义
getRunTime()(环境速率,:102-117) 起始 3500 tick;每个 BlockLiquid ×0.95;每个相邻 pamfishTrap ÷0.85 越小越快:周围水越多产得越快
getRunTime(ItemStack)(鱼饵续航,:207-212) 鱼饵 → 3200 tick 鱼饵提供的总工作时长

产出判定:produceTime >= Math.floor(getRunTime())(:165)。run() 每次产出后 func_70298_a(18, 1) 扣除 1 个鱼饵(:201)。

与 Animal Trap 完全同构:起始 3500、环境块 ×0.95、邻接陷阱 ÷0.85、鱼饵续航 3200。20 格全是水时环境速率 = 3500 × 0.95^20 ≈ 2357 tick ≈ 118 秒一件。

⚠ 产物条数取决于配置(TrapRecipes.java:47-83)

TrapRecipes.FISH_TRAP_RECIPES 由 if (ItemRegistry.enableharvestcraftfish) 分成两个互斥分支:

分支 条件 条数 行
HarvestCraft 鱼 enableharvestcraftfish == true 30 TrapRecipes.java:48-77
仅原版鱼 enableharvestcraftfish == false 4 TrapRecipes.java:79-82
默认值 ItemRegistry.java:989 → config.get(…, true).getBoolean(true) 默认走 30 条分支 ItemRegistry.java:989
  • true 分支含 4 个原版鱼元数据变体(Items.field_151115_aP meta 0/1/2/3,其中 meta 0 权重 7)+ 26 个 HarvestCraft 鱼类(anchovyrawItem、bassrawItem、…、walleyerawItem)。
  • false 分支只有 4 个原版鱼元数据变体,权重 7 / 2 / 1 / 1。
  • addFishRecipe(bait, out) 两参重载默认权重 1(TrapRecipes.java:94-96)。

这是「枚举/分支注册导致调用点严重虚高」的直接例子:grep 会得到 34(两个分支相加),但任何单一配置下只会加载其中一个分支。

交互

触发 行为 来源
右键 openGui(..., 9, ...) BlockPamFishTrap.java:72-79
破坏 散落全部 19 槽内容为掉落物实体 BlockPamFishTrap.java:41-70

源码缺陷

  1. isStackValidForSlot / func_94041_b 恒返回 false → 鱼陷阱完全不支持漏斗/管道自动化(TileEntityPamFishTrap.java 对应 :240-242 / :244-246)。
  2. countFlowers() 名实不符(统计液体)。
  3. getComb() 方法名残留(返回捕鱼结果,与蜂蜡无关)。
  4. 局部变量 queenBee(:148)指代鱼饵,未改名。
  5. 岩浆也算有效水体,无流体类型区分。
  6. 多方块 / 控制器 / 可否旋转:源码未定义。

相关条目

  • Animal Trap — 同构陷阱,统计泥土/草,3 种诱饵、21 条产物
  • TileEntity:Fish Trap

订正记录

  • 本条目完全重写并更名。旧 block/watertrap.md 基于 MC 1.12.2 fork,记录了 harvestcraft:watertrap 这一 1.7.10 中不存在的注册名,并引用 1.12.2 行号。旧版行号一律作废。
浏览全部模组