没有匹配的章节,请尝试材料名、配置键或命令。
先确认运行环境
此版本以标准 Bukkit 主线程模型为目标,不再使用 Folia 区域调度器。插件以 Bukkit API 1.20.1 编译,可运行于 1.20 至 26.2 的 Bukkit API 兼容服务端,服务器需要 Java 17 或更高版本。
在线数据背包、盔甲、副手、光标和末影箱。
世界容器只处理当前已加载区块,不主动加载新区块。
离线数据低峰期分批处理各世界 playerdata 文件。
不要在 Folia 上加载 2.0.0以及更高版本!
本版的世界、实体和库存操作按 Leaves/Bukkit 单主线程约束实现。若以后重新切换 Folia,需要恢复区域与实体调度设计,不能只修改
plugin.yml。
全新安装
- 停止服务器并做世界备份至少保留所有世界目录和现有
plugins/。 - 检查 Java 与核心使用 Java 17 或更高版本,核心版本为 Minecraft 1.20 至 26.2 的 Bukkit API 兼容服务端。
- 放入插件将
LeavesAntiIllegal-3.1.1.jar放到服务器plugins/。 - 启动一次等待生成
plugins/LeavesAntiIllegal/config.yml,确认控制台出现启用日志。 - 先做演练把离线扫描的
dry-run改成true,重载后观察一个低峰窗口。
server/
├── server-1.20-to-26.2.jar
├── plugins/
│ ├── LeavesAntiIllegal-{version}.jar
│ └── LeavesAntiIllegal/
│ ├── config.yml
│ └── scanner-state.properties
└── world/playerdata/
scanner-state.properties 在一次离线全量扫描成功结束后生成,用于记录最近完成日期,避免同一天重复遍历。
从 FoliaAntiIllegal 升级
项目名、插件名、主类和 Java 包均已更改。Bukkit 会因此使用新的数据目录,旧配置不会自动进入新插件。
| 项目 | 旧版 | 3.1.1 |
|---|---|---|
| 插件名 | FoliaAntiIllegal | LeavesAntiIllegal |
| 数据目录 | plugins/FoliaAntiIllegal/ | plugins/LeavesAntiIllegal/ |
| 目标核心 | Folia / Paper 旧目标 | Bukkit API 1.20 - 26.2 |
| 命令与权限 | /antiillegal、antiillegal.* | 保持不变 |
- 关闭服务器不能热替换插件 JAR,也不要同时保留新旧两份 JAR。
- 移走旧 JAR保留旧数据目录作为参考,但不要让旧插件再次加载。
- 让新版本生成配置新配置包含 2.0.0以及更高版本 的全部字段和逐行中文注释。
- 逐项合并业务规则迁移
banned-materials、附魔/属性阈值、白名单和自定义消息。 - 演练后启用写回不要直接用旧配置覆盖配置版本 3。
同名配置不代表结构相同
离线扫描、已加载容器、低峰窗口和文件保护均是新版字段。直接覆盖会让缺失项回落到代码默认值,但你会失去完整注释,也不便于审计实际行为。
推荐的分阶段上线
- 第一阶段:只观察离线数据设置
scanners.offline-player-data.dry-run: true,在线与容器扫描仍会正常移除。 - 第二阶段:核对误报重点检查不可破坏物品、玩家头颅、自定义属性装备和插件附魔。
- 第三阶段:调整白名单和规则合法运营道具应从禁止材料中删除或放宽对应检测项,不要长期给普通玩家绕过权限。
- 第四阶段:启用离线写回保持
backup-before-write: true,把dry-run改为false。
scanners:
offline-player-data:
enabled: true
dry-run: true
backup-before-write: true
log-each-removal: true
确认后将 log-each-removal 恢复为 false,否则大量历史违规可能显著增加日志量。
扫描器如何覆盖物品
实时事件拾取、点击、拖拽、换手与加入。
在线定时默认每 100 tick 扫描玩家库存。
已加载区块默认每 200 tick 处理 16 个区块。
离线低峰按窗口和在线人数处理 playerdata。
| 来源 | 包含 | 不会做什么 |
|---|---|---|
| 在线玩家 | 背包、快捷栏、盔甲、副手、光标、末影箱 | 绕过权限、OP、UUID 白名单不处理 |
| 方块容器 | 箱子、木桶、漏斗、熔炉、方块潜影盒等 | 不会为扫描主动加载区块 |
| 实体容器 | 运输矿车、漏斗矿车等 InventoryHolder | 玩家实体由在线扫描器负责 |
| 离线文件 | 各世界标准 UUID .dat 的背包、末影箱、嵌套物品 | 在线、登录中、刚退出、OP 和白名单玩家跳过 |
嵌套扫描默认最多 3 层,覆盖潜影盒、带库存的方块状态物品和收纳袋。增加深度会提高恶意复杂 NBT 的处理成本。
关键配置怎么选
发行包中的 config.yml 已为每个节点、字段和列表项提供中文解释、默认值与示例。以下是运维时最常调整的参数。
扫描节奏
| 配置键 | 默认 | 建议 |
|---|---|---|
scanners.online-players.interval-ticks | 100 | 5 秒一次;人数多可调到 200。 |
scanners.loaded-containers.interval-ticks | 200 | 批次间隔 10 秒。 |
scanners.loaded-containers.chunks-per-run | 16 | 卡顿时先降到 4 或 8。 |
scanners.nested-containers.max-depth | 3 | 通常无需超过 3,最大建议 5。 |
scanners.offline-player-data.files-per-batch | 10 | 机械盘可降到 2;观察磁盘延迟再增加。 |
scanners.offline-player-data.batch-delay-ticks | 20 | 每批间隔 1 秒;越大越平缓。 |
判定规则
| 配置 | 用途 | 容易误伤的场景 |
|---|---|---|
banned-materials | 直接禁止材料 | PLAYER_HEAD、刷怪笼等合法玩法。 |
check-unbreakable | 禁止不可破坏标记 | 任务物品、菜单物品、特殊工具。 |
custom-enchant-limits | 覆盖单个附魔上限 | 自定义附魔或刻意放宽的原版附魔。 |
attribute-limits | 按绝对值限制七类属性 | RPG 装备、负属性平衡道具。 |
whitelisted-players | 按 UUID 完全跳过 | 只适合受控的系统账号。 |
重载会重启全部扫描器修改后执行
/antiillegal reload。重载会重新读取规则快照、取消旧任务并按新设置启动,不需要重启服务器。低峰扫描的边界与保护
离线扫描只会在当前时间处于配置窗口、距离上次成功运行已满足天数且在线人数不高于阈值时开始。跨午夜窗口会归属到窗口开始日。
窗口控制
window-start、window-end、time-zone负载控制
max-online-players、files-per-batch、batch-delay-ticks文件保护登录/退出保护、UUID 锁、备份、临时文件原子替换
推荐窗口示例
scanners:
offline-player-data:
time-zone: "Asia/Shanghai"
window-start: "03:30"
window-end: "05:30"
minimum-days-between-runs: 1
max-online-players: 2
files-per-batch: 5
batch-delay-ticks: 40
- 窗口结束时未完成的一轮会停止,不写入成功日期,下个合适窗口会重新枚举。
- 在线人数超过阈值时当前批次暂停,不会继续读下一个文件。
- 玩家预登录、在线期间和退出后的保护时间内,其 UUID 文件会被跳过。
dry-run: true只检测和记录,不创建备份、不写回原文件。
命令与权限
| 命令 | 作用 | 说明 |
|---|---|---|
/antiillegal reload | 重载配置并重启扫描器 | 控制台或有管理权限的玩家可用。 |
/antiillegal scan | 立即扫描全部在线玩家 | 返回玩家数与移除总数。 |
/antiillegal scan <玩家> | 扫描指定在线玩家 | 目标必须在线。 |
/antiillegal check | 检查执行者主手物品 | 仅玩家可用,不删除。 |
/antiillegal status | 查看容器与离线扫描统计 | 用于判断任务是否启用/运行。 |
| 权限 | 默认 | 作用 |
|---|---|---|
antiillegal.admin | OP | 使用所有管理命令。 |
antiillegal.notify | OP | 接收在线玩家与容器违禁通知。 |
antiillegal.bypass | OP | 在线扫描完全绕过;请谨慎授予。 |
命令别名为 /ai 和 /illegal。离线扫描还会自动跳过服务器 OP 与 UUID 白名单。
备份与单玩家恢复
默认设置下,离线扫描仅在确实发现违禁物且准备写回时,把原文件复制为 <UUID>.dat.fai.bak。同一玩家下次被修改会覆盖该备份,因此它不是长期版本库。
- 停止服务器确保服务器不会同时保存该玩家数据。
- 确认玩家 UUID 与世界从日志中的世界名和 UUID 找到对应
playerdata。 - 保留当前文件把当前
<UUID>.dat另行复制,以便反向恢复。 - 恢复备份用
<UUID>.dat.fai.bak替换<UUID>.dat。 - 先修正规则若不调整误报规则,下一次低峰扫描仍会再次移除。
恢复必须在停服状态进行在线替换 playerdata 可能被服务器内存中的玩家数据覆盖,也可能造成文件损坏。大范围回滚优先恢复整服世界备份。
按症状调优
| 症状 | 先调整 | 取舍 |
|---|---|---|
| 每 10 秒出现主线程尖峰 | 降低 chunks-per-run,再提高容器 interval-ticks | 完成一轮已加载区块扫描会更慢。 |
| 在线人数多时定时扫描压力大 | 提高在线 interval-ticks 到 200 或 400 | 事件检测仍在,但静止库存发现延迟增加。 |
| 低峰磁盘延迟升高 | 降低 files-per-batch,提高 batch-delay-ticks | 可能无法在窗口内扫完全部历史玩家。 |
| 嵌套恶意物品处理慢 | 把 max-depth 保持 2 至 3 | 更深层嵌套不再递归。 |
| 通知刷屏 | 关闭 notify-admins 或 log-each-removal | 检测和删除仍继续,仅减少通知。 |
先减小批次,再拉长间隔批次大小直接决定一次任务占用主线程或磁盘的工作量;间隔决定完成整轮扫描所需时间。每次只改一个变量,结合 spark 或服务端 timings 对比。
常见问题
插件未加载或显示红色
- 确认服务端版本在 1.20 至 26.2 范围内,并使用 Java 17 或更高版本。
- 确认 JAR 名为
LeavesAntiIllegal-{version}.jar,没有同时保留旧版 JAR。 - 从控制台第一段异常开始检查,不要只看最后一行。
离线扫描没有启动
- 用
/antiillegal status确认扫描器已启用且当前未在运行。 - 核对
time-zone、窗口起止、在线人数阈值和最近成功日期。 - 检查各世界是否存在
playerdata/,且文件名是标准 UUID。
合法物品被删除
- 从日志读取材料、路径和原因,定位对应规则。
- 运营头颅玩法时从
banned-materials移除PLAYER_HEAD。 - 任务物品使用不可破坏标记时关闭
check-unbreakable,或重新设计物品。 - 自定义附魔使用
custom-enchant-limits明确设置允许值。
配置重载后没有生效
- 先检查 YAML 缩进和控制台解析错误,列表只能保留一种写法。
- 确认命令返回“配置与全部扫描器已重新加载”。
- 用
/antiillegal status验证开关与任务状态。
正式上线检查表
- 已备份全部世界与旧插件数据目录。
- 服务器版本为 1.20 至 26.2,运行 Java 17 或更高版本。
- 旧 FoliaAntiIllegal JAR 已移除,没有重复加载。
- 已从新配置出发逐项合并规则,而非覆盖整个文件。
- 已检查
PLAYER_HEAD、不可破坏物品、自定义附魔和 RPG 属性。 - 离线扫描已用
dry-run: true完成一次演练。 - 低峰窗口、时区、在线人数阈值和磁盘批次符合本服情况。
backup-before-write保持开启,并验证过单玩家恢复流程。- 权限只授予需要的管理组,没有给普通玩家
antiillegal.bypass。 - 已执行
/antiillegal status和一次指定玩家扫描。
插件已经注册bStats
- 为了统计此插件的使用数据(包括使用次数、用户服务器的地理位置(精确到国家)等非细节信息,我们会将数据推送至bStats平台)
- 请放心,此功能仅仅统计插件的使用次数,和您的服务器所在国家,不会上传其他任何数据