Chunk 加载回调

基本信息

属性 值
类名 mytown.handlers.MyTownLoadingCallback
文件 src/main/java/mytown/handlers/MyTownLoadingCallback.java
行数 30
实现 ForgeChunkManager.LoadingCallback
启用版本 Minecraft 1.7.10

功能

区块强载的恢复逻辑。MyTown2 会为城镇 / 地块强载区块, 使领地内容不掉落。本类负责在服务端启动时把已持久化的票据重新 force 回去。

注册点:Mod 入口 的 registerHandlers() 末行

ForgeChunkManager.setForcedChunkLoadingCallback(this, new MyTownLoadingCallback());

这是本 mod 唯一使用 ForgeChunkManager 的地方。

结构

public static final List<ForgeChunkManager.Ticket> tickets = new ArrayList<>();

静态票据列表,收集本 mod 持有的全部强载票据。

ticketsLoaded(List<Ticket>, World)

  1. 遍历传入票据,从 ticket.getModData() 取名为 chunkCoords 的 NBTTagList(元素类型 Constants.NBT.TAG_COMPOUND)。
  2. 对每个 NBTTagCompound 读 x / z 两个 int,构造 new ChunkCoordIntPair(x, z),调 ForgeChunkManager.forceChunk(ticket, coord)。
  3. 最后 MyTownLoadingCallback.tickets.addAll(tickets) 收进静态列表。

实现要点

⚠️ 票据的区块坐标存在 mod 自己的 NBT 里(key = chunkCoords), 不是用 Forge 默认的 Ticket 字段。这是本 mod 私有格式。

⚠️ NBT 元素只有 x 与 z,没有 y —— 再次印证 TownBlock 是区块级而非方块级。

⚠️ tickets 是 static final 列表且只 addAll 不清理。 /mytownadmin chunkunload 移除票据时若不同步移除此列表, 内存中的票据会与实际强载状态不一致。

⚠️ ticketsLoaded 由 Forge 在加载世界时回调,可能对多个世界多次调用。

相关条目

  • TownBlock - isChunkloaded() 与区块坐标
  • Ticker - 每日维护费
  • Config - costAdditionalChunkloadedUpkeep / costAmountChunkloadedClaim
  • CommandsAdmin - chunkload / chunkunload 命令