ThreadPlacementCheck

基本信息

属性 值
类名 mytown.thread.ThreadPlacementCheck
文件 src/main/java/mytown/thread/ThreadPlacementCheck.java
行数 43
类型 extends Thread
超时常量 TIMEOUT_IN_MS = 1000
启用版本 Minecraft 1.7.10

功能

异步轮询某个方块位置是否出现 TileEntity。类注释说明: 一个线程在给定方块上检查是否存在 TileEntity,1 秒内找不到就退出。

典型场景是某些 mod 在放置方块时 TileEntity 是延迟创建的, 同步检查会误判为「无 TileEntity」而漏掉保护,因此放到独立线程轮询等待。

执行流程

  1. 记录 startTime,经 MinecraftServer.getServer().worldServerForDimension(position.getDim()) 取世界。
  2. while (te == null) 循环调 world.getTileEntity(x, y, z)。
  3. 每轮检查 System.currentTimeMillis() - startTime >= 1000, 超时则调 ProtectionManager.placementThreadTimeout() 并 return。
  4. 拿到 te 后退出循环,交由 ProtectionManager 继续处理。

实现要点

⚠️ 坐标带 dim(维度 ID),构造器签名是 ThreadPlacementCheck(Resident res, int x, int y, int z, int dim) —— 即每个线程都锁定在单一世界的单一坐标,不跨维度。

⚠️ 这是自建 Thread 而非 Forge 任务调度器,因此:

  • 线程名未设置(构造器只调 super(),未传 name);
  • 无池化,每次检查新建一个线程;
  • 直接在服务端主线程之外访问 world.getTileEntity, 未见显式同步保护。

⚠️ 超时上限是 1 秒(1000 ms),是硬编码 private static final, 不受 Config 任何配置项控制。 把它当成可配置项是错误的。

相关条目