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 ≈ 2357tick ≈ 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_aPmeta 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 |
源码缺陷
isStackValidForSlot/func_94041_b恒返回 false → 鱼陷阱完全不支持漏斗/管道自动化(TileEntityPamFishTrap.java对应:240-242/:244-246)。countFlowers()名实不符(统计液体)。getComb()方法名残留(返回捕鱼结果,与蜂蜡无关)。- 局部变量
queenBee(:148)指代鱼饵,未改名。 - 岩浆也算有效水体,无流体类型区分。
- 多方块 / 控制器 / 可否旋转:源码未定义。
相关条目
- Animal Trap — 同构陷阱,统计泥土/草,3 种诱饵、21 条产物
- TileEntity:Fish Trap
订正记录
- 本条目完全重写并更名。旧
block/watertrap.md基于 MC 1.12.2 fork,记录了harvestcraft:watertrap这一 1.7.10 中不存在的注册名,并引用 1.12.2 行号。旧版行号一律作废。