LootGenerator

基本信息

属性 值
类名 amerifrance.guideapi.util.LootGenerator
类型 class,1 个静态方法
启用版本 Minecraft 1.7.10

功能

为「残页书」(book.isLostBook == true)生成残页战利品表。

public static void registerLoot() {
    for (Book book : GuideRegistry.getBookList()) {
        if (book.isLostBook) {
            for (CategoryAbstract categoryAbstract : book.categoryList) {
                for (EntryAbstract entryAbstract : categoryAbstract.entryList) {
                    for (int i = 0; i < entryAbstract.pageList.size(); i++) {
                        ItemStack page = new ItemStack(GuideAPIItems.lostPage, 1, 0);
                        ItemLostPage.setPage(page, GuideRegistry.getIndexOf(book),
                                book.categoryList.indexOf(categoryAbstract),
                                categoryAbstract.entryList.indexOf(entryAbstract), i);
                        for (String hook : book.chestHooks)
                            ChestGenHooks.addItem(hook,
                                new WeightedRandomChestContent(page, 1, 1, book.lootChance));
                    }
                }
            }
        }
    }
}

实现要点

  • 四层全遍历:书 → 分类 → 条目 → 页面,为每一个页面生成一张残页。 因此残页种类数 = 残页书的页面总数。
  • 每张残页通过 ItemLostPage 的 setPage 写入坐标串(book:category:entry:page)。
  • 权重为 new WeightedRandomChestContent(page, 1, 1, book.lootChance)—— 最小数量 1、最大数量 1、权重 book.lootChance。
  • 战利品表由 book.chestHooks 数组逐个注册; 该字段在 Book 的主构造器中才存在, 走 @Deprecated 构造器创建的书该字段为 null, 会导致此处的 for (String hook : book.chestHooks) 抛 NullPointerException。故残页书必须用主构造器创建。
  • 由 GuideAPI 在 postInit 调用—— 必须等所有 mod 都 registerBook 完毕,才能遍历到完整列表。
  • 注册时机在 postInit 也意味着战利品表只能追加, 无法在其它 mod 已注册同名 hook 后再改。

相关条目