diff --git a/src/main/java/org/betterx/bclib/api/v3/datagen/BlockLootTableProvider.java b/src/main/java/org/betterx/bclib/api/v3/datagen/BlockLootTableProvider.java new file mode 100644 index 00000000..ceb8774a --- /dev/null +++ b/src/main/java/org/betterx/bclib/api/v3/datagen/BlockLootTableProvider.java @@ -0,0 +1,40 @@ +package org.betterx.bclib.api.v3.datagen; + +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.storage.loot.LootTable; +import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; + +import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput; +import net.fabricmc.fabric.api.datagen.v1.provider.SimpleFabricLootTableProvider; + +import java.util.List; +import java.util.function.BiConsumer; + +public class BlockLootTableProvider extends SimpleFabricLootTableProvider { + protected final List modIDs; + + public BlockLootTableProvider( + FabricDataOutput output, + List modIDs + ) { + super(output, LootContextParamSets.BLOCK); + this.modIDs = modIDs; + } + + + @Override + public void generate(BiConsumer biConsumer) { + for (Block block : BuiltInRegistries.BLOCK) { + if (block instanceof LootDropProvider dropper) { + ResourceLocation id = BuiltInRegistries.BLOCK.getKey(block); + if (id != null && modIDs.contains(id.getNamespace())) { + LootTable.Builder builder = LootTable.lootTable(); + dropper.getDroppedItemsBCL(builder); + biConsumer.accept(id.withPrefix("blocks/"), builder); + } + } + } + } +} diff --git a/src/main/java/org/betterx/bclib/api/v3/datagen/DropSelfLootProvider.java b/src/main/java/org/betterx/bclib/api/v3/datagen/DropSelfLootProvider.java new file mode 100644 index 00000000..182828dd --- /dev/null +++ b/src/main/java/org/betterx/bclib/api/v3/datagen/DropSelfLootProvider.java @@ -0,0 +1,25 @@ +package org.betterx.bclib.api.v3.datagen; + +import org.betterx.bclib.behaviours.interfaces.BehaviourExplosionResistant; + +import net.minecraft.world.level.ItemLike; +import net.minecraft.world.level.storage.loot.LootPool; +import net.minecraft.world.level.storage.loot.LootTable; +import net.minecraft.world.level.storage.loot.entries.LootItem; +import net.minecraft.world.level.storage.loot.predicates.ExplosionCondition; +import net.minecraft.world.level.storage.loot.providers.number.ConstantValue; + +public interface DropSelfLootProvider extends LootDropProvider { + @Override + default void getDroppedItemsBCL(LootTable.Builder builder) { + var pool = LootPool.lootPool() + .setRolls(ConstantValue.exactly(1.0f)) + .add(LootItem.lootTableItem((B) this)); + + if (this instanceof BehaviourExplosionResistant) { + pool = pool.when(ExplosionCondition.survivesExplosion()); + } + + builder.withPool(pool); + } +} diff --git a/src/main/java/org/betterx/bclib/api/v3/datagen/LootDropProvider.java b/src/main/java/org/betterx/bclib/api/v3/datagen/LootDropProvider.java new file mode 100644 index 00000000..98129444 --- /dev/null +++ b/src/main/java/org/betterx/bclib/api/v3/datagen/LootDropProvider.java @@ -0,0 +1,7 @@ +package org.betterx.bclib.api.v3.datagen; + +import net.minecraft.world.level.storage.loot.LootTable; + +public interface LootDropProvider { + void getDroppedItemsBCL(LootTable.Builder builder); +}