## 🚀 概述
DistantTicking 是一款强大的 PaperMC 插件,旨在提高服务器性能的同时,确保您的重要红石装置和自动化农场持续运行,无论玩家距离多远。 告别 AFK 农场和在不方便的时候卸载区块!
传统上,Minecraft 只在玩家的 `simulation-distance` 范围内“tick” 区块。这意味着当玩家离得太远或离线时,复杂的机器和农场就会停止工作。DistantTicking 通过智能地检测和永久加载包含玩家放置的“值得 tick”的区块来解决这个问题,通过跟踪它们的 **确切位置**。
## 适合谁?
这不适用于大型服务器。 适用于小型、高端的私有服务器,这些服务器侧重于沉浸感并旨在拥有最大的模拟距离。 此插件可以让你降低你的模拟距离。
例如,在我的服务器上,模拟距离为 16,每个玩家会模拟大约 1089 个区块。
使用此插件,大约有 60 个区块被加载。
因为模拟距离变得不那么重要,所以我们将模拟距离降低到 10。
这意味着每个玩家模拟的区块少了大约 648 个,同时有效地将模拟距离作为经验来看,无限制延长,因为例如农作物、熔炉、带有箱子的区块等仍然被加载。
本质上,它是一个隐形的区块加载器。
[](https://youtu.be/PBmrIrpQiUU)
## ✨ 特性
- **智能区块加载:** 自动检测并强制加载区块,通过跟踪玩家放置的区块的 **具体位置** (例如,熔炉、漏斗、红石、活塞、铁轨)。
- **区块休眠:** 在所有玩家都离线一段时间后,自动休眠区块。
- **持久 tick:** 确保您的机器、农场和红石装置 24/7 持续工作,即使附近或同一维度没有玩家。
- **性能优化:** 允许服务器所有者在 `server.properties` 中降低全局 `simulation-distance` (例如,到 4-8),以获得更好的总体 TPS 和更低的服务器负载,同时 DistantTicking 管理关键的 tick 区域。
- **可配置的值得 tick 的区块:** 可以在 `config.yml` 中轻松自定义触发区块加载的区块材质。
- **自愈数据:** 使用混合方法(中心索引和每个区块的持久性数据容器 (PDC))进行强大的持久性。 在意外删除数据文件或服务器崩溃时,能够优雅地恢复。
- **定期的一致性检查:** 自动清理如果区块被移除而没有适当的插件通知(例如,世界编辑、服务器崩溃),则过时的强制加载条目。
- **管理员命令:** 直观的命令用于监控插件状态、列出强制加载的区块、刷新区块数据和调试。
- **旧数据清理工具:** 一个特定的命令,用于从旧版本的插件中删除存储在 PDC 中的旧 tick-worthy 区块数据。
- **调试日志:** 专门的调试模式以获取详细的插件日志,而不会淹没整个服务器控制台。
## ⚙️ 工作原理
DistantTicking 采用混合数据存储模型:
1. **每个区块的数据 (PDC):** 当玩家放置一个可配置的“值得 tick”的区块时,插件使用 Minecraft 内置的持久性数据容器 (PDCs) 标记该区块的数据。 除了计数,它现在存储每个区块内的 **X、Y、Z 具体坐标** 的可 tick 区块。 此数据序列化为 JSON 字符串,并直接存储在区块文件中,即使主插件数据文件丢失,也能持续存在。
2. **中心索引 (`active_chunks.json`):** 一个轻量级的 JSON 文件维护了所有世界中当前由插件强制加载的所有区块的列表。 在服务器启动时加载此文件,以立即启动所有相关区块的强制加载。
3. **同步:**
- 当玩家放置一个值得 tick 的区块时,它的区块被添加到中心索引,并且如果它是该区块中第一个值得 tick 的区块,则会强制加载。
- 当玩家破坏(或破坏一个)值得 tick 的区块时,其位置从区块的 PDC 中删除。 如果删除后,该区块 PDC 中 _没有_ 任何值得 tick 的区块,则它将从中心索引中删除并卸载。
- 定期的后台任务会验证中心索引中的区块是否仍然在它们的 PDC 中有相应的值得 tick 的区块。 如果区块的 PDC 显示没有存储的区块位置,则将该条目从中心索引中删除,从而确保从数据不一致中进行“自愈”。
这种方法提供了精确的跟踪、可靠的持久性和高效的资源管理。
## 已知问题
- 如果你跟踪农作物,当你跳到它们上面时,它不会检测它们被破坏。 然而,一致性检查最终会意识到。
## 📥 安装
1. 下载最新版本的 `DistantTicking-X.Y.Z.jar`。
2. 将 `DistantTicking-X.Y.Z.jar` 文件放入服务器的 `plugins/` 文件夹中。
3. 重新启动你的 PaperMC 服务器。
4. 将创建一个 `DistantTicking` 文件夹到你的 `plugins/` 目录中,包含 `config.yml` 和 `active_chunks.json`。
5. 重要提示! 如果你将其添加到现有的世界,你将需要运行 `/dt refresh <区块半径> <垂直向上> <垂直向下>` 以填充新位置的跟踪数据以供现有区块使用。 我建议以手术的方式,使用低区块半径和适当的垂直限制来完成,因为扫描许多区块或大型垂直范围可能很慢。
> 你可能想要在更新后运行 /dt cleanup,以防我更改了任何东西。
## 🛠️ 配置 (`config.yml`)
`config.yml` 文件将首次运行时自动生成。 您可以在此处自定义插件的行为。
```yaml
# DistantTicking 插件配置
settings:
# 自动将强制加载的区块数据保存到 active_chunks.json 文件的间隔。
# 测量单位为分钟。(20 滴答 = 1 秒)
auto-save-interval-minutes: 5 # 默认: 5
# 定期一致性检查的间隔。
# 此检查验证是否标记为强制加载的区块仍然在其 PDC 中包含值得 tick 的区块。
# 测量单位为小时。
consistency-check-interval-hours: 6 # 默认: 6
# 启用调试模式以获取更详细的控制台日志。
# 将其设置为 'true' 以查看详细的插件活动(例如,单个区块的加载/卸载)。
# 这些日志 *仅* 用于 DistantTicking,并且不会用其他插件的调试消息淹没你的控制台。
debug-mode: false # 默认: false
# 设置用于服务器休眠功能的设置。
# 当服务器为空时,插件可以卸载所有区块以节省资源。
hibernation:
# 设置为 true 以启用此功能。
enabled: true
# 服务器必须为空多长时间才能卸载区块。
# 测量单位为分钟。
unload-delay-minutes: 60
# 每次玩家加入空服务器时重新加载多少区块。
# 更高的值可以更快地重新加载,但可能会导致更多延迟。
reload-chunks-per-batch: 5
# 如何频繁(以滴答为单位)处理一批区块进行重新加载。 20 滴答 = 1 秒。
# 5 的值意味着每 5 滴答重新加载一个批次。
reload-stagger-ticks: 5
# 值得 tick 的区块材料的列表,当玩家放置时,应该使它们的区块 tick-worthy 并强制加载。
# 确保 Minecraft Material 枚举名称有效(在插件中不区分大小写,但为了清晰起见,请使用大写)。
#
# 重要提示:即使是非 BlockEntities(如红石线、中继器、活塞)也会导致区块保持加载状态,
# 允许它们持续运行,如果它们是活动红石电路的一部分。
#
tick-worthy-blocks:
- 你想要 tick 的区块
# 服务器所有者的建议:
# 为了获得最佳性能,请考虑将服务器的 'simulation-distance' 降低到 4-8 等值
# 位于 server.properties 中。 这允许 DistantTicking 管理机器的持久 tick,
# 同时显著降低服务器 CPU 在没有重要装置的区域的负载。
```
## 🎮 命令
所有命令都以 `/dt` (或 `/distantticking`) 开头。
| 命令 | 描述 | 权限 |
| :--------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------ |
| `/dt help` | 显示插件的帮助消息。 | `distantticking.command.base` |
| `/dt pdcinfo` | 显示你当前区块中的 tick-worthy 区块数 (来自 PDC)。 | `distantticking.command.pdcinfo` |
| `/dt status` | 显示 DistantTicking 插件的当前状态。 | `distantticking.command.status` |
| `/dt list [页面]` | 列出插件当前强制加载的所有区块,并带有分页。 | `distantticking.command.list` |
| `/dt removehere` | 从强制加载列表中删除你所在区块。 | `distantticking.command.removehere` |
| `/dt reload` | 重新加载插件的 `config.yml` 并重启内部任务。 | `distantticking.command.reload` |
| `/dt refresh <半径> <垂直向上> <垂直向下>` | 扫描由半径参数定义的区块的正方形区域,并被垂直向上和向下参数限制以防止检测不需要的地图结构(例如矿井)。 | `distantticking.command.refresh` |
| `/dt cleanup` | 清理旧 PDC 密钥,在跟踪是块特异之前使用。 | `distantticking.command.cleanup` |
| `/dt check` | 执行一致性检查并告诉你运行所需的时间。 这旨在作为配置工具,而不是真正使用,因为这些检查会自动运行。 | `distantticking.command.cleanup` |