
Ping查询协议 - 用于服务器列表
为Hytale实现Minecraft Ping协议,让服务器列表知道您的服务器在线!
PingProtocol - 为 Hytale 实现的 Minecraft 服务器列表 Ping
一款 Hytale 插件,实现了 Minecraft 服务器列表 Ping 协议,允许 Minecraft 客户端查询您的 Hytale 服务器信息,并在其服务器列表中显示。
工作原理
此插件创建一个 TCP 服务器,与 Hytale 的 QUIC(UDP)游戏服务器并行运行。关键点是 TCP 和 UDP 是独立的协议,因此它们可以监听相同端口号而不会发生冲突:
- Hytale 服务器:使用 UDP/QUIC 协议监听端口 5520(或配置端口)处理游戏流量
- PingProtocol 插件:使用相同端口号的 TCP 协议处理 Minecraft Ping 请求
这使得 Minecraft 客户端可以 Ping 您的 Hytale 服务器,无需任何端口转发或额外的网络配置。
功能
完整的 Minecraft 协议支持:
- 现代协议(1.7+)支持 JSON 状态响应
- 传统协议(1.6)支持 §1 格式化响应
- 非常古老的协议(Beta 1.8 – 1.3)支持
自动服务器信息:
- 当前玩家数和最大玩家数
- 包含名称和 UUID 的玩家列表
- 从 Hytale 清单读取的服务器版本(例如 "2026.01.13")
性能优化:
- 智能响应缓存(1 秒缓存持续时间)
- 玩家数量变化时缓存失效
- 缓存请求的响应时间小于 10 毫秒
简单配置:
- 自定义 MOTD 文本
- 显示/隐藏玩家列表
- 始终使用游戏服务器端口(无需额外配置)
安装
- 从发布页面下载
PingProtocol-1.0.0.jar - 将其放入 Hytale 服务器的
mods/目录 - 启动服务器或输入
/plugin load Hytalist:PingProtocol - 如有需要,在
mods/Hytalist_PingProtocol/config.json中进行配置
配置
插件会在 mods/Hytalist_PingProtocol/ 目录下创建一个 config.json 文件:
{
"motd": "",
"showPlayerList": true
}
配置选项
| 选项 | 默认值 | 描述 |
|---|---|---|
motd |
"" |
显示给 Minecraft 客户端的每日消息(未设置则为空字符串) |
showPlayerList |
true |
悬停在玩家数量时显示玩家列表 |
插件会自动:
- 使用与 Hytale 服务器相同的端口(TCP/UDP 可以共享同一端口)
- 报告协议版本 0 以指示非 Minecraft 服务器
- 从 Hytale 清单读取服务器版本并去除构建哈希(例如 "2026.01.13-dcad8778f" 变为 "2026.01.13")
协议支持
现代协议(Minecraft 1.7+)
插件实现了完整的现代服务器列表 Ping 协议:
- 握手数据包(0x00):客户端发送协议版本、服务器地址、端口和下一个状态
- 状态请求(0x00):客户端请求服务器状态
- 状态响应(0x00):服务器发送包含版本、玩家、描述的 JSON
- Ping 请求(0x01):客户端发送时间戳
- Pong 响应(0x01):服务器回显时间戳并关闭连接
JSON 响应示例:
{
"version": {
"name": "2026.01.13",
"protocol": 0
},
"players": {
"max": 100,
"online": 5,
"sample": [
{
"name": "PlayerName",
"id": "uuid-here"
}
]
},
"description": {
"text": "My Hytale Server"
}
}
传统协议(Minecraft 1.6)
插件也支持旧版客户端的传统 Ping 协议:
- 检测
0xFE 0x01 0xFA魔术字节 - 响应
0xFF踢出数据包 - 格式:
§1\0protocol\0version\0motd\0online\0max
非常古老的协议(Beta 1.8 – 1.3)
支持最古老的 Ping 协议:
- 检测
0xFE魔术字节 - 响应
0xFF踢出数据包 - 格式:
motd§online§max
性能
该插件针对低延迟响应进行了优化:
- 响应缓存:状态响应缓存 1 秒
- 智能失效:玩家数量变化时缓存失效
- 典型响应时间:
- 首次请求(缓存未命中):约 10-50 毫秒
- 缓存请求:小于 10 毫秒
- 缓存避免了每次 Ping 时进行获取完整玩家列表和 JSON 序列化等昂贵操作
技术细节
架构
该插件使用 Netty(Hytale 服务器中已提供)创建 TCP 服务器:
- PingServer:引导和管理 Netty 服务器
- MinecraftPingHandler:处理数据包的有状态处理器
- StatusCache:状态响应的共享缓存,以最小化昂贵操作
- MinecraftProtocol:用于 VarInt 编解码和数据包读写的实用工具
- StatusResponse:用于 JSON 序列化的数据类
为何能工作
Minecraft 服务器列表 Ping 使用 TCP,而 Hytale 使用基于 UDP 的 QUIC。由于它们是不同的传输协议,因此可以绑定到相同的端口号:
- TCP 数据包 → 由 PingProtocol 插件处理
- UDP 数据包 → 由 Hytale 的 QUIC 服务器处理
从源码构建
./gradlew jar
JAR 文件将创建在 build/libs/PingProtocol-1.0.0.jar。
故障排除
"Failed to start ping server on port X"
原因:另一个 TCP 服务正在使用该端口
解决方案:
- 检查是否有其他服务绑定到 TCP 端口
- 确保防火墙允许该端口的 TCP 连接
- 注意:该插件使用与 Hytale 相同的端口号,但使用 TCP(Hytale 使用 UDP)
Minecraft 客户端显示 "Can't connect to server"
原因:防火墙阻止 TCP 连接或插件未启动
解决方案:
- 检查服务器日志中插件是否成功启动
- 检查防火墙是否允许服务器端口的 TCP 流量
- 尝试在 Minecraft 中使用 IP:port 格式添加服务器
玩家列表不显示
原因:配置设置或没有在线玩家
解决方案:
- 在配置中设置
"showPlayerList": true - 确保 Hytale 服务器上确实有玩家在线
- 仅当
currentPlayerCount > 0时才显示玩家列表
Ping 响应时间慢
原因:缓存未生效或首次请求
解决方案:
- 首次请求会构建缓存,可能需要 10-50 毫秒
- 后续请求应小于 10 毫秒
- 缓存每秒或玩家数量变化时失效
- 如果持续缓慢,请检查 Hytale 服务器性能
致谢
正在加载版本记录…
正在加载评论…
评论在新手盒子客户端中发表,这里同步展示。