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 优雅地处理这些缺失:
- 直接重映射(Block / Item):缺失 ID 直接替换为目标方块/物品。
- 抑制警告:静默忽略缺失,避免世界加载时刷屏。
- 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直接对接。