ПЕРЕДУМОВИ
Спершу переконайтеся, що ви виконали процес налаштування datagen.
Вам знадобляться різні постачальники (класи) для блоків, скринь і сутностей. Не забувайте додати їх усі до свого пакета у вашій DataGeneratorEntrypoint у методі onInitializeDataGenerator.
java
pack.addProvider(ExampleModBlockLootTableProvider::new);
pack.addProvider(ExampleModChestLootTableProvider::new);1
2
2
Пояснення таблиць здобичі
Таблиці здобичі визначають, що ви отримуєте від добування блоку (не включаючи вміст, як у скринях), вбивства сутності або відкриття щойно згенерованого контейнера. Кожна таблиця здобичі має пули, з яких вибираються предмети. Таблиці здобичі також мають функції, які певним чином змінюють отриману здобич.
Пули здобичі мають записи, умови, функції, кидки та бонусні кидки. Записи — це групи, послідовності або можливості предметів, або просто предмети. Умови — це речі, які перевіряються у світі, як-от чари на знаряддях або випадковий шанс. Мінімальна кількість записів, вибраних пулом, називається кидками, а все, що перевищує цю кількість, називається бонусним кидком.
Блоки
Щоб з блоків випадали предмети, включаючи себе, нам потрібно створити таблицю здобичі. Створіть клас, який extends FabricBlockLootTableProvider:
java
public class ExampleModBlockLootTableProvider extends FabricBlockLootTableProvider {
protected ExampleModBlockLootTableProvider(FabricDataOutput 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 SimpleFabricLootTableProvider {
public ExampleModChestLootTableProvider(FabricDataOutput 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
We'll need a RegistryKey<LootTable> for our loot table. Помістімо це в новий клас під назвою ModLootTables. Якщо ви використовуєте розділені джерела, переконайтеся, що це джерело є у вашому main наборі джерел.
java
public class ModLootTables {
public static ResourceKey<LootTable> TEST_CHEST_LOOT = ResourceKey.create(Registries.LOOT_TABLE, ResourceLocation.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






