方块变换钩子
基本信息
| 属性 | 值 |
|---|---|
| 包路径 | com.sk89q.worldedit.forge.compat |
| 文件数 | 6 个 + rotation/ 子包 8 个 |
| 注册入口 | ForgeWorldEdit.preInit(ForgeWorldEdit.java:113-128) |
| 钩子容器 | ForgeWorldData.addBlockTransformHook(...) |
4 个方块变换钩子
| 钩子类 | 注册条件 | 依赖的模组 | 注册行 |
|---|---|---|---|
ForgeMultipartExistsCompat |
Loader.isModLoaded("ForgeMultipart") |
ForgeMultipart | ForgeWorldEdit.java:113-117 |
ArchitectureCraftBlockTransformHook |
Loader.isModLoaded("ArchitectureCraft") |
ArchitectureCraft | :118-121 |
CarpentersBlocksBlockTransformHook |
Loader.isModLoaded("CarpentersBlocks") |
CarpentersBlocks | :122-125 |
ModRotationBlockTransformHook |
无条件 | 本分支自带的旋转映射 | :126-128 |
前 3 个互斥可选:各自只在对应模组加载时注册。
ForgeMultipartExistsCompat会被强转回具体类型再注册(ForgeWorldEdit.java:115-116:addBlockTransformHook((ForgeMultipartExistsCompat) compat)),因为compat字段声明类型是接口ForgeMultipartCompat。未加载 ForgeMultipart 时,
compat字段保持初始值new NoForgeMultipartCompat()(ForgeWorldEdit.java:98),作为空实现兜底。
依赖的软硬性质(重要)
这 3 个模组在 @Mod 注解里写的是 after:,不是 required-after::
ForgeWorldEdit.java:73-78
@Mod(
modid = ForgeWorldEdit.MOD_ID,
name = "WorldEdit",
version = WETags.VERSION,
acceptableRemoteVersions = "*",
dependencies = "after:ForgeMultipart;after:ArchitectureCraft;after:CarpentersBlocks")
after: 只声明加载顺序,不声明必需性;三者缺失都不会导致 WorldEdit 崩溃。真正的可选性由上面的 Loader.isModLoaded 守卫保证。
而 mcmod.info 里却写着 "dependencies": ["ForgeMultipart"](src/main/resources/mcmod.info:14-16),这是 FML 的硬依赖声明——两处声明不一致。实际能否启动取决于运行环境如何处理 mcmod.info 的 dependencies 数组;本仓无法核实 GTNH 整合包的实际行为。
⚠️ 另有一处 gradle 层面的不一致:
ForgeMultipart、ArchitectureCraft、CarpentersBlocks在dependencies.gradle中都是devOnlyNonPublishable(仅开发/测试期使用,不作为发布的 Maven 依赖),而CodeChickenCore才是implementation(正式依赖)。这与「可选集成」的定位一致。
CodeChickenCore 的真实用途(勿按名字推测)
CodeChickenCore 在代码中只有 1 个文件引用,且只用到 codechicken.multipart 这两个类:
forge/compat/ForgeMultipartExistsCompat.java:36-37
import codechicken.multipart.MultipartHelper;
import codechicken.multipart.TileMultipart;
即它提供的是 ForgeMultipart 的底层库(codechicken.multipart),不是 CodeChickens 生态的通用 CCLib。其余 WorldEdit 代码不触碰 CodeChicken 任何 API。
静默失败点
ForgeWorld.generateChunk 整段被 catch (Throwable t) 包裹,失败时记 logger.log(Level.WARNING, "Failed to generate chunk", t) 并 return false(forge/ForgeWorld.java:367-370)——该区块的生成被放弃,但上层只看到 false,玩家侧表现为「该区块没有被修改」而非明确报错。
相关条目
- 可选模组支持 - NEI、CUI 通道、参考手册 GUI
- 旋转映射(分支新增) -
ModRotationBlockTransformHook消费的数据 - worldedit.properties 配置项 - 与钩子无关的配置