Animal Trap(动物陷阱)
事实基准:
harvestcraft-1.3.14-GTNH.jar(MC 1.7.10 / Forge 10.13.4.1614)CFR 0.152 反编译源码。
基本信息
| 属性 | 值 | 来源 |
|---|---|---|
| 注册名 | harvestcraft:animaltrap |
BlockRegistry.java:652 |
| 方块类 | BlockPamAnimalTrap extends BlockContainer |
BlockPamAnimalTrap.java:24-25 |
| 字段 | BlockRegistry.pamanimalTrap |
BlockRegistry.java:54 |
| 构造 | new BlockPamAnimalTrap() |
BlockRegistry.java:463 |
| 显示名 | tile.animaltrap.name = Animal Trap |
en_US.lang:56 |
| 硬度 | 1.0f |
BlockRegistry.java:463 |
| TileEntity | TileEntityPamAnimalTrap | BlockPamAnimalTrap.java:37-39 |
| GUI ID | 8 |
BlockPamAnimalTrap.java:77 |
| 条件注册 | 无,无条件注册 | BlockRegistry.java:652 |
| 多方块 | 否,源码未定义任何多方块结构 | — |
| 朝向 | 不支持(无 func_149689_a),贴图上/中/下均为同一张 harvestcraft:animaltrap |
BlockPamAnimalTrap.java:82-86 |
文件更名说明:旧 wiki 的
block/groundtrap.md记录的是一个在 1.7.10 中不存在注册名的方块(harvestcraft:groundtrap)。本条目已改名为animaltrap.md,与真实注册名animaltrap一致。旧文件名已改写为废止说明页。
槽位布局(TileEntityPamAnimalTrap.java:30,inventory = new ItemStack[19])
| 槽位 | 内容 | 说明 |
|---|---|---|
| 0–17 | 捕获物(18 个产物槽) | 自动填充,不需玩家操作 |
| 18 | 诱饵 | 需玩家放入,机器运行时会消耗 |
- 容器:
ContainerPamAnimalTrap,玩家背包 36 槽。 - 产物槽在
run()中按0 → 17取第一个空槽放入(TileEntityPamAnimalTrap.javarun())。
工作条件(三者同时满足才运行,TileEntityPamAnimalTrap.java:187)
(槽18 是 grainbaitItem 或 fruitbaitItem 或 veggiebaitItem) && countFlowers() >= 5
| 条件 | 判定 | 来源 |
|---|---|---|
| 有诱饵 | 槽 18 为谷物饵 / 果饵 / 菜饵三者之一 | :187 |
| 周围够“肥沃” | countFlowers() >= 5 |
:187 |
countFlowers() 统计什么 |
半径 2 圆内、同一 Y 层的 BlockDirt 或 BlockGrass 数量 |
:124-134 |
命名缺陷:
countFlowers()(TileEntityPamAnimalTrap.java:124)在陷阱里统计的是泥土/草方块,与花无关。同样被复制到TileEntityPamFishTrap.countFlowers()(TileEntityPamFishTrap.java:123),但那里统计的却是液体。两个同名方法统计的东西完全不同。
半径判定(:112):圆内并排除 4 个角格(±(radius-1), ±(radius-1)),即半径 2 圆去掉四角 → 最多 20 格。
速率:两个数字,别搞混
陷阱有两个独立的「时间」概念,TileEntityPamAnimalTrap.java:
| 概念 | 公式 | 含义 |
|---|---|---|
getRunTime()(环境速率,:103-118) |
起始 3500 tick;每个 BlockDirt/BlockGrass ×0.95;每个相邻 pamanimalTrap ÷0.85 |
越小越快 —— 泥土越多、邻接陷阱越多,产出间隔越短 |
getRunTime(ItemStack)(诱饵续航,:209-214) |
诱饵为三种饵之一 → 3200 tick | 诱饵提供的总工作时长 |
产出判定:produceTime >= Math.floor(getRunTime())(:167)—— 即每累计满一个环境间隔产出一件。诱饵耗尽时 runTime 归零并按 getRunTime(bait) 重新续期(:149-150)。
⚠ 语义容易写反:3500 是「间隔」不是「冷却」。周围 20 格全是泥土/草时,环境速率 =
3500 × 0.95^20 ≈ 2357tick(≈118 秒)一件;空旷处则是 3500 tick(175 秒)一件。摆放得越「肥沃」产得越快。
run() 每次产出后调用 func_70298_a(18, 1) 扣除 1 个诱饵(:203)。
产物(TrapRecipes.ANIMAL_TRAP_RECIPES)
加权随机;同一诱饵下多条配方按权重抽取。addAnimalRecipe(bait, out) 的两参重载把权重默认设为 1(TrapRecipes.java:86-88)。
| 诱饵 | 条数 | 行 |
|---|---|---|
grainbaitItem |
7 | TrapRecipes.java:26-32 |
fruitbaitItem |
6 | TrapRecipes.java:33-38 |
veggiebaitItem |
8 | TrapRecipes.java:39-46 |
| 合计 | 21 | TrapRecipes.java:26-46 |
- 权重分布举例:
:28鸡肉权重 3、:30/:36/:44权重 2、其余权重 1。 - 其中 5 个产物是未反混淆的原版物品
Items.field_151082_bd/field_151076_bf/field_151116_aA/field_151008_G/field_151110_aK/field_151103_aS(含field_151147_al)。本仓库无 MCP 映射,无法确定这些具体是哪种原版肉/物品,此处不做断言。 - 可识别的本作产物:
turkeyrawItem、rabbitrawItem、venisonrawItem、muttonrawItem。 - 诱饵显示名:
item.grainbaitItem.name=Grain Bait、item.fruitbaitItem.name=Fruit Bait、item.veggiebaitItem.name=Veggie Bait(en_US.lang:260-262)。
交互
| 触发 | 行为 | 来源 |
|---|---|---|
| 右键 | openGui(..., 8, ...);player.func_70093_af() 为真时不打开 |
BlockPamAnimalTrap.java:72-79 |
| 破坏 | 散落全部 19 槽内容为掉落物实体(随机撒布,带初速度) | :41-70 |
源码缺陷
isStackValidForSlot恒返回 false(TileEntityPamAnimalTrap.java:240-242)、func_94041_b恒返回 false(:244-246)。→ 陷阱完全不支持漏斗/管道自动化,只能手动开 GUI 取货。getRandomOutputForBait之后的取物方法被命名为getComb()—— 与 Apiary 的蜂蜡产物方法同名,纯复制粘贴残留(TileEntityPamAnimalTrap.java)。- 局部变量
queenBee(:150)在动物陷阱里指代的是诱饵而非蜂王,是从蜂箱 TileEntity 复制来的未改名变量。 countFlowers()名实不符(见上)。- 多方块 / 控制器 / 可否旋转:源码未定义。
相关条目
- Fish Trap — 结构完全相同,但统计液体、只需 1 种诱饵
- Beehive / Apiary
- TileEntity:Animal Trap
订正记录
- 本条目完全重写并更名。旧
block/groundtrap.md基于 MC 1.12.2 fork,记录了harvestcraft:groundtrap这一 1.7.10 中不存在的注册名(系该 fork 的方块命名),并引用了 1.12.2 的行号。旧版行号一律作废。