格莱梅拉燃料

格莱梅拉燃料

GlymeraFuel移除了熔炉和篝火的燃料需求,并通过可配置的乘数(最高10倍)加速了四种工作台类型(熔炉、篝火、回收台、制革厂)的工作速度。所有设置均可通过config.json为每个工作台单独自定义。

生活质量

🔥 GlymeraFuel 🔥

无需燃料的熔炉/营火,并将处理速度提升至 10 倍。

目前仅适用于 Hytale stable 4 版本! 不要错过我其他激动人心的项目——查看 GlymeraCraft 的个人主页 Discord: https://discord.gg/s5NRFWfxgy


◆ 什么是 GlymeraFuel?

GlymeraFuel 是一个服务端插件,它可以移除熔炉和营火的燃料需求,并为处理台提供可配置的速度倍数。您的处理台将立即工作,无需等待燃料燃烧和物品缓慢熔炼——不再需要煤炭、木材,无需等待。

该插件通过运行一个后台扫描器来工作,该扫描器会定期遍历所有世界中的所有已加载区块。它使用 Hytale 的 ECS(实体组件系统)查找所有活动的 ProcessingBenchState 组件,并通过反射操作其内部状态。对于无燃料模式,插件会将内部的 fuelTime 值维持在 999.0,使处理台永不耗尽燃料。对于速度提升,插件会在每个扫描周期向 inputProgress 字段添加额外的进度,从而有效地成倍提高处理速度。

默认情况下,该插件管理 4 种处理台类型:熔炉和营火在无燃料模式下以 10 倍速度运行,而 Salvagebench 和 Tannery(本身不需要燃料)仅以 10 倍速度提升。您可以在配置文件中为每种处理台添加任何其他类型、更改速度倍数或单独切换无燃料模式。

◆ 支持的处理台类型(默认配置)

▸ 熔炉

标准的冶炼站。通常需要燃料(煤炭、木材等)才能运行。使用 GlymeraFuel,熔炉无需任何燃料即可运行,并且默认以 10 倍速度处理物品。插件会检测熔炉是否具有燃料槽,自动将燃料计时器填满,同时如果配方已配置但处理台处于非活动状态,则会激活它。

▸ 营火

户外烹饪站。与熔炉一样,营火通常需要燃料才能运行。GlymeraFuel 移除了这一需求,并将处理速度默认提升至 10 倍。与熔炉相同的无燃料和速度提升逻辑同样适用。

▸ Salvagebench

物品回收站。Salvagebench 本身不需要 燃料,因此默认情况下此处理台类型的无燃料功能是禁用的(fuelFree = false)。然而,它仍然受益于 10 倍的速度倍数,使回收操作显著加快。

▸ Tannery

皮革加工站。与 Salvagebench 类似,Tannery 本身不需要 燃料,因此默认禁用无燃料模式(fuelFree = false)。10 倍的速度倍数是激活的,可加速所有制革配方。

◆ 工作原理 - 逐步说明

  1. 在服务器启动时,插件从插件的数据目录加载其 config.json。如果不存在配置文件,则会自动创建一个包含所有 4 种预配置处理台类型的默认配置。
  2. 插件初始化 Java 反射 以访问 ProcessingBenchState 类的 4 个私有字段:fuelTime(浮点数 - 剩余燃料持续时间)、inputProgress(浮点数 - 当前处理进度)、active(布尔值 - 处理台当前是否正在运行)和 recipe(对象 - 当前加载的配方,如果未设置配方则为 null)。
  3. 插件从 Hytale 的 BlockStateModule 中检索 ProcessingBenchState ComponentType。需要此 ComponentType 才能使用 Hytale 的 ECS 架构有效地查询已加载区块中的所有处理台状态。
  4. 在 Hytale 的 SCHEDULED_EXECUTOR 上注册一个计划的后台任务。此任务以固定的时间间隔运行(默认:每 500 毫秒一次,可在 100 毫秒到 5000 毫秒之间配置)。
  5. 在每个扫描周期,任务使用 Universe.get().getWorlds() 遍历服务器上的所有世界。对于每个世界,它通过 world.execute() 在世界自身的执行线程上分派一个扫描操作。
  6. 在每个世界内部,插件访问 ChunkStore 并调用 forEachChunk,并传入 ProcessingBenchState ComponentType。这可以高效地仅遍历包含处理台的区块,完全跳过所有其他区块。
  7. 对于找到的每个 ProcessingBenchState,插件使用 state.getBench().getId() 读取处理台的 ID,并检查该处理台类型是否列在配置中。如果未配置该处理台类型,则跳过。
  8. 对于启用了 fuelFree 的处理台,插件首先检查该处理台是否实际具有燃料槽(使用 ProcessingBench.getFuel())。这可防止将无燃料逻辑应用于本身不使用燃料的处理台。如果处理台有燃料槽且当前 fuelTime 低于 100.0,插件会将 fuelTime 设置为 999.0,从而有效地为处理台提供无限燃料。此外,如果处理台已加载配方但当前未处于活动状态,插件会强制将 active 设置为 true 以立即开始处理。
  9. 对于 speedMultiplier 大于 1 的处理台,并且仅当处理台当前处于活动状态且已加载配方时,插件会计算额外进度:(speedMultiplier - 1) × (scanIntervalMs / 1000.0)。此值会在每个扫描周期添加到当前的 inputProgress 中。在 500 毫秒间隔下,10 倍的倍数意味着每个扫描周期额外增加 4.5 个进度单位(9 × 0.5),从而有效地使处理台的处理速度比正常情况快大约 10 倍。
  10. 所有操作都使用缓存的反射字段,这些字段在启动时初始化一次,从而最大限度地减少每个扫描周期中反射带来的性能开销。

◆ 配置

GlymeraFuel 使用一个 config.json 文件,该文件在首次启动时会在插件的数据目录中自动创建。配置在服务器启动时加载一次。要应用更改,请重启服务器。

▸ 默认 config.json

{
  "scanIntervalMs": 500,
  "benches": {
    "Furnace": {
      "fuelFree": true,
      "speedMultiplier": 10
    },
    "Campfire": {
      "fuelFree": true,
      "speedMultiplier": 10
    },
    "Salvagebench": {
      "fuelFree": false,
      "speedMultiplier": 10
    },
    "Tannery": {
      "fuelFree": false,
      "speedMultiplier": 10
    }
  }
}

▸ 配置选项说明

  • scanIntervalMs(整数,默认值:500) - 插件扫描所有已加载区块以查找处理台的频率,以毫秒为单位。值越低,响应越快,但 CPU 使用率略高。限制在 1005000 毫秒之间。
  • benches(映射) - 处理台类型名称与其单独设置之间的映射。键必须与 Hytale 中定义的处理台 ID 完全一致(例如,"Furnace"、"Campfire"、"Salvagebench"、"Tannery")。您可以添加服务器上存在的任何处理台类型。
  • fuelFree(布尔值,默认值:true) - 启用时,插件会将处理台的燃料计时器保持在 999.0,并在加载配方时自动激活处理台。此设置仅对实际具有燃料槽的处理台有效。对于没有燃料槽的处理台(如 Salvagebench 和 Tannery),无论其值如何,此设置都会被忽略。
  • speedMultiplier(整数,默认值:10) - 处理台处理物品的速度倍数。值为 1 表示正常速度(无提升)。限制在 110 之间。速度提升仅在处理台处于活动状态且已加载配方时适用。

▸ 添加自定义处理台类型

您可以使用 Hytale 中准确的处理台 ID 将任何处理台类型添加到配置中。例如,如果一个模组添加了一种名为 "Kiln" 的新处理台类型,您可以添加:

{
  "scanIntervalMs": 500,
  "benches": {
    "Furnace": { "fuelFree": true, "speedMultiplier": 10 },
    "Campfire": { "fuelFree": true, "speedMultiplier": 10 },
    "Salvagebench": { "fuelFree": false, "speedMultiplier": 10 },
    "Tannery": { "fuelFree": false, "speedMultiplier": 10 },
    "Kiln": { "fuelFree": true, "speedMultiplier": 5 }
  }
}

◆ 功能

  • 无燃料运行 - 熔炉和营火无需任何燃料即可运行。插件将内部燃料计时器保持在 999.0,使处理台永不停止。无需收集煤炭、木材或任何其他燃料来源。
  • 可配置的速度倍数 - 对每种处理台类型单独将处理速度从 1 倍(正常)提升到 10 倍。在 10 倍速度下,通常需要 10 秒的配方大约在 1 秒内完成。
  • 按处理台类型设置 - 每种处理台类型都有自己独立的 fuelFree 和 speedMultiplier 设置。您可以设置熔炉以 10 倍速度无燃料运行,同时保持营火以正常速度需要燃料,或任何其他组合。
  • 智能燃料检测 - 插件在应用无燃料逻辑之前会检查处理台是否实际具有燃料槽。没有原生燃料槽的处理台(如 Salvagebench 和 Tannery)永远不会受到无燃料功能的影响,即使配置中 fuelFree 设置为 true。
  • 自动激活 - 当无燃料模式激活时,插件会自动激活已加载配方但尚未运行的处理台。这意味着您只需将物品放入处理台,它就会立即开始处理——无需手动添加燃料来触发它。
  • 基于 ECS 的区块扫描 - 插件使用 Hytale 的实体组件系统高效地仅扫描包含处理台的区块。它不遍历每个区块中的每一个方块,而是使用 ProcessingBenchState ComponentType 配合 forEachChunk 直接访问相关数据。即使在加载了许多区块的服务器上,这也非常高效。
  • 多世界支持 - 扫描器会自动在服务器上的所有世界中运行。每个包含处理台的世界都将受益于该插件的功能。
  • 缓存反射 - 所有反射字段查找仅在启动时执行一次,并在插件的整个生命周期内缓存。这最大限度地减少了反射在紧密循环中使用时通常引入的性能开销。
  • 线程安全执行 - 所有处理台修改都通过 world.execute() 分派到每个世界自身的执行线程,确保了线程安全以及与 Hytale 内部线程模型的兼容性。
  • 自动生成配置 - 在首次启动时,会创建一个完全配置好的 config.json,其中包含所有 4 种原版处理台类型的合理默认值。现有配置会被加载并验证,数值会被限制以防止配置错误。
  • 可扩展 - 使用其 Hytale 处理台 ID 将任何处理台类型添加到配置中。如果某个模组引入了新的处理台类型,只需将其 ID 添加到配置中,即可将其纳入无燃料和速度提升系统。
  • 优雅的错误处理 - 如果反射失败(例如,由于 Hytale 更新更改了字段名称),插件会记录一条清晰的错误消息并拒绝启动,而不是导致崩溃。单个处理台的扫描错误会被捕获并记录,而不会中断对其他处理台的扫描。

◆ 技术细节

▸ 反射字段

插件通过 Java 反射访问 ProcessingBenchState 类的 4 个私有字段:

  • fuelTime(浮点数) - 处理台中的剩余燃料持续时间。当此值达到 0 时,处理台停止处理。插件会为无燃料处理台将此值设置为 999.0。
  • inputProgress(浮点数) - 当前活动配方的处理进度。插件在每个扫描周期添加额外进度以实现速度倍增。
  • active(布尔值) - 处理台当前是否正在处理。插件会为已加载配方的无燃料处理台强制将此值设置为 true。
  • recipe(对象) - 当前加载的配方。用于检查处理台是否有要处理的内容。插件从不修改此字段。

▸ 速度计算

每个扫描周期添加的额外进度计算如下:

extraProgress = (speedMultiplier - 1) × (scanIntervalMs / 1000.0)

例如,使用默认设置(speedMultiplier = 10,scanIntervalMs = 500):

  • extraProgress = (10 - 1) × (500 / 1000.0) = 9 × 0.5 = 每个扫描周期增加 4.5 个进度单位
  • 结合处理台每 500 毫秒约 0.5 的正常进度,总有效速度大约为 正常速度的 10 倍

▸ 性能考量

  • 使用特定 ComponentType 的 forEachChunk 方法可确保仅访问包含处理台的区块——完全跳过空区块。
  • 反射字段在启动时被缓存。扫描期间不会进行字段查找。
  • 计划任务使用 Hytale 内置的 SCHEDULED_EXECUTOR 以实现最佳线程管理。
  • 在默认的 500 毫秒间隔下,即使在多个世界中有数百个活动处理台,其开销也可忽略不计。

◆ 安装

  1. 停止您的 Hytale 服务器。
  2. GlymeraFuel-1.0.3.jar 复制到您服务器的 mods/ 文件夹中。
  3. 启动您的服务器。
  4. 首次启动时,插件会在其数据目录中创建一个默认的 config.json,其中包含所有 4 种预配置的处理台类型。
  5. 检查服务器日志,寻找:"[GlymeraFuel] GlymeraFuel v1.0.3 started! Scan=500ms" 以及随后每种处理台类型的配置信息。
  6. (可选)编辑 config.json 以自定义处理台设置,然后重启服务器。

注意: 此插件不需要资源包或任何其他文件。只需要 JAR 文件。

◆ 重要说明

  • 无指令 - 此插件没有游戏内指令。所有配置均通过 config.json 文件完成。更改需要服务器重启才能生效。
  • 影响所有世界 - 扫描器会在服务器上的所有世界中运行。目前没有选项可以排除特定世界。
  • 基于反射 - 由于插件使用 Java 反射访问 Hytale 内部字段,因此当 Hytale 更新重命名或删除了 ProcessingBenchState 中的 fuelTime、inputProgress、active 或 recipe 字段时,插件将失效。在这种情况下,插件将记录错误并优雅地自行禁用。
  • 速度限制 - 最大速度倍数上限为 10 倍。配置中超过 10 的值将被限制为 10。低于 1 的值将被提升为 1。
  • 扫描间隔限制 - 扫描间隔限制在 100 毫秒到 5000 毫秒之间。较低的值可以更快地响应新放置的物品,但会略微增加 CPU 使用率。

◆ 支持

有问题或疑问?请在此处留言或访问我们的 Discord 服务器!


由 GlymeraCraft 开发