AntiDestroy 是一款面向 Luminol 的危险物品操作审计插件。它会记录操作结果、写入文件或 MySQL,并向有权限的在线管理员发送通知。
插件只负责审计,不会主动取消或拦截事件。监听器在 MONITOR 阶段记录操作结果,包括成功和已取消状态,因此可以与现有的领地、权限和保护插件配合使用。
- 审计危险方块放置、岩浆桶倒出、TNT 点燃、末地水晶放置和 TNT 矿车放置等操作。
- 审计危险物品交互,以及危险物品进入箱子等外部容器的操作。
- 记录操作状态、玩家、物品、数量、领地、坐标和上下文。
- 支持文件与 MySQL 两种存储模式,所有文件和数据库 I/O 均异步执行。
- MySQL 模式提供 CoreProtect 风格的组合
lookup查询、彩色结果和可点击分页。 - 提供彩色
status页面,显示存储队列、丢失记录、连接池、通知、Residence 和 JVM 状态。 - 使用 MiniMessage 格式向拥有通知权限的在线管理员发送消息。
- 可选对接 Residence,以记录操作所在的领地。
- 遵循 Folia 调度模型,并按任务所有权使用
Entity、Region、Global或Async调度路径。
| 项目 | 要求 |
|---|---|
| 服务端 | Luminol 26.2 (Build 726) |
| Java | 25 |
| 可选依赖 | Residence 6.0.0.1 |
| 可选数据库 | MySQL 8.0+ |
当前版本仅面向 Luminol 26.2 (Build 726),不再支持 Luminol 1.21.11。项目已按照 Folia 调度模型实现,但 folia-supported: true 只代表服务端允许加载插件,不能替代生产环境验证。
使用 Residence 集成功能前,请确认所安装的 Residence 版本兼容 Luminol 26.2。部署到生产环境前,请在目标服务端验证插件加载、危险物品审计、文件或 MySQL 写入、断线处理、查询、重载、关闭和管理员通知。
- 从 GitHub Releases 获取
AntiDestroy-1.1.0.jar,或自行构建项目。 - 将 JAR 放入服务器的
plugins目录。 - 启动服务器后,按需修改
plugins/AntiDestroy/config.yml。 - 运行
/antidestroy reload重新加载配置。
| 命令 | 说明 | 权限 |
|---|---|---|
/antidestroy reload |
异步重新加载配置 | antidestroy.reload |
/antidestroy on |
开启管理员通知 | antidestroy.toggle 或 antidestroy.reload |
/antidestroy off |
关闭管理员通知 | antidestroy.toggle 或 antidestroy.reload |
/antidestroy lookup [过滤器...] |
查询 MySQL 审计记录 | antidestroy.lookup |
/antidestroy status |
查看彩色运行状态 | antidestroy.status |
| 权限 | 说明 | 默认值 |
|---|---|---|
antidestroy.notify |
接收审计通知 | OP |
antidestroy.reload |
重新加载配置 | OP |
antidestroy.toggle |
切换管理员通知 | OP |
antidestroy.lookup |
查询 MySQL 审计记录 | OP |
antidestroy.status |
查看插件运行状态 | OP |
过滤器顺序不限,可以组合使用;多个过滤器之间为 AND 条件。不带过滤器时显示最新记录,每页固定 4 条。
| 过滤器 | 含义 | 示例 |
|---|---|---|
u: |
玩家名或标准 UUID | u:cloudfl4re |
t: |
最近一段时间,支持 m、h、d、w |
t:2h |
r: |
玩家当前位置同世界内的水平半径,范围 1–1000 | r:30 |
a: |
精确操作名称 | a:使用 |
i: |
Minecraft 物品或方块 | i:minecraft:tnt |
world: |
精确世界名称 | world:world |
status: |
成功、被拦截、success 或 blocked |
status:被拦截 |
page: |
页码 | page:2 |
例如:
/antidestroy lookup u:cloudfl4re t:2h i:minecraft:tnt status:成功 page:1
玩家可以点击黄色页码和前后翻页按钮。记录使用青色、黄色、绿色、红色和灰色区分玩家、物品、成功、拦截与辅助信息;悬停记录可查看完整时间、UUID、物品键、领地、上下文和坐标。控制台支持除 r: 外的过滤器。
dangerous-materials:
- LAVA_BUCKET
- TNT
- END_CRYSTAL
- RESPAWN_ANCHOR
- FLINT_AND_STEEL
time-zone: Asia/Shanghai
notification-format: "<red>[AntiDestroy]</red> 玩家={player} 时间={time} 状态={status} 操作={action} 物品={item} 数量={amount} 领地={territory} 坐标={world},{x},{y},{z} 目标={context}"
storage:
type: file
mysql:
host: 127.0.0.1
port: 3306
database: antidestroy
username: root
password: change_me
maximum-pool-size: 10
connection-timeout-ms: 10000
ssl-mode: PREFERREDdangerous-materials 用于配置需要审计的物品和方块。默认配置还包含 TNT 矿车、16 种床、火焰弹和凋灵骷髅头颅等条目。
time-zone 使用 IANA 时区名称,例如 Asia/Shanghai。notification-format 使用 MiniMessage 格式,并且必须保留以下占位符:
{player} {time} {status} {action} {item} {amount}
{territory} {world} {x} {y} {z} {context}
岩浆桶倒出和玩家点燃 TNT 始终会产生审计记录;其余大部分监听项由 dangerous-materials 控制。
storage.type 只接受 file 或 mysql:
file是默认模式,记录写入plugins/AntiDestroy/logs.log,不支持lookup。mysql只写 MySQL,不同时写logs.log。插件会自动创建antidestroy_schema_version和antidestroy_audit。- MySQL 启动连接或 schema 初始化失败时,AntiDestroy 会禁用,避免悄悄切换存储导致查询结果不完整。
- 修改存储配置后执行
reload,插件会先异步验证新后端,成功后原子替换;失败时继续使用旧配置和旧后端。 - 写入失败会按 1、2、4 秒最多重试 3 次。若
commit结果不确定,为避免重复记录不会重试,并保守计入 lost。
MySQL 用户至少需要目标数据库的 CREATE、SELECT 和 INSERT 权限。ssl-mode 支持 DISABLED、PREFERRED、REQUIRED、VERIFY_CA 和 VERIFY_IDENTITY。密码不会出现在 status 或安全错误信息中。
文件模式的日志位于 plugins/AntiDestroy/logs.log。MySQL 模式将同样的结构化字段保存到数据库。每条记录包含时间、玩家名、UUID、操作状态(成功或被拦截)、操作类型、物品、数量、领地、世界、坐标和上下文。
安装 Residence 后,日志中的领地字段会显示解析到的领地名称;未安装 Residence 或 API 不可用时,该字段会显示对应状态。
Windows:
.\gradlew.bat clean buildLinux 或 macOS:
./gradlew clean build构建完成后,JAR 位于 build/libs/AntiDestroy-1.1.0.jar。JAR 已包含 HikariCP 与 MySQL Connector/J,服务器无需单独安装 JDBC 驱动。
本项目采用 GNU General Public License v3.0 许可 (SPDX: GPL-3.0-only)。
cloudfl4re