BlockLootTablesGenerator.java
@@ -0,0 +1,134 @@
+package com.hauntedchest.lovecraftplus.datagen;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.hauntedchest.lovecraftplus.LovecraftPlusMod;
+import com.hauntedchest.lovecraftplus.registries.BlockHandler;
+import net.minecraft.advancements.criterion.StatePropertiesPredicate;
+import net.minecraft.block.Block;
+import net.minecraft.block.SlabBlock;
+import net.minecraft.data.DataGenerator;
+import net.minecraft.data.DirectoryCache;
+import net.minecraft.data.IDataProvider;
+import net.minecraft.data.LootTableProvider;
+import net.minecraft.data.loot.BlockLootTables;
+import net.minecraft.state.properties.SlabType;
+import net.minecraft.util.ResourceLocation;
+import net.minecraft.world.storage.loot.*;
+import net.minecraft.world.storage.loot.conditions.BlockStateProperty;
+import net.minecraft.world.storage.loot.conditions.SurvivesExplosion;
+import net.minecraft.world.storage.loot.functions.SetCount;
+
+import java.io.IOException;
+import java.nio.file.Path;
+import java.util.HashMap;
+import java.util.Map;
+
+@SuppressWarnings("NullableProblems")
+public class BlockLootTablesGenerator extends LootTableProvider {
+ private final HashMap<Block, LootTable.Builder> TABLES = new HashMap<>();
+ private final DataGenerator GENERATOR;
+ private final Gson GSON = new GsonBuilder().setPrettyPrinting().disableHtmlEscaping().create();
+
+ public BlockLootTablesGenerator(DataGenerator generator) {
+ super(generator);
+ this.GENERATOR = generator;
+ }
+
+ private void addLootTables(BlockLootTablesGenerator loot) {
+ loot.dropSelf(BlockHandler.HUMMING_OBSIDIAN.get());
+
+ loot.dropSelf(BlockHandler.HUMMING_STONE.get());
+
+ loot.dropSelf(BlockHandler.LAVA_SPONGE.get());
+
+ loot.dropSelf(BlockHandler.MOLTEN_LAVA_SPONGE.get());
+
+ loot.dropSelf(BlockHandler.MOONCALITE.get());
+
+ loot.addLoot(BlockHandler.MOON_LEAVES.get(),
+ BlockLootTables.droppingWithChancesSticksAndApples(BlockHandler.MOON_LEAVES.get(),
+ BlockHandler.MOON_SAPLING.get(),
+ BlockLootTables.DEFAULT_SAPLING_DROP_RATES));
+
+ loot.dropSelf(BlockHandler.MOON_LOG.get());
+
+ loot.dropSelf(BlockHandler.MOON_PLANKS.get());
+
+ loot.dropSelf(BlockHandler.MOON_SAPLING.get());
+
+ loot.dropSelf(BlockHandler.MOONSTONE.get());
+
+ loot.dropSelf(BlockHandler.MOONSTONE_BRICKS.get());
+
+ loot.dropSelf(BlockHandler.SMOOTH_MOONSTONE.get());
+
+ loot.addLoot(BlockHandler.THORN_LEAVES.get(),
+ BlockLootTables.droppingWithChancesSticksAndApples(BlockHandler.THORN_LEAVES.get(),
+ BlockHandler.THORN_SAPLING.get(),
+ BlockLootTables.DEFAULT_SAPLING_DROP_RATES));
+
+ loot.dropSelf(BlockHandler.THORN_LOG.get());
+
+ loot.dropSelf(BlockHandler.THORN_PLANKS.get());
+
+ loot.dropSelf(BlockHandler.THORN_SAPLING.get());
+ }
+
+ // Add a custom loot table
+ private void addLoot(Block block, LootTable.Builder loot) {
+ TABLES.put(block, loot);
+ }
+
+ private void dropSelf(Block block) {
+ LootPool.Builder pool = LootPool.builder()
+ .rolls(ConstantRange.of(1))
+ .addEntry(ItemLootEntry.builder(block))
+ .acceptCondition(SurvivesExplosion.builder());
+
+ TABLES.put(block, LootTable.builder().addLootPool(pool));
+ }
+
+ private void dropSlabs(Block block) {
+ LootPool.Builder pool = LootPool.builder()
+ .rolls(ConstantRange.of(1))
+ .addEntry(ItemLootEntry.builder(block))
+ .acceptCondition(SurvivesExplosion.builder())
+ .acceptFunction(SetCount.builder(ConstantRange.of(2))
+ .acceptCondition(BlockStateProperty.builder(block)
+ .fromProperties(
+ StatePropertiesPredicate.Builder.newBuilder()
+ .withProp(SlabBlock.TYPE, SlabType.DOUBLE)
+ )));
+
+ TABLES.put(block, LootTable.builder().addLootPool(pool));
+ }
+
+ @Override
+ public void act(DirectoryCache cache) {
+ addLootTables(this);
+
+ HashMap<ResourceLocation, LootTable> namespacedTables = new HashMap<>();
+
+ for (Map.Entry<Block, LootTable.Builder> entry : TABLES.entrySet()) {
+ namespacedTables.put(entry.getKey().getLootTable(),
+ entry.getValue().setParameterSet(LootParameterSets.BLOCK).build());
+ }
+
+ writeLootTables(namespacedTables, cache);
+ }
+
+ private void writeLootTables(HashMap<ResourceLocation, LootTable> tables, DirectoryCache cache) {
+ Path output = GENERATOR.getOutputFolder();
+
+ tables.forEach((key, table) -> {
+ Path path = output.resolve("data/" + key.getNamespace() + "/loot_tables/" + key.getPath() + ".json");
+
+ try {
+ IDataProvider.save(GSON, cache, LootTableManager.toJson(table), path);
+ } catch (IOException e) {
+ LovecraftPlusMod.LOGGER.error("couldn't write loot table" + path, e);
+ }
+ });
+ }
+}