RecEx

[!INFO] Git Commit: 85f1023 | Updated: 2026-02-06

RecEx(modid RecEx,显示名 Recex Recipe Exporter)是一个纯客户端的配方导出工具——它不注册任何方块、物品、实体、附魔、维度、群系、结构、成就或指令,全部 21 个 Java 文件只做一件事:把当前游戏内存里已注册的合成配方抓出来,压缩成一个 JSON 文件(外加一个 zip)写到存档根目录,供 NotEnoughProduction 等外部程序读取。

源码包 com.bigbass.recex,作者 bigbass1997,GTNH fork,版本标签 1.1.5。

基本信息

属性 值
modid RecEx(首字母大写,非全小写)
@Mod 类 com.bigbass.recex.RecipeExporterMod
显示名 Recex Recipe Exporter(gradle.properties 的 modName)
Minecraft 1.7.10 / Forge 10.13.4.1614
版本 1.1.5(HEAD 正好在该 tag 上;@Mod 里写的是 gradle token Tags.VERSION)
源码规模 21 个 Java 文件
端 仅客户端(ServerProxy 只打一条警告)
硬依赖 GregTech 5U 及其 BartWorks / GT++ / Good Generator / TecTech 附属(编译期直接 import)
注册内容 1 个热键、0 方块 / 物品 / 实体 / TileEntity / 指令 / 附魔 / 维度
配置 无。<config>/RecEx 目录会被创建但永远为空
内容维度 仅 keybinding(1 条)与 setting(7 条)

工作方式

按 K(默认键,可改)          [Open Exporter GUI]
   ↓
全屏蓝底 GUI,单个 "Export!" 按钮
   ↓  点击后立刻关闭 GUI,导出转入 daemon 线程
抓取 5 类配方 → Gson 压缩序列化 → 写 .json → zip4j 压 .zip
   ↓
<存档根>/RecEx-Records/<UTC时间戳>.json + .zip

因为是运行时即时抓取,任何在 init/postInit 期间发生的配方改动(包括 MineTweaker 脚本)都会被一并导出;代价是必须在已加载的存档里才能导出。

热键列表

  • Open Exporter GUI — 默认 K,分类 Recipe Exporter,打开导出器 GUI。全 mod 唯一热键

导出机制

  • 配方导出流程 — 触发链、子线程执行、确定性排序、异常处理的一处不一致
  • 导出输出位置 — RecEx-Records/ 路径推导、UTC 秒级时间戳、zip 参数、被创建却从不写入的空配置目录
  • 导出 JSON 格式 — sources 五段结构、字段缩写约定、GT 字段缺失、仓库里 schema.json 已过时

数据模型

  • 配方类型对比 — ShapedRecipe / ShapelessRecipe / OreDictShapedRecipe / FurnaceRecipe 逐项对比
  • 成分类型 — IItem / Item / ItemOreDict / Fluid 枚举与 NBT 编码
  • GT 配方表遍历 — 反射扫描 5 个 RecipeMap 容器类、按机器分组
  • 仅客户端模组 — 端代理差异、无网络消息、acceptableRemoteVersions = "*"

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

以下维度经全源码检索确认没有任何内容,因此未创建对应目录。grep 命令均在 /Users/evlos/a/mirror/RecEx/src/main/java 下对全部 21 个 Java 文件执行。

没有方块 / 物品 / TileEntity

$ grep -rn "registerBlock\|registerItem\|registerTileEntity\|registerEntity" .
(无输出)

$ grep -rn "extends Item\b\|extends Block\b\|extends Entity\|extends TileEntity" .
(无输出)

mcmod.info 里也没有 tileEntities 字段。RecEx 不向游戏注册任何内容物,CraftingManager / FurnaceRecipes 只是被读取。

没有指令

$ grep -rn "ICommand\|addChatCommand\|CommandBase\|getCommandName\|getRequiredPermissionLevel" .
(无输出)

导出不能用指令触发,只能靠热键开 GUI 点按钮。mcmod.info 的 dependencies 为空数组(由 gradle 模板生成),没有任何命令注册。

没有网络消息

$ grep -rn "SimpleNetworkWrapper\|IMessage\|NetworkRegistry\|sendToServer\|FMLEmbeddedChannel" .
(无输出)

唯一用到网络类的地方是 GuiMain 复用原版 S02PacketChat 把提示塞进本地聊天栏,不涉及自建 channel。

没有附魔 / 药水效果 / 群系 / 结构 / 成就 / 维度

$ grep -rn "net.minecraft.enchantment\|PotionEffect\|Achievement\|WorldProvider\|BiomeGen\|dimensionManager\|IBonemealable" .
(无输出)

没有多方块结构

grep -rn "Multiblock\|IMultiblock\|TileMultiblock" . 无输出——本 mod 不放置任何方块,结构概念无从谈起。

没有配置项

$ grep -rn "Configuration\|@Mod.Config\|configuration\.\|loadConfig\|ConfigurationCategory" .
./com/bigbass/recex/RecipeExporterMod.java:33:        clientConfigDir = e.getModConfigurationDirectory();

唯一命中是 getModConfigurationDirectory()——只是取路径去拼输出目录,不加载任何 .cfg。src/main/resources/ 下也没有任何 .lang / .properties 配置文件(只有 mcmod.info 与 gson/zip4j 的 LICENSE、NOTICE)。

硬编码的"规则"只有三处,全在代码里不可配置:输出目录名 RecEx-Records、时间戳格式 uuuu-MM-dd_HH-mm-ss 与时区 UTC、zip 的 DEFLATE + FASTEST。

没有 NEI / REI 集成代码

$ grep -rn "codechicken\|notenoughitems\|mezz.jei\|IRecipeHandler\|ICraftingRecipeProvider\|IItemListOverlay" .
(无输出)

dependencies.gradle 里确实有 runtimeOnlyNonPublishable("com.github.GTNewHorizons:NotEnoughItems:2.8.60-GTNH:dev"),但那是仅供开发环境 runClient 用的 dev 依赖(NonPublishable),不参与发布、也没有任何源码 import。RecEx 与 NEI 的关系是单向的数据消费者关系——README 提到它"developed alongside NotEnoughProduction",导出文件供 NEP 读取,NEP 侧不需要装 RecEx。

没有事件订阅之外的客户端钩子

@SubscribeEvent 全仓库只有 1 处:listeners/KeyInputEventHandler.onKeyInput(InputEvent.KeyInputEvent)。没有 Mixin(gradle.properties 的 usesMixins = false),没有 ASM 字节码修改,没有 coremod(coreModClass 为空)。

第三方集成

库 / mod 关系 依据
GregTech 5U 硬依赖,提供 GTRecipe / RecipeMaps implementation(...) + 直接 import
BartWorks / GT++ / Good Generator / TecTech 硬依赖,仅为多抓几组 RecipeMap 顶部直接 import,无 isModLoaded 守卫
Gson 2.7 硬依赖,负责序列化 shadowImplementation,打进 jar
zip4j 2.3.1 硬依赖,负责压缩 shadowImplementation,打进 jar
jabel(Blowdryer) 编译期,为 FurnaceRecipe 的 record 语法降级到 Java 8 enableModernJavaSyntax = jabel
LWJGL 客户端按键枚举与 OpenGL 绘制 Keyboard.KEY_K / GL11
NotEnoughItems 仅 dev 依赖,零源码引用 runtimeOnlyNonPublishable(...:dev)
MineTweaker / CraftTweaker 无依赖,但导出会包含其脚本改的配方 README 明确说明

Color.java 的类注释写明其代码"directly copied from com.badlogic.gdx.graphics.Color"(Apache 2.0,文件头保留了 LibGDX 版权声明)。