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」而漏掉保护,因此放到独立线程轮询等待。
执行流程
- 记录
startTime,经MinecraftServer.getServer().worldServerForDimension(position.getDim())取世界。 while (te == null)循环调world.getTileEntity(x, y, z)。- 每轮检查
System.currentTimeMillis() - startTime >= 1000, 超时则调ProtectionManager.placementThreadTimeout()并return。 - 拿到
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 任何配置项控制。
把它当成可配置项是错误的。
相关条目
- ProtectionManager -
placementThreadTimeout()的宿主 - Segment - 判定被延迟的那一步
- Config - 37 项配置中无超时项