From 0258e6bf8d7df4f3eb827f51a61d9388d2f22546 Mon Sep 17 00:00:00 2001 From: thedarkcolour <30441001+thedarkcolour@users.noreply.github.com> Date: Wed, 15 Jan 2025 18:30:15 -0800 Subject: [PATCH] Add support for Forestry bees, butterflies and Gendustry pollen kits --- build.gradle | 8 ++ .../ProductiveTreesForestryPlugin.java | 22 +++++ .../forestry/ProductiveTreesPollenType.java | 93 +++++++++++++++++++ .../productivetrees/util/TreeUtil.java | 21 +++++ .../forestry.api.plugin.IForestryPlugin | 1 + 5 files changed, 145 insertions(+) create mode 100644 src/main/java/cy/jdkdigital/productivetrees/integrations/forestry/ProductiveTreesForestryPlugin.java create mode 100644 src/main/java/cy/jdkdigital/productivetrees/integrations/forestry/ProductiveTreesPollenType.java create mode 100644 src/main/resources/META-INF/services/forestry.api.plugin.IForestryPlugin diff --git a/build.gradle b/build.gradle index ae6e6f410..bdf2c0028 100644 --- a/build.gradle +++ b/build.gradle @@ -125,6 +125,11 @@ repositories { flatDir { dir 'libs' } + maven { + name = 'ModKit' + url 'https://jitpack.io' + content { includeGroup 'com.github.thedarkcolour' } + } } dependencies { @@ -167,6 +172,9 @@ dependencies { implementation fg.deobf("curse.maven:pams-harvestcraft-2-crops-361385:4687624") implementation fg.deobf("curse.maven:pams-harvestcraft-2-pams-harvestcraft-2-trees-365460:4625518") implementation fg.deobf("curse.maven:pams-harvestcraft-2-food-extended-402231:4606448") + implementation fg.deobf("curse.maven:forestry-community-edition-1056828:6085417") + implementation fg.deobf("curse.maven:gendustry-community-edition-1179084:6089265") + implementation fg.deobf('com.github.thedarkcolour:ModKit:0302f9aa42') } def resourceTargets = ['META-INF/mods.toml', 'pack.mcmeta'] diff --git a/src/main/java/cy/jdkdigital/productivetrees/integrations/forestry/ProductiveTreesForestryPlugin.java b/src/main/java/cy/jdkdigital/productivetrees/integrations/forestry/ProductiveTreesForestryPlugin.java new file mode 100644 index 000000000..2b356c4de --- /dev/null +++ b/src/main/java/cy/jdkdigital/productivetrees/integrations/forestry/ProductiveTreesForestryPlugin.java @@ -0,0 +1,22 @@ +package cy.jdkdigital.productivetrees.integrations.forestry; + +import net.minecraft.resources.ResourceLocation; + +import forestry.api.plugin.IForestryPlugin; +import forestry.api.plugin.IPollenRegistration; + +import cy.jdkdigital.productivetrees.ProductiveTrees; + +public class ProductiveTreesForestryPlugin implements IForestryPlugin { + public static final ResourceLocation ID = new ResourceLocation(ProductiveTrees.MODID, "plugin"); + + @Override + public ResourceLocation id() { + return ID; + } + + @Override + public void registerPollen(IPollenRegistration pollen) { + pollen.registerPollenType(new ProductiveTreesPollenType()); + } +} diff --git a/src/main/java/cy/jdkdigital/productivetrees/integrations/forestry/ProductiveTreesPollenType.java b/src/main/java/cy/jdkdigital/productivetrees/integrations/forestry/ProductiveTreesPollenType.java new file mode 100644 index 000000000..e7c52b08b --- /dev/null +++ b/src/main/java/cy/jdkdigital/productivetrees/integrations/forestry/ProductiveTreesPollenType.java @@ -0,0 +1,93 @@ +package cy.jdkdigital.productivetrees.integrations.forestry; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.StringTag; +import net.minecraft.nbt.Tag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.BlockTags; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.state.BlockState; + +import forestry.api.genetics.pollen.IPollen; +import forestry.api.genetics.pollen.IPollenType; + +import cy.jdkdigital.productivetrees.ProductiveTrees; +import cy.jdkdigital.productivetrees.common.block.ProductiveLeavesBlock; +import cy.jdkdigital.productivetrees.registry.TreeFinder; +import cy.jdkdigital.productivetrees.registry.TreeObject; +import cy.jdkdigital.productivetrees.registry.TreeRegistrator; +import cy.jdkdigital.productivetrees.util.TreeUtil; +import org.jetbrains.annotations.Nullable; + +class ProductiveTreesPollenType implements IPollenType { + public static final ResourceLocation ID = new ResourceLocation(ProductiveTrees.MODID, "pollen"); + + @Override + public ResourceLocation id() { + return ID; + } + + @Override + public boolean canPollinate(LevelAccessor level, BlockPos pos, @Nullable Object pollinator) { + return level.getBlockState(pos).getBlock() instanceof ProductiveLeavesBlock; + } + + @Nullable + @Override + public IPollen tryCollectPollen(LevelAccessor level, BlockPos pos, @Nullable Object pollinator) { + if (level.getBlockState(pos).getBlock() instanceof ProductiveLeavesBlock leaves) { + return new Pollen(leaves.getTree()); + } + + return null; + } + + @Override + public boolean tryPollinate(LevelAccessor levelAccessor, BlockPos pos, TreeObject tree, @Nullable Object pollinator) { + BlockState state = levelAccessor.getBlockState(pos); + if (levelAccessor instanceof Level level && state.is(BlockTags.LEAVES) && !state.is(TreeRegistrator.POLLINATED_LEAVES.get())) { + TreeUtil.tryPollinatePosition(level, pos, TreeUtil.getBlock(tree.getId(), "_leaves")); + } + return false; + } + + @Override + public IPollen readNbt(Tag nbt) { + if (nbt instanceof StringTag string) { + return new Pollen(TreeFinder.trees.get(ResourceLocation.tryParse(string.getAsString()))); + } + + return null; + } + + private class Pollen implements IPollen { + private final TreeObject tree; + + private Pollen(TreeObject tree) { + this.tree = tree; + } + + @Override + public IPollenType getType() { + return ProductiveTreesPollenType.this; + } + + @Override + public TreeObject getPollen() { + return this.tree; + } + + @Nullable + @Override + public Tag writeNbt() { + return StringTag.valueOf(this.tree.getId().toString()); + } + + @Override + public ItemStack createStack() { + return TreeUtil.getPollen(TreeUtil.getBlock(this.tree.getId(), "_leaves")); + } + } +} diff --git a/src/main/java/cy/jdkdigital/productivetrees/util/TreeUtil.java b/src/main/java/cy/jdkdigital/productivetrees/util/TreeUtil.java index e1b2d53ad..504118c51 100644 --- a/src/main/java/cy/jdkdigital/productivetrees/util/TreeUtil.java +++ b/src/main/java/cy/jdkdigital/productivetrees/util/TreeUtil.java @@ -9,7 +9,9 @@ import cy.jdkdigital.productivetrees.common.block.ProductiveLogBlock; import cy.jdkdigital.productivetrees.common.block.ProductiveSaplingBlock; import cy.jdkdigital.productivetrees.common.block.ProductiveWoodBlock; +import cy.jdkdigital.productivetrees.common.block.entity.PollinatedLeavesBlockEntity; import cy.jdkdigital.productivetrees.common.block.entity.StripperBlockEntity; +import cy.jdkdigital.productivetrees.recipe.RecipeHelper; import cy.jdkdigital.productivetrees.recipe.SawmillRecipe; import cy.jdkdigital.productivetrees.registry.TreeFinder; import cy.jdkdigital.productivetrees.registry.TreeObject; @@ -31,6 +33,8 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.LevelEvent; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.Vec3; import net.minecraftforge.common.ToolActions; @@ -258,4 +262,21 @@ public static Block getBlock(ResourceLocation tree, String name) { public static TreeObject getTree(Block block) { return TreeFinder.trees.get(ForgeRegistries.BLOCKS.getKey(block).withPath(p -> p.replace("_log", "").replace("_wood", "").replace("_sapling", "").replace("_leaves", ""))); } + + public static boolean tryPollinatePosition(Level level, BlockPos pos, Block leafB) { + BlockState state = level.getBlockState(pos); + var recipe = RecipeHelper.getPollinationRecipe(level, state, leafB.defaultBlockState()); + if (recipe != null) { + level.setBlock(pos, TreeRegistrator.POLLINATED_LEAVES.get().defaultBlockState(), Block.UPDATE_ALL); + if (level.getBlockEntity(pos) instanceof PollinatedLeavesBlockEntity leaves) { + leaves.setLeafA(state.getBlock()); + leaves.setLeafB(leafB); + leaves.setResult(recipe.result); + leaves.setChanged(); + level.levelEvent(LevelEvent.PARTICLES_PLANT_GROWTH, pos, 0); + return true; + } + } + return false; + } } diff --git a/src/main/resources/META-INF/services/forestry.api.plugin.IForestryPlugin b/src/main/resources/META-INF/services/forestry.api.plugin.IForestryPlugin new file mode 100644 index 000000000..4275cb682 --- /dev/null +++ b/src/main/resources/META-INF/services/forestry.api.plugin.IForestryPlugin @@ -0,0 +1 @@ +cy.jdkdigital.productivetrees.integrations.forestry.ProductiveTreesForestryPlugin