旋转映射(分支新增)

基本信息

属性 值
来源包 com.sk89q.worldedit.forge.compat.rotation
文件 RotationMappings.java、RotationMapping.java、RotationType.java、RotationUtils.java、types/(5 个类)
对应提交 e5623ac “Add Support for Custom Rotation Mappings (#18)”(2026-07-19)
存储目录 <config>/worldedit/mappings/
初始化点 ForgeWorldEdit.java:159(RotationMappings.init(workingDir),在 serverAboutToStart 中)
重载命令 //we reloadmappings(forge/command/ForgeRotationCommands.java:24-33)

用途

//rotate、//flip、刷子与 schematic 粘贴在变换方块时,需要知道每个方块的元数据旋转规则。1.7.10 的原版方块有内建规则,而模组方块没有。本映射表就是为模组方块补上这层信息:把一个旋转形态的方块 rotate 成另一个形态。

本特性是 GTNH 分支相对上游 WorldEdit 的自有增量,不属于 1.7.10 上游代码。

类型与文件

RotationType 是 5 值枚举(RotationType.java:6-12),loadAll() 为每个类型从 <mappings>/<类型名小写>.json 读取(RotationMappings.java:65-77):

枚举值 文件名 对应实现类(types/)
STAIRS stairs.json StairRotation
PILLAR pillar.json PillarRotation
TRAP_DOOR trap_door.json TrapdoorRotation
FENCE_GATE fence_gate.json FourRotation
OTHER other.json FourRotation / 由 JSON 的 type 字段再分派

OTHER 类型支持在每个 JSON 条目内用 "type" 字段再指定 STAIR / PILLAR 等细分(RotationMappings.java:96-98:fileType == RotationType.OTHER && obj.has("type") 时取 obj.get("type").getAsString().toUpperCase())。

自动生成默认映射

loadAll() 发现映射表为空时调用 generateDefaults() 再 saveAll()(RotationMappings.java:73-76)。generateDefaults()(RotationMappings.java:243)遍历 GameData.getBlockRegistry(),跳过所有 minecraft: 前缀的方块(RotationMappings.java:251:if (name == null || name.startsWith("minecraft:")) continue;),只对模组方块按 1.7.10 原版基类判定类型:

判定条件 生成的类型 默认规则来源
block instanceof BlockStairs STAIRS RotationUtils.defaultStairs()
block instanceof BlockRotatedPillar PILLAR RotationUtils.defaultPillar()
block instanceof BlockFenceGate FENCE_GATE RotationUtils.defaultFour(false)
block instanceof BlockButton OTHER RotationUtils.defaultFour(true)
block instanceof BlockTrapDoor TRAP_DOOR RotationUtils.defaultTrapdoor()

均不匹配的方块不生成条目。因此首启动只会为「继承自这 5 个原版基类的模组方块」写出映射,其余模组方块需玩家手写 JSON。

与方块变换钩子的关系

生成的映射由 ModRotationBlockTransformHook 消费。该钩子在 ForgeWorldEdit.preInit 中无条件注册(ForgeWorldEdit.java:126-128),与其它三个需要 Loader.isModLoaded 判断的钩子不同。

//we reloadmappings 在重读映射后调用 hook.clearCache()(ForgeRotationCommands.java:30-32)——因为映射变了,已缓存的方块 → 旋转规则对应关系必须失效。

静默失败点

loadFile 读取 JSON 时 catch (IOException ignore) {} —— 完全静默吞掉 I/O 异常(RotationMappings.java:92),文件损坏或无权限时玩家只会看到映射表为空而不报错。saveAll() 侧同类吞异常见 RotationMappings.java:239。

相关条目