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 后再改。
相关条目
- GuideAPI -
postInit调用方 - Book -
isLostBook/chestHooks/lootChance的定义处 - ItemLostPage - 残页物品与
setPage - GuideAPIItems -
lostPage引用 - GuideRegistry - 书列表与
getIndexOf - PageBase - 用
bookHasPage判定解锁