ObjectTags 模块
基本信息
net.glease.tc4tweak.modules.objectTag —— 维护「物品 → 要素(Aspect)列表」映射,
是本 mod 最核心的数据结构,被 NEI 集成与多个模块依赖。
3 个类
| 类 | 可见性 | 泛型 / 职责 |
|---|---|---|
GetObjectTags |
public class |
对外查询 API |
ObjectTagsCache |
包私有 class |
FlushableCache<ConcurrentMap<Item, TIntObjectMap<AspectList>>> |
ObjectTagsMutation |
包私有 | 变更记录(供 undo / 重载) |
ObjectTagsCache 的三层键
ConcurrentMap<Item, TIntObjectMap<AspectList>>
↑物品 ↑meta(整数) ↑该物品该 meta 的要素集合
两层嵌套:先按
Item,再按 meta(int), 再得AspectList。只按Item缓存会丢失 meta 区分, 这是本 mod 哈希逻辑(见 GenerateItemHash 模块)的前提。
GetObjectTags 的 API
| 方法 | 行 | 返回 |
|---|---|---|
newReplacementObjectTagsMap() |
37 | ConcurrentHashMap<List, AspectList> |
stream() |
41 | Stream<Map.Entry<ItemStack, AspectList>> |
getObjectTags(ItemStack) |
65 | AspectList |
静态内部类 InterceptingConcurrentHashMap |
250 | 覆写 put 做写入拦截(即变更追踪) |
InterceptingConcurrentHashMap.put 是变更拦截点 ——
每次写都记录到 ObjectTagsMutation。
⚠️ stream() 返回的是自定义迭代器
第 52-63 行手写 hasNext() / next(),因为映射是三层嵌套
(Item → meta → AspectList),需要扁平化成 ItemStack → AspectList 流。
不能直接对 ConcurrentHashMap 取 entrySet().stream()。
相关条目
源码
src/main/java/net/glease/tc4tweak/modules/objectTag/GetObjectTags.javasrc/main/java/net/glease/tc4tweak/modules/objectTag/ObjectTagsCache.javasrc/main/java/net/glease/tc4tweak/modules/objectTag/ObjectTagsMutation.java