旋转映射(分支新增)
基本信息
| 属性 | 值 |
|---|---|
| 来源包 | 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。
相关条目
- 方块变换钩子 - 4 个钩子的注册条件对比
- 世界编辑管理指令 -
//we reloadmappings - worldedit.properties 配置项 - 本映射不走 properties 体系