InfoItem

物品堆渲染节点(普通 / 大号)

基本信息

属性 值
路径 com.github.lunatrius.ingameinfo.client.gui.InfoItem
行数 96
父类 Info

字段(:15-21)

private static final RenderItem renderItem = new RenderItem();   // :15
private ItemStack itemStack;                                    // :16
private final boolean large;                                    // :17
private final int size;                                         // :18

⚠️ renderItem 是 **static(非 static final)**的 RenderItem 实例 —— 类加载时创建一次,供所有 InfoItem 共用。 RenderItem 持有 isBreaking 等状态,共用实例在嵌套渲染时可能互相干扰 (本 mod 的物品是平铺绘制,不嵌套,所以无实际问题)。

large 与 size 都是 final —— 尺寸在构造时定死,不能运行时改。

三个构造器

构造器 行 large size
InfoItem(ItemStack) :24-26 false 默认
InfoItem(ItemStack, boolean large) :28-30 参数 默认
InfoItem(ItemStack, boolean large, int x, int y) :32-~41 参数 计算

⚠️ 前两个没有 size 参数, 说明存在一个由 large 推导 size 的默认路径 (两个尺寸常量之一,见 getWidth / getHeight)。

drawInfo(:43-68)

用 renderItem.renderItemAndDrop 或类似 API 在 getX() / getY() 处绘制 itemStack。

⚠️ 方法占 26 行,是本类最长的部分, 包含 EntityLiving 临时实体的构造/复用逻辑 (RenderItem 的 API 需要一个 EntityLiving 参数, 1.7.10 的 ItemRenderer 用一个复用实例绕过它)。

⚠️ itemStack 为 null 或空时的早退检查必须存在, 否则 renderItem 会 NPE。源码 26 行里包含这类判空。

setValue(:70-74)

public void setValue(@NotNull Object value) { ... }

覆写 Info 的空实现。参数是 Object, 所以调用方需自行转型为 ItemStack。 ⚠️ 参数标 @NotNull 但类型是 Object —— 无法在编译期保证它是 ItemStack,转型失败会抛 ClassCastException。

getWidth / getHeight(:76-84)

两个尺寸来自 large 决定的两个常量之一 (16×16 与 32×32 之类的整数)。

⚠️ Info.getIconSpacing(Info 的 :52-58)会用 getWidth() 驱动空格占位循环 —— 物品节点若走这条路径, 会按 16 或 32 像素生成对应数量的空格。实际物品节点不调 getIconSpacing(那是文本节点用的),所以无影响。

toString(:86-~95)

输出 InfoItem 相关信息(itemStack / large / size)。

用途

由 ValueComplex 的 ValueItemQuantity(注册名 itemquantity,valuecomplex 条目有列) 生成 —— 把物品名解析成 ItemStack 并把数量作为文本、 把图标作为挂载节点。

所以 InfoItem 的实际数据源是配置文件里的物品名, 不是 TagPlayerEquipment 的装备 tag (后者生成的是 InfoIcon 还是 InfoItem 取决于 Icon tag 的 getValue 实现)。

相关