farmingforengineers

[!INFO] Git Commit: 71be217 | Updated: 2024-08-29

Farming for Engineers(@Mod 类 com.guigs44.farmingforengineers.FarmingForEngineers,modid = farmingforengineers,name = "Farming for Engineers",acceptedMinecraftVersions = "[1.7.10]")是 GTNewHorizons 的种子市场 mod:只注册 1 个方块、1 个实体、1 个 TileEntity,没有任何机器、矿物、作物方块、附魔、维度、群系或世界生成。mcmod.info 自述 “Adds a seed market with a search bar and a scrolling grid.”

全部内容仅 55 个 Java 文件(其中 8 个是 package-info.java),根包 com.guigs44.farmingforengineers,作者 BlayTheNinth、guigs44、mitchej123、GTNH Team。

核心机制:放一个 Market 方块 → 方块旁生成一只 Merchant → 右键任一者打开 GUI → 用绿宝石换种子/树苗。「卖什么」完全由配置驱动的 JSON 注册表决定(见 市场注册表),没有一条代码写死的交易。

[!IMPORTANT] 三个与 mod 名不符、容易被外部资料误导的前提,均已由源码核实:

  1. mod 名里有 “Farming” 但本 mod 不种任何东西。全仓库零个作物方块、零个 ItemSeeds、零条关于 farmland/tilling 的代码。种子与树苗全部是其他 mod 的物品,本 mod 只做「定价与售卖」。
  2. market 有 4 个 metadata 值(2~5),但不是 4 种子类型。metadata 存的是 ForgeDirection 的 ordinal(朝向),见 Market 方块。
  3. @Mod 里声明的 after:agricraft 是无效依赖。AgriCraftAddon 类在仓库中不存在,见下方「整合门控」。

注册总表

本 mod 全部注册项——没有一条被省略或推测:

类别 注册名 / 标识 数量 来源
方块 farmingforengineers:market 1 CommonProxy.java:22
物品(方块物品) farmingforengineers:market(ItemBlockMarket) 1 CommonProxy.java:22(随方块注册,无独立 registerItem)
TileEntity farmingforengineers:market(TileMarket,空类) 1 CommonProxy.java:24
实体 farmingforengineers:merchant(EntityMerchant,ID 0) 1 FarmingForEngineers.java:89
GUI GuiHandler.MARKET = 1 1 network/GuiHandler.java:18
网络封包 判别字 0(S→C MessageMarketList)、1(C→S MessageMarketSelect) 2 network/NetworkHandler.java:18
指令 /farmingforengineers reload 1 FarmingForEngineers.java:109
创造栏 farmingforengineers 1 FarmingForEngineers.java:56
合成配方 1 条有形状配方 1 ModRecipes.java:13
自有声音事件 farmingforengineers:falling 1 ModSounds.java:11 + sounds.json
市场默认批次 Market.json 的 10 个批次 10 见 市场注册表
市场条目 由上表 10 批次展开 147 + N N = 已装 Forestry 的树种数
配置项 FarmingForEngineers.cfg 1 ModConfig.java:10
音效资源 2 个自有 .ogg / 复用 2 个原版音 2 自有 sounds/falling.ogg + ModSounds
语言键 en_US.lang 11 键 / de_DE.lang 10 键 21 lang/

合计:4 个游戏注册项(方块 / 方块物品 / TileEntity / 实体)+ 1 GUI + 2 封包 + 1 指令 = 8 项 FML/Forge 注册,其余为配方、批次与配置。

[!NOTE] NetworkRegistry.INSTANCE.registerGuiHandler 被调用了两次且各 new 一个 GuiHandler:FarmingForEngineers.init(:87)与 CommonProxy.init(:23)。FML 允许重复注册,行为上无差异,但属于源码既有冗余。

市场:定价与售卖

完整的批次表、条目语法、筛选与购买流程见 市场注册表 Market.json。要点:

事实 值
数据文件 <config>/FarmingForEngineers/Market.json(Gson,2 空格缩进,首次运行自动生成)
顶层键 defaults / defaults payment / defaults blacklist / custom entries
加载顺序 货币 → 默认批次 → blacklist → custom(custom 优先级最高,会覆盖默认条目)
默认条目数 147 + N(N = Forestry 树种数;仅原版为 19)
默认货币 绿宝石 ×1;Forestry 树苗为绿宝石 ×2;BiomesOPlenty 圣橡树苗为绿宝石 ×1 meta 8
分类枚举 MarketEntry.EntryType 3 值:SEEDS(0) / SAPLINGS(1) / OTHER(2),按 ordinal() 排序
定价 每个条目独立 costItem(可含数量 / meta / NBT),没有分级、折扣或批量

GUI 与容器

项 值
GUI ID 1(GuiHandler.MARKET)
服务端容器 ContainerMarket(GuiHandler.getServerGuiElement)
客户端容器 ContainerMarketClient(extends 上者,额外持有搜索 / 筛选 / 滚动状态)
客户端界面 GuiMarket(GuiContainer,ySize = 174,贴图 farmingforengineers:textures/gui/market.png)
槽位总数 50 = 付款 1 + 出货 1 + 市场展示 12(4 行 × 3 列)+ 玩家主物品栏 27 + 快捷栏 9
支付载体 2 个 InventoryBasic(容量各 1,canTakeStack = false),不是 TileEntity
距离校验 canInteractWith 恒 true
自动化 无——无红石、无按钮、无 tick 逻辑;TileMarket 是空类
界面残留 关闭 GUI 时付款槽内容 entityDropItem 丢在脚下
购买同步 点条目 → C→S 封包 → 服务端 getEntryFor 回查 → 客户端扣款;GUI 打开期间不推送列表变更

配置

本 mod 只有 1 个 FML 配置项(Configuration API,非 @Config 注解、非 Gson):

键 分类 类型 默认值 作用
Show Registry Warnings client boolean false 决定 logWarning 是否进 registryErrors 并刷到聊天栏;logError 恒刷

详见 FarmingForEngineers.cfg。市场条目本身在 Market.json,不在 .cfg 里。

指令

指令 参数 权限 说明
/farmingforengineers reload reload(唯一子命令,Tab 补全只给这一个) 0 级(任何人可用) 清空 registryErrors → 重载 Market.json → 聊天栏回报 + 逐条列出错误

getRequiredPermissionLevel 未覆写,CommandBase 默认返回 0。详见 /farmingforengineers reload。

整合门控

postInit 用 Loader.isModLoaded(modId) 守卫 + Class.forName 反射实例化 5 个 compat addon(FarmingForEngineers.java:96-101)。VanillaAddon 无条件执行。

目标 mod modid 常量值 addon 类 提供的批次 门控是否真的生效
原版 — VanillaAddon Vanilla Seeds(3) / Vanilla Saplings(6) / Bonemeal(1) / Animal Eggs(9) ✅ 无条件
Pams HarvestCraft harvestcraft HarvestcraftAddon Pams Harvestcraft Seeds(60) / Pams Harvestcraft Saplings(36) ✅
Forestry Forestry(首字母大写) ForestryAddon Forestry Saplings(数量随安装树种) ✅ 需 Forestry API
Natura natura NaturaAddon Natura Saplings(9) ✅
Biomes O’ Plenty BiomesOPlenty(首字母大写) BiomesOPlentyAddon BiomesOPlenty Saplings(23) / BiomesOPlenty Sacred Oak Sapling(1) ✅
AgriCraft agricraft AgriCraftAddon 不存在 — ❌ 静默失效,见下
MouseTweaks mousetweaks 无 addon — ❌ 仅 @Mod.dependencies 与一个未使用的常量
NEI — NEIFarmingForEngineersConfig — ❌ 类存在但从未被实例化
JEI — 无任何类 — ❌ 只有 en_US.lang 里残留一个 jei. 键

[!WARNING] AgriCraft 门控是死代码。 FarmingForEngineers.java:99 调 buildSoftDependProxy(Compat.AGRICRAFT, "com.guigs44.farmingforengineers.compat.AgriCraftAddon"),但 src/main/java/com/guigs44/farmingforengineers/compat/ 目录下只有 BiomesOPlentyAddon / Compat / ForestryAddon / HarvestcraftAddon / NaturaAddon / VanillaAddon / package-info / nei/。Class.forName 抛 ClassNotFoundException → 被 catch (Exception e) 吞掉 → return Optional.empty()。装了 AgriCraft 也一条种子都加不进市场,且控制台没有任何日志。

[!WARNING] NEI 集成是死代码。 NEIFarmingForEngineersConfig implements IConfigureNEI(loadConfig() 空实现),但全仓库 grep NEIFarmingForEngineersConfig 只命中它自己的定义——它不在任何 addon 列表里,@Mod 类上也没有 NEI 插件注解。另注:dependencies.gradle 把 NotEnoughItems:2.6.30-GTNH 与 ForestryMC:4.9.7 声明为 implementation(编译期硬依赖),运行期则靠上面的 isModLoaded 守卫。

本 mod 没有的内容(grep 证据)

以下维度在 src/main/java/ 全仓库零命中,因此未建对应目录:

维度 grep 模式 命中
keybinding new KeyBinding、registerKeyBinding 0
achievement Achievement 0
enchantment Enchantment、registerEnchantment 0
potioneffect PotionEffect、MobEffects、registerPotion 0
multiblock Multiblock、IMultiblock、Formation、Controller、structure 0
dimension WorldProvider、registerDimension、DimensionManager 0
biome BiomeGen、registerBiome 0(BiomesOPlenty 的 7 处命中全是树苗方块与常量名,与群系无关)
structure WorldGen、IWorldGenerator、MapGen、registerStructure、ChunkProviderEvent 0
世界生成资源 src/main/resources 下无任何 worldgen / biome / structure 配置文件 0
掉落 dropFewItems、dropRareDrop、getItemDropped、getDrops 0(方块与实体均无掉落)
附魔适用 getItemEnchantability、canApplyAt 0

[!NOTE] BiomesOPlentyAddon 不是群系整合:它只从 Block.blockRegistry 里取 BiomesOPlenty:sapling_0/1/2 三种方块(各 8 个 metadata),没有 import 任何 Biome 类,也没有注册群系。

逐条说明:

  • 本 mod 没有多方块结构。multiblock/ 在本 wiki 中不存在。BlockMarket 虽继承 BlockContainer,但 TileMarket 是 5 行空类,无成组检测、无 Controller、无 Formation 类。市场是单方块 + 1 实体。
  • 本 mod 没有作物 / 作物方块 / 农田交互。种子与树苗全部是外部 mod 物品,本 mod 不 place 它们、不 till 土地、不定义 IPlantable。
  • 本 mod 没有矿物、机器、管道、能量、流体。IEnergyHandler / EnergyStorage / IFluidHandler / FluidTank 全仓库 0 命中。
  • 本 mod 没有热键。全 mod 无 KeyBinding,市场 GUI 只支持鼠标与搜索框键盘输入。
  • 本 mod 没有成就。Achievement 0 命中。
  • 本 mod 没有 Buff/Debuff,不施加任何 PotionEffect。
  • 本 mod 没有附魔,也不让任何物品被附魔。
  • 本 mod 没有维度、群系、结构与世界生成。不注册 WorldProvider / 维度 ID / 群系 / 结构,也不改矿物分布。
  • 本 mod 没有独立实体 AI 生成的自然生物。EntityMerchant 是 NPC(INpc),canDespawn() 返回 false,不刷怪、不攻击(未覆写 attackEntityAsMob),杀死只有经验球。
  • 本 mod 没有第二个物品系统:ItemBlockMarket 之外零个物品。

方块列表

  • Market(市场摊位) - 唯一方块,硬度 2.0F / 抗爆 10.0F,metadata 即朝向(2~5),摆放时生成商人

物品列表

实体列表

  • Merchant(商人) - 唯一实体,20 HP / 护甲 0 / 碰撞箱 0.6×1.95,3 个 AI 任务,NBT 存 4 个市场字段

游戏设定列表