世界与区块扩展

基本信息

属性 值
包名 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)两条路径。

相关条目