运维参考 / Server owner guide

LeavesAntiIllegal 服主手册

用于部署、配置和维护 Minecraft 1.20 至 26.2 Bukkit API 服务端上的在线玩家、已加载容器与离线玩家数据扫描。

Minecraft 1.20 - 26.2 Java 17+ 配置版本 3 插件版本 3.1.1
01 / 适用范围

先确认运行环境

此版本以标准 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
02 / 安装

全新安装

  1. 停止服务器并做世界备份至少保留所有世界目录和现有 plugins/
  2. 检查 Java 与核心使用 Java 17 或更高版本,核心版本为 Minecraft 1.20 至 26.2 的 Bukkit API 兼容服务端。
  3. 放入插件LeavesAntiIllegal-3.1.1.jar 放到服务器 plugins/
  4. 启动一次等待生成 plugins/LeavesAntiIllegal/config.yml,确认控制台出现启用日志。
  5. 先做演练把离线扫描的 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 在一次离线全量扫描成功结束后生成,用于记录最近完成日期,避免同一天重复遍历。

03 / 迁移

从 FoliaAntiIllegal 升级

项目名、插件名、主类和 Java 包均已更改。Bukkit 会因此使用新的数据目录,旧配置不会自动进入新插件。

项目旧版3.1.1
插件名FoliaAntiIllegalLeavesAntiIllegal
数据目录plugins/FoliaAntiIllegal/plugins/LeavesAntiIllegal/
目标核心Folia / Paper 旧目标Bukkit API 1.20 - 26.2
命令与权限/antiillegalantiillegal.*保持不变
  1. 关闭服务器不能热替换插件 JAR,也不要同时保留新旧两份 JAR。
  2. 移走旧 JAR保留旧数据目录作为参考,但不要让旧插件再次加载。
  3. 让新版本生成配置新配置包含 2.0.0以及更高版本 的全部字段和逐行中文注释。
  4. 逐项合并业务规则迁移 banned-materials、附魔/属性阈值、白名单和自定义消息。
  5. 演练后启用写回不要直接用旧配置覆盖配置版本 3。
同名配置不代表结构相同 离线扫描、已加载容器、低峰窗口和文件保护均是新版字段。直接覆盖会让缺失项回落到代码默认值,但你会失去完整注释,也不便于审计实际行为。
04 / 首次运行

推荐的分阶段上线

  1. 第一阶段:只观察离线数据设置 scanners.offline-player-data.dry-run: true,在线与容器扫描仍会正常移除。
  2. 第二阶段:核对误报重点检查不可破坏物品、玩家头颅、自定义属性装备和插件附魔。
  3. 第三阶段:调整白名单和规则合法运营道具应从禁止材料中删除或放宽对应检测项,不要长期给普通玩家绕过权限。
  4. 第四阶段:启用离线写回保持 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,否则大量历史违规可能显著增加日志量。

05 / 工作范围

扫描器如何覆盖物品

实时事件拾取、点击、拖拽、换手与加入。
在线定时默认每 100 tick 扫描玩家库存。
已加载区块默认每 200 tick 处理 16 个区块。
离线低峰按窗口和在线人数处理 playerdata。
来源包含不会做什么
在线玩家背包、快捷栏、盔甲、副手、光标、末影箱绕过权限、OP、UUID 白名单不处理
方块容器箱子、木桶、漏斗、熔炉、方块潜影盒等不会为扫描主动加载区块
实体容器运输矿车、漏斗矿车等 InventoryHolder玩家实体由在线扫描器负责
离线文件各世界标准 UUID .dat 的背包、末影箱、嵌套物品在线、登录中、刚退出、OP 和白名单玩家跳过

嵌套扫描默认最多 3 层,覆盖潜影盒、带库存的方块状态物品和收纳袋。增加深度会提高恶意复杂 NBT 的处理成本。

06 / 配置索引

关键配置怎么选

发行包中的 config.yml 已为每个节点、字段和列表项提供中文解释、默认值与示例。以下是运维时最常调整的参数。

扫描节奏

配置键默认建议
scanners.online-players.interval-ticks1005 秒一次;人数多可调到 200。
scanners.loaded-containers.interval-ticks200批次间隔 10 秒。
scanners.loaded-containers.chunks-per-run16卡顿时先降到 4 或 8。
scanners.nested-containers.max-depth3通常无需超过 3,最大建议 5。
scanners.offline-player-data.files-per-batch10机械盘可降到 2;观察磁盘延迟再增加。
scanners.offline-player-data.batch-delay-ticks20每批间隔 1 秒;越大越平缓。

判定规则

配置用途容易误伤的场景
banned-materials直接禁止材料PLAYER_HEAD、刷怪笼等合法玩法。
check-unbreakable禁止不可破坏标记任务物品、菜单物品、特殊工具。
custom-enchant-limits覆盖单个附魔上限自定义附魔或刻意放宽的原版附魔。
attribute-limits按绝对值限制七类属性RPG 装备、负属性平衡道具。
whitelisted-players按 UUID 完全跳过只适合受控的系统账号。
重载会重启全部扫描器修改后执行 /antiillegal reload。重载会重新读取规则快照、取消旧任务并按新设置启动,不需要重启服务器。
07 / 离线数据

低峰扫描的边界与保护

离线扫描只会在当前时间处于配置窗口、距离上次成功运行已满足天数且在线人数不高于阈值时开始。跨午夜窗口会归属到窗口开始日。

窗口控制window-startwindow-endtime-zone
负载控制max-online-playersfiles-per-batchbatch-delay-ticks
文件保护登录/退出保护、UUID 锁、备份、临时文件原子替换

推荐窗口示例

每日 03:30 至 05:30,仅在线不超过 2 人
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 只检测和记录,不创建备份、不写回原文件。
08 / 管理入口

命令与权限

命令作用说明
/antiillegal reload重载配置并重启扫描器控制台或有管理权限的玩家可用。
/antiillegal scan立即扫描全部在线玩家返回玩家数与移除总数。
/antiillegal scan <玩家>扫描指定在线玩家目标必须在线。
/antiillegal check检查执行者主手物品仅玩家可用,不删除。
/antiillegal status查看容器与离线扫描统计用于判断任务是否启用/运行。
权限默认作用
antiillegal.adminOP使用所有管理命令。
antiillegal.notifyOP接收在线玩家与容器违禁通知。
antiillegal.bypassOP在线扫描完全绕过;请谨慎授予。

命令别名为 /ai/illegal。离线扫描还会自动跳过服务器 OP 与 UUID 白名单。

09 / 数据安全

备份与单玩家恢复

默认设置下,离线扫描仅在确实发现违禁物且准备写回时,把原文件复制为 <UUID>.dat.fai.bak。同一玩家下次被修改会覆盖该备份,因此它不是长期版本库。

  1. 停止服务器确保服务器不会同时保存该玩家数据。
  2. 确认玩家 UUID 与世界从日志中的世界名和 UUID 找到对应 playerdata
  3. 保留当前文件把当前 <UUID>.dat 另行复制,以便反向恢复。
  4. 恢复备份<UUID>.dat.fai.bak 替换 <UUID>.dat
  5. 先修正规则若不调整误报规则,下一次低峰扫描仍会再次移除。
恢复必须在停服状态进行在线替换 playerdata 可能被服务器内存中的玩家数据覆盖,也可能造成文件损坏。大范围回滚优先恢复整服世界备份。
10 / 性能

按症状调优

症状先调整取舍
每 10 秒出现主线程尖峰降低 chunks-per-run,再提高容器 interval-ticks完成一轮已加载区块扫描会更慢。
在线人数多时定时扫描压力大提高在线 interval-ticks 到 200 或 400事件检测仍在,但静止库存发现延迟增加。
低峰磁盘延迟升高降低 files-per-batch,提高 batch-delay-ticks可能无法在窗口内扫完全部历史玩家。
嵌套恶意物品处理慢max-depth 保持 2 至 3更深层嵌套不再递归。
通知刷屏关闭 notify-adminslog-each-removal检测和删除仍继续,仅减少通知。
先减小批次,再拉长间隔批次大小直接决定一次任务占用主线程或磁盘的工作量;间隔决定完成整轮扫描所需时间。每次只改一个变量,结合 spark 或服务端 timings 对比。
11 / 排障

常见问题

插件未加载或显示红色

  • 确认服务端版本在 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 验证开关与任务状态。
12 / 交付

正式上线检查表

  • 已备份全部世界与旧插件数据目录。
  • 服务器版本为 1.20 至 26.2,运行 Java 17 或更高版本。
  • 旧 FoliaAntiIllegal JAR 已移除,没有重复加载。
  • 已从新配置出发逐项合并规则,而非覆盖整个文件。
  • 已检查 PLAYER_HEAD、不可破坏物品、自定义附魔和 RPG 属性。
  • 离线扫描已用 dry-run: true 完成一次演练。
  • 低峰窗口、时区、在线人数阈值和磁盘批次符合本服情况。
  • backup-before-write 保持开启,并验证过单玩家恢复流程。
  • 权限只授予需要的管理组,没有给普通玩家 antiillegal.bypass
  • 已执行 /antiillegal status 和一次指定玩家扫描。
13 / 数据共享

插件已经注册bStats

  • 为了统计此插件的使用数据(包括使用次数、用户服务器的地理位置(精确到国家)等非细节信息,我们会将数据推送至bStats平台)
  • 请放心,此功能仅仅统计插件的使用次数,和您的服务器所在国家,不会上传其他任何数据