LeafRTP - RTP - 随机传送
除了提供基础的随机传送功能外,本插件旨在为自定义实现提供一个平台。开发者不计划进行重大的功能性变更。其主要目标用户是原版生存(SMP)服务器,因为这类服务器最需要此类功能。
核心机制
本插件通过存储和回溯传送失败区域,结合线性空间索引与基础数据压缩技术,实现了确定性的位置选择耗时。更多技术细节可在 Wiki 上查阅。
- 该插件与自定义世界生成配合极佳,但强烈建议同时进行世界预生成,并为自定义生物群系使用集成插件。
- 由于使用了内存数据库和后台处理,预期会有较高的内存消耗和 MSPT(每刻毫秒数)。
- 除非单个任务耗时超过一个游戏刻(gametick),否则通常不会导致 TPS 低于 19。
代码变更通常会经过讨论以寻求最佳解决方案,并且减少动态内存分配是优先事项。
设计理念
功能优于形式
随机传送常被误解为简单廉价,但由于涉及区块加载、安全位置查找、位置重选以及玩家后续的探索,它实际上是服务器最耗费资源的任务之一。本插件通过支持选择优化、位置缓存(类似于 JakesRTP)和玩家队列,提供了对性能的精确控制,从而改进了传统 RTP 插件的基础设计。
细致设置与极高灵活性
传送由“区域”控制,区域通过 YAML 配置文件定义,并可通过命令更新。对于有进阶需求的用户,可能需要创建一个插件来访问 RTP 的事件和方法。RTP 提供了命令结构、多个事件、可互换的形状类以及一些反射方法调用,主要目的是与领地插件、世界生成器及用户自定义行为集成。Github 仓库中提供了一些示例。
主要特性
区域与配置
- 每个世界内可设置任意数量的传送区域。
- 支持按区域和按世界的传送配置。
- 传送区域形状(方形/圆形)。
- 传送半径与中心半径。
- 中心点 X、Z 坐标。
- 曲线权重(偏向或远离中心)。
- 最小与最大 Y 值。
- 可选的天光检查。
- 可选的世界权限要求。
- 可选唯一位置放置。
- 可选区域扩展。
- 当玩家无权限时的世界覆盖规则。
- 支持通过命令更新区域和世界配置。
- 支持多维度。
传送安全
- 可配置的安全半径检查。
- 可配置的平台创建。
- 可配置的无敌时间。
- 可配置的材料黑名单。
- 在传送延迟期间预加载区块。
- 在 Paper 服务器上支持异步区块加载。
性能与队列
- 世界和玩家参数权限控制。
- 位置队列:将加载成本分摊到时间线上,减少每次随机传送的影响。
- 异步随机位置生成。
- 在 Paper 服务器上异步预加载区块。
- 对已就绪的队列位置实现快速传送。
- 重用已生成但被取消的传送位置。
- 自动学习失败放置:每次失败后,位置选择在统计意义上会变得更快。
其他功能
- 可在
lang.yml中完全配置日志和消息。 - 基于权限的音效和粒子效果(格式化说明请参见相关链接)。
- 为开发者提供的 API。
- 形状系统:插件内置了一些形状,任何形状都可以通过 API 调用和配置添加。
支持的领地插件
领地插件通过附加组件和反射得到支持。Github 上提供了示例,集成了以下插件:
- Domain
- Factions(以及任何以
massivecraft.factions为基础的 Factions 插件) - GriefDefender
- GriefPrevention
- HuskTowns
- Lands
- TownyAdvanced
- WorldGuard
软依赖
- PaperLib
- PlaceholderAPI
- ProtocolLib
- Vault
PlaceholderAPI 占位符
%rtp_player_status%- 玩家当前的传送状态%rtp_total_queue_length%- 玩家在“/rtp”命令将使用的区域中,可用的位置总数%rtp_public_queue_length%- 在“/rtp”命令将使用的区域中,对所有人可用的位置数量%rtp_personal_queue_length%- 在“/rtp”命令将使用的区域中,专门分配给该玩家的位置数量%rtp_teleport_world%%rtp_teleport_x%%rtp_teleport_y%%rtp_teleport_z%
基础命令
注意:控制台命令可以工作,但可能需要指定玩家、区域和/或世界,因为控制台本身既不是玩家也不在某个世界中。
/rtp- 传送到你所在世界的默认区域。/rtp [parameter]:[value]- 在传送前指定区域、世界、玩家和/或临时的区域参数。/rtp update- 通过命令更新任何/所有配置。/rtp fill- 尝试区域内的每一个可能位置,并存储所有失败的位置和生物群系位置。(不稳定)
最佳设置建议
该插件针对 Paper 服务器进行了优化,使用 PaperLib 进行异步区块加载。Spigot 服务器也可运行,但在生成新位置时对性能(Timings)会有一定影响。
由于插件依赖于预加载目的地,当服务器有充足内存时,其工作效果尤佳。
常见问题解答
Q: 这个插件的响应速度比我用过的同类插件快很多。为什么我不需要等待区块加载?
A: 当我说“优化”时,我是认真的!在大多数情况下,在你输入命令之前,下一个传送位置就已经准备就绪了。
Q: 如何设置从/到其他世界的传送?
A: 你可以查看 Wiki 了解如何配置区域和世界设置。在命令中,世界信息的优先级顺序是:玩家当前世界(或提供的世界参数) -> 世界的目标区域 -> 区域的目标世界。
Q: 如何联系开发者反馈问题或提出功能请求?
A: 你可以点击上方的 Github 链接,在那里创建 Issue 或 Pull Request,或者访问我的 Discord 服务器获取一般性支持。
待办事项
- 开发运维相关工作。
- 完善 Wiki。
提示:如果你遇到任何意外错误,请在 Github 上提交 Issue,并提供错误信息、插件配置、相关插件列表以及重现错误的步骤,以便开发者进行调试。
(本插件使用 bStats 收集匿名使用数据。)
本插件通过反射 API 支持自定义位置检查、世界边界检查及带补全的自定义子命令,并提供丰富的 PlaceholderAPI 变量供信息显示。
PlaceholderAPI 变量
以下变量可用于在聊天、计分板等位置显示随机传送的相关信息:
%rtp_player_status%- 玩家当前的传送状态%rtp_total_queue_length%- 玩家在/rtp将使用的区域内可用的总位置数量%rtp_public_queue_length%- 在该区域内对所有人可用的位置数量%rtp_personal_queue_length%- 在该区域内专门分配给该玩家的位置数量%rtp_teleport_world%- 传送目标世界%rtp_teleport_x%- 传送目标 X 坐标%rtp_teleport_y%- 传送目标 Y 坐标%rtp_teleport_z%- 传送目标 Z 坐标
基础命令
> 注意:控制台命令可以执行,但可能需要指定玩家、区域和/或世界,因为控制台本身既不是玩家也不处于某个世界中。
/rtp- 传送至你所在世界的默认区域/rtp [parameter]:[value]- 在传送前指定区域、世界、玩家和/或临时区域参数/rtp update- 通过命令更新任何/所有配置,并重新加载/rtp reload- 从配置文件中重新加载新设置/rtp fill- 尝试区域内的每一个可能位置(必要时会生成区块),并将任何失败的放置位置和生物群系位置添加到相应的列表中。(此功能不稳定,需要测试)