AutoEMC

AutoEMC

为 ProjectE 实现自动、准确的 EMC 分配 — 专为整合包而构建,而不仅仅是原版。

魔法

AutoEMC — 完全指南

为 ProjectE 自动、安全地生成 EMC 值。

AutoEMC 是一个 Forge 模组,它会在启动时扫描整合包中的物品和配方,然后自动填补缺失的 ProjectE EMC 值。专为大型“厨房水槽”整合包设计,手动为每个物品定价是不现实的。


1. 概览:AutoEMC 做什么

AutoEMC 从来不想取代 ProjectE——它只是填补空缺。在启动时,它会:

  1. 检查 ProjectE 已经知道的 EMC 值。
  2. 读取所有已加载的配方。
  3. 尝试从它能理解的配方中推导缺失的值(这总是优先于猜测)。
  4. 仅在没有配方路径时,才回退到智能猜测。
  5. 将所有内容写入 ProjectE 的值文件,以及自己的诊断日志。

两个版本的核心规则:AutoEMC 不会故意降低 ProjectE 或整合包作者已设置的值。 它只填补空缺,或者(在 1.20.1 版本中)当新的配方证据证明合理时,提高自己早期的回退猜测值。


2. 值如何被解算(配方解算)

这是两个版本中首选的方法——在猜测之前,先通过实际合成配方来解算价格。

  • 如果配方中的每种成分都有已知的 EMC 值,AutoEMC 就可以计算出产物的价值(大致为:总成分成本 ÷ 产出数量)。
  • 1.20.1 在这里增加了更多细微差别:
    • 运行多次解算“轮次”(maxRecipePasses),以便配方链可以分阶段解析。
    • 为原始/基础材料设定一个起始回退值,以便依赖它们的配方仍然可以解算,然后在之后重新解算。
    • 如果加载的配方证明某个物品应该更贵,则可以稍后提高回退产物的价格(postFallbackRecipeUpgrade)。
    • 特殊处理锻造台转化配方(升级后的工具/盔甲从其基础物品 + 升级材料继承价值),但会跳过装饰性的锻造台纹饰,因为它们会产生混乱/误导性的值。
    • 当一种成分有多个匹配选项时,默认使用更安全的、更低的 EMC 值(allowRecipeValueIncrease 可以改变此行为,但关闭它更安全)。
  • 1.16.5 也使用捆绑的映射/转换数据(来自 ProjectE Integration)作为额外的“类似配方”的边缘,因此非普通合成配方的东西(如物品转换机制)仍然可被视为可解算路径。

3. 回退定价(当没有配方时)

如果配方无法解算价格,AutoEMC 会依次通过几个层级进行回退,大致顺序如下:

  1. 捆绑的基础值 —— 从 ProjectE Integration 附带的数据中提取(植物魔法、末影接口、通用机械、机械动力等数十个模组)。

  2. 基于材料/标签的回退 —— 匹配诸如 forge:ingots/copper、forge:gems/diamond、forge:dusts/sulfur、forge:storage_blocks/iron 等标签。一个基础材料值会乘以其形态(例如,一个存储块 ≈ 9 个锭,一个粒 ≈ 1/9 个锭)。

  3. 基于稀有度/等级的回退作为最后手段:

    • 1.16.5:简单的基于稀有度的回退,带有一个“反向配方底线”,因此原材料最终不会比由其制成的加工品更便宜。
    • 1.20.1:增加了稀有度 + 堆叠大小 + 耐久度回退,以及一个专门的进阶等级系统,用于强大的模组物品,这样它们就不会获得便宜的通用价值:
      • 强 —— 例如,ATM金属、飞龙级物品
      • 非常强 —— 例如,振金、龙之、龙块、觉醒级物品
      • OP(超强) —— 例如,终焉锭、混沌、无限、创造级物品
      • 等级匹配可以由模组命名空间、精确的物品 ID 或物品路径中的关键字触发。

回退在两个版本中默认开启(因为它使大型整合包可用),但可以为了更严格的设置而收紧或禁用。


4. NBT 标签物品

两个版本都理解某些物品(药水、附魔书、材料标签物品)会因其 NBT 数据而变化,而不仅仅是其基础 ID。

  • 一个可插拔的 NBT 材料解析器框架根据其实际嵌入的材料为这些物品定价,而不是将每个变体都归入一个通用值。
  • 对诸如 Avaritia 奇点之类的东西的内置支持(根据其材料 + 一个乘数定价)。
  • 可以作为预扫描轮次运行,在某些情况下,还可以在 ProjectE 实际转换期间实时运行。
  • maxNbtVariantsPerItem 限制一个物品 ID 可以生成的变体数量,因此在一个大型整合包中,一个物品不会爆炸式地产生数百个条目。

5. 安全特性(保护经济)

两个版本都共享相同的安全理念——不要让自动定价毁掉整合包的经济:

  • 仅创造 / 无配方技术性物品 默认锁定为 1 EMC,因此它们永远不会作为无限价值的来源泄露到生存模式。
  • 大幅掉落保护 阻止任何单次扫描将已定价物品的价值崩溃到超出可配置的比例——相反,它会被记录到检疫报告中,而不是静默应用。
  • 所有权追踪:AutoEMC 保持自己的记录,记录它生成了哪些值,与 ProjectE/整合包作者的值分开,因此它知道以后允许再次接触哪些值。
    • 1.16.5 特别有一个“所有权仲裁器”,防止 ProjectE 仅仅回响 AutoEMC 的最后一个值而被误认为是手动覆盖(否则会删除 AutoEMC 对该条目的追踪)。
  • 永不降低 ProjectE 拥有的值。
  • 自适应、批量化扫描——在服务器 ticks 间以小批次工作,而不是在启动时冻结服务器,即使有数千个物品。
  • 1.20.1 另外:如果自上次扫描以来没有任何变化,则跳过重新扫描,并且可以要求在信任正常回退之前,成功加载的配方达到最低数量(及早捕获损坏的配方加载)。

6. 报告和日志

两个版本都写入诊断文件,以便您可以审计到底发生了什么以及为什么:

  • generated_entries.json —— AutoEMC 当前拥有/生成的所有内容。
  • underpriced_inputs_report.json (1.16.5) —— 标记那些看起来价格过低、与其用于合成的物品相比不匹配的非拥有物品。
  • quarantined_drops.json (1.16.5) —— 因看起来不安全而被阻止的值更改。
  • autoemc-debug.log / autoemc-debug.previous.log (1.20.1) —— 主要故障排查日志,以及前一次运行的日志。
  • recipe_solve_state.json (1.20.1) —— 扫描状态,因此未更改的整合包可以跳过不必要的重新扫描。
  • known_items.json (1.20.1) —— 追踪的物品注册表状态。
  • config/ProjectE/custom_emc.json —— ProjectE 实际读取以应用 EMC 值的文件。

每个生成的值都带有其来源标签(baseline、tag-material、rarity-fallback、reverse-recipe-floor、creative-no-recipe 等),因此您可以追溯某个数字是如何得出的。


7. 关键配置选项

通用

  • enabled —— 总开关。
  • alwaysRescan (1.20.1) —— 每次服务器启动时扫描,即使没有任何变化。
  • chatNotifications / chatVerbosity —— 聊天中的扫描消息(0 = 最少,2 = 详细)。
  • itemsPerTick / adaptiveBatchSizing / adaptiveBatchTargetMs —— 控制扫描批处理/延迟。

配方解算

  • solveRecipes —— 开启/关闭从配方推导的值。
  • maxRecipePasses (1.20.1) —— 运行多少次依赖解算轮次。
  • allowRecipeValueIncrease —— 使用最高选项还是最低选项成分(最低/关闭更安全)。
  • useBundledProjectEMappingConversions / useMapperFramework —— 使用捆绑的 ProjectE 风格转换数据作为额外的配方边缘。

回退

  • useFallbackForUnsolvable —— 是否允许回退定价。
  • useForgeTagFallback —— 在通用稀有度回退之前,使用材料标签。
  • useProjectEIntegrationBaselines —— 使用捆绑的基础值。
  • giveCreativeNoRecipeItemsOneEmc —— 针对创造/无配方物品的 1 EMC 安全底线。
  • tagFallbackNamespaces —— 要检查的标签命名空间(默认值:forge、mekanism、create)。
  • protectedCheapFallbackPatterns (1.20.1) —— 绝不应该获得廉价回退值的物品 ID 片段。

安全

  • largeDropProtectionThreshold / maxAllowedDropRatio —— 调整大幅掉落防护。
  • ownershipSmallDifferenceRatio —— AutoEMC 和 ProjectE 值之间的差异多大程度会被视为“仅噪声”。
  • consistencyWarnMinRatio / consistencyWarnMinAbsoluteDelta (1.16.5) —— 低价输入报告的阈值。

NBT

  • scanNbtVariants —— 扫描 NBT 标签物品变体。
  • maxNbtVariantsPerItem —— 每个物品 ID 能生成的变体上限。
  • useNbtMaterialResolvers / useLiveNbtMaterialResolution —— 启用材料感知的 NBT 定价。
  • nbtMaterialMultipliers —— 材料标签 NBT 解析器使用的乘数。

以上所有内容都位于 autoemc-common.toml 中。


8. 命令 (1.20.1)

/autoemc rescan

需要权限等级 2。立即强制进行一次全新的扫描,无需等待服务器重启。


9. 构建信息 (1.20.1)

  • 模组 ID:autoemc
  • 版本:2.0.0
  • 构建命令:.\gradlew.bat clean build
  • 输出 jar:build/libs/autoemc-2.0.0.jar

预发布冒烟测试检查清单:

  1. 安装 ProjectE 和 AutoEMC 后启动游戏。
  2. 确认日志中出现扫描开始消息。
  3. 确认 latest.log 或 config/autoemc/autoemc-debug.log 中无错误。
  4. 确认 config/ProjectE/custom_emc.json 被写入/更新。
  5. 重启或执行 /reload 以使生成的值生效。

注意:在大型整合包上首次扫描可能需要 5 分钟以上,并且可能看起来像什么都没发生——它正在处理物品、配方和回退逻辑。在出现完成消息之前,请等待,不要假设它卡住了。


10. 要求回顾

1.16.5 版本:

  • Minecraft 1.16.5,Forge
  • ProjectE(必需)
  • ProjectE Integration(必需——用于基础数据和其自身集成的功能)

1.20.1 版本:

  • Minecraft 1.20.1,Forge 47.x,Java 17
  • ProjectE(必需,但无需捆绑 jar——使用反射/兼容)
  • ProjectE Integration(用作基础数据源)