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 两条转换路径之一