💬 AdventureChat

一、简介

AdventureChat 是基于 TabooLib 的现代高级聊天系统,为 Paper、Spigot 与 Velocity 提供统一的频道、格式、过滤和跨服消息能力。

插件采用多模块架构:公共核心负责频道与规则模型,Bukkit 运行端负责聊天拦截、组件渲染和功能展示,Velocity 运行端负责代理频道广播。

📡
多频道路由
频道独立配置权限、格式、别名、命令入口、聊天半径和跨服开关。
🧩
JSON 交互组件
支持 hover、click、suggest、copy、URL 等组件字段。
🛡️
本地与云过滤
敏感词可替换或阻断,并支持定时刷新云端词库。
🌐
Velocity 跨服
使用 adventurechat:main 插件消息频道广播代理聊天。

二、当前能力

  • Bukkit/Paper 异步聊天拦截
  • HEX 与传统颜色转换、MiniMessage/Kether 条件基础
  • 提及玩家、全体提及、物品/背包/末影箱展示
  • 按频道与格式分别检查权限
  • LuckPerms 权限组兼容
  • CraftEngine 文本支持、PlaceholderAPI 可选联动
⚠️ 当前版本说明

源码 README 将图片展示和 PacketEvents 高级显示列为后续完善项目;配置中的 show-image 默认关闭。本文只把源码中已经接线的能力标为可用。

📥 安装与架构

环境要求

项目要求
服务端Paper/Spigot 1.20.6+ API
代理端Velocity 3.4.0+(跨服频道需要)
Java17+
构建框架TabooLib 6.3 / Kotlin 2.2

安装步骤

  1. 将构建产物放入 Bukkit/Paper 的 plugins/
  2. 需要跨服聊天时,在 Velocity 端部署同版本插件。
  3. 启动服务端,生成 config.ymlchannels.ymlformats.ymlfilters.yml
  4. 分配频道与格式权限,再执行 /achat reload
  5. 跨服环境使用两个子服测试 global 或 staff 频道。

模块结构

AdventureChat/
├── plugin/                   # 最终打包入口与插件描述
├── project/common/           # 频道、格式、过滤、命令规则模型
├── project/runtime-bukkit/   # 聊天管线、GUI展示、配置和命令
└── project/runtime-velocity/ # adventurechat:main 跨服转发桥
ℹ️ 重载边界

/achat reload 只会重新读取配置。替换 JAR、升级运行库或修改模块后必须重启服务端。

📡 频道系统

每个频道都由 channels.yml 中的独立节点定义。

默认频道

ID范围入口跨服
global无限!/global/shout
local100 格#/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-texttrue启用组件化消息
kethertrue启用条件表达式
hex-colortrue启用 HEX 颜色
mentiontrue提及高亮
show-itemtrue展示手持物品
show-inventorytrue展示背包快照
show-enderchesttrue展示末影箱快照
show-imagefalse图片展示预留能力

展示记录

物品栏与末影箱展示会生成短期 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 跨服桥接

工作方式

  1. Bukkit 端将代理频道编码为插件消息。
  2. Velocity 监听 adventurechat:main
  3. 消息被转发到除来源服之外的全部已注册子服。
  4. 目标 Bukkit 端按频道权限筛选接收者并渲染组件。

代理端命令

命令权限说明
/achatvadventurechat.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 命令

命令权限说明
/achatadventurechat.command显示帮助
/achat reloadadventurechat.command.reload重读四份配置并输出统计
/achat channelsadventurechat.command列出已加载频道
/achat cloudsyncadventurechat.command.reload立即同步云词库
/achat view <id>展示记录控制查看背包或末影箱展示

频道与格式权限

  • adventurechat.channel.global
  • adventurechat.channel.local
  • adventurechat.channel.staff
  • adventurechat.format.default
  • adventurechat.format.local
  • adventurechat.format.staff
  • adventurechat.filter.bypass
  • adventurechat.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 高级显示桥