ItemKey / ItemKeyStack / ItemQueue
基本信息
| 属性 | 值 |
|---|---|
| 路径 | mrtjp.core.item.itemident |
| 源码 | src/main/java/../scala/mrtjp/core/item/itemident.scala(实际路径 src/main/scala/mrtjp/core/item/itemident.scala) |
用「物品 + damage + NBT」三元组作为可哈希的身份键,解决 ItemStack.equals 的比较问题。
ItemKey
| 成员 | 说明 |
|---|---|
ItemKey.get(...) / getOrNull(stack) |
从 ItemStack 构造 |
compare(that) |
比较 |
makeStack(size) |
还原为 ItemStack |
copy |
浅拷贝(new ItemKey(item, itemDamage, tag),NBT 引用共享) |
getMaxStackSize / getName |
代理到 testStack |
ItemKeyStack
在 ItemKey 之上加一个 var stackSize,实现 setSlotFromStack 风格的整槽赋值。
ItemQueue
批量增删的物品队列:add(ItemKey, amount) / remove(ItemKey, amount) / apply(ItemKey): Int。
缺陷
ItemKey的equals/hashCode未在类中定义(继承AnyRef的引用相等), 作为 map key 时只有同一实例才相等;源码中ItemEquality另有一套比较逻辑, 两者并存易混。copy共享同一NBTTagCompound引用,修改副本的 tag 会影响原件。
相关条目
- ItemEquality — 更完整的比较实现
- InvWrapper — 消费方