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)

相关条目