ProtectionParser
基本信息
| 属性 | 值 |
|---|---|
| 类名 | mytown.protection.json.ProtectionParser |
| 文件 | src/main/java/mytown/protection/json/ProtectionParser.java |
| 行数 | 97 |
| 启用版本 | Minecraft 1.7.10 |
功能
保护规则的加载器。真正的保护数据不在代码里,而在
<config>/MyTown/protections/ 目录下的一批 JSON 文件中 —— 这些文件由独立的仓库
MyTown2-Protections 维护。
本类负责扫描该目录、逐个反序列化、并注册进 ProtectionManager。
由 Mod 入口 的 serverStarting 在建数据源之前调用
ProtectionParser.start()。
start() 流程
- 目录不存在则
mkdir(),失败直接return false。 - 先清空 4 个容器:
segmentsBlock、segmentsEntity、segmentsItem、segmentsTile。 FileUtils.listFiles(folder, {"json"}, true)递归列出所有.json。- 逐个
read(file);解析成功则:- 若
protection.modid等于"Minecraft"→ 暂存为vanillaProtection - 否则立即
ProtectionManager.addProtection(...)并打日志
- 若
- 原版保护最后才加入(循环结束后),保证其优先级最低。
- 一个都没加载成功时打两条
warn,提示去 GitHub 拉保护包。
实现要点
⚠️ 原版(Minecraft)保护被刻意延后注册(ProtectionParser.java:57-69):
先收集到 vanillaProtection 局部变量,等所有第三方 mod 的保护加完后再添加。
这样设计是为了让具体 mod 的保护优先于原版通用保护。
⚠️ start() 在 serverStarting 中于 new MyTownDatasource() 之前调用,
但它 clear() 的 4 个容器属于静态的 ProtectionManager,
因此重载配置文件需要重启服务端(/mytownadmin reload 不重跑本方法)。
⚠️ segmentsSpecialBlock 与 segmentsTrackedEntity 不在本方法的 clear() 列表中
(源码只清了 4 个),这是与 ProtectionManager 声明的 6 个容器不一致之处。
Gson 实例注册了 Caller.class 的自定义序列化器(ProtectionParser.java:26),
以支持 Segment Caller 的反射式字段 / 方法取值。
相关条目
- Protection - 单条保护规则的数据模型
- ProtectionManager - 注册目标
- MyEssentials-Core -
SerializerTemplate来源(已收录) - MyTown2-Client - 客户端扩展