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() 流程

  1. 目录不存在则 mkdir(),失败直接 return false。
  2. 先清空 4 个容器:segmentsBlock、segmentsEntity、segmentsItem、segmentsTile。
  3. FileUtils.listFiles(folder, {"json"}, true) 递归列出所有 .json。
  4. 逐个 read(file);解析成功则:
    • 若 protection.modid 等于 "Minecraft" → 暂存为 vanillaProtection
    • 否则立即 ProtectionManager.addProtection(...) 并打日志
  5. 原版保护最后才加入(循环结束后),保证其优先级最低。
  6. 一个都没加载成功时打两条 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 的反射式字段 / 方法取值。

相关条目