# NullAttributeRemover
一个轻量级的Bukkit/Spigot插件,用于扫描并移除玩家的**损坏**或**无效的属性修改器**,以防止崩溃和不稳定。
最初创建是为了修复已损坏的玩家数据中的`java.lang.NullPointerException`。
## 🔍 它所做的事情
此插件扫描玩家属性,查找:
- ❌ `null`或重复的UUID(甚至跨属性)
- ❌ `NaN`或`Infinity`值
- ❌ 无效或缺失的操作
- ❌ `null`、空白或UUID格式的修改器名称
- ❌ 完全损坏的修改器(null条目)
如果发现任何问题,它们将**自动移除**。
扫描可以手动触发,也可以在传送、重生、世界变化等事件时触发。
## ⚙️ 工作原理
- 检查玩家的所有属性(例如`GENERIC_MAX_HEALTH`)
- 检查每个修改器的:
- UUID的有效性和唯一性
- 名称的有效性(包括是否看起来像UUID)
- 值的合理性(没有`NaN`、`Infinity`或零垃圾)
- 操作类型
- 如果任何部分损坏或可疑,则将其移除
- 如果修改器的UUID在多个地方被重复使用,则会移除所有重复项
- 可配置可选日志和消息
## 🔧 配置
```yaml
# config.yml
silent: false # 抑制玩家聊天消息
kickOnFailure: true # 如果无法移除不良修改器,则将玩家踢出
log-to-console: true # 在控制台中显示扫描结果
log-to-file: true # 将扫描日志保存到 plugins/NullAttributeRemover/nar.log
logUUIDLikeNames: true # 如果修改器名称看起来像UUID,则发出警告
log-invalid-uuid-names: true # 如果为false,则抑制日志,例如“Skipped bad UUID: armor.boots”
debugLogs: true # 启用详细的内部调试日志
```
## 📦 命令
| 命令 | 描述 |
|--------|-------------|
| `/nar scan [player]` | 扫描特定玩家或所有在线玩家 |
| `/nar debug ` | 注入损坏的修改器以进行测试 |
| `/nar reset ` | 清除所有属性并将它们重置为原版 |
> 该插件对所有命令使用 Tab 补全。
## 🧪 兼容性
- 需要 **Java 17 或更高版本**
- 与 **Minecraft 1.17+** 兼容
- 专为 **Paper** 设计,也可能适用于 Spigot 和其分支