Apiary(蜂箱舍 / 养蜂场)
事实基准:
harvestcraft-1.3.14-GTNH.jar(MC 1.7.10 / Forge 10.13.4.1614)CFR 0.152 反编译源码。
基本信息
| 属性 | 值 | 来源 |
|---|---|---|
| 注册名 | harvestcraft:apiary |
BlockRegistry.java:638 |
| 方块类 | BlockPamApiary extends BlockContainer |
BlockPamApiary.java:30-31 |
| 字段 | BlockRegistry.pamApiary |
BlockRegistry.java:49 |
| 构造 | new BlockPamApiary() |
BlockRegistry.java:449 |
| 显示名 | tile.apiary.name = Apiary |
en_US.lang:33 |
| 硬度 | 1.0f |
BlockRegistry.java:449 |
| TileEntity | TileEntityPamApiary | BlockPamApiary.java:37-39 |
| GUI ID | 0 |
BlockPamApiary.java:48 |
| 条件注册 | 无,无条件注册 | BlockRegistry.java:638 |
| 多方块 | 否,源码未定义任何多方块结构 | — |
| 朝向 | 不支持(无 func_149689_a),贴图 apiarytop/apiaryside/apiarybottom |
— |
槽位布局(TileEntityPamApiary.java:32-35)
inventory = new ItemStack[19],常量索引已在源码中显式定义:
| 常量 | 值 | 含义 |
|---|---|---|
SLOT_WAX_MIN |
0 |
产物区起点 |
SLOT_WAX_MAX |
17 |
产物区终点(18 格) |
SLOT_QUEENBEE |
18 |
蜂王槽 |
| 槽位 | 内容 | 限制 |
|---|---|---|
| 0–17 | 蜂产品(蜂蜡块/蜂巢/幼虫),自动产出 | SlotPamResult,只可取出 |
| 18 | 蜂王 ItemRegistry.queenbeeItem |
堆叠上限 1(SlotPamApiary) |
产物区 18 格在 GUI 中排成 6 列 × 3 行(ContainerPamApiary:for (x<6) for (y<3),槽索引 y + x*3)。蜂王槽为第 19 格。
工作条件(TileEntityPamApiary.java:173-175)
槽18 是 queenbeeItem && 蜂王耐久 != 最大耐久
| 条件 | 判定 | 行 |
|---|---|---|
| 有蜂王 | inventory[18].getItem() == ItemRegistry.queenbeeItem |
:175 |
| 蜂王未耗尽 | getItemDamage() != getMaxDamage() |
:175 |
蜂王物品参数(ItemPamBee):堆叠上限经 func_77656_e(18) 设为 1(ItemPamBee.java:18),耐久 18 为其元数据空间(ItemPamBee.java:26 向创造标签页加入 meta 0 与 18 两个变体)。
速率:环境速率 vs 蜂王续航
TileEntityPamApiary.java 里有两个 getRunTime,不要混淆:
| 概念 | 公式 | 行 | 含义 |
|---|---|---|---|
getRunTime() 环境速率 |
起始 3500 tick;半径 2 圆内每个 BlockFlower / BlockCrops / BlockPamCrop / BlockPamNormalGarden ×0.95;每个相邻 pamApiary ÷0.85 |
:109-123 |
越小越快——周围花/作物/花园越多产出越密 |
getRunTime(ItemStack) 蜂王续航 |
是 queenbeeItem → 3200 tick |
:212-213 |
蜂王提供的总工作时长 |
产出判定:produceTime >= Math.floor(getRunTime())(:167)。每次产出后 run() 对蜂王执行 damageItem(1)(TileEntityPamGrinder/TileEntityPamApiary 的 func_96631_a(1, null)),蜂王耐久每次 −1。
环境判定半径为 2 的圆,并排除 4 个角格(:117),最多 20 格。周围 20 格全是花/作物时环境速率 = 3500 × 0.95^20 ≈ 2357 tick(≈118 秒)一件;空旷处 3500 tick(175 秒)一件。
产物(getComb(),TileEntityPamApiary.java:180-194)
| 条件 | 产物 | 行 |
|---|---|---|
| 蜂王耐久 == 17 | 恒定产出 ItemRegistry.grubItem(幼虫) |
:184-185 |
否则 random.nextInt(100) < 50 |
ItemRegistry.waxcombItem(蜂蜡块,50%) |
:187-188 |
否则 < 95 |
ItemRegistry.honeycombItem(蜂巢,45%) |
:190-191 |
否则 >= 95 |
ItemRegistry.grubItem(幼虫,5%) |
:193 |
显示名(en_US.lang):item.waxcombItem.name=Waxcomb(:253)、item.honeycombItem.name=Honeycomb(:254)、item.beeswaxItem.name=Beeswax(:256)。
逻辑推论(源码可推导,非猜测):蜂王耐久
0 → 17期间产出蜂蜡块/蜂巢/幼虫随机物;耐久到达 17 时必出幼虫;再工作一次耐久变 18,canRun()因damage == maxDamage而永久停机。
交互
| 触发 | 行为 | 来源 |
|---|---|---|
| 右键 | openGui(..., 0, ...);player.func_70093_af() 为真时不打开 |
BlockPamApiary.java:44-51 |
| 破坏 | 散落全部 19 槽内容为掉落物实体 | BlockPamApiary.java:41-69 |
源码缺陷
- 「耗尽即移除蜂王」的逻辑是死代码。
TileEntityPamApiary.java:143-147:
两处都是无效操作:① 减的是 0;②queenBee.field_77994_a -= 0; // 减去 0 —— 无操作 if (queenBee.field_77994_a == 0) queenBee = null; // 赋给局部变量
queenBee是局部变量,= null不会写回inventory[18]。该分支永远无法把蜂王从槽中清空。 - 蜂王无法从 GUI 取出。
TileEntityPamApiary.java:240与:244均为return slot == 18 && stack.func_77973_b() == ItemRegistry.queenbeeItem;—— 该isStackValidForSlot对除 18 以外的所有槽位一律返回 false。效果是:产物槽(0–17)不能被玩家手动放入任何东西,蜂王槽也不能手动放入非蜂王物品。看似合理,但它同时意味着产物槽对漏斗插入也关闭(func_94041_b同样如此),蜂产品完全无法自动化取出。 - Apiary 未覆写
func_149650_a。与 Beehive 不同,本类没有任何掉落物覆写,破坏时走Block的默认路径;BlockRegistry.java:638同样用registerBlock(Block, String)两参重载。无法从本仓库确定:默认路径下是否掉落方块自身,取决于 Forge 两参
registerBlock是否自动创建ItemBlock,而本仓库不含 Forge 源码,故不下结论。可确定的是:源码未显式声明 Apiary 的掉落物。 - 多方块 / 控制器 / 可否旋转:源码未定义。
相关条目
订正记录
- 本条目完全重写。旧版基于 MC 1.12.2 的
MatrexsVigil/harvestcraftfork,引用了该 fork 的TileEntityApiary、GuiHandler.GUIID_APIARY等 1.12.2 标识与行号,并虚构了旧版的蜂巢升级/繁殖机制。1.7.10 GTNH 版不存在这些机制。旧版行号一律作废;本条目的 3500 / 3200 / 0.95 / 0.85 / 50-45-5 分布与 19 槽布局均为本次源码实测复核结果。