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







