🇩🇪 Deutsch (German)
🇩🇪 Deutsch (German)
Erscheinungsbild
🇩🇪 Deutsch (German)
🇩🇪 Deutsch (German)
Erscheinungsbild
Diese Seite ist für folgende Version geschrieben:
1.21.4
Diese Seite ist für folgende Version geschrieben:
1.21.4
VORAUSSETZUNGEN
Stelle sicher, dass du den Prozess der Einrichtung der Datengenerierung zuerst abgeschlossen hast.
Du wirst unterschiedliche Provider (Klassen) für Blöcke, Truhen und Entitäten benötigen. Vergesse nicht, alle diese zu deinem Pack in deinem DataGeneratorEntrypoint
innerhalb der onInitializeDataGenerator
Methode hinzuzufügen.
pack.addProvider(FabricDocsReferenceBlockLootTableProvider::new);
Beutetabellen definieren, was du erhältst, wenn du einen Block abbaust (ohne den Inhalt, wie bei Truhen), eine Entität tötest oder einen neu erzeugten Container öffnest. Jede Beutetabelle hat einen Pool aus welchem Items ausgewählt werden. Beutetabellen haben außerdem Funktionen, welche die resultierenden Beute auf irgendeine Art verändern.
Beutepools haben Einträge, Bedingungen, Funktionen, Rollen und Bonusrollen. Einträge sind Gruppen, Sequenzen, Möglichkeiten an Items oder einfach Items. Bedingungen sind Dinge, die in der Welt getestet werden, wie z. B. Verzauberungen auf einem Werkzeug oder eine zufällige Chance. Die minimale Anzahl an Einträgen, welche von einem Pool gewählt werden, nennen sich Rollen und alles darüber nennt sich eine Bonusrolle.
Damit Blöcke Items - auch sich selbst - fallen lassen können, müssen wir eine Beutetabelle erstellen. Erstelle eine Klasse, die extends FabricBlockLootTableProvider
:
public class FabricDocsReferenceBlockLootTableProvider extends FabricBlockLootTableProvider {
protected FabricDocsReferenceBlockLootTableProvider(FabricDataOutput dataOutput, CompletableFuture<RegistryWrapper.WrapperLookup> registryLookup) {
super(dataOutput, registryLookup);
}
@Override
public void generate() {
}
}
Füge diesen Provider unbedingt zu deinem Pack hinzu!
Es gibt eine Reihe von Hilfsmethoden, die dir bei der Erstellung deiner Beutetabellen unterstützen. Wir werden sie nicht alle aufzählen, aber du solltest sie in deiner IDE ansehen.
Lasst uns ein paar Drops in der Methode generate
hinzufügen:
// 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))))
);
Beute von Truhen sind ein wenig komplizierter als Beute von Blöcken. Erstelle eine Klasse, die extends SimpleFabricLootTableProvider
ähnlich zu dem Beispiel unterhalb ** und füge sie zu deinem Pack hinzu**.
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) {
}
}
Wir werden einen RegistryKey<LootTable>
für unsere Beutetabelle benötigen. Lasst uns dies in eine neue Klasse mit dem Namen ModLootTables
packen. Stelle sicher, dass dies dein main
Quellenverzeichnis ist, wenn du geteilte Quellen nutzt.
public class ModLootTables {
public static RegistryKey<LootTable> TEST_CHEST_LOOT = RegistryKey.of(RegistryKeys.LOOT_TABLE, Identifier.of(FabricDocsReference.MOD_ID, "chests/test_loot"));
}
Dann können wir eine Beutetabelle innerhalb der generate
Methode unseres Providers generieren.
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
)
));