村民职业与交易
基本信息
| 属性 | 值 |
|---|---|
| 注册 API | cpw.mods.fml.common.registry.VillagerRegistry |
| 注册方块 ID | ID_VILLAGER_BEEKEEPER = 80、ID_VILLAGER_LUMBERJACK = 81(forestry/core/config/Constants.java:46-47) |
| 职业数 | 2 |
| 皮肤贴图 | beekeeper.png、lumberjack.png(Constants.java:42-43) |
| 开关 | Config.enableVillagers,默认 true(forestry/core/config/Config.java:71) |
| 配置项 | world.generate / villagers(Config.java:236) |
功能
Forestry 注册了两个自定义村民职业,统共受一个配置开关控制。开关为 false 时,两处 if (Config.enableVillagers) 整块跳过,职业 ID、皮肤、交易表与村庄组件一个都不注册(PluginApiculture.java:318-325、PluginArboriculture.java:187-192)。
| 职业 | villagerId | 皮肤常量 | 贴图路径 | 交易处理器 | 来源插件 |
|---|---|---|---|---|---|
| 养蜂人 Beekeeper | 80 | TEXTURE_SKIN_BEEKPEEPER |
entities/beekeeper.png |
VillageHandlerApiculture |
Apiculture |
| 伐木工 Lumberjack | 81 | TEXTURE_SKIN_LUMBERJACK |
entities/lumberjack.png |
VillageHandlerArboriculture |
Arboriculture |
皮肤通过 Proxies.render.registerVillagerSkin(id, path) 注册(ProxyRenderClient.java:118-119),服务端对应方法是空实现(ProxyRender.java:63)。
[!NOTE] 常量名
TEXTURE_SKIN_BEEKPEEPER在源码里多写了一个e(Constants.java:42)。这里按源码原样记录。
养蜂人(Beekeeper)
注册时除了职业 ID 与皮肤,还向 VillagerRegistry 登记了村庄生成处理器(PluginApiculture.java:320-324):
VillageHandlerApiculture villageHandler = new VillageHandlerApiculture();
VillagerRegistry.instance().registerVillageCreationHandler(villageHandler);
VillagerRegistry.instance().registerVillagerId(Constants.ID_VILLAGER_BEEKEEPER);
Proxies.render.registerVillagerSkin(Constants.ID_VILLAGER_BEEKEEPER, Constants.TEXTURE_SKIN_BEEKPEEPER);
VillagerRegistry.instance().registerVillageTradeHandler(Constants.ID_VILLAGER_BEEKEEPER, villageHandler);
VillageHandlerApiculture 同时实现 IVillageCreationHandler 与 IVillageTradeHandler,所以一个对象干两件事。
交易表(VillageHandlerApiculture.manipulateTradesForVillager,每次交易刷新时重建,共 12 条):
| 玩家付出 | 村民给出 | 备注 |
|---|---|---|
beePrincessGE × 1(WILDCARD_VALUE) |
绿宝石 × 1 | 任意基因的女王蜂换 1 绿宝石 |
| 小麦 × 2 | 随机蜂蜡脾 × 1 | beeComb.getRandomComb(1, random, false) |
原木 × 24(WILDCARD_VALUE) |
蜂箱 BlockApicultureType.APIARY |
任意树种原木 |
| 绿宝石 × 1 | 已验证框架 × 6 | frameProven |
| 绿宝石 × 12 | beePrincessGE × 1(通配)+ 修道士蜂雄蜂 |
BeeDefinition.MONASTIC |
| 末影之眼 × 16 | beePrincessGE × 1(通配)+ 末影蜂雄蜂 |
BeeDefinition.ENDED |
| 蜂胶 × 1 | 任意雄蜂 × 4(通配)+ 森林雄蜂 | BeeDefinition.FOREST |
| 蜂胶 × 1 | 任意雄蜂 × 4(通配)+ 草甸雄蜂 | BeeDefinition.MEADOWS |
| 蜂胶 × 1 | 任意雄蜂 × 4(通配)+ 谦逊雄蜂 | BeeDefinition.MODEST |
| 蜂胶 × 1 | 任意雄蜂 × 4(通配)+ 热带雄蜂 | BeeDefinition.TROPICAL |
| 蜂胶 × 1 | 任意雄蜂 × 4(通配)+ 寒冬雄蜂 | BeeDefinition.WINTRY |
| 蜂胶 × 1 | 任意雄蜂 × 4(通配)+ 沼泽雄蜂 | BeeDefinition.MARSHY |
其中后 7 条是同一配方的蜂种变体:用 1 个蜂胶把「任意雄蜂」定向繁殖成指定蜂种。
村庄组件:ComponentVillageBeeHouse 通过 MapGenStructureIO.func_143031_a(ComponentVillageBeeHouse.class, "Forestry:BeeHouse") 注册(VillageHandlerApiculture.java:36-43),调用点在 PluginApiculture.java:209-212(同样受 Config.enableVillagers 包裹)。部件权重为 15(getVillagePieceWeight)。注册失败只 Log.severe("Failed to register village beehouse."),不抛出。
村庄里的蜂群:PluginApiculture.java:307-316 按村庄大小把蜂种基因组放进 BeeManager.villageBees[0](小型村)与 [1](大型村):
| 村庄大小 | 蜂种 |
|---|---|
villageBees[0](小型村) |
FOREST、MEADOWS、MODEST、MARSHY、WINTRY、TROPICAL(共 6 种) |
villageBees[1](大型村) |
FOREST(getRainResist() 抗雨基因)、COMMON、VALIANT(共 3 种) |
伐木工(Lumberjack)
只注册职业 ID、皮肤与交易表,没有村庄生成处理器(PluginArboriculture.java:187-192)。
交易表(VillageHandlerArboriculture.manipulateTradesForVillager,共 3 条):
| 玩家付出 | 村民给出 | 备注 |
|---|---|---|
| 绿宝石 × 8 | 随机树苗 × 1 | TreeManager.treeRoot.getRandomTemplate(random) 取随机模板 |
| 绿宝石 × 2 | 已验证嫁接器 grafterProven × 1 |
PluginArboriculture.items.grafterProven |
| 绿宝石 × 1 | 随机木板 × 32 | EnumWoodType.getRandom(random),产物数被硬改为 32 |
[!NOTE] 第三条把
planks.stackSize直接赋值为 32(VillageHandlerArboriculture.java:44-47),是三组配方里产量最高的一条。
相关条目
- EntityBee - ⚠ 并非世界实体,蜜蜂以
Forestry:beeQueenGE等物品形式存在 - Bee Comb - 交易中「随机蜂蜡脾」的来源
- Propolis - 蜂种定向繁殖配方用的蜂胶
- Hive Frame - 交易中出售的已验证框架
[!NOTE] 本分类目前没有配置项条目。开关
world.generate/villagers的读取逻辑见forestry/core/config/Config.java:236,默认值见同文件:71。