方块变换钩子

基本信息

属性 值
包路径 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,玩家侧表现为「该区块没有被修改」而非明确报错。

相关条目