Add Datagen for Loot Tables and Recipes

This commit is contained in:
Martin Prokoph
2024-09-16 20:05:21 +02:00
parent 8e2fc41b99
commit da7af06774
83 changed files with 1676 additions and 1248 deletions

View File

@@ -1,5 +1,8 @@
package eu.midnightdust.motschen.rocks;
import eu.midnightdust.motschen.rocks.datagen.LootTables;
import eu.midnightdust.motschen.rocks.datagen.Recipes;
import eu.midnightdust.motschen.rocks.datagen.Tags;
import eu.midnightdust.motschen.rocks.world.configured_feature.MiscFeatures;
import eu.midnightdust.motschen.rocks.world.configured_feature.NetherFeatures;
import eu.midnightdust.motschen.rocks.world.configured_feature.RockFeatures;
@@ -19,6 +22,9 @@ public class RocksDataGen implements DataGeneratorEntrypoint {
public void onInitializeDataGenerator(FabricDataGenerator fabricDataGenerator) {
FabricDataGenerator.Pack pack = fabricDataGenerator.createPack();
pack.addProvider(WorldGenData::new);
pack.addProvider(LootTables.BlockLootTables::new);
pack.addProvider(Tags.Blocks::new);
pack.addProvider(Recipes::new);
System.out.println("out");
}
@Override

View File

@@ -0,0 +1,57 @@
package eu.midnightdust.motschen.rocks.datagen;
import eu.midnightdust.motschen.rocks.RocksMain;
import eu.midnightdust.motschen.rocks.util.RockType;
import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput;
import net.fabricmc.fabric.api.datagen.v1.provider.FabricBlockLootTableProvider;
import net.minecraft.block.Block;
import net.minecraft.enchantment.Enchantment;
import net.minecraft.enchantment.Enchantments;
import net.minecraft.item.Item;
import net.minecraft.item.Items;
import net.minecraft.loot.LootPool;
import net.minecraft.loot.LootTable;
import net.minecraft.loot.condition.TableBonusLootCondition;
import net.minecraft.loot.entry.ItemEntry;
import net.minecraft.loot.function.CopyStateLootFunction;
import net.minecraft.loot.provider.number.ConstantLootNumberProvider;
import net.minecraft.registry.RegistryKeys;
import net.minecraft.registry.RegistryWrapper;
import net.minecraft.state.property.Property;
import java.util.Arrays;
import java.util.concurrent.CompletableFuture;
public class LootTables {
public static class BlockLootTables extends FabricBlockLootTableProvider {
public BlockLootTables(FabricDataOutput dataOutput, CompletableFuture<RegistryWrapper.WrapperLookup> registryLookup) {
super(dataOutput, registryLookup);
}
@Override
public void generate() {
RocksMain.rocksByType.forEach((rockType, rock) -> addSilkTouchDrop(rock, rockType != RockType.GRAVEL ? RocksMain.splittersByType.get(rockType) : Items.FLINT));
RocksMain.sticksByType.forEach((stickType, stick) -> addSilkTouchDrop(stick, Items.STICK));
addSilkTouchDrop(RocksMain.Pinecone, Items.SPRUCE_SAPLING);
addSilkTouchOrRareDrop(RocksMain.Seashell, Items.NAUTILUS_SHELL, 0.02f, 0.022222223f, 0.025f, 0.033333335f, 0.1f);
addCopyStateDrop(RocksMain.Starfish, RocksMain.STARFISH_VARIATION);
}
public void addCopyStateDrop(Block block, Property<?>... properties) {
var lootFunction = CopyStateLootFunction.builder(block);
Arrays.stream(properties).forEach(lootFunction::addProperty);
addDrop(block, LootTable.builder().pool(this.addSurvivesExplosionCondition(block,
LootPool.builder().rolls(ConstantLootNumberProvider.create(1.0F)).with(ItemEntry.builder(block)
.apply(lootFunction)))));
}
public void addSilkTouchDrop(Block block, Item alternative) {
addDrop(block, this.dropsWithSilkTouch(block, ItemEntry.builder(alternative)));
}
public void addSilkTouchOrRareDrop(Block block, Item alternative, float... chances) {
RegistryWrapper.Impl<Enchantment> impl = this.registryLookup.getWrapperOrThrow(RegistryKeys.ENCHANTMENT);
addDrop(block, this.dropsWithSilkTouch(block, ItemEntry.builder(alternative).conditionally(TableBonusLootCondition.builder(impl.getOrThrow(Enchantments.FORTUNE), chances))));
}
}
}

View File

@@ -0,0 +1,33 @@
package eu.midnightdust.motschen.rocks.datagen;
import eu.midnightdust.motschen.rocks.RocksMain;
import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput;
import net.fabricmc.fabric.api.datagen.v1.provider.FabricRecipeProvider;
import net.minecraft.data.server.recipe.RecipeExporter;
import net.minecraft.data.server.recipe.ShapelessRecipeJsonBuilder;
import net.minecraft.recipe.book.RecipeCategory;
import net.minecraft.registry.Registries;
import net.minecraft.registry.RegistryWrapper;
import net.minecraft.util.Identifier;
import java.util.concurrent.CompletableFuture;
public class Recipes extends FabricRecipeProvider {
public Recipes(FabricDataOutput output, CompletableFuture<RegistryWrapper.WrapperLookup> registriesFuture) {
super(output, registriesFuture);
}
@Override
public void generate(RecipeExporter exporter) {
generateCrafting(exporter);
}
private void generateCrafting(RecipeExporter exporter) {
RocksMain.splittersByType.forEach(((rockType, splitter) -> {
ShapelessRecipeJsonBuilder.create(RecipeCategory.BUILDING_BLOCKS, Registries.BLOCK.get(Identifier.ofVanilla(rockType.name().toLowerCase())))
.input(splitter, 4)
.criterion(FabricRecipeProvider.hasItem(splitter), FabricRecipeProvider.conditionsFromItem(splitter))
.offerTo(exporter, rockType.name().toLowerCase()+"_from_splitter");
}));
}
}

View File

@@ -0,0 +1,31 @@
package eu.midnightdust.motschen.rocks.datagen;
import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput;
import net.fabricmc.fabric.api.datagen.v1.provider.FabricTagProvider;
import net.minecraft.registry.RegistryWrapper;
import java.util.concurrent.CompletableFuture;
public class Tags {
public static class Blocks extends FabricTagProvider.BlockTagProvider {
// private static final TagKey<Block> PICKAXE_MINEABLE = TagKey.of(RegistryKeys.BLOCK, Identifier.ofVanilla("mineable/pickaxe"));
// private static final TagKey<Block> AXE_MINEABLE = TagKey.of(RegistryKeys.BLOCK, Identifier.ofVanilla("mineable/axe"));
// private static final TagKey<Block> NEEDS_STONE_TOOL = TagKey.of(RegistryKeys.BLOCK, Identifier.ofVanilla("needs_stone_tool"));
public Blocks(FabricDataOutput output, CompletableFuture<RegistryWrapper.WrapperLookup> registriesFuture) {
super(output, registriesFuture);
}
@Override
protected void configure(RegistryWrapper.WrapperLookup arg) {
// List<Block> pickaxeBlocks = new ArrayList<>(DecorativeMain.BLOCKS);
// pickaxeBlocks.removeAll(LogsWithAxes.TYPES);
// getOrCreateTagBuilder(PICKAXE_MINEABLE).setReplace(false)
// .add(pickaxeBlocks.toArray(new Block[0]));
// getOrCreateTagBuilder(AXE_MINEABLE).setReplace(false)
// .add(LogsWithAxes.TYPES.toArray(new Block[0]));
// getOrCreateTagBuilder(NEEDS_STONE_TOOL).setReplace(false)
// .add(DecorativeMain.RockyAsphalt);
}
}
}