OreDict greggedItem

基本信息

属性 值
类 gttweaker.mods.gregtech.expand.OreDictEntryExpansion
类型 唯一的 ZenExpansion(不是 ZenClass)
ZenExpansion minetweaker.oredict.IOreDictEntry
ZenGetter greggedItem(返回 IItemStack)
ModOnly @ModOnly("gregtech")
注册方式 MineTweakerAPI.registerClassRegistry(GTTweakerRegistry.class)(postInit)
判定依据 item.getDefinition().getId().startsWith("gregtech")

作用

为 CraftTweaker 的矿辞典条目对象补一个 getter,返回「这个矿辞典里属于 GregTech 的那个物品」。脚本写法:

<ore:ingotIron>.greggedItem    // 返回 GT 的铁锭 ItemStack

实现(OreDictEntryExpansion.java:17-40)

@ZenGetter("greggedItem")
public static IItemStack getGreggedItem(IOreDictEntry oreDictEntry) {
    List<IItemStack> matchedItems = new ArrayList<IItemStack>();
    for (IItemStack item : oreDictEntry.getItems()) {
        // TODO: how to determine GT's items better?
        if (item.getDefinition().getId().startsWith("gregtech")) matchedItems.add(item);
    }
    if (matchedItems.size() > 1) {
        logError("An ore dictionary <ore:" + name + "> has multiple items owned by GregTech");
    } else if (matchedItems.size() == 0) {
        logError("An ore dictionary <ore:" + name + "> has not items owned by GregTech");
        return null;
    }
    return matchedItems.get(0);   // there can be only one
}

两条错误路径的不对称

情况 行为 缺陷
匹配到 > 1 个 logError,仍继续 return matchedItems.get(0) 见下
匹配到 0 个 logError + return null 正确
匹配到 恰好 1 直接返回 正确

匹配到多个时不返回 null,而是在明确报错之后仍返回列表中的第 0 个 —— 错误信息说「有多个」,返回值却假装只有 1 个。脚本作者会拿到一个未被确认的物品。

数值

数值 值
ZenExpansion 数 1
ZenGetter 数 1(greggedItem)
匹配前缀 "gregtech"
匹配方式 String.startsWith
注册方式 registerClassRegistry(postInit,与 56 个 ZenClass 的 init 不同)
匹配 > 1 时 报错但仍返回第 0 个
匹配 == 0 时 报错 + 返回 null
判定 GT++ 物品 不能(前缀 "gregtech" 不匹配 "miscutils")

源码缺陷

  • 匹配到多个时仍返回第 0 个(:30-39):唯一的 logError 后没有 return null,与紧邻的 0 个分支处理方式相反。注释 // there can be only one 表达的是期望而非保证。实际影响:像 <ore:ingotIron> 这种既被 GT 5 又被 GT++ 注册的矿辞典会返回不确定的物品。
  • 匹配逻辑是字符串前缀(:23-25):源码自带 // TODO: how to determine GT's items better?。任何 modid 以 "gregtech" 开头(gregtech_xxx)或物品定义恰好如此都会被误判;反之 GT++ 物品(miscutils:*)永远不被识别。
  • 无 gregtech_pp / miscutils 分支:GT++ 的物品在 greggedItem 中不可见,与 GT++ 机器 支持形成能力落差。
  • @ZenGetter 只对 IOreDictEntry 生效,但 @ModOnly("gregtech") 挂在 expansion 类上:MineTweaker 的 registerClassRegistry 机制与 registerClass 不同,源码无注释说明两者的门控时机差异。
  • matchedItems 用 new ArrayList<>() 无参构造:可无妨,但与本仓其他 ArrayList<>(n) 风格不一致。
  • 错误信息有语法错误(:35):"has not items owned by GregTech" 应为 has no items。属沿袭自上游 CraftTweaker 的原文(上游同样是 has not items),非本 mod 引入。
  • getGreggedItem 遍历全量 getItems():对含上百变体的大型矿辞典每次调用都是 O(n) 字符串比较,且无缓存。

相关条目

  • 注册时序 - 本条目走 registerClassRegistry 而非 registerClass
  • GT++ 机器 - 门控 modid 为 miscutils,本条目识别不了
  • 原料转换 - IIngredient 两条转换路径之一