AdventureChat
一、简介
AdventureChat 是基于 TabooLib 的现代高级聊天系统,为 Paper、Spigot 与 Velocity 提供统一的频道、格式、过滤和跨服消息能力。
插件采用多模块架构:公共核心负责频道与规则模型,Bukkit 运行端负责聊天拦截、组件渲染和功能展示,Velocity 运行端负责代理频道广播。
二、当前能力
- Bukkit/Paper 异步聊天拦截
- HEX 与传统颜色转换、MiniMessage/Kether 条件基础
- 提及玩家、全体提及、物品/背包/末影箱展示
- 按频道与格式分别检查权限
- LuckPerms 权限组兼容
- CraftEngine 文本支持、PlaceholderAPI 可选联动
源码 README 将图片展示和 PacketEvents 高级显示列为后续完善项目;配置中的 show-image 默认关闭。本文只把源码中已经接线的能力标为可用。
安装与架构
环境要求
| 项目 | 要求 |
|---|---|
| 服务端 | Paper/Spigot 1.20.6+ API |
| 代理端 | Velocity 3.4.0+(跨服频道需要) |
| Java | 17+ |
| 构建框架 | TabooLib 6.3 / Kotlin 2.2 |
安装步骤
- 将构建产物放入 Bukkit/Paper 的
plugins/。 - 需要跨服聊天时,在 Velocity 端部署同版本插件。
- 启动服务端,生成
config.yml、channels.yml、formats.yml和filters.yml。 - 分配频道与格式权限,再执行
/achat reload。 - 跨服环境使用两个子服测试 global 或 staff 频道。
模块结构
AdventureChat/
├── plugin/ # 最终打包入口与插件描述
├── project/common/ # 频道、格式、过滤、命令规则模型
├── project/runtime-bukkit/ # 聊天管线、GUI展示、配置和命令
└── project/runtime-velocity/ # adventurechat:main 跨服转发桥
/achat reload 只会重新读取配置。替换 JAR、升级运行库或修改模块后必须重启服务端。
频道系统
每个频道都由 channels.yml 中的独立节点定义。
默认频道
| ID | 范围 | 入口 | 跨服 |
|---|---|---|---|
| global | 无限 | !、/global、/shout | 是 |
| local | 100 格 | #、/local、/l | 否 |
| staff | 无限 | @staff、/staff、/sc | 是 |
字段说明
| 字段 | 说明 |
|---|---|
display | 频道显示名,支持传统颜色和 HEX。 |
permission | 发送和接收该频道所需权限。 |
format | 绑定 formats.yml 中的格式 ID。 |
aliases | 聊天消息前缀入口。 |
commands | 动态注册的频道命令。 |
range | -1 为无限范围,否则为格数。 |
proxy | 是否通过 Velocity 广播。 |
disabled-functions | 按频道禁用 mentionall 等功能。 |
配置示例
channels:
trade:
display: "&6Trade"
permission: "adventurechat.channel.trade"
format: "default"
aliases: ["$" ]
commands: ["trade"]
range: -1
default: false
proxy: true
disabled-functions: ["mentionall"]
消息格式
formats.yml 同时支持简单 pattern 与组件列表。拥有多个格式权限时,核心会选择第一个满足权限与条件的格式。
可用占位符
| 变量 | 内容 |
|---|---|
{channel} | 频道显示名 |
{display} | 玩家显示名 |
{player} | 玩家名称 |
{message} | 处理后的消息正文 |
组件字段
text— 当前组件文字hover— 多行悬浮说明suggest— 点击后填入命令click— 点击执行命令copy— 点击复制内容url— 打开网页condition/permission— 条件化显示
格式示例
formats:
default:
permission: "adventurechat.format.default"
pattern: "{channel} &7{display}&f: {message}"
components:
- text: "&7{display}"
hover:
- "&7点击私聊 {player}"
suggest: "/w {player} "
- text: "&f: {message}"
交互功能
功能开关
| 配置 | 默认 | 作用 |
|---|---|---|
json-text | true | 启用组件化消息 |
kether | true | 启用条件表达式 |
hex-color | true | 启用 HEX 颜色 |
mention | true | 提及高亮 |
show-item | true | 展示手持物品 |
show-inventory | true | 展示背包快照 |
show-enderchest | true | 展示末影箱快照 |
show-image | false | 图片展示预留能力 |
展示记录
物品栏与末影箱展示会生成短期 ID,其他玩家可通过交互组件触发 /achat view <id> 查看;过期后返回“这个展示已经过期”。
可以在频道的 disabled-functions 中关闭特定功能,例如 staff 默认禁用 mentionall。
内容过滤
本地规则
本地规则可替换敏感词,或将 replacement 设置为 BLOCK 直接阻断消息。
local:
example-replace:
word: "badword"
replacement: "***"
bypass-permission: "adventurechat.filter.bypass"
example-block:
word: "blockedword"
replacement: "BLOCK"
bypass-permission: "adventurechat.filter.bypass"
云词库
在 config.yml 开启 settings.cloud-filter.enabled,配置 URL 与刷新间隔。也可以执行 /achat cloudsync 立即同步。
云词库 URL 应使用可信 HTTPS 来源。同步失败不会清空现有本地规则。
命令控制器
命令控制器用于在玩家执行命令前检查匹配规则、权限、条件和冷却,并可将命令重定位为其他指令。
字段说明
| 字段 | 说明 |
|---|---|
pattern | 命令匹配表达式 |
exact | 是否精确匹配 |
permission | 使用权限;null 表示不限制 |
condition | 附加条件 |
cooldown | 冷却秒数 |
relocate | 匹配后由控制台执行的命令列表 |
command-controller:
enabled: true
rules:
- pattern: "version|ver|plugins|pl"
exact: false
permission: "adventurechat.admin"
cooldown: 3
relocate: []
- pattern: "rules"
exact: true
cooldown: 5
relocate:
- "say {player} is reading the rules."
Velocity 跨服桥接
工作方式
- Bukkit 端将代理频道编码为插件消息。
- Velocity 监听
adventurechat:main。 - 消息被转发到除来源服之外的全部已注册子服。
- 目标 Bukkit 端按频道权限筛选接收者并渲染组件。
代理端命令
| 命令 | 权限 | 说明 |
|---|---|---|
/achatv | adventurechat.velocity.command | 检查 Velocity bridge 是否运行 |
检查清单
- Bukkit 与 Velocity 使用相同插件版本
- 需要跨服的频道设置
proxy: true - 发送者与接收者均拥有频道权限
- 代理日志出现
Enabled v... on Velocity
配置文件
| 文件 | 用途 |
|---|---|
config.yml | 云过滤、功能开关、权限别名与命令控制器 |
channels.yml | 频道路由、范围、入口和跨服设置 |
formats.yml | 消息 pattern 与组件列表 |
filters.yml | 本地敏感词与云词库缓存 |
主配置示例
settings:
cloud-filter:
enabled: false
url: "https://raw.githubusercontent.com/Yurinann/Filter-Thesaurus-Cloud/main/database.json"
refresh-minutes: 30
features:
json-text: true
kether: true
hex-color: true
mention: true
show-item: true
show-inventory: true
show-enderchest: true
show-image: false
permissions:
admin: "adventurechat.admin"
command: "adventurechat.command"
reload: "adventurechat.command.reload"
命令与权限
Bukkit 命令
| 命令 | 权限 | 说明 |
|---|---|---|
/achat | adventurechat.command | 显示帮助 |
/achat reload | adventurechat.command.reload | 重读四份配置并输出统计 |
/achat channels | adventurechat.command | 列出已加载频道 |
/achat cloudsync | adventurechat.command.reload | 立即同步云词库 |
/achat view <id> | 展示记录控制 | 查看背包或末影箱展示 |
频道与格式权限
adventurechat.channel.globaladventurechat.channel.localadventurechat.channel.staffadventurechat.format.defaultadventurechat.format.localadventurechat.format.staffadventurechat.filter.bypassadventurechat.admin
插件联动
| 插件 | 用途 |
|---|---|
| LuckPerms | 权限与 group.* 权限组判断 |
| CraftEngine | 自定义文本和物品显示支持 |
| PlaceholderAPI | 消息内容占位符扩展 |
| PacketEvents | 高级包级显示预留 |
| AdventureFriend | 社交与私聊生态联动 |
以上依赖均为 optional。未安装时插件仍可启动,但对应扩展能力不会启用。
排错指南
频道消息没有发送
- 确认玩家拥有频道与格式权限
- 检查频道是否为 default,或消息是否使用了别名/频道命令
- 本地频道确认接收者在 range 范围内
- 检查 filters.yml 是否将消息阻断
跨服频道只有本服可见
- 检查 Velocity 端插件是否启动
- 确认频道
proxy: true - 确认所有子服部署同版本 Bukkit 端
修改配置没有生效
执行 /achat reload 并检查返回的频道、屏蔽词和规则数量。若刚替换 JAR,请完整重启。
版本说明
v1.0.0 当前
- NEW Paper/Spigot 聊天拦截管线
- NEW 多频道、多格式与独立权限
- NEW JSON 组件、HEX 颜色和提及功能
- NEW 本地/云敏感词过滤
- NEW 命令控制器与动态频道命令
- NEW Velocity 插件消息桥
规划中
- MiniMessage 与组件解析进一步完善
- 图片展示
- PacketEvents 高级显示桥