ItemStackReplacementManager

基本信息

属性 值
完整类名 com.gtnewhorizons.postea.api.ItemStackReplacementManager
包路径 api
类型 公共 API 注册表(abstract class, 不允许实例化)
调用时机 FMLPostInitializationEvent 或 FMLLoadCompleteEvent 之后
触发条件 任何 NBT 被反序列化为 ItemStack 时(带 "id" 字段)

功能

Postea 的核心 API 之一。在 ItemStack NBT 反序列化的瞬间拦截它,对其执行复杂转换或简单替换。与 BlockReplacementManager 对称,但作用于物品/物品堆叠而非方块。

与 BlockReplacementManager 不同:本 API 不依赖世界加载,在 NBT 解析的任何位置(包括 TileEntity 内、玩家物品栏、容器 NBT 等)都会触发。

方法

自定义转换注册

方法 说明
addTransformationHandler(String originalId, IItemStackTransformationHandler transformer) 注册复杂 ItemStack 转换器,返回 false 表示不识别

回调签名:boolean apply(String originalId, NBTTagCompound stack)。返回 true 阻止后续 handler 执行。

ID 解析注册

方法 说明
registerIDResolver(String originalId, Consumer<Integer> resolver) 注册回调,缓存 namespaced ID → 数值 ID 的映射

Missing Mapping 替换

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

Simple Replacement(O(1) 执行)

方法签名 源 → 目标 行为
addSimpleReplacement(String, Item) item → item 保留 damage
addSimpleReplacement(String, Item, boolean skipBlockRemap) 同上 可选跳过 Block 镜像
addSimpleReplacement(String, Item, int newMeta) item → item+meta newMeta 可用 WILDCARD_VALUE 保留
addSimpleReplacement(String, Item, int newMeta, boolean) 同上 可选跳过 Block 镜像
addSimpleReplacement(String, ItemStack) item → stack 不复制 NBT,只换 ID + damage
addSimpleReplacement(String, ItemStack, boolean) 同上 可选跳过 Block 镜像
addSimpleReplacement(String, int origMeta, Item) item+meta → item origMeta 可用 WILDCARD_VALUE
addSimpleReplacement(String, int origMeta, Item, boolean) 同上 可选跳过 Block 镜像
addSimpleReplacement(String, int origMeta, ItemStack) item+meta → stack 不复制 NBT
addSimpleReplacement(String, int origMeta, ItemStack, boolean) 同上 可选跳过 Block 镜像
addSimpleReplacement(String, int origMeta, Item, int newMeta) item+meta → item+meta 两 meta 都可用 WILDCARD_VALUE
addSimpleReplacement(String, int origMeta, Item, int newMeta, boolean) 同上 完整控制

WILDCARD_VALUE 语义:源侧 32767 = meta-specific 回退;目标侧 32767 = 保留原值。

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

NBT 不复制:以 ItemStack 为目标的简单替换只替换 ID 与 damage,原 NBT 数据全部丢弃。

性能特征

  • Simple replacements 使用 SimpleTransformationMap,对同一 ID 注册 N 条规则时执行时间仍为 O(1)。
  • 不做 chunk 缓存:每次 NBT 反序列化都会调用(用于纯 NBT 转换的写回)。

使用示例

// 简单替换:把"oldmod:ruby"全部换成 minecraft:diamond
ItemStackReplacementManager.addSimpleReplacement("oldmod:ruby", Items.diamond);

// 仅替换特定 meta 的 item+meta → item+meta
ItemStackReplacementManager.addSimpleReplacement("oldmod:ruby", 1, Items.emerald, 0);

// 复杂转换:自定义 NBT 调整(如修改 tag)
ItemStackReplacementManager.addTransformationHandler("oldmod:specialTool", (origId, tag) -> {
    if (!tag.hasKey("CustomData")) return false;
    tag.setString("MigratedFrom", origId);
    return true;
});

// 缓存数值 ID 用于复杂转换的快速比对
ItemStackReplacementManager.registerIDResolver("minecraft:diamond", id -> MyMod.diamondId = id);

第三方 mod 集成

  • 依赖:required-after:gtnhlib@[0.6.21,)。
  • 复杂转换应优先用 IDRegistry.registerItemIDResolver 缓存数值 ID;string ID 在 handler 中可直接用,无需 resolve。

相关条目