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) 字符串比较,且无缓存。