平台与能力 API
基本信息
| 属性 | 值 |
|---|---|
| 全局单例 | com.sk89q.worldedit.WorldEdit(WorldEdit.getInstance()) |
| 平台管理 | com.sk89q.worldedit.extension.platform.PlatformManager |
| 平台实现 | com.sk89q.worldedit.forge.ForgePlatform(本模组的 1.7.10 实现) |
| 能力枚举 | com.sk89q.worldedit.extension.platform.Capability |
| 平台注册点 | ForgeWorldEdit.java:162-166(new ForgePlatform(this) 后 getPlatformManager().register(platform)) |
| 平台注销点 | ForgeWorldEdit.java:189-191(serverStopping) |
能力(Capability)
ForgePlatform.getCapabilities() 声明 6 项能力及其偏好(ForgePlatform.java:212-221):
| 能力 | Preference | 含义 |
|---|---|---|
CONFIGURATION |
PREFER_OTHERS |
提供 LocalConfiguration |
WORLDEDIT_CUI |
NORMAL |
支持 CUI 协议 |
GAME_HOOKS |
NORMAL |
挂接原版游戏事件 |
PERMISSIONS |
NORMAL |
提供权限体系 |
USER_COMMANDS |
NORMAL |
提供 ServerInterface(用户指令入口) |
WORLD_EDITING |
PREFERRED |
提供世界读写能力 |
Capability.CONFIGURATION 的持有者被 //we reload 用于取配置并发事件(WorldEditCommands.java:76-78:queryCapability(Capability.CONFIGURATION).getConfiguration())。
/worldedit version 会遍历 Capability.values() 逐个报告由哪个平台提供,无提供者显示 NONE(WorldEditCommands.java:60-65)。
WorldEdit 单例持有的工厂
WorldEdit 实例在静态块中完成初始化(WorldEdit.java:109-113):
WorldEditPrefixHandler.register("com.sk89q.worldedit")(log4j 日志前缀,与指令无关)getVersion()BundledBlockData.getInstance()—— 加载方块注册表
对外暴露的工厂(WorldEdit.java):
| 工厂 | 用途 |
|---|---|
getPlatformManager() |
平台注册与能力查询 |
getEventBus() |
事件总线 |
getBlockFactory() |
由文本解析 BaseBlock |
getItemFactory() |
由文本解析 BaseItem |
getMaskFactory() |
构造掩码 |
getPatternFactory() |
构造图案 |
getSessionManager() |
会话存取 |
getServer() |
转发到 getPlatformManager().getServerInterface()(:848-850) |
getLightingScheduler() / setLightingScheduler() |
光照调度器 |
1.7.10 专属的方块/物品解析桥
src/main/resources/com/sk89q/worldedit/world/registry/blocks.json(167,462 字节,172 条记录)把 1.7.10 的数字 ID 映射到 minecraft:xxx 命名空间,每条含 legacyId、id、unlocalizedName、material(后者含 fullCube、opaque、powerSource、liquid、solid、hardness、resistance、slipperiness、grassBlocking、ambientOcclusionLightValue 等 1.7.10 物理属性)。
这是 1.7.10 特有的「数字 ID ↔ 命名空间」桥接,在 1.12+ 的方块状态体系中不存在对应物,属于必须与其它 MC 版本隔离的内容。
平台注册时序
| 阶段 | 事件 | 动作 | 行 |
|---|---|---|---|
| 客户端/服务端启动 | FMLPreInitializationEvent |
建工作目录、读配置、注册 4 个方块变换钩子 | ForgeWorldEdit.java:103-137 |
| 初始化 | FMLInitializationEvent |
注册事件总线 + proxy handlers | :139-143 |
| 服务端启动前 | FMLServerAboutToStartEvent |
RotationMappings.init、填充群系、注册 ForgePlatform、装 ForgeLightingScheduler |
:150-174 |
| 服务端启动 | FMLServerStartedEvent |
投递 PlatformReadyEvent |
:194-199 |
| 服务端停止 | FMLServerStoppingEvent |
关闭光照调度器、注销平台 | :176-192 |
serverAboutToStart 开头有一段重入保护:若 platform != null 说明上次没走停止流程,先记 logger.warn("FMLServerStartingEvent occurred when FMLServerStoppingEvent hasn't") 并注销旧平台(ForgeWorldEdit.java:152-157)。