跳到正文
烈焰甘蔗Wiki

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

源码缺陷

  1. 「耗尽即移除蜂王」的逻辑是死代码。TileEntityPamApiary.java:143-147:
    queenBee.field_77994_a -= 0;                       // 减去 0 —— 无操作
    if (queenBee.field_77994_a == 0) queenBee = null;  // 赋给局部变量
    
    两处都是无效操作:① 减的是 0;② queenBee 是局部变量,= null 不会写回 inventory[18]。该分支永远无法把蜂王从槽中清空。
  2. 蜂王无法从 GUI 取出。TileEntityPamApiary.java:240 与 :244 均为 return slot == 18 && stack.func_77973_b() == ItemRegistry.queenbeeItem; —— 该 isStackValidForSlot 对除 18 以外的所有槽位一律返回 false。效果是:产物槽(0–17)不能被玩家手动放入任何东西,蜂王槽也不能手动放入非蜂王物品。看似合理,但它同时意味着产物槽对漏斗插入也关闭(func_94041_b 同样如此),蜂产品完全无法自动化取出。
  3. Apiary 未覆写 func_149650_a。与 Beehive 不同,本类没有任何掉落物覆写,破坏时走 Block 的默认路径;BlockRegistry.java:638 同样用 registerBlock(Block, String) 两参重载。

    无法从本仓库确定:默认路径下是否掉落方块自身,取决于 Forge 两参 registerBlock 是否自动创建 ItemBlock,而本仓库不含 Forge 源码,故不下结论。可确定的是:源码未显式声明 Apiary 的掉落物。

  4. 多方块 / 控制器 / 可否旋转:源码未定义。

相关条目

  • Beehive — 蜂王的唯一来源(破坏蜂箱必掉一只)
  • TileEntity:Apiary

订正记录

  • 本条目完全重写。旧版基于 MC 1.12.2 的 MatrexsVigil/harvestcraft fork,引用了该 fork 的 TileEntityApiary、GuiHandler.GUIID_APIARY 等 1.12.2 标识与行号,并虚构了旧版的蜂巢升级/繁殖机制。1.7.10 GTNH 版不存在这些机制。旧版行号一律作废;本条目的 3500 / 3200 / 0.95 / 0.85 / 50-45-5 分布与 19 槽布局均为本次源码实测复核结果。
浏览全部模组