Генерация таблиц добычи 26.1.2
Руководство по настройке генерации таблицы добычи с помощью datagen.
ТРЕБОВАНИЯ
Сначала убедитесь, что вы установили datagen.
Вам понадобятся разные провайдеры (классы) для блоков, сундуков и сущностей. Не забудьте добавить их все в свой пакет в DataGeneratorEntrypoint в методе onInitializeDataGenerator.
java
pack.addProvider(ExampleModBlockLootTableProvider::new);
pack.addProvider(ExampleModChestLootTableProvider::new);1
2
2
Как работают таблицы добычи
Таблицы добычи определяют, что вы получите при разрушении блока (за исключением содержимого, например в сундуках), убийстве сущности или открытии вновь сгенерированного контейнера. Каждая таблица лута (loot table) состоит из пулов (pools), из которых выбираются предметы. Таблицы лута также содержат функции (functions), которые определенным образом изменяют финальный лут.
Пулы лута содержат записи (entries), условия (conditions), функции (functions), броски (rolls) и бонусные броски (bonus rolls). Записи представляют собой группы, последовательности или варианты предметов, либо просто одиночные предметы. Условия — это проверяемые в мире параметры, такие как зачарования на инструменте или случайный шанс выпадения. Минимальное количество записей, выбираемых пулом, называется бросками, а всё, что свыше этого — бонусными бросками.
Блоки
Чтобы из блоков выпадали предметы — включая сам блок — необходимо создать таблицу лута. Создайте класс, который расширяет (extends) FabricBlockLootTableProvider:
java
public class ExampleModBlockLootTableProvider extends FabricBlockLootSubProvider {
protected ExampleModBlockLootTableProvider(FabricPackOutput dataOutput, CompletableFuture<HolderLookup.Provider> registryLookup) {
super(dataOutput, registryLookup);
}
@Override
public void generate() {
}
}1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
Не забудьте добавить этот провайдер в свой пакет!
Существует множество вспомогательных методов, которые помогут вам в создании таблиц лута. Мы не будем рассматривать их все, поэтому обязательно изучите их в своей IDE.
Давайте добавим несколько результатов бросков в метод generate:
java
// Make condensed dirt drop its block item.
// Also adds the condition that it survives the explosion that broke it, if applicable,
dropSelf(ModBlocks.CONDENSED_DIRT);
// Make prismarine lamps drop themselves with silk touch only
dropWhenSilkTouch(ModBlocks.PRISMARINE_LAMP);
// Make condensed oak logs drop between 7 and 9 oak logs
add(ModBlocks.CONDENSED_OAK_LOG, LootTable.lootTable().withPool(applyExplosionCondition(Items.OAK_LOG, LootPool.lootPool()
.setRolls(new UniformGenerator(new ConstantValue(7), new ConstantValue(9)))
.add(LootItem.lootTableItem(Items.OAK_LOG))))
);1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
Сундуки
Лут для сундуков устроен немного сложнее, чем лут для блоков. Создайте класс, который расширяет SimpleFabricLootTableProvider, аналогично примеру ниже, и добавьте его в свой пакет.
java
public class ExampleModChestLootTableProvider extends SimpleFabricLootTableSubProvider {
public ExampleModChestLootTableProvider(FabricPackOutput output, CompletableFuture<HolderLookup.Provider> registryLookup) {
super(output, registryLookup, LootContextParamSets.CHEST);
}
@Override
public void generate(BiConsumer<ResourceKey<LootTable>, LootTable.Builder> lootTableBiConsumer) {
}
}1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
Для нашей таблицы лута понадобится ResourceKey<LootTable>. Давайте поместим его в новый класс под названием ModLootTables. Убедитесь, что он находится в наборе исходных текстов main, если вы используете раздельные источники.
java
public class ModLootTables {
public static ResourceKey<LootTable> TEST_CHEST_LOOT = ResourceKey.create(Registries.LOOT_TABLE, Identifier.fromNamespaceAndPath(ExampleMod.MOD_ID, "chests/test_loot"));
}1
2
3
2
3
Затем мы можем сгенерировать таблицу лута внутри метода generate вашего провайдера.
java
lootTableBiConsumer.accept(ModLootTables.TEST_CHEST_LOOT, LootTable.lootTable()
.withPool(LootPool.lootPool() // One pool
.setRolls(ConstantValue.exactly(2.0f)) // That has two rolls
.add(LootItem.lootTableItem(Items.DIAMOND) // With an entry that has diamond(s)
.apply(SetItemCountFunction.setCount(ConstantValue.exactly(1.0f)))) // One diamond
.add(LootItem.lootTableItem(Items.DIAMOND_SWORD) // With an entry that has a plain diamond sword
)
));1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
Условная загрузка ресурсов
Чтобы применить условную загрузку ресурсов к динамически генерируемой таблице добычи, вызовите метод withConditions и укажите любые условия ресурсов, которые вы хотите применить, а затем вызовите метод из провайдера таблиц добычи, например dropSelf. В результате будет создана таблица добычи с примененными условиями ресурсов:
java
// Make the duplicator never drop via resource conditions
withConditions(ResourceConditions.not(ResourceConditions.alwaysTrue()))
.dropSelf(ModBlocks.DUPLICATOR_BLOCK);1
2
3
2
3







