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 名不符、容易被外部资料误导的前提,均已由源码核实:
- mod 名里有 “Farming” 但本 mod 不种任何东西。全仓库零个作物方块、零个
ItemSeeds、零条关于 farmland/tilling 的代码。种子与树苗全部是其他 mod 的物品,本 mod 只做「定价与售卖」。market有 4 个 metadata 值(2~5),但不是 4 种子类型。metadata 存的是ForgeDirection的 ordinal(朝向),见 Market 方块。@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 没有成就。
Achievement0 命中。 - 本 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),摆放时生成商人
物品列表
- Market(物品形态) - 唯一物品,
ItemBlockMarket空壳,堆叠 64,无耐久 / 无附魔
实体列表
- Merchant(商人) - 唯一实体,20 HP / 护甲 0 / 碰撞箱 0.6×1.95,3 个 AI 任务,NBT 存 4 个市场字段
游戏设定列表
- 市场注册表 Market.json - 10 个默认批次 / 147 + N 条目 / 4 段 JSON schema / 50 格容器 / 3 值分类枚举
- FarmingForEngineers.cfg - 唯一配置项
Show Registry Warnings(boolean,默认false) - /farmingforengineers reload - 唯一指令,权限 0 级,热重载
Market.json