🧭 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

📥 安装与部署

环境要求

项目要求
Java21+
ProxyVelocity 3.4.0+
BackendPaper 1.21.4+
外部依赖无(PlaceholderAPI 可选)

部署步骤

  1. AdventureServer-Proxy-1.6.0.jar 放入 Velocity plugins/
  2. AdventureServer-Paper-1.6.0.jar 放入每个子服 plugins/
  3. 每个子服配置 config.yml -> server-name,必须与 Velocity 注册名一致
  4. 所有子服统一 servers.yml
  5. 启动后用 /stp reload(Paper)与 /asadmin reload(Proxy)同步重载
⚠ 重点

子服名不一致会导致跨服消息正确但传送失败。先校验 config.yml: server-name 与 Velocity 配置中的 name 完全一致(含大小写)。

⌨️ 命令总表

玩家命令(Paper)

命令别名权限说明
/stp [server]/servertp, /astadventureserver.stp列出子服或跳转
/atp <player>/crosstpadventureserver.tp请求跨服传送到目标
/atphere <player>/crosstphereadventureserver.tphere邀请目标传送到自己
/atpyes/atpaccept接受请求
/atpno/atpdeny拒绝请求
/sethome/ashomeadventureserver.home.set设置家点
/home/hadventureserver.home.use回家(倒计时+移动取消)
/artp/rtp, /randomtpadventureserver.rtp随机传送到当前世界安全位置
/aback/backadventureserver.back返回上一个死亡位置

管理员命令

命令权限说明
/stp reloadPaperadventureserver.admin重载 Paper 配置
/asadmin statusProxyadventureserver.admin查看代理状态、玩家分布
/asadmin reloadProxyadventureserver.admin重载 Proxy 并广播 RELOAD

🔐 权限矩阵

权限默认用途
adventureserver.stptrue使用 /stp
adventureserver.stp.bypass.cooldownop绕过 STP 冷却
adventureserver.stp.bypass.costop绕过 STP 消耗
adventureserver.tptrue使用 /atp
adventureserver.tp.bypass.cooldownop绕过 TP 冷却
adventureserver.tp.bypass.costop绕过 TP 消耗
adventureserver.tphereop使用 /atphere
adventureserver.tphere.bypass.cooldownop绕过 TPHere 冷却
adventureserver.tphere.bypass.costop绕过 TPHere 消耗
adventureserver.home.usetrue使用 /home
adventureserver.home.settrue使用 /sethome
adventureserver.home.bypass.cooldownop绕过 /home 冷却
adventureserver.serveropen.bypassop绕过子服开放时间限制
adventureserver.serveropen.enforce.bypassop绕过闭服滞留限制
adventureserver.rtptrue使用 /artp
adventureserver.rtp.bypass.cooldownop绕过 RTP 冷却
adventureserver.rtp.bypass.limitop绕过 RTP 每日次数限制
adventureserver.rtp.group.*RTP 权限组(max/pro/mvp/vip/plus)
adventureserver.backtrue使用 /aback
adventureserver.back.bypass.cooldownop绕过 /aback 冷却
adventureserver.back.group.*Back 权限组(控制冷却)
adventureserver.adminop管理员命令权限

动态权限(按子服配置)

  • servers.yml -> servers.<name>.permission:访问该子服的条件权限
  • servers.yml -> open-control.bypass-permission:绕过该子服时段限制
  • Proxy config.properties -> server-open.<name>.bypass-permission:Proxy 全局拦截绕过

⚙️ 配置详解

config.yml(Paper)

路径默认说明
server-namelobby当前子服名(必须匹配 Velocity)
stp.cooldown3STP 冷却秒数
stp.countdown3STP 倒计时秒数
stp.cancel-on-movetrue移动取消
stp.move-tolerance0.5移动容差(格)
tp.enabledtrue启用 ATP
tp.request-timeout60TP 请求超时秒
tphere.enabledtrue启用 ATPHere
home.enabledtrue启用 home
home.cooldown20/home 冷却秒
home.countdown3/home 倒计时
server-open-control.check-interval-seconds5闭服检测周期
server-open-control.enforce.block-movetrue闭服禁止移动
server-open-control.enforce.force-gamemode.enabledfalse闭服强制模式
server-open-control.enforce.darkness.enabledfalse闭服黑暗效果
随机传送 RTP
rtp.enabledtrue启用 RTP
rtp.max-attempts30安全选点最大尝试次数
rtp.countdown3RTP 倒计时秒
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.enabledtrue启用 /aback
back.cooldown30默认冷却秒
back.countdown3倒计时秒
back.groups.<name>.cooldown权限组冷却秒
security.max-requests-per-second3请求限流
debugfalse调试日志

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)

关键消息键

分组关键键
commonplayer-only, no-permission, player-not-found, cooldown, reload-success
stpserver-not-found, no-server-permission, already-on-server, server-closed, countdown-*, teleporting
tprequest-sent/received, request-expired-*, accepted*, denied*, arrived, countdown-*
tphererequest-sent/received, accepted*, denied*, teleporting, arrived, countdown-*
homenot-set, set-success, countdown-*, teleported, world-not-found
rtpdisabled, already-in-progress, world-not-allowed, no-group, daily-limit-reached, searching, failed, success, countdown-*
backdisabled, no-location, success, countdown-*
server-open-controlclosed-enforce, move-blocked, health-drain, force-transfer

🔗 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 详解

核心通道协议

  • 通道: 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_LOOKUPPaper→Proxy[lookupId, targetName]
PLAYER_LOOKUP_RESPONSEProxy→Paper[lookupId, playerName, uuid, serverName]
TP_REQUESTPaper→Proxy→Paper[senderUuid, senderName, targetUuid, timeout] (+senderServer)
TP_ACCEPTPaper→Proxy→Paper[senderUuid, accepterName, accepterUuid, type] (+location+accepterServer)
TP_DENYPaper→Proxy→Paper[senderUuid, denierName, type]
CONNECT_SERVERPaper→Proxy[playerUuid, targetServer, (targetPlayerUuid)]
TP_EXECUTEProxy→Paper[arrivedUuid, targetUuid, targetName]
RELOADProxy→Paper[]
SERVER_NOT_FOUNDProxy→Paper[playerUuid, targetServerName]

Java 类接口

关键方法
AdventureServerPapergetConfigManager(), getMessageManager(), getTpManager(), getHomeManager(), getServerOpenManager(), getRtpManager(), getBackManager(), reloadAll()
ProxyMessageManageronMessage(type, handler), sendToProxy(type, data...), connectServer(...)
ConfigManagersendMessage(player, key, replacements...)
HomeManagersetHome(player), teleportHome(player), getHome(uuid), getRemainingCooldown(uuid)
ServerOpenManagercanEnterServer(player, server), isServerOpenNow(server), getTimeRangesDisplay(server)
RtpManagerexecuteRtp(player), getPlayerGroup(player), cancelRtp(uuid), reload()
BackManagerexecuteBack(player), recordDeath(player), cancelBack(uuid)
ℹ️ 注意

MessageType 枚举顺序是协议的一部分,Proxy/Paper 任意一侧顺序变化都会导致消息错读。

🛠️ 运维与排错

常见问题

现象排查点
/stp 显示服务器不存在检查所有子服 servers.yml 是否一致;目标名拼写
请求能发但传送不执行Proxy 插件是否在线、通道是否注册、目标玩家是否在线
时段限制不生效open-control.enabled、时区、格式 H:mm-H:mm
玩家被错误拦截是否缺少绕过权限
PAPI 输出为空确认 PlaceholderAPI 已安装且启动日志出现注册信息

推荐运维流程

  1. 先在测试服验证 servers.yml + Proxy config.properties 的开放规则
  2. 上线前统一分发配置到所有 Paper 子服
  3. 执行 /asadmin reload 后,再在任意子服执行 /stp reload
  4. 验证:普通进服、/stp 路径、绕过权限三种场景

📝 更新日志

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/homehomes.yml 持久化
  • NEW PAPI 占位符:home 状态、开放状态、时间段
  • NEW Proxy 层开放时间拦截(全路径入服控制)
  • 命令/权限/文档全面同步到 v1.4.0

v1.3.0

  • IMPROVED 消息配置自动补全(merge defaults),旧文件缺少 key 自动写入
  • 增强启动日志