MissingMappingHandler

基本信息

属性 值
完整类名 com.gtnewhorizons.postea.utility.MissingMappingHandler
包路径 utility
类型 FML Missing Mapping 监听器(abstract class, 不允许实例化)
触发事件 FMLMissingMappingsEvent(Postea 主类注册)
数据结构 ObjectOpenHashSet<String> + Object2ObjectOpenHashMap<String, Block/Item>

功能

Postea 的 FML 缺失映射处理子系统。当世界加载时 FML 发现 ID 在当前 mod 列表中不存在,会触发 FMLMissingMappingsEvent;本类提供三种注册方式让其他 mod 优雅地处理这些缺失:

  1. 直接重映射(Block / Item):缺失 ID 直接替换为目标方块/物品。
  2. 抑制警告:静默忽略缺失,避免世界加载时刷屏。
  3. ItemBlock 自动识别:若缺失的是 Block,调用 addBlockMapping 时也会用 Item.getItemFromBlock 兜底对应的 Item。

底层 vs Simple Replacement:本类是 FML 层级的"缺失 ID 重映射",适用于"该 ID 完全从 mod 列表消失"的场景;BlockReplacementManager.addSimpleReplacement 适用于"该 ID 仍存在但你想换内容"的场景——后者性能更好。

公开方法

方法 说明
addBlockMapping(String originalId, Block block) 注册缺失 Block ID → Block 的直接映射
addItemMapping(String originalId, Item item) 注册缺失 Item ID → Item 的直接映射
addIgnore(String originalId) 注册要抑制警告的 ID

Postea 还提供公开 façade:BlockReplacementManager.replaceMissingMapping / ItemStackReplacementManager.replaceMissingMapping / BlockReplacementManager.ignoreMissingMapping / ItemStackReplacementManager.ignoreMissingMapping,底层都调用本类。

FML 回调逻辑

onMissingMapping(FMLMissingMappingsEvent event):
  for each MissingMapping in event.getAll():
    if originalId in MISSING_IDS_TO_IGNORE:
      mapping.ignore()
      continue

    if mapping.type == BLOCK:
      if block = MISSING_BLOCK_MAPPINGS.get(originalId):
        mapping.remap(block)
        continue
    elif mapping.type == ITEM:
      if block = MISSING_BLOCK_MAPPINGS.get(originalId):
        # Block 映射兜底对应的 Item
        mapping.remap(Item.getItemFromBlock(block))
        continue
      if item = MISSING_ITEM_MAPPINGS.get(originalId):
        mapping.remap(item)
        continue

使用示例

// 直接重映射:把"removedmod:oreCopper"统一替换为 vanilla dirt
BlockReplacementManager.replaceMissingMapping("removedmod:oreCopper", Blocks.dirt);
// 注意:只在目标 Block 在该世界 ID 表中"未被分配 ID"时生效;否则改用 addSimpleReplacement

// 抑制警告:完全静默某个 mod 的所有残留 ID
ItemStackReplacementManager.ignoreMissingMapping("abandonedmod:dustIron");
ItemStackReplacementManager.ignoreMissingMapping("abandonedmod:dustGold");

限制

限制 解决方式
目标 Block 在该世界已有 ID 时,replaceMissingMapping 不会重新指向它 改用 BlockReplacementManager.addSimpleReplacement(origId, targetBlock, WILDCARD_VALUE, WILDCARD_VALUE, true)
不能处理 meta-specific 缺失 改用 addSimpleReplacement(origId, meta, target)

第三方 mod 集成

  • 无直接依赖;本类纯 java + fastutil。
  • 与 FML 1.7.10 的 FMLMissingMappingsEvent 直接对接。

相关条目