AchievementRegistry
基本信息
| 属性 |
值 |
| 类名 |
betterachievements.registry.AchievementRegistry |
| 类型 |
单例(final) |
| 源文件 |
src/main/java/betterachievements/registry/AchievementRegistry.java |
功能
管理 AchievementPage / Achievement / 图标的运行时集合:
- 内部维护一个 “Minecraft” 虚拟 AchievementPage
mcPage,把不属于任何 AchievementPage 的原版成就归到这一页(用于显示在 GUI 中)。
- 缓存 AchievementPage 的页签图标(
iconMap)。
- 按
statId 索引所有原版 Achievement(statIdMap),供网络包解锁查询。
- 管理用户用
listTabIcons 配置或中键改图标得到的 userSetIcons,进入世界时由 SaveHandler 注入。
公开 API
| 方法 |
返回 |
说明 |
instance() |
AchievementRegistry |
单例(懒加载) |
getAchievements(AchievementPage page) |
List<Achievement> |
返回该页的所有成就;mcPage 返回未归入任何页的原版成就列表 |
getAllPages() |
List<AchievementPage> |
第一项固定为 mcPage,其后按注册顺序追加所有 AchievementPage.getAchievementPage(i) |
getItemStack(AchievementPage page) |
ItemStack |
页签图标解析:先 iconMap,再 ICustomIcon.getPageIcon(),最后回退到该页第一个无父成就的 theItemStack |
registerIcon(String pageName, ItemStack itemStack, boolean userSet) |
void |
把 pageName → itemStack 写入 iconMap;userSet=true 时同时写入 userSetIcons |
getAchievement(String statId) |
Achievement |
statIdMap.get(statId) |
dumpUserSetIcons() |
String[] |
导出 userSetIcons 为 pageName->modid:item:meta:nbtJson 字符串数组 |
setUserSetIcons(String[] array) |
void |
反向解析(GameRegistry.findItem + JsonToNBT.func_150315_a)并写入 userSetIcons |
静态字段
| 字段 |
说明 |
AchievementPage mcPage |
"Minecraft" 虚拟页,承载未归入任何 AchievementPage 的原版成就 |
实例字段
| 字段 |
说明 |
List<Achievement> mcAchievements |
未归入任何页的原版成就 |
Map<String, Achievement> statIdMap |
statId → Achievement |
Map<String, ItemStack> iconMap |
pageName → 页签图标 |
Map<String, ItemStack> userSetIcons |
用户自选图标(持久化) |
boolean firstLoad |
init() 是否已执行(懒加载) |
初始化流程(init,首次调用 getAchievements/getAllPages 时)
private void init() {
for (Object oa : AchievementList.achievementList) {
Achievement achievement = (Achievement) oa;
this.statIdMap.put(achievement.statId, achievement);
if (!AchievementPage.isAchievementInPages(achievement)) this.mcAchievements.add(achievement);
}
this.iconMap.put(mcPage.getName(), new ItemStack(Blocks.grass)); // mcPage 默认图标为草方块
this.iconMap.putAll(this.userSetIcons);
this.firstLoad = false;
}
setUserSetIcons 解析细节
每行格式:pageName->modid:item:meta:nbtJson
| 段 |
解析 |
pageName |
split[0](按 ->) |
modid:item |
GameRegistry.findItem(modid, item) |
meta |
Integer.parseInt(itemSplit[2]),缺失为 0;解析失败记日志 |
nbtJson |
JsonToNBT.func_150315_a(...),缺失或空为 null |
| 失败 |
跳过该行,不抛异常 |
调用方
| 调用方 |
用途 |
GuiBetterAchievements.initGui |
getAllPages() |
GuiBetterAchievements.drawPageIcon |
getItemStack(page) |
GuiBetterAchievements.drawAchievements |
getAchievements(page) |
GuiBetterAchievements.drawMouseOverAchievement |
registerIcon(...)(中键 + iconReset) |
SaveHandler.onWorldLoad |
setUserSetIcons(userSetIcons) |
SaveHandler.onWorldUnload |
ConfigHandler.saveUserSetIcons() → dumpUserSetIcons() |
AchievementUnlockMessage.onMessage |
getAchievement(statId) |
BetterAchievements.imcCallback |
registerIcon(key, stack, false)(IMC) |
相关条目