AdventureServer
Velocity + Paper 跨服传送与服务器管理系统
🔀 STP 跨服跳转
📡 ATP 跨服传送
🏠 Home 回家系统
⌨️ 限定开放机制
🎲 RTP 随机传送
☠️ Back 死亡返回
🔗 PAPI 占位符
📦 Velocity 3.4.0+
核心能力
STP 跨服跳转
按目标子服独立权限/冷却/消耗执行
ATP / ATPHere
跨服请求、接受、拒绝、倒计时、移动取消
限定开放机制
按子服时段开放,闭服可执行禁移/强制模式/黑暗
Home 回家
/sethome + /home,含冷却与持久化
RTP 随机传送
权限组范围、每日次数、冷却、安全选点
Back 死亡返回
/aback 返回最近死亡点,连续使用可往返
Proxy 层拦截
Proxy 可拦截非 /stp 路径进服
增强消息
chat/title/actionbar/bossbar + sound
下一篇安装部署 →
安装与部署
环境要求
| 项目 | 要求 |
|---|---|
| Java | 21+ |
| Proxy | Velocity 3.4.0+ |
| Backend | Paper 1.21.4+ |
| 外部依赖 | 无(PlaceholderAPI 可选) |
部署步骤
- 将
AdventureServer-Proxy-1.6.0.jar放入 Velocityplugins/ - 将
AdventureServer-Paper-1.6.0.jar放入每个子服plugins/ - 每个子服配置
config.yml -> server-name,必须与 Velocity 注册名一致 - 所有子服统一
servers.yml - 启动后用
/stp reload(Paper)与/asadmin reload(Proxy)同步重载
⚠ 重点
子服名不一致会导致跨服消息正确但传送失败。先校验 config.yml: server-name 与 Velocity 配置中的 name 完全一致(含大小写)。
上一篇← 概览
下一篇命令总表 →
命令总表
玩家命令(Paper)
| 命令 | 别名 | 权限 | 说明 |
|---|---|---|---|
/stp [server] | /servertp, /ast | adventureserver.stp | 列出子服或跳转 |
/atp <player> | /crosstp | adventureserver.tp | 请求跨服传送到目标 |
/atphere <player> | /crosstphere | adventureserver.tphere | 邀请目标传送到自己 |
/atpyes | /atpaccept | — | 接受请求 |
/atpno | /atpdeny | — | 拒绝请求 |
/sethome | /ashome | adventureserver.home.set | 设置家点 |
/home | /h | adventureserver.home.use | 回家(倒计时+移动取消) |
/artp | /rtp, /randomtp | adventureserver.rtp | 随机传送到当前世界安全位置 |
/aback | /back | adventureserver.back | 返回上一个死亡位置 |
管理员命令
| 命令 | 端 | 权限 | 说明 |
|---|---|---|---|
/stp reload | Paper | adventureserver.admin | 重载 Paper 配置 |
/asadmin status | Proxy | adventureserver.admin | 查看代理状态、玩家分布 |
/asadmin reload | Proxy | adventureserver.admin | 重载 Proxy 并广播 RELOAD |
上一篇← 安装部署
下一篇权限矩阵 →
权限矩阵
| 权限 | 默认 | 用途 |
|---|---|---|
adventureserver.stp | true | 使用 /stp |
adventureserver.stp.bypass.cooldown | op | 绕过 STP 冷却 |
adventureserver.stp.bypass.cost | op | 绕过 STP 消耗 |
adventureserver.tp | true | 使用 /atp |
adventureserver.tp.bypass.cooldown | op | 绕过 TP 冷却 |
adventureserver.tp.bypass.cost | op | 绕过 TP 消耗 |
adventureserver.tphere | op | 使用 /atphere |
adventureserver.tphere.bypass.cooldown | op | 绕过 TPHere 冷却 |
adventureserver.tphere.bypass.cost | op | 绕过 TPHere 消耗 |
adventureserver.home.use | true | 使用 /home |
adventureserver.home.set | true | 使用 /sethome |
adventureserver.home.bypass.cooldown | op | 绕过 /home 冷却 |
adventureserver.serveropen.bypass | op | 绕过子服开放时间限制 |
adventureserver.serveropen.enforce.bypass | op | 绕过闭服滞留限制 |
adventureserver.rtp | true | 使用 /artp |
adventureserver.rtp.bypass.cooldown | op | 绕过 RTP 冷却 |
adventureserver.rtp.bypass.limit | op | 绕过 RTP 每日次数限制 |
adventureserver.rtp.group.* | — | RTP 权限组(max/pro/mvp/vip/plus) |
adventureserver.back | true | 使用 /aback |
adventureserver.back.bypass.cooldown | op | 绕过 /aback 冷却 |
adventureserver.back.group.* | — | Back 权限组(控制冷却) |
adventureserver.admin | op | 管理员命令权限 |
动态权限(按子服配置)
servers.yml -> servers.<name>.permission:访问该子服的条件权限servers.yml -> open-control.bypass-permission:绕过该子服时段限制Proxy config.properties -> server-open.<name>.bypass-permission:Proxy 全局拦截绕过
上一篇← 命令总表
下一篇配置详解 →
配置详解
config.yml(Paper)
| 路径 | 默认 | 说明 |
|---|---|---|
server-name | lobby | 当前子服名(必须匹配 Velocity) |
stp.cooldown | 3 | STP 冷却秒数 |
stp.countdown | 3 | STP 倒计时秒数 |
stp.cancel-on-move | true | 移动取消 |
stp.move-tolerance | 0.5 | 移动容差(格) |
tp.enabled | true | 启用 ATP |
tp.request-timeout | 60 | TP 请求超时秒 |
tphere.enabled | true | 启用 ATPHere |
home.enabled | true | 启用 home |
home.cooldown | 20 | /home 冷却秒 |
home.countdown | 3 | /home 倒计时 |
server-open-control.check-interval-seconds | 5 | 闭服检测周期 |
server-open-control.enforce.block-move | true | 闭服禁止移动 |
server-open-control.enforce.force-gamemode.enabled | false | 闭服强制模式 |
server-open-control.enforce.darkness.enabled | false | 闭服黑暗效果 |
| 随机传送 RTP | ||
rtp.enabled | true | 启用 RTP |
rtp.max-attempts | 30 | 安全选点最大尝试次数 |
rtp.countdown | 3 | RTP 倒计时秒 |
rtp.blacklisted-blocks | […] | 安全选点黑名单方块 |
rtp.groups.<name>.permission | — | 权限组权限节点 |
rtp.groups.<name>.min/max-radius | — | 传送范围(格) |
rtp.groups.<name>.cooldown | — | 冷却秒 |
rtp.groups.<name>.daily-limit | — | 每日次数限制(-1=无限) |
| 死亡返回 Back | ||
back.enabled | true | 启用 /aback |
back.cooldown | 30 | 默认冷却秒 |
back.countdown | 3 | 倒计时秒 |
back.groups.<name>.cooldown | — | 权限组冷却秒 |
security.max-requests-per-second | 3 | 请求限流 |
debug | false | 调试日志 |
servers.yml(Paper)
servers:
creative:
display: "&b创造服"
permission: "adventureserver.stp.creative"
cooldown: -1
cost:
money: -1
exp-level: -1
order: 2
open-control:
enabled: true
timezone: "Asia/Shanghai"
time-ranges:
- "19:00-23:30"
bypass-permission: "adventureserver.serveropen.bypass.creative"
| 字段 | 说明 |
|---|---|
display | 展示名(支持颜色) |
permission | 访问权限(空=不限制) |
cooldown | 覆盖全局冷却(-1=用全局) |
cost.money / exp-level | 覆盖全局消耗(-1=用全局) |
order | 排序权重 |
open-control.time-ranges | 时间段,支持跨天 |
homes.yml(自动生成)
homes:
550e8400-e29b-41d4-a716-446655440000:
world: "world"
x: 100.5
y: 64.0
z: -32.5
yaw: 90.0
pitch: 0.0
Proxy config.properties
# 连接失败提示(留空=隐藏默认消息)
connection-failed-message=&c[!] &e%server% &c服务器暂时不可用
# 子服关闭/被踢时的自定义提示
shutdown-kick-message=&c[!] 服务器 &e%server% &c已关闭
# 子服关闭后玩家重定向到的备用服务器(留空=不重定向)
shutdown-fallback-server=lobby
# Proxy层开放时间拦截(拦截非 /stp 进服)
server-open-control-enabled=true
server-open-bypass-permission=adventureserver.serveropen.bypass
server-open-default-timezone=Asia/Shanghai
server-open-deny-message=&c[!] &e%server% &c当前未开放,开放时段: &e%ranges%
# creative 子服规则
server-open.creative.enabled=true
server-open.creative.timezone=Asia/Shanghai
server-open.creative.time-ranges=19:00-23:30,00:00-01:00
server-open.creative.bypass-permission=adventureserver.serveropen.bypass.creative
ℹ️ 建议
Paper 与 Proxy 都配置开放机制。Paper 负责功能层限制(STP/闭服措施),Proxy 负责入口层拦截。
上一篇← 权限矩阵
下一篇消息系统 →
消息系统 (messages.yml)
支持简写字符串与增强对象。增强对象支持 type + sound + title/bossbar 扩展参数。
占位符
| 占位符 | 含义 |
|---|---|
%player% | 玩家名 |
%server% / %display% | 服务器名/显示名 |
%time% / %timeout% | 时间秒数 |
%cost% / %amount% | 消耗相关 |
%world% %x% %y% %z% | 位置 |
%time_ranges% | 开放时间段 |
类型字段
chat— 聊天栏(默认)title— 标题+副标题(支持 fade-in/stay/fade-out)actionbar— 动作栏bossbar— BossBar(支持 bar-color/bar-style/bar-duration)
关键消息键
| 分组 | 关键键 |
|---|---|
common | player-only, no-permission, player-not-found, cooldown, reload-success |
stp | server-not-found, no-server-permission, already-on-server, server-closed, countdown-*, teleporting |
tp | request-sent/received, request-expired-*, accepted*, denied*, arrived, countdown-* |
tphere | request-sent/received, accepted*, denied*, teleporting, arrived, countdown-* |
home | not-set, set-success, countdown-*, teleported, world-not-found |
rtp | disabled, already-in-progress, world-not-allowed, no-group, daily-limit-reached, searching, failed, success, countdown-* |
back | disabled, no-location, success, countdown-* |
server-open-control | closed-enforce, move-blocked, health-drain, force-transfer |
上一篇← 配置详解
下一篇PAPI 占位符 →
PlaceholderAPI
标识符: as(即 %as_xxx%),安装 PlaceholderAPI 后自动注册。
| 占位符 | 返回值 | 说明 |
|---|---|---|
%as_home_set% | true/false | 是否已设置 home |
%as_home_world% | world 名 | home 世界名 |
%as_home_x/y/z% | 一位小数 | home 坐标 |
%as_home_cooldown% | 整数秒 | /home 剩余冷却 |
%as_server_current% | 当前子服名 | config.yml: server-name |
%as_server_open% | true/false | 当前子服是否开放 |
%as_current_server_open% | true/false | 同上(别名) |
%as_server_open_<server>% | true/false | 目标子服是否开放 |
%as_server_ranges_<server>% | 如 19:00-23:30 | 目标子服开放时段 |
使用示例
# TAB 示例
&7当前服: &f%as_server_current%
&7是否开放: &f%as_server_open%
&7Home状态: &f%as_home_set%
&7Home冷却: &f%as_home_cooldown%s
# 查询目标服
&7PVP开放: &f%as_server_open_pvp%
&7PVP时段: &f%as_server_ranges_pvp%
上一篇← 消息系统
下一篇开发 API →
开发 API 详解
核心通道协议
- 通道:
adventureserver:main - 编码:
DataOutputStream / DataInputStream - 封包:
int typeOrdinal+int dataCount+UTF string[dataCount] - 限制: 最大 32KB, 最大 64 字段; Paper 待发队列上限 50
MessageType 枚举
PLAYER_LOOKUP / PLAYER_LOOKUP_RESPONSE
TP_REQUEST / TPHERE_REQUEST
TP_ACCEPT / TP_DENY / TP_CANCEL / TP_EXECUTE
TP_LOCATION
PLAYER_LIST_REQUEST / PLAYER_LIST_RESPONSE
CONNECT_SERVER / PLAYER_ARRIVED / RELOAD
SERVER_NOT_FOUND
消息字段
| 类型 | 方向 | 数据 |
|---|---|---|
PLAYER_LOOKUP | Paper→Proxy | [lookupId, targetName] |
PLAYER_LOOKUP_RESPONSE | Proxy→Paper | [lookupId, playerName, uuid, serverName] |
TP_REQUEST | Paper→Proxy→Paper | [senderUuid, senderName, targetUuid, timeout] (+senderServer) |
TP_ACCEPT | Paper→Proxy→Paper | [senderUuid, accepterName, accepterUuid, type] (+location+accepterServer) |
TP_DENY | Paper→Proxy→Paper | [senderUuid, denierName, type] |
CONNECT_SERVER | Paper→Proxy | [playerUuid, targetServer, (targetPlayerUuid)] |
TP_EXECUTE | Proxy→Paper | [arrivedUuid, targetUuid, targetName] |
RELOAD | Proxy→Paper | [] |
SERVER_NOT_FOUND | Proxy→Paper | [playerUuid, targetServerName] |
Java 类接口
| 类 | 关键方法 |
|---|---|
AdventureServerPaper | getConfigManager(), getMessageManager(), getTpManager(), getHomeManager(), getServerOpenManager(), getRtpManager(), getBackManager(), reloadAll() |
ProxyMessageManager | onMessage(type, handler), sendToProxy(type, data...), connectServer(...) |
ConfigManager | sendMessage(player, key, replacements...) |
HomeManager | setHome(player), teleportHome(player), getHome(uuid), getRemainingCooldown(uuid) |
ServerOpenManager | canEnterServer(player, server), isServerOpenNow(server), getTimeRangesDisplay(server) |
RtpManager | executeRtp(player), getPlayerGroup(player), cancelRtp(uuid), reload() |
BackManager | executeBack(player), recordDeath(player), cancelBack(uuid) |
ℹ️ 注意
MessageType 枚举顺序是协议的一部分,Proxy/Paper 任意一侧顺序变化都会导致消息错读。
上一篇← PAPI 占位符
下一篇运维排错 →
运维与排错
常见问题
| 现象 | 排查点 |
|---|---|
/stp 显示服务器不存在 | 检查所有子服 servers.yml 是否一致;目标名拼写 |
| 请求能发但传送不执行 | Proxy 插件是否在线、通道是否注册、目标玩家是否在线 |
| 时段限制不生效 | open-control.enabled、时区、格式 H:mm-H:mm |
| 玩家被错误拦截 | 是否缺少绕过权限 |
| PAPI 输出为空 | 确认 PlaceholderAPI 已安装且启动日志出现注册信息 |
推荐运维流程
- 先在测试服验证
servers.yml+ Proxyconfig.properties的开放规则 - 上线前统一分发配置到所有 Paper 子服
- 执行
/asadmin reload后,再在任意子服执行/stp reload - 验证:普通进服、/stp 路径、绕过权限三种场景
上一篇← 开发 API
下一篇更新日志 →
更新日志
v1.6.0
- NEW RTP 随机传送 —
/artp随机传送到当前世界安全位置,参考 BetterRTP 安全选点算法(圆形/方形均匀分布) - NEW RTP 权限组范围 — 按 default/plus/vip/mvp/pro/max 分组配置传送范围、冷却、每日次数限制
- NEW RTP 世界规则 — 在
servers.yml按子服+世界名配置中心点/Y范围/形状,支持下界 - NEW Back 死亡返回 —
/aback返回最近死亡点;多次死亡取最后一次;使用后当前位置成为新 back 点 - NEW Back 权限组 — 按权限组配置不同冷却时间
- NEW 闭服扣血 —
servers.yml open-control.enforce.health-drain,每X秒扣Y生命值 - NEW 闭服强制传送 —
servers.yml open-control.enforce.force-transfer,延迟后强制传送到指定子服 - CONFIG 新增配置项 —
rtp.*和back.*配置区块;servers.yml rtp.*世界规则 - CONFIG 新增消息键 — rtp.*, back.*, server-open-control.health-drain, server-open-control.force-transfer
v1.5.0
- NEW 关服自定义消息 — Proxy
shutdown-kick-message配置项,替代 Velocity 默认的 "close server" 提示,支持 %server%/%player% 占位符 - NEW 关服自动重定向 — Proxy
shutdown-fallback-server配置项,子服关闭后自动将玩家传送到指定备用服(如 lobby) - NEW 目标服务器不存在提示 — 当跨服目标不可达时,Proxy 直接通知玩家并通过 SERVER_NOT_FOUND 消息通知 Paper 端
- FIX 玩家断线/闪退报错 — TpManager 所有异步回调增加 null/isOnline 防护,消除 NPE 崩溃日志
- NEW AdventureManage 卡片数据保存 — 跨服传送前自动通过反射调用 AdventureManage 的 FlyCard/ExpCard 保存方法
- CONFIG softdepend 更新 — plugin.yml 新增 AdventureManage 为可选依赖
v1.4.0
- NEW 子服限定开放机制(Paper 时段准入 + 闭服滞留限制)
- NEW Home 功能:
/sethome、/home、homes.yml持久化 - NEW PAPI 占位符:home 状态、开放状态、时间段
- NEW Proxy 层开放时间拦截(全路径入服控制)
- 命令/权限/文档全面同步到 v1.4.0
v1.3.0
- IMPROVED 消息配置自动补全(merge defaults),旧文件缺少 key 自动写入
- 增强启动日志
上一篇← 运维排错