Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,10 @@ public class ConventionalBlockTagProvider extends BlockTagProvider {
BlockTags.DIRT,
BlockTags.ICE,
BlockTags.SAND,
BlockTags.SMALL_FLOWERS,
BlockTags.MINEABLE_WITH_PICKAXE,
ConventionalBlockTags.GRAVELS
ConventionalBlockTags.GRAVELS,
BotaniaTags.Blocks.MYSTICAL_FLOWERS
);

public ConventionalBlockTagProvider(PackOutput packOutput, CompletableFuture<HolderLookup.Provider> lookupProvider) {
Expand Down Expand Up @@ -143,6 +145,14 @@ protected void addTags(HolderLookup.Provider provider) {
Blocks.WAXED_COPPER_BULB, Blocks.WAXED_EXPOSED_COPPER_BULB,
Blocks.WAXED_WEATHERED_COPPER_BULB, Blocks.WAXED_OXIDIZED_COPPER_BULB
);

tag(BotaniaTags.Blocks.FERTILIZER_SPREADABLE_PLANTS)
.addTag(BlockTags.SMALL_FLOWERS)
.add(Blocks.LILY_PAD, Blocks.SPORE_BLOSSOM, Blocks.RED_MUSHROOM, Blocks.BROWN_MUSHROOM);

tag(BotaniaTags.Blocks.FERTILIZER_EXCLUDED_PLANTS)
.addTag(BotaniaTags.Blocks.MYSTICAL_FLOWERS)
.add(Blocks.WITHER_ROSE, Blocks.TORCHFLOWER);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,74 +84,47 @@ public void buildRecipes(RecipeOutput consumer) {

alchemy(consumer, id("rotten_flesh_to_leather"), new ItemStack(Items.LEATHER), ingr(Items.ROTTEN_FLESH), 600);

cycle(consumer, 40, "botania:log_cycle", Blocks.OAK_LOG, Blocks.SPRUCE_LOG, Blocks.BIRCH_LOG, Blocks.JUNGLE_LOG, Blocks.ACACIA_LOG, Blocks.DARK_OAK_LOG, Blocks.MANGROVE_LOG, Blocks.CHERRY_LOG);
cycle(consumer, 40, "botania:froglight_cycle", Blocks.OCHRE_FROGLIGHT, Blocks.VERDANT_FROGLIGHT, Blocks.PEARLESCENT_FROGLIGHT);
cycle(consumer, 120, "botania:sapling_cycle", Blocks.OAK_SAPLING, Blocks.SPRUCE_SAPLING, Blocks.BIRCH_SAPLING, Blocks.JUNGLE_SAPLING, Blocks.ACACIA_SAPLING, Blocks.DARK_OAK_SAPLING, Blocks.MANGROVE_PROPAGULE, Blocks.CHERRY_SAPLING);

deconstruct(consumer, id("glowstone_deconstruct"), Items.GLOWSTONE_DUST, Blocks.GLOWSTONE);
deconstruct(consumer, id("quartz_deconstruct"), Items.QUARTZ, Blocks.QUARTZ_BLOCK);
deconstruct(consumer, id("dark_quartz_deconstruct"), BotaniaItems.darkQuartz, BotaniaBlocks.darkQuartz);
deconstruct(consumer, id("mana_quartz_deconstruct"), BotaniaItems.manaQuartz, BotaniaBlocks.manaQuartz);
deconstruct(consumer, id("blaze_quartz_deconstruct"), BotaniaItems.blazeQuartz, BotaniaBlocks.blazeQuartz);
deconstruct(consumer, id("lavender_quartz_deconstruct"), BotaniaItems.lavenderQuartz, BotaniaBlocks.lavenderQuartz);
deconstruct(consumer, id("red_quartz_deconstruct"), BotaniaItems.redQuartz, BotaniaBlocks.redQuartz);
deconstruct(consumer, id("elf_quartz_deconstruct"), BotaniaItems.elfQuartz, BotaniaBlocks.elfQuartz);
deconstruct(consumer, id("sunny_quartz_deconstruct"), BotaniaItems.sunnyQuartz, BotaniaBlocks.sunnyQuartz);

alchemy(consumer, id("chiseled_stone_bricks"), new ItemStack(Blocks.CHISELED_STONE_BRICKS, 1), ingr(Blocks.STONE_BRICKS), 150);
cycle(consumer, 40, "botania:log_cycle",
Blocks.OAK_LOG, Blocks.DARK_OAK_LOG, Blocks.SPRUCE_LOG, Blocks.MANGROVE_LOG,
Blocks.BIRCH_LOG, Blocks.CHERRY_LOG, Blocks.JUNGLE_LOG, Blocks.ACACIA_LOG);
cycle(consumer, 6000, "botania:sapling_cycle",
Blocks.OAK_SAPLING, Blocks.DARK_OAK_SAPLING, Blocks.SPRUCE_SAPLING, Blocks.MANGROVE_PROPAGULE,
Blocks.BIRCH_SAPLING, Blocks.CHERRY_SAPLING, Blocks.JUNGLE_SAPLING, Blocks.ACACIA_SAPLING);

alchemy(consumer, id("ice"), new ItemStack(Blocks.ICE), ingr(Blocks.SNOW_BLOCK), 2250);

// TODO: These can use the `cycle` function, right?? check when datagen operational
final String vineLilypadGroup = "botania:vine_and_lily_pad_cycle";
alchemy(consumer, id("vine_to_lily_pad"), new ItemStack(Blocks.LILY_PAD), ingr(Blocks.VINE), 320, vineLilypadGroup);
alchemy(consumer, id("lily_pad_to_vine"), new ItemStack(Blocks.VINE), ingr(Blocks.LILY_PAD), 320, vineLilypadGroup);
cycle(consumer, 320, "botania:vine_and_lily_pad_cycle", Items.LILY_PAD, Items.VINE);

cycle(consumer, 200, "botania:fish_cycle", Items.COD, Items.SALMON, Items.TROPICAL_FISH, Items.PUFFERFISH);
cycle(consumer, 6000, "botania:crop_cycle", Items.COCOA_BEANS, Items.WHEAT_SEEDS, Items.POTATO, Items.CARROT, Items.BEETROOT_SEEDS, Items.MELON_SEEDS, Items.PUMPKIN_SEEDS);
cycle(consumer, 6000, "botania:crop_cycle", Items.COCOA_BEANS, Items.WHEAT_SEEDS, Items.POTATO,
Items.CARROT, Items.BEETROOT_SEEDS, Items.MELON_SEEDS, Items.PUMPKIN_SEEDS);

alchemy(consumer, id("potato_unpoison"), new ItemStack(Items.POTATO), ingr(Items.POISONOUS_POTATO), 1200);
alchemy(consumer, id("blaze_rod_to_nether_wart"), new ItemStack(Items.NETHER_WART), ingr(Items.BLAZE_ROD), 4000);

cycle(consumer, 200, "", Items.GUNPOWDER, Items.FLINT);
cycle(consumer, 200, "botania:gunpowder_and_flint_cycle", Items.GUNPOWDER, Items.FLINT);

alchemy(consumer, id("book_to_name_tag"), new ItemStack(Items.NAME_TAG), ingr(Items.WRITABLE_BOOK), 6000);

alchemy(consumer, id("wool_deconstruct"), new ItemStack(Items.STRING, 3), ingr(ItemTags.WOOL), 100);

final String cactusSlimeGroup = "botania:cactus_and_slime_cycle";
alchemy(consumer, id("cactus_to_slime"), new ItemStack(Items.SLIME_BALL), ingr(Blocks.CACTUS), 1200, cactusSlimeGroup);
alchemy(consumer, id("slime_to_cactus"), new ItemStack(Blocks.CACTUS), ingr(Items.SLIME_BALL), 1200, cactusSlimeGroup);
cycle(consumer, 1200, "botania:cactus_and_slime_cycle", Items.SLIME_BALL, Blocks.CACTUS);

alchemy(consumer, id("ender_pearl_from_ghast_tear"), new ItemStack(Items.ENDER_PEARL), ingr(Items.GHAST_TEAR), 28000);
alchemy(consumer, id("nether_wart_from_wart_block"), new ItemStack(Blocks.NETHER_WART), ingr(Blocks.NETHER_WART_BLOCK), 500);

cycle(consumer, 300, "botania:glowstone_and_redstone_cycle", Items.GLOWSTONE_DUST, Items.REDSTONE);

alchemy(consumer, id("cobble_to_sand"), new ItemStack(Blocks.SAND), ingr(ConventionalItemTags.COBBLESTONES), 50);
alchemy(consumer, id("terracotta_to_red_sand"), new ItemStack(Blocks.RED_SAND), ingr(Blocks.TERRACOTTA), 50);

deconstruct(consumer, id("clay_deconstruct"), Items.CLAY_BALL, Blocks.CLAY);
deconstruct(consumer, id("brick_deconstruct"), Items.BRICK, Blocks.BRICKS);

alchemy(consumer, id("coarse_dirt"), new ItemStack(Blocks.COARSE_DIRT), ingr(Blocks.DIRT), 120);
alchemy(consumer, id("soul_soil"), new ItemStack(Blocks.SOUL_SOIL), ingr(Blocks.SOUL_SAND), 120);

alchemy(consumer, id("stone_to_andesite"), new ItemStack(Blocks.ANDESITE), ingr(Blocks.STONE), 200);
cycle(consumer, 200, "botania:stone_cycle", Blocks.DIORITE, Blocks.GRANITE, Blocks.ANDESITE);
// TODO: move tuff and calcite to stone cycle
cycle(consumer, 200, "botania:117_stone_cycle", Blocks.TUFF, Blocks.CALCITE, Blocks.DEEPSLATE);

cycle(consumer, 500, "botania:shrub_cycle", Blocks.FERN, Blocks.DEAD_BUSH, Blocks.SHORT_GRASS);
cycle(consumer, 200, "botania:stone_cycle", Blocks.ANDESITE, Blocks.DIORITE, Blocks.GRANITE, Blocks.TUFF, Blocks.CALCITE);
cycle(consumer, 200, "botania:nether_stone_cycle", Blocks.BASALT, Blocks.NETHERRACK, Blocks.BLACKSTONE);

// NB: No wither rose is intentional
cycle(consumer, 400, "botania:flower_cycle", Blocks.DANDELION, Blocks.POPPY, Blocks.BLUE_ORCHID, Blocks.ALLIUM, Blocks.AZURE_BLUET, Blocks.RED_TULIP, Blocks.ORANGE_TULIP,
Blocks.WHITE_TULIP, Blocks.PINK_TULIP, Blocks.OXEYE_DAISY, Blocks.CORNFLOWER, Blocks.LILY_OF_THE_VALLEY,
Blocks.SUNFLOWER, Blocks.LILAC, Blocks.ROSE_BUSH, Blocks.PEONY);

alchemy(consumer, id("dripleaf_shrinking"), new ItemStack(Blocks.SMALL_DRIPLEAF), ingr(Items.BIG_DRIPLEAF), 500);
alchemy(consumer, id("dripleaf_shrinking"), new ItemStack(Blocks.SMALL_DRIPLEAF), ingr(Blocks.BIG_DRIPLEAF), 500);
alchemy(consumer, id("chorus_fruit_to_flower"), new ItemStack(Blocks.CHORUS_FLOWER), ingr(Items.POPPED_CHORUS_FRUIT), 10000);

cycle(consumer, 240, "botania:berry_cycle", Items.APPLE, Items.SWEET_BERRIES, Items.GLOW_BERRIES);

mini(consumer, BotaniaBlocks.agricarnationChibi, BotaniaBlocks.agricarnation);
mini(consumer, BotaniaBlocks.clayconiaChibi, BotaniaBlocks.clayconia);
mini(consumer, BotaniaBlocks.bellethornChibi, BotaniaBlocks.bellethorn);
Expand All @@ -165,46 +138,58 @@ public void buildRecipes(RecipeOutput consumer) {

alchemy(consumer, id("hydroangeas_motif"), new ItemStack(BotaniaBlocks.motifHydroangeas), ingr(BotaniaBlocks.hydroangeas), 2500);

conjuration(consumer, id("redstone_dupe"), new ItemStack(Items.REDSTONE, 2), ingr(Items.REDSTONE), 5000);
conjuration(consumer, id("glowstone_dupe"), new ItemStack(Items.GLOWSTONE_DUST, 2), ingr(Items.GLOWSTONE_DUST), 5000);
conjuration(consumer, id("quartz_dupe"), new ItemStack(Items.QUARTZ, 2), ingr(Items.QUARTZ), 2500);
conjuration(consumer, id("coal_dupe"), new ItemStack(Items.COAL, 2), ingr(Items.COAL), 2100);
conjuration(consumer, id("snowball_dupe"), new ItemStack(Items.SNOWBALL, 2), ingr(Items.SNOWBALL), 200);
conjuration(consumer, id("netherrack_dupe"), new ItemStack(Blocks.NETHERRACK, 2), ingr(Blocks.NETHERRACK), 200);
conjuration(consumer, id("soul_sand_dupe"), new ItemStack(Blocks.SOUL_SAND, 2), ingr(Blocks.SOUL_SAND), 1500);
conjuration(consumer, id("gravel_dupe"), new ItemStack(Blocks.GRAVEL, 2), ingr(Blocks.GRAVEL), 720);

conjuration(consumer, id("oak_leaves_dupe"), new ItemStack(Blocks.OAK_LEAVES, 2), ingr(Blocks.OAK_LEAVES), 2000);
conjuration(consumer, id("birch_leaves_dupe"), new ItemStack(Blocks.BIRCH_LEAVES, 2), ingr(Blocks.BIRCH_LEAVES), 2000);
conjuration(consumer, id("spruce_leaves_dupe"), new ItemStack(Blocks.SPRUCE_LEAVES, 2), ingr(Blocks.SPRUCE_LEAVES), 2000);
conjuration(consumer, id("jungle_leaves_dupe"), new ItemStack(Blocks.JUNGLE_LEAVES, 2), ingr(Blocks.JUNGLE_LEAVES), 2000);
conjuration(consumer, id("acacia_leaves_dupe"), new ItemStack(Blocks.ACACIA_LEAVES, 2), ingr(Blocks.ACACIA_LEAVES), 2000);
conjuration(consumer, id("dark_oak_leaves_dupe"), new ItemStack(Blocks.DARK_OAK_LEAVES, 2), ingr(Blocks.DARK_OAK_LEAVES), 2000);
conjuration(consumer, id("azalea_leaves_dupe"), new ItemStack(Blocks.AZALEA_LEAVES, 2), ingr(Blocks.AZALEA_LEAVES), 2000);
conjuration(consumer, id("flowering_azalea_leaves_dupe"), new ItemStack(Blocks.FLOWERING_AZALEA_LEAVES, 2), ingr(Blocks.FLOWERING_AZALEA_LEAVES), 2000);
conjuration(consumer, id("mangrove_leaves_dupe"), new ItemStack(Blocks.MANGROVE_LEAVES, 2), ingr(Blocks.MANGROVE_LEAVES), 2000);
conjuration(consumer, id("cherry_leaves_dupe"), new ItemStack(Blocks.CHERRY_LEAVES, 2), ingr(Blocks.CHERRY_LEAVES), 2000);

conjuration(consumer, id("grass"), new ItemStack(Blocks.SHORT_GRASS, 2), ingr(Blocks.SHORT_GRASS), 800);
deconstruct2x2(consumer, Items.CLAY_BALL, Blocks.CLAY);
deconstruct2x2(consumer, Items.SNOWBALL, Blocks.SNOW_BLOCK);

deconstruct(consumer, Items.SNOWBALL, 1, Blocks.SNOW, 20, null);
deconstruct(consumer, id("wool_deconstruct"), new ItemStack(Items.STRING, 3), ingr(ItemTags.WOOL), 100, "botania:wool_deconstruction");
deconstruct(consumer, Items.NETHER_BRICK, 2, Blocks.RED_NETHER_BRICKS, 25, null);

// fully-grown cluster yields 4 shards with unenchanted pickaxe
deconstruct(consumer, Items.AMETHYST_SHARD, 1, Blocks.SMALL_AMETHYST_BUD, 100, "botania:amethyst_cluster_deconstruction");
deconstruct(consumer, Items.AMETHYST_SHARD, 2, Blocks.MEDIUM_AMETHYST_BUD, 100, "botania:amethyst_cluster_deconstruction");
deconstruct(consumer, Items.AMETHYST_SHARD, 3, Blocks.LARGE_AMETHYST_BUD, 100, "botania:amethyst_cluster_deconstruction");
deconstruct(consumer, Items.AMETHYST_SHARD, 4, Blocks.AMETHYST_CLUSTER, 100, "botania:amethyst_cluster_deconstruction");

deconstruct2x2Lossy(consumer, Items.QUARTZ, Blocks.QUARTZ_BLOCK, "botania:quartz_deconstruction");
deconstruct2x2Lossy(consumer, BotaniaItems.darkQuartz, BotaniaBlocks.darkQuartz, "botania:quartz_deconstruction");
deconstruct2x2Lossy(consumer, BotaniaItems.manaQuartz, BotaniaBlocks.manaQuartz, "botania:quartz_deconstruction");
deconstruct2x2Lossy(consumer, BotaniaItems.blazeQuartz, BotaniaBlocks.blazeQuartz, "botania:quartz_deconstruction");
deconstruct2x2Lossy(consumer, BotaniaItems.lavenderQuartz, BotaniaBlocks.lavenderQuartz, "botania:quartz_deconstruction");
deconstruct2x2Lossy(consumer, BotaniaItems.redQuartz, BotaniaBlocks.redQuartz, "botania:quartz_deconstruction");
deconstruct2x2Lossy(consumer, BotaniaItems.elfQuartz, BotaniaBlocks.elfQuartz, "botania:quartz_deconstruction");
deconstruct2x2Lossy(consumer, BotaniaItems.sunnyQuartz, BotaniaBlocks.sunnyQuartz, "botania:quartz_deconstruction");

deconstruct2x2Lossy(consumer, Items.GLOWSTONE_DUST, Blocks.GLOWSTONE);
deconstruct2x2Lossy(consumer, Items.BRICK, Blocks.BRICKS);
deconstruct2x2Lossy(consumer, Items.NETHER_BRICK, Blocks.NETHER_BRICKS);
deconstruct2x2Lossy(consumer, Items.POINTED_DRIPSTONE, Blocks.DRIPSTONE_BLOCK);
deconstruct2x2Lossy(consumer, Items.HONEYCOMB, Blocks.HONEYCOMB_BLOCK);
deconstruct2x2Lossy(consumer, Items.MAGMA_CREAM, Blocks.MAGMA_BLOCK);
deconstruct2x2Lossy(consumer, Items.AMETHYST_SHARD, Blocks.AMETHYST_BLOCK);

deconstruct3x3Lossless(consumer, Items.BAMBOO, Blocks.BAMBOO_BLOCK);
deconstruct3x3Lossless(consumer, Items.MELON_SLICE, Blocks.MELON);

}

private static final StateIngredient ALCHEMY = StateIngredients.of(BotaniaBlocks.alchemyCatalyst);
private static final StateIngredient CONJURATION = StateIngredients.of(BotaniaBlocks.conjurationCatalyst);

private static void normal(RecipeOutput consumer, ResourceLocation id, ItemStack output, Ingredient input, int mana) {
protected static void normal(RecipeOutput consumer, ResourceLocation id, ItemStack output, Ingredient input, int mana) {
consumer.accept(id, new ManaInfusionRecipe(output, input, mana, null, null), null);
}

private static void alchemy(RecipeOutput consumer, ResourceLocation id, ItemStack output, Ingredient input, int mana, @Nullable String group) {
protected static void alchemy(RecipeOutput consumer, ResourceLocation id, ItemStack output, Ingredient input, int mana, @Nullable String group) {
consumer.accept(id, new ManaInfusionRecipe(output, input, mana, group, ALCHEMY), null);
}

private static void alchemy(RecipeOutput consumer, ResourceLocation id, ItemStack output, Ingredient input, int mana) {
protected static void alchemy(RecipeOutput consumer, ResourceLocation id, ItemStack output, Ingredient input, int mana) {
alchemy(consumer, id, output, input, mana, null);
}

private static void conjuration(RecipeOutput consumer, ResourceLocation id, ItemStack output, Ingredient input, int mana) {
consumer.accept(id, new ManaInfusionRecipe(output, input, mana, "", CONJURATION), null);
protected static void deconstruct(RecipeOutput consumer, ResourceLocation id, ItemStack output, Ingredient input, int mana, @Nullable String group) {
consumer.accept(id, new ManaInfusionRecipe(output, input, mana, group, CONJURATION), null);
}

protected void cycle(RecipeOutput consumer, int cost, String group, ItemLike... items) {
Expand All @@ -220,8 +205,25 @@ protected void mini(RecipeOutput consumer, ItemLike mini, ItemLike full) {
alchemy(consumer, id(BuiltInRegistries.ITEM.getKey(mini.asItem()).getPath()), new ItemStack(mini), ingr(full), 2500, "botania:flower_shrinking");
}

protected void deconstruct(RecipeOutput consumer, ResourceLocation id, ItemLike items, ItemLike block) {
alchemy(consumer, id, new ItemStack(items, 4), ingr(block), 25, "botania:block_deconstruction");
protected void deconstruct(RecipeOutput consumer, ItemLike items, int count, ItemLike block, int mana, @Nullable String group) {
deconstruct(consumer, id(BuiltInRegistries.ITEM.getKey(block.asItem()).getPath() + "_deconstruct"),
new ItemStack(items, count), ingr(block), mana, group);
}

protected void deconstruct2x2(RecipeOutput consumer, ItemLike items, ItemLike block) {
deconstruct(consumer, items, 4, block, 30, "botania:lossless_2x2_deconstruction");
}

protected void deconstruct2x2Lossy(RecipeOutput consumer, ItemLike items, ItemLike block) {
deconstruct2x2Lossy(consumer, items, block, "botania:lossy_2x2_deconstruction");
}

protected void deconstruct2x2Lossy(RecipeOutput consumer, ItemLike items, ItemLike block, @Nullable String group) {
deconstruct(consumer, items, 3, block, 25, group);
}

protected void deconstruct3x3Lossless(RecipeOutput consumer, ItemLike items, ItemLike block) {
deconstruct(consumer, items, 9, block, 120, "botania:lossless_3x3_deconstruction");
}

protected ResourceLocation id(String s) {
Expand Down
Loading