PREREQUISITI
Assicurati di aver prima completato il processo di configurazione della datagen.
Ti serviranno fornitori (classi) diversi per blocchi, bauli, ed entità. Ricorda di aggiungerli tutto al tuo pack nella tua DataGeneratorEntrypoint nel metodo onInitializeDataGenerator.
java
pack.addProvider(FabricDocsReferenceBlockLootTableProvider::new);
pack.addProvider(FabricDocsReferenceChestLootTableProvider::new);1
2
2
Loot Table Spiegate
Le loot table definiscono cosa si ottiene dalla rottura di un blocco (esclusi i contenuti, per esempio per i bauli), uccisione di un'entità, o apertura di un contenitore appena generato. Ogni loot table ha dei pool fra cui gli oggetti sono selezionati. Le loot table hanno anche funzioni, che modificano il loot risultante in qualche modo.
Le loot pool hanno voci, condizioni, funzioni, roll e roll bonus. Le voci sono gruppi, sequenze, o possibilità di oggetti, o solo oggetti. Le condizioni sono cose per cui si testa nel mondo, come incantesimi su un'utensile o una probabilità casuale. Il numero minimo di voci scelte da una pool è detto roll, e qualsiasi cosa sopra a ciò è detta una roll bonus.
Blocchi
Perché i blocchi droppino oggetti - inclusi se stessi - dobbiamo creare una loot table. Crea una classe che extends FabricBlockLootTableProvider:
java
public class FabricDocsReferenceBlockLootTableProvider extends FabricBlockLootTableProvider {
protected FabricDocsReferenceBlockLootTableProvider(FabricDataOutput dataOutput, CompletableFuture<RegistryWrapper.WrapperLookup> 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
Assicurati di aggiungere questo fornitore al tuo pack!
Ci sono parecchi metodi ausiliari per aiutarti a costruire le tue loot table. Non li analizzeremo, per cui assicurati di controllarli nel tuo IDE.
Aggiungiamo alcuni drop nel metodo generate:
java
// Make condensed dirt drop its block item.
// Also adds the condition that it survives the explosion that broke it, if applicable,
addDrop(ModBlocks.CONDENSED_DIRT);
// Make prismarine lamps drop themselves with silk touch only
addDropWithSilkTouch(ModBlocks.PRISMARINE_LAMP);
// Make condensed oak logs drop between 7 and 9 oak logs
addDrop(ModBlocks.CONDENSED_OAK_LOG, LootTable.builder().pool(addSurvivesExplosionCondition(Items.OAK_LOG, LootPool.builder()
.rolls(new UniformLootNumberProvider(new ConstantLootNumberProvider(7), new ConstantLootNumberProvider(9)))
.with(ItemEntry.builder(Items.OAK_LOG))))
);1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
Bauli
Il loot dei bauli è un po' più complesso del loot dei blocchi. Crea una classe che extends SimpleFabricLootTableProvider come nell'esempio sotto e aggiungila al tuo pack.
java
public class FabricDocsReferenceChestLootTableProvider extends SimpleFabricLootTableProvider {
public FabricDocsReferenceChestLootTableProvider(FabricDataOutput output, CompletableFuture<RegistryWrapper.WrapperLookup> registryLookup) {
super(output, registryLookup, LootContextTypes.CHEST);
}
@Override
public void accept(BiConsumer<RegistryKey<LootTable>, LootTable.Builder> lootTableBiConsumer) {
}
}1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
Ci servirà una RegistryKey<LootTable> per la nostra loot table. Mettiamola in una nuova classe chiamata ModLootTables. Assicurati che sia nel tuo insieme di sorgenti main se usi fonti suddivise.
java
public class ModLootTables {
public static RegistryKey<LootTable> TEST_CHEST_LOOT = RegistryKey.of(RegistryKeys.LOOT_TABLE, Identifier.of(FabricDocsReference.MOD_ID, "chests/test_loot"));
}1
2
3
2
3
Poi possiamo generare una loot table nel metodo generate del tuo fornitore.
java
lootTableBiConsumer.accept(ModLootTables.TEST_CHEST_LOOT, LootTable.builder()
.pool(LootPool.builder() // One pool
.rolls(ConstantLootNumberProvider.create(2.0f)) // That has two rolls
.with(ItemEntry.builder(Items.DIAMOND) // With an entry that has diamond(s)
.apply(SetCountLootFunction.builder(ConstantLootNumberProvider.create(1.0f)))) // One diamond
.with(ItemEntry.builder(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






