Skip to content

Commit ad2ac0f

Browse files
committed
Added Loot Table datagen. Added sticks to the short/tall grass loot table.
1 parent d05fccf commit ad2ac0f

7 files changed

Lines changed: 133 additions & 8 deletions

File tree

src/client/java/com/tcm/MineTale/MineTaleDataGen.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
package com.tcm.MineTale;
22

3-
import com.tcm.MineTale.datagen.ModBlockTagProvider;
4-
import com.tcm.MineTale.datagen.ModLangProvider;
5-
import com.tcm.MineTale.datagen.ModModelProvider;
6-
import com.tcm.MineTale.datagen.ModRecipeProvider;
3+
import com.tcm.MineTale.datagen.*;
74

85
import net.fabricmc.fabric.api.datagen.v1.DataGeneratorEntrypoint;
96
import net.fabricmc.fabric.api.datagen.v1.FabricDataGenerator;
@@ -26,5 +23,6 @@ public void onInitializeDataGenerator(FabricDataGenerator fabricDataGenerator) {
2623
pack.addProvider(ModModelProvider::new);
2724
pack.addProvider(ModRecipeProvider::new);
2825
pack.addProvider(ModBlockTagProvider::new);
26+
pack.addProvider(ModLootTableProvider::new);
2927
}
3028
}

src/client/java/com/tcm/MineTale/datagen/ModBlockTagProvider.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.tcm.MineTale.datagen;
22

3+
import com.jcraft.jorbis.Block;
34
import com.tcm.MineTale.registry.ModBlocks;
45
import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput;
56
import net.fabricmc.fabric.api.datagen.v1.provider.FabricTagProvider;
@@ -28,6 +29,14 @@ public ModBlockTagProvider(FabricDataOutput output, CompletableFuture<HolderLook
2829
*/
2930
@Override
3031
protected void addTags(HolderLookup.Provider provider) {
32+
valueLookupBuilder(BlockTags.MINEABLE_WITH_PICKAXE)
33+
.add(ModBlocks.FURNACE_WORKBENCH_BLOCK_T1)
34+
.add(ModBlocks.FURNACE_WORKBENCH_BLOCK_T2)
35+
.add(ModBlocks.ARMORERS_WORKBENCH_BLOCK);
36+
valueLookupBuilder(BlockTags.MINEABLE_WITH_AXE)
37+
.add(ModBlocks.CAMPFIRE_WORKBENCH_BLOCK)
38+
.add(ModBlocks.WORKBENCH_WORKBENCH_BLOCK);
39+
3140
valueLookupBuilder(BlockTags.LOGS)
3241
.add(ModBlocks.AMBER_LOG)
3342
.add(ModBlocks.BAMBOO_LOG)
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package com.tcm.MineTale.datagen;
2+
3+
import com.tcm.MineTale.registry.ModBlocks;
4+
import com.tcm.MineTale.registry.ModItems;
5+
import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput;
6+
import net.fabricmc.fabric.api.datagen.v1.provider.FabricBlockLootTableProvider;
7+
import net.minecraft.core.HolderLookup;
8+
import net.minecraft.core.registries.Registries;
9+
import net.minecraft.world.item.Item;
10+
import net.minecraft.world.item.enchantment.Enchantment;
11+
import net.minecraft.world.item.enchantment.Enchantments;
12+
import net.minecraft.world.level.block.Block;
13+
import net.minecraft.world.level.storage.loot.LootTable;
14+
import net.minecraft.world.level.storage.loot.entries.LootItem;
15+
import net.minecraft.world.level.storage.loot.entries.LootPoolSingletonContainer;
16+
import net.minecraft.world.level.storage.loot.functions.ApplyBonusCount;
17+
import net.minecraft.world.level.storage.loot.functions.SetItemCountFunction;
18+
import net.minecraft.world.level.storage.loot.providers.number.ConstantValue;
19+
import net.minecraft.world.level.storage.loot.providers.number.UniformGenerator;
20+
21+
import java.util.concurrent.CompletableFuture;
22+
23+
public class ModLootTableProvider extends FabricBlockLootTableProvider {
24+
public ModLootTableProvider(FabricDataOutput dataOutput, CompletableFuture<HolderLookup.Provider> registryLookup) {
25+
super(dataOutput, registryLookup);
26+
}
27+
28+
@Override
29+
public void generate() {
30+
///Block Drops Itself
31+
//Bug!! Workbenches currently drop items based on the amount of blocks
32+
//the multiblock is. For example the Furnaces currently drop 4 furnaces.
33+
dropSelf(ModBlocks.FURNACE_WORKBENCH_BLOCK_T1);
34+
dropSelf(ModBlocks.FURNACE_WORKBENCH_BLOCK_T1);
35+
dropSelf(ModBlocks.ARMORERS_WORKBENCH_BLOCK);
36+
dropSelf(ModBlocks.CAMPFIRE_WORKBENCH_BLOCK);
37+
dropSelf(ModBlocks.WORKBENCH_WORKBENCH_BLOCK);
38+
}
39+
40+
41+
/// For Ore Drops
42+
/** Ex:
43+
* add(ModBlocks.IRON_ORE_SHALE, AverageOreDrops(ModBlocks.IRON_ORE_SHALE, Items.RAW_IRON));
44+
* **/
45+
public LootTable.Builder AverageOreDrops(Block drop, Item item) {
46+
HolderLookup.RegistryLookup<Enchantment> impl = this.registries.lookupOrThrow(Registries.ENCHANTMENT);
47+
return this.createSilkTouchDispatchTable(drop, this.applyExplosionDecay(drop, ((LootPoolSingletonContainer.Builder<?>)
48+
LootItem.lootTableItem(item).apply(SetItemCountFunction.setCount(UniformGenerator.between(2, 5))))
49+
.apply(ApplyBonusCount.addOreBonusCount(impl.getOrThrow(Enchantments.FORTUNE)))));
50+
}
51+
52+
public LootTable.Builder SingleOreDrops(Block drop, Item item) {
53+
HolderLookup.RegistryLookup<Enchantment> impl = this.registries.lookupOrThrow(Registries.ENCHANTMENT);
54+
return this.createSilkTouchDispatchTable(drop, this.applyExplosionDecay(drop, ((LootPoolSingletonContainer.Builder<?>)
55+
LootItem.lootTableItem(item).apply(SetItemCountFunction.setCount(ConstantValue.exactly(1))))
56+
.apply(ApplyBonusCount.addOreBonusCount(impl.getOrThrow(Enchantments.FORTUNE)))));
57+
}
58+
59+
public LootTable.Builder LightOreDrops(Block drop, Item item) {
60+
HolderLookup.RegistryLookup<Enchantment> impl = this.registries.lookupOrThrow(Registries.ENCHANTMENT);
61+
return this.createSilkTouchDispatchTable(drop, this.applyExplosionDecay(drop, ((LootPoolSingletonContainer.Builder<?>)
62+
LootItem.lootTableItem(item).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 2))))
63+
.apply(ApplyBonusCount.addOreBonusCount(impl.getOrThrow(Enchantments.FORTUNE)))));
64+
}
65+
}

src/main/java/com/tcm/MineTale/MineTale.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.tcm.MineTale;
22

3+
import com.tcm.MineTale.util.ModLootTableModifiers;
34
import net.fabricmc.api.ModInitializer;
45
import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry;
56
import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking;
@@ -72,6 +73,8 @@ public void onInitialize() {
7273

7374
RecipeSynchronization.synchronizeRecipeSerializer(ModRecipes.FURNACE_SERIALIZER);
7475

76+
ModLootTableModifiers.modifyLootTables();
77+
7578
// Register the payload type and codec so the game knows how to handle it
7679
PayloadTypeRegistry.playC2S().register(CraftRequestPayload.TYPE, CraftRequestPayload.CODEC);
7780

@@ -129,7 +132,7 @@ public void onInitialize() {
129132
});
130133
});
131134

132-
LOGGER.info("Hello Fabric world!");
135+
LOGGER.info("MineTale Loaded!");
133136
}
134137

135138
private boolean hasIngredients(ServerPlayer player, WorkbenchRecipe recipe) {

src/main/java/com/tcm/MineTale/registry/ModBlocks.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import net.minecraft.world.level.material.MapColor;
2929
import net.minecraft.world.level.block.Blocks;
3030

31+
import static net.minecraft.world.level.block.Blocks.litBlockEmission;
3132
import static net.minecraft.world.level.block.Blocks.logProperties;
3233

3334
public class ModBlocks {
@@ -59,14 +60,18 @@ public class ModBlocks {
5960
public static final Block FURNACE_WORKBENCH_BLOCK_T1 = register(
6061
"furnace_workbench_block_t1",
6162
(props) -> new FurnaceWorkbench(props, ModTiers.TIER_1),
62-
BlockBehaviour.Properties.of().sound(SoundType.STONE).noOcclusion(),
63-
true
63+
BlockBehaviour.Properties.of().sound(SoundType.STONE).noOcclusion()
64+
.requiresCorrectToolForDrops().strength(3.5F)
65+
.lightLevel(litBlockEmission(13)),
66+
true
6467
);
6568

6669
public static final Block FURNACE_WORKBENCH_BLOCK_T2 = register(
6770
"furnace_workbench_block_t2",
6871
(props) -> new FurnaceWorkbench(props, ModTiers.TIER_2),
69-
BlockBehaviour.Properties.of().sound(SoundType.STONE).noOcclusion(),
72+
BlockBehaviour.Properties.of().sound(SoundType.STONE).noOcclusion()
73+
.requiresCorrectToolForDrops().strength(3.5F)
74+
.lightLevel(litBlockEmission(13)),
7075
true
7176
);
7277

src/main/java/com/tcm/MineTale/registry/ModItems.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,26 @@
33
import java.util.ArrayList;
44
import java.util.List;
55
import java.util.function.Function;
6+
import java.util.function.UnaryOperator;
67

78
import com.tcm.MineTale.MineTale;
89
import com.tcm.MineTale.item.ModCreativeTab;
910

1011
import net.fabricmc.fabric.api.itemgroup.v1.ItemGroupEvents;
1112
import net.minecraft.core.Registry;
13+
import net.minecraft.core.component.DataComponents;
1214
import net.minecraft.core.registries.BuiltInRegistries;
1315
import net.minecraft.core.registries.Registries;
1416
import net.minecraft.resources.Identifier;
1517
import net.minecraft.resources.ResourceKey;
1618
import net.minecraft.world.food.FoodProperties;
19+
import net.minecraft.world.item.BlockItem;
1720
import net.minecraft.world.item.Item;
21+
import net.minecraft.world.item.Items;
22+
import net.minecraft.world.item.component.ItemContainerContents;
23+
import net.minecraft.world.level.block.Block;
24+
25+
import static net.minecraft.world.item.Items.registerBlock;
1826

1927
public class ModItems {
2028

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package com.tcm.MineTale.util;
2+
3+
import net.fabricmc.fabric.api.loot.v3.LootTableEvents;
4+
import net.minecraft.world.item.Items;
5+
import net.minecraft.resources.Identifier;
6+
import net.minecraft.world.level.storage.loot.LootPool;
7+
import net.minecraft.world.level.storage.loot.entries.LootItem;
8+
import net.minecraft.world.level.storage.loot.functions.SetItemCountFunction;
9+
import net.minecraft.world.level.storage.loot.providers.number.ConstantValue;
10+
import net.minecraft.world.level.storage.loot.providers.number.UniformGenerator;
11+
12+
public class ModLootTableModifiers {
13+
private static final Identifier SHORT_GRASS_ID = Identifier.fromNamespaceAndPath("minecraft", "blocks/short_grass");
14+
private static final Identifier TALL_GRASS_ID = Identifier.fromNamespaceAndPath("minecraft", "blocks/tall_grass");
15+
16+
public static void modifyLootTables() {
17+
LootTableEvents.MODIFY.register((key, tableBuilder, sources, registry) -> {
18+
if (SHORT_GRASS_ID.equals(key.identifier())) {
19+
LootPool.Builder poolBuilder = LootPool.lootPool()
20+
.setRolls(ConstantValue.exactly(1))
21+
.add(LootItem.lootTableItem(Items.AIR)
22+
.apply(SetItemCountFunction.setCount(UniformGenerator.between(1f, 1f))))
23+
.add(LootItem.lootTableItem(Items.STICK)
24+
.apply(SetItemCountFunction.setCount(UniformGenerator.between(1f, 3f))));
25+
tableBuilder.pool(poolBuilder.build());
26+
}
27+
28+
if (TALL_GRASS_ID.equals(key.identifier())) {
29+
LootPool.Builder poolBuilder = LootPool.lootPool()
30+
.setRolls(ConstantValue.exactly(1))
31+
.add(LootItem.lootTableItem(Items.STICK).setWeight(1)
32+
.apply(SetItemCountFunction.setCount(UniformGenerator.between(1f, 4f))));
33+
tableBuilder.pool(poolBuilder.build());
34+
}
35+
});
36+
}
37+
}

0 commit comments

Comments
 (0)