已应用工厂

已应用工厂

这是一个通过基于脚本的方式控制AE2处理工作和被动工作的模组。

应用能源学 2

Applied Factory

Applied Energistics 2 的 TypeScript 自动化。

Applied Factory 允许你用代码定义 AE2 处理样板,并控制执行这些样板的机器。工厂控制器运行你的脚本,而工厂总线则负责搬运资源并与机器和方块交互。你可以在游戏内编辑器或 IDE 中编写程序,也可以连接支持 MCP 的编程助手来检查你的装置并针对正在运行的世界开发脚本。

功能

  • 脚本定义处理: 将输入、输出和订单处理器注册为 AE2 处理样板,然后从 AE2 终端请求其产物。
  • 持续自动化: 运行独立的工作流来收集输出、供应消耗品、在网络之间搬运资源或请求 AE2 合成任务。
  • 精确资源路由: 按 ID 或标签筛选资源,定位单个物品槽位,并在部分转移与全有或全无的批量转移之间选择。物品、流体以及由 AE2 附属模组注册的资源频道共用同一套 API。
  • 世界交互: 使用物品、放置和破坏方块、丢弃资源、检查方块状态和 NBT 快照,以及通过工厂总线读取或发出红石信号。
  • 整合包配方数据: 导出本地 JEI 配方,并通过 require_recipes(...) 选取它们,以使用整合包实际的输入和输出。
  • 可编辑工作区: TypeScript 声明、示例、日志、上传/下载控制、外部编辑器支持,以及可选的、当文件变更时自动重新上传。

要求

当前项目面向 Minecraft 1.21.1、NeoForge 21.1.244 或更新版本,以及 Applied Energistics 2 19.x 系列中的 19.2.17 或更新版本。本地 JEI 配方数据用于配方导出。

快速开始

  1. 放置一台工厂控制器,并将其连接到包含你的存储的、已供能的 AE2 网络。使用你惯用的 AE2 合成 CPU 配置来进行自动合成。
  2. 将工厂总线连接到 AE2 线缆上,朝向你想操作的机器。机器的朝向仍然适用:输入、燃料和输出可能需要总线位于不同的面。
  3. 打开控制器并点击导出工作区。这会在游戏目录中准备 appliedscripts/,其中包含文档、demo.ts、类型声明以及导出的配方数据。
  4. 在控制器的文件浏览器中创建或选择一个 .ts 文件。在游戏内编辑它,或使用打开 VS Code / 打开文件夹在外部工作。
  5. 点击 ↑ 保存并上传脚本。启用控制器日志以检查它已加载并注册了样板。
  6. 从 AE2 终端请求一个已注册的输出。

对于简单的装置,存储和机器可以共用同一个网络。要将下单网络与生产网络分开,请将它们连接到控制器的不同面,并使用 network("back")、network("front") 或绝对方向(如 "north" 和 "top")来选择它们。控制器会在各面之间共享 AE 能量,同时保持各自的物品和频道网络相互独立。

保存(Ctrl+S)只会写入本地文件;↑ 还会将其上传。如果控制器已有一个程序但没有匹配的本地副本,请在编辑前使用 ↓ 将其下载下来。启用自动重载可从外部编辑器自动上传更改。

示例:熔炉处理

将下单/存储网络连接到控制器的背面,并将一个独立的机器网络连接到其正面。将一个工厂总线放在熔炉上方用于输入,另一个放在下方用于输出,二者都位于机器网络上。单独供应熔炉燃料。此示例假设使用的是标准铁矿石冶炼配方;在游玩修改过的整合包时,请检查导出的配方。

const production = network("front");
const storage = network("back");
const input = production.buses.find(bus =>
  bus.target.id === "minecraft:furnace" && bus.targetFace === "up"
);
const output = production.buses.find(bus =>
  bus.target.id === "minecraft:furnace" && bus.targetFace === "down"
);

if (input === undefined || output === undefined) {
  throw new Error("Connect input and output Factory Buses to the furnace.");
}

registerProcessingPattern(
  [{
    orderNetwork: "back",
    inputs: [item("minecraft:iron_ore", 1)],
    outputs: [item("minecraft:iron_ingot", 1)],
  }],
  function* (order) {
    yield order.input.pushExactlyInto(input);
  },
);

go(function* () {
  while (true) {
    yield output.extract(item("minecraft:iron_ingot")).to(storage);
    yield sleep(20);
  }
});

订单处理器为熔炉供料,而一个独立的工作流收集成品锭。当所有声明的输出都返回到下单网络时,AE2 就认为处理已完成。因此,多步配方可以拆分为独立的样板,交由 AE2 来调度。

yield 会等待一个动作完成。pushExactlyInto(...) 会等待直到整批物品能够一次性移动;.to(...) 则可以分批搬运资源。资源转移动作还提供 .now(),用于立即尝试一次。

使用整合包配方

导出工作区后,按 ID、类型、机器、输入或输出选取配方:

const recipes = require_recipes({
  type: "minecraft:smelting",
  output: "minecraft:iron_ingot",
});

每个结果包含 id、type、inputs、outputs 和 json。输入的输出与输出规格可用于注册处理样板。require_recipes(...) 会在上传前展开,因此请保持筛选条件具体,并在配方变更后再次导出工作区。某些配方类别会被排除在导出之外;详情请参阅脚本 API。

脚本还可以使用 import settings from "./settings.json" 导入工作区 JSON。不支持 TypeScript/JavaScript 模块导入。上传时会检查代码能否转译;请在 IDE 中使用提供的类型声明以进行完整的类型检查。

与编程助手协作

  1. 导出工作区,并在支持 MCP 的编程工具中将 appliedscripts/ 作为项目打开。其中的 agents.md 描述了控制器工作流,SCRIPT_API.md 记录了 API。
  2. 将该工具的项目级 MCP 连接配置为 http://127.0.0.1:39291/mcp。工作区包含一份 OpenCode 配置;其他工具需要各自的配置格式。更改 MCP 设置后请重启代理。
  3. 在游戏内打开目标控制器并点击 M 将其绑定。保持其区块已加载且游戏未暂停。
  4. 让助手检查网络和机器,运行探测脚本,然后从工作区保存并上传生产脚本。
工具 用途
appliedfactory_status 读取连接、已绑定的控制器、工作区路径和自动重载状态。
appliedfactory_execute 运行临时的 TypeScript 探测并返回其日志、结果和完成原因。
appliedfactory_upload 从本地工作区文件编译并替换生产程序;编译失败会保持现有程序不变。

探测脚本会在实际世界中运行,可能会搬运资源或与机器交互。请告知助手要处理哪条生产线、应由什么触发,以及是否进行试运行。

文档与故障排除

游戏内的 AE2 指南包含英文和简体中文文档。相同的源文件在此处也可获取:

参考资料 英文 简体中文
控制器设置与界面 Factory Controller 工厂控制器
编程模型与 API Script API 脚本 API
完整类型声明 applied_factory.d.ts applied_factory.d.ts
编程助手说明 agents.md agents.md

另请参阅随附的 demo.ts,其中涉及拓扑发现、输出收集、红石以及附属模组资源频道。

  • 样板缺失: 启用日志,检查脚本错误,并确认 orderNetwork 指向你请求合成的网络。
  • 传输一直等待: 检查可用数量、目标容量,以及暴露给总线的机器面。storage() 可能会显示该面无法提取的物品。
  • 配方展开失败: 再次导出工作区以刷新配方数据。
  • MCP 无法连接: 检查项目配置、控制器绑定、区块加载以及游戏是否暂停。

当控制器的所有面都失去电力时,脚本和订单会暂停,直到电力恢复。正在运行的工作流和脚本发起的合成订单不会在控制器卸载或脚本重载后保留;有关取消和资源回收行为,请参阅脚本 API。