🇮🇹 Italiano (Italian)
🇮🇹 Italiano (Italian)
Aspetto
🇮🇹 Italiano (Italian)
🇮🇹 Italiano (Italian)
Aspetto
Questa pagina si applica alla versione:
1.21.4
Questa pagina si applica alla versione:
1.21.4
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
.
pack.addProvider(FabricDocsReferenceBlockLootTableProvider::new);
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.
Perché i blocchi droppino oggetti - inclusi se stessi - dobbiamo creare una loot table. Crea una classe che extends FabricBlockLootTableProvider
:
public class FabricDocsReferenceBlockLootTableProvider extends FabricBlockLootTableProvider {
protected FabricDocsReferenceBlockLootTableProvider(FabricDataOutput dataOutput, CompletableFuture<RegistryWrapper.WrapperLookup> registryLookup) {
super(dataOutput, registryLookup);
}
@Override
public void generate() {
}
}
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
:
// 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))))
);
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.
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) {
}
}
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.
public class ModLootTables {
public static RegistryKey<LootTable> TEST_CHEST_LOOT = RegistryKey.of(RegistryKeys.LOOT_TABLE, Identifier.of(FabricDocsReference.MOD_ID, "chests/test_loot"));
}
Poi possiamo generare una loot table nel metodo generate
del tuo fornitore.
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
)
));