ItemGuideBook

基本信息

属性 值
类名 amerifrance.guideapi.items.ItemGuideBook
类型 class extends Item
注册名 ItemGuideBook
本地化名 GuideBook(setUnlocalizedName)
堆叠上限 1
启用版本 Minecraft 1.7.10

功能

指南书的物品形态。用 metadata(伤害值)编码书的序号, 右键打开 GUI,潜行右键「被链接」的方块直接跳条目。

核心机制:metadata = 书序号

  • onItemRightClick:player.openGui(GuideAPI.instance, stack.getItemDamage(), ...), 即把 metadata 当作 GUI id 传给 GuideAPI 的实例。
  • getUnlocalizedName(stack):返回 getUnlocalizedName() + "." + metadata, 每本书对应一个本地化条目。
  • getItemStackDisplayName(stack):有效时取 GuideRegistry.getBook(metadata).getLocalizedDisplayName()。
  • 打开前有双重守卫:!GuideRegistry.isEmpty() && getSize() > metadata。

onItemUse:潜行右键方块跳转

  • 先判 player.isSneaking(),不潜行则 return false。
  • 再判目标方块 instanceof IGuideLinked。
  • 调 getLinkedEntryUnlocName(...) 得到条目名, 遍历 book.categoryList × entryList 做 entry.unlocEntryName.equals(entryName) 线性匹配, 命中后 GuideAPI.proxy.openEntry(...) 并 return true。

图标与着色

  • registerIcons 注册 2 个内置图标: guideapi:book_cover(itemIcon)与 guideapi:book_pages(pagesIcon); 再对每本书,若 book.itemTexture != null 则注册进 customIcons(TIntObjectHashMap<IIcon>,trove)。
  • requiresMultipleRenderPasses() 恒为 true, getRenderPasses 因此恒返回 2:第 0 pass 画封面,第 1 pass 画书页。
  • getIcon(stack, pass):有 customIcons 用之; 否则 pass == 0 ? itemIcon : pagesIcon。
  • getColorFromItemStack(stack, pass):当书没有 itemTexture 时, 第 0 pass 返回 book.bookColor.getRGB() 着色封面; 有 itemTexture 则不染色。

创造标签与提示

  • getSubItems:为每本已注册书生成一个子物品, 并写入 NBT CreativeBook = book.isLostBook。
  • addInformation 三条提示:
    1. 书无效 → 红色 text.book.warning;
    2. author 非空 → 显示 translateToLocal(author)(作者字段本身是本地化键);
    3. NBT CreativeBook 为真 → 金色 text.book.creative。

实现要点

  • getUnlocalizedName 用裸 StackTrace-free 的 GuideRegistry.getSize() 与 metadata 比较,不判 metadata < 0。
  • onItemRightClick 里 stack.setTagCompound(new NBTTagCompound()) 在无 NBT 时先建空 NBT再开界面——但空 NBT 里不写任何东西, 该分支实际只保证后续 hasTagCompound() 返回 true。
  • 使用 gnu.trove.map.hash.TIntObjectHashMap(trove)而非 HashMap, 因为键是 int(书序号)。

相关条目