Генерація таблиць здобичі 1.21.4
Посібник із налаштування генерації таблиць здобичі.
WARNING
Ця сторінка написана для версії 1.21.4. Документація для старіших версій може бути неповною.
ПЕРЕДУМОВИ
Спершу переконайтеся, що ви виконали процес налаштування datagen.
Вам знадобляться різні постачальники (класи) для блоків, скринь і сутностей. Не забувайте додати їх усі до свого пакета у вашій DataGeneratorEntrypoint у методі onInitializeDataGenerator.
java
pack.addProvider(FabricDocsReferenceDamageTypesProvider.TaterDamageTypesGenerator::new);1
2
2
Пояснення таблиць здобичі
Таблиці здобичі визначають, що ви отримуєте від добування блоку (не включаючи вміст, як у скринях), вбивства сутності або відкриття щойно згенерованого контейнера. Кожна таблиця здобичі має пули, з яких вибираються предмети. Таблиці здобичі також мають функції, які певним чином змінюють отриману здобич.
Пули здобичі мають записи, умови, функції, кидки та бонусні кидки. Записи — це групи, послідовності або можливості предметів, або просто предмети. Умови — це речі, які перевіряються у світі, як-от чари на знаряддях або випадковий шанс. Мінімальна кількість записів, вибраних пулом, називається кидками, а все, що перевищує цю кількість, називається бонусним кидком.
Блоки
Щоб з блоків випадали предмети, включаючи себе, нам потрібно створити таблицю здобичі. Створіть клас, який extends FabricBlockLootTableProvider:
java
public class FabricDocsReferenceBlockLootTableProvider extends FabricBlockLootTableProvider {
protected FabricDocsReferenceBlockLootTableProvider(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 FabricDocsReferenceChestLootTableProvider extends SimpleFabricLootTableProvider {
public FabricDocsReferenceChestLootTableProvider(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 ResourceKey<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(FabricDocsReference.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






