世界与区块扩展
基本信息
| 属性 | 值 |
|---|---|
| 包名 | codechicken.lib.world |
| 公开类型数 | 6 |
| 事件订阅 | WorldExtensionManager、TileChunkLoadHook 均为全仓 5 个 @SubscribeEvent 类之一 |
功能
Minecraft 原版没有「区块加载/卸载时的扩展钩子」。codechicken.lib.world 补上了这个缺口:附属模组可以按需把自己的逻辑挂到区块生命周期上,而不必自己写一个全局的 ChunkEvent 监听器去遍历所有已加载区块。
核心抽象
WorldExtensionInstantiator
public abstract class WorldExtensionInstantiator {
public int instantiatorID;
public abstract WorldExtension createWorldExtension(World world);
public abstract ChunkExtension createChunkExtension(Chunk chunk, WorldExtension world);
public WorldExtension getExtension(World world) { ... }
}
模组继承本类并实现两个工厂方法,然后调用 WorldExtensionManager.registerWorldExtension(...)(WorldExtensionManager.java:126)注册。instantiatorID 是本模组实例的唯一标识,查找时通过 getWorldExtension(world, instantiatorID) 完成。
ChunkExtension
抽象基类,为每个区块提供一个扩展实例(ChunkExtension.java):
| 字段 / 方法 | 说明 |
|---|---|
public final Chunk chunk / ChunkCoordIntPair coord / WorldExtension world |
上下文引用 |
public HashSet<EntityPlayerMP> watchedPlayers |
正在观看本区块的玩家 |
loadData(NBTTagCompound) / saveData(NBTTagCompound) |
NBT 持久化,默认空实现 |
load() / unload() |
区块加载/卸载 |
sendPacketToPlayers(Packet) |
向 watchedPlayers 广播封包(final) |
watchPlayer(EntityPlayerMP) / unwatchPlayer(EntityPlayerMP) |
观看者增删(final,会回调 onWatchPlayer / onUnWatchPlayer) |
sendUpdatePackets() |
主动推送更新 |
hashCode() / equals() 被重写为与坐标等价,且兼容 ChunkCoordIntPair 与「打包成 long 的坐标」两种比较对象。
WorldExtension
对应世界维度的扩展基类。
事件接线
WorldExtensionManager.WorldExtensionEventHandler(WorldExtensionManager.java:25)把 Forge 事件桥接到上述扩展点,共 12 个处理方法:
| 事件 | 行 |
|---|---|
ChunkDataEvent.Load / ChunkDataEvent.Save |
:28、:38 |
ChunkEvent.Load / ChunkEvent.Unload |
:46、:55 |
WorldEvent.Save / WorldEvent.Load / WorldEvent.Unload |
:67、:73、:78 |
Watch / UnWatch |
:84、:96 |
TickEvent.ClientTickEvent / TickEvent.WorldTickEvent |
:108、:115 |
另有独立的 TileChunkLoadHook(lib/world/TileChunkLoadHook.java),提供 init()(:16)与 onChunkLoad(ChunkEvent.Load)(:24)两条路径。