🧭 AdventureServer

一、简介

AdventureServer —— 一款 Velocity + Paper 跨服传送管理插件

AdventureServer 为您的服务器群组提供完整的跨服传送解决方案。支持跨服传送(STP)、跨服玩家传送请求(ATP)、Home系统、随机传送(RTP)、死亡返回(Back)和服务器限定开放等功能。基于 Plugin Message 协议实现高性能跨服通信。

AdventureServer 支持 Velocity 3.4+ 代理端和 Paper 1.21.4+ 子服,并且会第一时间支持未来版本。

AdventureServer

  • STP跨服传送 > 独立权限/冷却/消耗,一键传送指定服务器
  • ATP/ATPHere > 跨服玩家传送请求,支持接受/拒绝
  • Home系统 > sethome + home 持久化,支持多个家
  • RTP随机传送 > 权限组范围/冷却/每日次数限制
  • Back返回 > 死亡返回 + 往返切换
  • 限定开放 > 时段准入 + 闭服滞留处理
  • Proxy+Paper双端 > 代理端和子服协同工作
  • Plugin Message > 高性能跨服通信协议
  • 高自定义 > 消息文本、冷却、费用全部可配置

二、插件前置说明

都是非必须

  • PlaceholderAPI — PAPI变量支持(Paper端)

📥 安装与部署

环境要求

项目要求
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 配置名完全一致(含大小写)。

⌨️ 命令总表

玩家命令 (Paper)

命令别名权限说明
/stp [server]/servertp /astadventureserver.stp列出子服或跳转
/atp <player>/crosstpadventureserver.tp请求跨服传送到目标
/atphere <player>/crosstphereadventureserver.tphere邀请目标传送到自己
/atpyes/atpaccept接受请求
/atpno/atpdeny拒绝请求
/sethome/ashome /homesetadventureserver.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.rtptrue/artp
adventureserver.rtp.bypass.cooldownOP绕过 RTP 冷却
adventureserver.rtp.bypass.limitOP绕过每日次数
adventureserver.rtp.group.*RTP 权限组
adventureserver.backtrue/aback
adventureserver.back.bypass.cooldownOP绕过 back 冷却
adventureserver.back.group.*Back 权限组
adventureserver.serveropen.bypassOP绕过时段限制
adventureserver.serveropen.enforce.bypassOP绕过闭服滞留
adventureserver.adminOP管理命令

动态权限 (按子服)

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

⚙️ 配置详解

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 倒计时秒
rtp.enabledtrue启用 RTP
rtp.max-attempts30安全选点尝试次数
rtp.countdown3RTP 倒计时秒
rtp.groups.<name>.*权限组 (min/max-radius, cooldown, daily-limit)
back.enabledtrue启用 /aback
back.cooldown30默认冷却秒
back.countdown3倒计时秒
back.groups.<name>.cooldown权限组冷却
security.max-requests-per-second3限流
security.log-teleportstrue传送日志
debugfalse调试

闭服控制

路径默认说明
server-open-control.check-interval-seconds5检测周期
server-open-control.enforce.enabledtrue闭服滞留处理
server-open-control.enforce.block-movetrue禁移
server-open-control.enforce.force-gamemode.*强制模式
server-open-control.enforce.darkness.*黑暗效果

servers.yml (Paper)

servers:
  creative:
    display: "&b创造服"
    permission: "adventureserver.stp.creative"
    cooldown: -1          # -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"

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=
shutdown-kick-message=&c[!] 服务器 &e%server% &c已关闭
shutdown-fallback-server=lobby

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%

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 负责功能层限制 (STP/闭服措施),Proxy 负责入口层拦截 (任何进服路径),建议都配。

💬 消息系统

支持简写字符串与增强对象两种格式。增强对象支持 type + sound 扩展。

占位符

占位符含义
%player%玩家名
%server% / %display%服务器名/显示名
%time% / %timeout%时间秒数
%cost% / %amount% / %item%消耗相关
%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, cooldown, reload-success 等
stpserver-not-found, countdown-*, teleporting, server-entry
tprequest-sent/received, accepted*, denied*, arrived
tphererequest-sent/received, accepted*, teleporting
homenot-set, set-success, countdown-*, teleported
rtpdaily-limit-reached, searching, failed, success
backno-location, success, countdown-*
server-open-controlclosed-enforce, move-blocked, force-transfer

📊 PlaceholderAPI

标识符:as(即 %as_xxx%

占位符返回说明
%as_home_set%true/false是否设置 home
%as_home_world%world 名home 世界
%as_home_x% / y / z坐标home 坐标
%as_home_cooldown%整数秒home 剩余冷却
%as_server_current%子服名当前子服
%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

Plugin Message 协议

  • 通道:adventureserver:main
  • 编码:DataOutputStream / DataInputStream
  • 封包:int typeOrdinal + int dataCount + UTF string[dataCount]
  • 限制:最大 32KB / 64 字段;Paper 待发队列上限 50

MessageType 枚举

PLAYER_LOOKUP            # Paper→Proxy [lookupId, targetName]
PLAYER_LOOKUP_RESPONSE   # Proxy→Paper [lookupId, name, uuid, server]
TP_REQUEST               # Paper→Proxy→Paper [senderUuid, name, targetUuid, timeout]
TPHERE_REQUEST           # Paper→Proxy→Paper [senderUuid, name, targetUuid, timeout]
TP_ACCEPT                # Paper→Proxy→Paper [senderUuid, accepterName, uuid, type, ...]
TP_DENY                  # Paper→Proxy→Paper [senderUuid, denierName, type]
TP_CANCEL                # Paper→Proxy→Paper [targetUuid]
TP_EXECUTE               # Proxy→Paper [arrivedUuid, targetUuid, targetName]
TP_LOCATION              # Paper→Proxy→Paper [uuid, world, x, y, z, yaw, pitch]
PLAYER_LIST_REQUEST      # Paper→Proxy []
PLAYER_LIST_RESPONSE     # Proxy→Paper [server, playersCsv, ...]
CONNECT_SERVER           # Paper→Proxy [uuid, targetServer, (targetPlayerUuid)]
PLAYER_ARRIVED           # Proxy→Paper [uuid, name]
RELOAD                   # Proxy→Paper []
SERVER_NOT_FOUND         # Proxy→Paper [uuid, targetServerName]

Java 类接口

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

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

🛠️ 运维与排错

常见问题

现象排查点
/stp 服务器不存在检查所有子服 servers.yml 一致 + 目标名拼写
请求发了传送不执行Proxy 插件是否在线、通道是否注册、目标在线
时段限制不生效open-control.enabled + 时区 + 格式 H:mm-H:mm
玩家被错误拦截缺少绕过权限 (全局或子服 bypass)
PAPI 空值确认 PAPI 已装 + 启动日志有「占位符已注册」

推荐运维流程

  1. 测试服验证 servers.yml + Proxy config.properties
  2. 上线前统一分发配置到所有子服
  3. /asadmin reload/stp reload 确认
  4. 管理员验证:普通进服 / /stp 路径 / 绕过权限 三种场景

📝 更新日志

v1.6.0 最新

  • NEW RTP 随机传送 — /artp 安全选点,权限组范围/冷却/每日次数
  • NEW RTP 世界规则 — servers.yml 按子服+世界配置中心点/Y范围/形状
  • NEW Back 死亡返回 — /aback 返回死亡点,连续往返
  • NEW Back 权限组 — 按组配冷却
  • NEW 闭服扣血 — health-drain 每X秒扣Y HP
  • NEW 闭服强制传送 — force-transfer 延迟后传到指定子服

v1.5.0

  • NEW 关服自定义消息 (shutdown-kick-message + %server%/%player%)
  • NEW 关服自动重定向 (shutdown-fallback-server)
  • NEW 目标服不存在提示 (SERVER_NOT_FOUND)
  • FIX TpManager 异步回调 null/isOnline 防护
  • NEW AdventureManage FlyCard/ExpCard 跨服保存

v1.4.0

  • NEW 子服限定开放机制 (Paper 时段准入 + 闭服滞留)
  • NEW Home 功能 (/sethome + /home + homes.yml)
  • NEW PAPI 占位符 (home/开放状态/时段)
  • NEW Proxy 层开放时间拦截

v1.3.0

  • NEW 消息配置自动补全 (merge defaults)