# 崩服防护与自动化

XFEServerManager 在“设置 → 崩服防护”提供可热更新的主线程熔断器，并把检测结果接入普通触发器。它用于在掉落物、生物、模组实体、区块加载器或命令方块失控时保住服务器的响应能力；它不能代替原版 watchdog、内存/磁盘监控、定期备份或对第三方模组本身的修复。

## 默认保护

新安装默认启用下列限制；旧配置文件缺少整段或只写了部分字段时，其余字段会自动继承当前安全默认值。

| 项目 | 默认值 | 超限行为 |
|---|---:|---|
| 已加载掉落物（每维度 / 每区块） | 2,000 / 256 | 清理超额掉落物，并阻止继续生成 |
| 已加载生物（每维度 / 每区块） | 2,000 / 128 | 只阻止继续生成，不删除已有生物 |
| 已加载实体总数（每维度 / 每区块） | 5,000 / 512 | 阻止继续生成 |
| 同一第三方注册命名空间实体数（每维度） | 512 | 阻止该维度继续生成该模组的实体；`minecraft` 使用掉落物/生物/总实体限制 |
| 新实体生成突发量 | 5 秒内 400 个 | 立即阻止本窗口内后续实体生成 |
| 命令方块执行速率 | 每秒 100 条 | 熔断本秒内后续命令方块命令 |
| 已加载区块数（每维度） | 8,000 | 发出事件和告警，不强制卸载 |
| 慢刻 | 连续 3 刻均至少 200 ms | 发出事件和告警 |
| JVM 堆占用 | 90% | 发出事件和告警，不强制 GC |

周期统计默认每 100 游戏刻（正常约 5 秒）扫描一次，只遍历已经加载的实体和区块，不加载新区块、不访问磁盘，也不在服务器线程发起网络请求。生成突发量和命令方块速率使用轻量计数器即时判断。

玩家实体永远不会被实体上限拦截。磁盘加载中的已有实体也不会在加入事件中被拒绝，避免世界加载时破坏存档；但后续周期扫描仍可清理超过上限的掉落物。自动清理只作用于 `ItemEntity`，不会删除生物、宠物、村民、Boss 或玩家。

这些规则覆盖常见的命令方块循环 `/summon`、高频投掷器/刷怪器、集中掉落物碰撞、Create 等模组产生的失控实体/机械实体，以及区块强加载、严重慢刻和内存压力。命名空间事件仍会报告 `minecraft`，方便单独观察原版实体，但第三方模组硬上限不会抢先覆盖原版的分类限制。静态方块实体网络、第三方模组死循环、原生崩溃、Mixin 冲突和单个异常数据包仍可能越过通用实体计数；应配合 Spark、watchdog、模组更新和离线备份处理。

## 触发器事件

| 事件 ID | 用途 | 可配置项 |
|---|---|---|
| `protection.item_overflow` | 掉落物超过阈值 | `threshold`, `scope=dimension|chunk`, `cooldownSeconds` |
| `protection.mob_overflow` | 生物超过阈值 | 同上 |
| `protection.entity_overflow` | 全部实体超过阈值 | 同上 |
| `protection.mod_entity_overflow` | 指定模组/命名空间实体超过阈值 | `threshold`, `namespace`, `cooldownSeconds` |
| `protection.spawn_burst` | 短时间实体生成洪泛 | `threshold`, `cooldownSeconds` |
| `protection.command_block_rate` | 命令方块执行洪泛 | `threshold`, `cooldownSeconds` |
| `protection.slow_tick` | 连续慢刻 | `threshold`（毫秒）, `consecutive`, `cooldownSeconds` |
| `protection.loaded_chunk_overflow` | 已加载区块过多 | `threshold`, `cooldownSeconds` |
| `protection.memory_pressure` | JVM 堆占用过高 | `threshold`（百分比）, `cooldownSeconds` |

阈值使用严格的“超过”语义：数量等于阈值时不会触发。编辑器默认 60 秒冷却，冷却键按触发器、维度、范围和模组命名空间隔离，避免一次洪泛刷满触发器队列。

事件上下文可直接用于条件、富文本和任意支持变量的操作：

- `{protection.kind}`、`{protection.scope}`、`{protection.count}`、`{protection.threshold}`、`{protection.excess}`；
- `{protection.removed}`、`{protection.action}`、`{protection.reason}`；
- `{protection.namespace}`、`{protection.windowTicks}`、`{protection.windowSeconds}`、`{protection.consecutive}`；
- `{protection.heapUsedBytes}`、`{protection.heapMaxBytes}`、`{protection.commandSource}`；
- 适用时还包含 `{world.dimension}`、`{chunk.x}`、`{chunk.z}` 和被拒绝实体的类型、UUID、坐标。

例如可为 `protection.mod_entity_overflow` 设置 `namespace=create`、`threshold=200`，然后广播位置、写入日志、执行管理员自定义处置触发器或发送 Web 通知。保护事件本身不具备玩家上下文，不能直接使用传送、踢出、私聊等玩家专用操作。

## 调整建议

- 先观察正常高峰期的实体、区块和 MSPT，再逐步降低阈值；大型整合包不要直接套用小型原版服的数值。
- 每区块限制应不大于对应每维度限制，掉落物/生物限制也不能超过实体总限制；服务端和 Web 页面都会拒绝不一致配置。
- `removeExcessItems` 是唯一会主动移除已有对象的选项。若希望只告警，关闭它，并关闭 `blockExcessSpawns` 或提高硬限制。
- 对 Create 等模组可用命名空间事件设置更低的告警阈值，而保留较宽松的全局硬上限。
- 对确需高频运行的合法命令方块，应提高每秒上限或关闭命令方块熔断，并用命令策略限制危险的 `summon`/`execute` 路径。
