BlockReplacementManager

基本信息

属性 值
完整类名 com.gtnewhorizons.postea.api.BlockReplacementManager
包路径 api
类型 公共 API 注册表(abstract class, 不允许实例化)
调用时机 FMLPostInitializationEvent 或 FMLLoadCompleteEvent 之后
关联事件 ChunkEvent.Load

功能

Postea 的核心 API 之一。在世界区块加载阶段拦截普通 Block(非 TileEntity),对其执行复杂转换或简单替换。注册到同一 ID 的多个 handler 按顺序执行,任一返回 true 即终止。

Block transformers 在 TileEntity transformers 之后执行;当 TileEntity 已将位置替换为 Block 时,Block transformers 仍会作用于该 Block(见 BlockAccessCompat 章节)。

方法

自定义转换注册

方法 说明
addTransformationHandler(String originalId, IBlockTransformationHandler transformer) 注册复杂 Block 转换器,返回 false 表示不识别,继续执行后续 handler

ID 解析注册

方法 说明
registerIDResolver(String originalId, Consumer<Integer> resolver) 注册回调,在世界首次加载时获得给定 namespaced ID 对应的数值 ID;若该 ID 从未存在则返回 -1

Missing Mapping 替换(FML 缺失 ID 重映射)

方法 说明
replaceMissingMapping(String originalId, Block block) 旧 ID 在 FML 检测缺失时直接重映射为目标 Block
ignoreMissingMapping(String originalId) 抑制 FML 对该 ID 的缺失警告

Simple Replacement(简单重映射,常数时间)

方法签名 源 → 目标 行为
addSimpleReplacement(String, Block) block → block 保留 meta
addSimpleReplacement(String, Block, boolean skipStackRemap) 同上 可选跳过 ItemStack 镜像
addSimpleReplacement(String, int meta, Block) block+meta → block 源 meta 可用 WILDCARD_VALUE
addSimpleReplacement(String, int meta, Block, boolean) 同上 可选跳过 ItemStack 镜像
addSimpleReplacement(String, Block, int newMeta) block → block+meta 目标 meta 可用 WILDCARD_VALUE 保留原值
addSimpleReplacement(String, Block, int newMeta, boolean) 同上 可选跳过 ItemStack 镜像
addSimpleReplacement(String, int origMeta, Block, int newMeta) block+meta → block+meta 两个 meta 都可用 WILDCARD_VALUE
addSimpleReplacement(String, int origMeta, Block, int newMeta, boolean) 同上 完整控制

WILDCARD_VALUE 语义:

  • 源侧(originalMeta = 32767):作为 meta-specific handler 的回退,在没有更精确匹配时使用。
  • 目标侧(newMeta = 32767):保留原 meta 值,不覆盖。

自动镜像:当 Block 是 ItemBlock 时,Postea 会自动注册对应的 ItemStack 转换器;传 skipStackRemap = true 禁用。

性能特征

  • Simple replacements 使用 SimpleTransformationMap 实现,对同一 ID 注册 N 条规则时执行时间仍为 O(1)。
  • TileEntity / Block transformers 只在每个区块加载时执行一次,结果会被 chunk NBT 的 POSTEA_UPDATE_CODE 哈希缓存;dev 环境下缓存禁用以便调试。

使用示例

// 简单替换:把"othermod:oreCopper"的所有 meta 替换为 vanilla dirt
BlockReplacementManager.addSimpleReplacement("othermod:oreCopper", Blocks.dirt);

// 带 meta 的精确替换:meta=0 替换为 stone,meta=1 替换为 iron_block
BlockReplacementManager.addSimpleReplacement("othermod:ore", 0, Blocks.stone);
BlockReplacementManager.addSimpleReplacement("othermod:ore", 1, Blocks.iron_block);

// 复杂转换:根据 meta 与上下文自定义输出
BlockReplacementManager.addTransformationHandler("othermod:ore", info -> {
    if (info.metadata == 0 && info.chunk.getBlockMetadata(info.x & 15, info.y, info.z & 15) == 5) {
        info.replacement = new BlockInfo(Blocks.diamond_ore, 0, null);
        return true;
    }
    return false;
});

// 注册 ID 解析器以备复杂转换时使用
BlockReplacementManager.registerIDResolver("othermod:ore", id -> MyMod.targetOreId = id);

第三方 mod 集成

  • 依赖:required-after:gtnhlib@[0.6.21,)。
  • 复杂转换应优先调用 IDRegistry.registerBlockIDResolver 缓存数值 ID,避免在每区块回调中做字符串匹配。

相关条目