add replanting enchant

This commit is contained in:
2024-10-20 22:02:39 +02:00
parent d4a4c2acc7
commit 680b0af5d7
4 changed files with 153 additions and 2 deletions
@@ -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
@@ -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<EnchantioEnchant> enchantioEnchants = Set.of(
new SoulboundEnchant(),
new TelepathyEnchant()
new TelepathyEnchant(),
new ReplantingEnchant()
);
context.getLifecycleManager().registerEventHandler(LifecycleEvents.TAGS.preFlatten(RegistryKey.ITEM).newHandler((event) -> {
@@ -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<EquipmentSlotGroup> getActiveSlots() {
return Set.of(EquipmentSlotGroup.HAND);
}
@Override
public boolean canGetFromEnchantingTable() {
return true;
}
@Override
public TagKey<ItemType> getTagForSupportedItems() {
return TagKey.create(RegistryKey.ITEM, Key.key("enchantio:replanting_enchantable"));
}
@Override
public Set<TagEntry<ItemType>> getSupportedItems() {
return Set.of(
TagEntry.tagEntry(ItemTypeTagKeys.HOES)
);
}
}
@@ -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<Enchantment> enchantmentRegistry = RegistryAccess.registryAccess().getRegistry(RegistryKey.ENCHANTMENT);
private final Tag<Material> 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());
}
}