From 680b0af5d71094c3d920289c4a0b2ed363867f87 Mon Sep 17 00:00:00 2001 From: YouHaveTrouble Date: Sun, 20 Oct 2024 22:02:39 +0200 Subject: [PATCH] add replanting enchant --- .../youhavetrouble/enchantio/Enchantio.java | 3 +- .../enchantio/EnchantioBootstrap.java | 4 +- .../enchantio/enchants/ReplantingEnchant.java | 77 +++++++++++++++++++ .../listeners/ReplantingListener.java | 71 +++++++++++++++++ 4 files changed, 153 insertions(+), 2 deletions(-) create mode 100644 src/main/java/me/youhavetrouble/enchantio/enchants/ReplantingEnchant.java create mode 100644 src/main/java/me/youhavetrouble/enchantio/listeners/ReplantingListener.java diff --git a/src/main/java/me/youhavetrouble/enchantio/Enchantio.java b/src/main/java/me/youhavetrouble/enchantio/Enchantio.java index 866cb72..b4b7d64 100644 --- a/src/main/java/me/youhavetrouble/enchantio/Enchantio.java +++ b/src/main/java/me/youhavetrouble/enchantio/Enchantio.java @@ -1,5 +1,6 @@ package me.youhavetrouble.enchantio; +import me.youhavetrouble.enchantio.listeners.ReplantingListener; import me.youhavetrouble.enchantio.listeners.SoulboundListener; import me.youhavetrouble.enchantio.listeners.TelepathyListener; import org.bukkit.plugin.java.JavaPlugin; @@ -8,9 +9,9 @@ public final class Enchantio extends JavaPlugin { @Override public void onEnable() { - getServer().getPluginManager().registerEvents(new SoulboundListener(), this); getServer().getPluginManager().registerEvents(new TelepathyListener(), this); + getServer().getPluginManager().registerEvents(new ReplantingListener(), this); } @Override diff --git a/src/main/java/me/youhavetrouble/enchantio/EnchantioBootstrap.java b/src/main/java/me/youhavetrouble/enchantio/EnchantioBootstrap.java index 599cf99..9c750bb 100644 --- a/src/main/java/me/youhavetrouble/enchantio/EnchantioBootstrap.java +++ b/src/main/java/me/youhavetrouble/enchantio/EnchantioBootstrap.java @@ -10,6 +10,7 @@ import io.papermc.paper.registry.keys.tags.EnchantmentTagKeys; import io.papermc.paper.registry.keys.tags.ItemTypeTagKeys; import io.papermc.paper.tag.TagEntry; import me.youhavetrouble.enchantio.enchants.EnchantioEnchant; +import me.youhavetrouble.enchantio.enchants.ReplantingEnchant; import me.youhavetrouble.enchantio.enchants.SoulboundEnchant; import me.youhavetrouble.enchantio.enchants.TelepathyEnchant; import org.bukkit.enchantments.Enchantment; @@ -25,7 +26,8 @@ public class EnchantioBootstrap implements PluginBootstrap { Set enchantioEnchants = Set.of( new SoulboundEnchant(), - new TelepathyEnchant() + new TelepathyEnchant(), + new ReplantingEnchant() ); context.getLifecycleManager().registerEventHandler(LifecycleEvents.TAGS.preFlatten(RegistryKey.ITEM).newHandler((event) -> { diff --git a/src/main/java/me/youhavetrouble/enchantio/enchants/ReplantingEnchant.java b/src/main/java/me/youhavetrouble/enchantio/enchants/ReplantingEnchant.java new file mode 100644 index 0000000..9365c14 --- /dev/null +++ b/src/main/java/me/youhavetrouble/enchantio/enchants/ReplantingEnchant.java @@ -0,0 +1,77 @@ +package me.youhavetrouble.enchantio.enchants; + +import io.papermc.paper.registry.RegistryKey; +import io.papermc.paper.registry.data.EnchantmentRegistryEntry; +import io.papermc.paper.registry.keys.tags.ItemTypeTagKeys; +import io.papermc.paper.registry.tag.TagKey; +import io.papermc.paper.tag.TagEntry; +import net.kyori.adventure.key.Key; +import net.kyori.adventure.text.Component; +import org.bukkit.inventory.EquipmentSlotGroup; +import org.bukkit.inventory.ItemType; + +import java.util.Set; + +@SuppressWarnings("UnstableApiUsage") +public class ReplantingEnchant implements EnchantioEnchant { + + public static final Key KEY = Key.key("enchantio:replanting"); + + @Override + public Key getKey() { + return KEY; + } + + @Override + public Component getDescription() { + return Component.translatable("enchantio.enchant.replanting", "Replanting"); + } + + @Override + public int getAnvilCost() { + return 1; + } + + @Override + public int getMaxLevel() { + return 1; + } + + @Override + public int getWeight() { + return 10; + } + + @Override + public EnchantmentRegistryEntry.EnchantmentCost getMinimumCost() { + return EnchantmentRegistryEntry.EnchantmentCost.of(1, 1); + } + + @Override + public EnchantmentRegistryEntry.EnchantmentCost getMaximumCost() { + return EnchantmentRegistryEntry.EnchantmentCost.of(65, 1); + } + + @Override + public Iterable getActiveSlots() { + return Set.of(EquipmentSlotGroup.HAND); + } + + @Override + public boolean canGetFromEnchantingTable() { + return true; + } + + @Override + public TagKey getTagForSupportedItems() { + return TagKey.create(RegistryKey.ITEM, Key.key("enchantio:replanting_enchantable")); + } + + @Override + public Set> getSupportedItems() { + return Set.of( + TagEntry.tagEntry(ItemTypeTagKeys.HOES) + ); + } + +} diff --git a/src/main/java/me/youhavetrouble/enchantio/listeners/ReplantingListener.java b/src/main/java/me/youhavetrouble/enchantio/listeners/ReplantingListener.java new file mode 100644 index 0000000..6b730cc --- /dev/null +++ b/src/main/java/me/youhavetrouble/enchantio/listeners/ReplantingListener.java @@ -0,0 +1,71 @@ +package me.youhavetrouble.enchantio.listeners; + +import io.papermc.paper.registry.RegistryAccess; +import io.papermc.paper.registry.RegistryKey; +import me.youhavetrouble.enchantio.enchants.ReplantingEnchant; +import org.bukkit.*; +import org.bukkit.block.BlockState; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Item; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.block.BlockDropItemEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; + +public class ReplantingListener implements Listener { + + private final Registry enchantmentRegistry = RegistryAccess.registryAccess().getRegistry(RegistryKey.ENCHANTMENT); + private final Tag cropTag = Tag.CROPS; + private final Enchantment replanting = enchantmentRegistry.get(ReplantingEnchant.KEY); + + @EventHandler(ignoreCancelled = true, priority = EventPriority.NORMAL) + public void onReplantingTool(BlockDropItemEvent event) { + if (replanting == null) return; + + ItemStack tool = event.getPlayer().getInventory().getItemInMainHand(); + if (!tool.containsEnchantment(replanting)) return; + + BlockState block = event.getBlockState(); + + if (cropTag == null) return; + if (!cropTag.isTagged(block.getType())) return; + + Material placementMaterial = block.getBlockData().getPlacementMaterial(); + + Player player = event.getPlayer(); + PlayerInventory inventory = player.getInventory(); + + boolean removed = false; + + // try to remove seed from the player's inventory + for (ItemStack item : inventory.getContents()) { + if (item == null) continue; + if (item.getType() == placementMaterial) { + item.setAmount(item.getAmount() - 1); + removed = true; + break; + } + } + + if (!removed) { + // Try to remove the seed from the items dropped by the block + for (Item item : event.getItems()) { + ItemStack itemStack = item.getItemStack(); + if (itemStack.getType().equals(placementMaterial)) { + itemStack.setAmount(itemStack.getAmount() - 1); + removed = true; + break; + } + } + } + + if (!removed) return; + + // Replant the crop + event.getBlock().setType(block.getType()); + } + +}