From 053f7d5c7deabb9b7263436427ff8ea7b1ee9ae5 Mon Sep 17 00:00:00 2001 From: Intelli Date: Thu, 2 May 2024 12:52:35 -0600 Subject: [PATCH] Fixed NoSuchMethodError when shooting or dropping arrows (fixes #535) --- .../net/coreprotect/bukkit/BukkitAdapter.java | 21 ++++++++++++++++++ .../coreprotect/bukkit/BukkitInterface.java | 3 +++ .../net/coreprotect/bukkit/Bukkit_v1_20.java | 22 +++++++++++++++++++ .../coreprotect/listener/ListenerHandler.java | 1 + .../PlayerPickupArrowListener.java | 18 +++------------ .../player/ProjectileLaunchListener.java | 1 - 6 files changed, 50 insertions(+), 16 deletions(-) rename src/main/java/net/coreprotect/listener/{ => player}/PlayerPickupArrowListener.java (65%) diff --git a/src/main/java/net/coreprotect/bukkit/BukkitAdapter.java b/src/main/java/net/coreprotect/bukkit/BukkitAdapter.java index d1f3e19..a295551 100644 --- a/src/main/java/net/coreprotect/bukkit/BukkitAdapter.java +++ b/src/main/java/net/coreprotect/bukkit/BukkitAdapter.java @@ -13,6 +13,7 @@ import org.bukkit.block.BlockState; import org.bukkit.block.Sign; import org.bukkit.block.data.BlockData; import org.bukkit.block.data.Directional; +import org.bukkit.entity.Arrow; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.entity.ItemFrame; @@ -22,6 +23,10 @@ import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.MerchantRecipe; import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.inventory.meta.PotionMeta; +import org.bukkit.potion.PotionData; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionType; import net.coreprotect.config.ConfigHandler; import net.coreprotect.utility.Util; @@ -263,4 +268,20 @@ public class BukkitAdapter implements BukkitInterface { return true; } + @Override + public ItemStack getArrowMeta(Arrow arrow, ItemStack itemStack) { + PotionData data = arrow.getBasePotionData(); + if (data.getType() != PotionType.UNCRAFTABLE) { + itemStack = new ItemStack(Material.TIPPED_ARROW); + PotionMeta meta = (PotionMeta) itemStack.getItemMeta(); + meta.setBasePotionData(data); + for (PotionEffect effect : arrow.getCustomEffects()) { + meta.addCustomEffect(effect, false); + } + itemStack.setItemMeta(meta); + } + + return itemStack; + } + } diff --git a/src/main/java/net/coreprotect/bukkit/BukkitInterface.java b/src/main/java/net/coreprotect/bukkit/BukkitInterface.java index 995c4c9..48fe07e 100644 --- a/src/main/java/net/coreprotect/bukkit/BukkitInterface.java +++ b/src/main/java/net/coreprotect/bukkit/BukkitInterface.java @@ -9,6 +9,7 @@ import org.bukkit.block.Block; import org.bukkit.block.BlockState; import org.bukkit.block.Sign; import org.bukkit.block.data.BlockData; +import org.bukkit.entity.Arrow; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.entity.LivingEntity; @@ -84,4 +85,6 @@ public interface BukkitInterface { public boolean isSignFront(SignChangeEvent event); + public ItemStack getArrowMeta(Arrow arrow, ItemStack itemStack); + } diff --git a/src/main/java/net/coreprotect/bukkit/Bukkit_v1_20.java b/src/main/java/net/coreprotect/bukkit/Bukkit_v1_20.java index 83941c0..24aab04 100644 --- a/src/main/java/net/coreprotect/bukkit/Bukkit_v1_20.java +++ b/src/main/java/net/coreprotect/bukkit/Bukkit_v1_20.java @@ -11,9 +11,13 @@ import org.bukkit.block.BlockState; import org.bukkit.block.ChiseledBookshelf; import org.bukkit.block.Sign; import org.bukkit.block.sign.Side; +import org.bukkit.entity.Arrow; import org.bukkit.event.block.SignChangeEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.PotionMeta; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionType; import net.coreprotect.model.BlockGroup; @@ -254,4 +258,22 @@ public class Bukkit_v1_20 extends Bukkit_v1_19 implements BukkitInterface { return event.getSide().equals(Side.FRONT); } + @Override + public ItemStack getArrowMeta(Arrow arrow, ItemStack itemStack) { + PotionType potionType = arrow.getBasePotionType(); + Color color = arrow.getColor(); + if (potionType != null || color != null) { + itemStack = new ItemStack(Material.TIPPED_ARROW); + PotionMeta meta = (PotionMeta) itemStack.getItemMeta(); + meta.setBasePotionType(potionType); + meta.setColor(color); + for (PotionEffect effect : arrow.getCustomEffects()) { + meta.addCustomEffect(effect, false); + } + itemStack.setItemMeta(meta); + } + + return itemStack; + } + } diff --git a/src/main/java/net/coreprotect/listener/ListenerHandler.java b/src/main/java/net/coreprotect/listener/ListenerHandler.java index a974bc0..338b532 100644 --- a/src/main/java/net/coreprotect/listener/ListenerHandler.java +++ b/src/main/java/net/coreprotect/listener/ListenerHandler.java @@ -45,6 +45,7 @@ import net.coreprotect.listener.player.PlayerInteractEntityListener; import net.coreprotect.listener.player.PlayerInteractListener; import net.coreprotect.listener.player.PlayerItemBreakListener; import net.coreprotect.listener.player.PlayerJoinListener; +import net.coreprotect.listener.player.PlayerPickupArrowListener; import net.coreprotect.listener.player.PlayerQuitListener; import net.coreprotect.listener.player.PlayerTakeLecternBookListener; import net.coreprotect.listener.player.ProjectileLaunchListener; diff --git a/src/main/java/net/coreprotect/listener/PlayerPickupArrowListener.java b/src/main/java/net/coreprotect/listener/player/PlayerPickupArrowListener.java similarity index 65% rename from src/main/java/net/coreprotect/listener/PlayerPickupArrowListener.java rename to src/main/java/net/coreprotect/listener/player/PlayerPickupArrowListener.java index 9c80278..46a4d41 100644 --- a/src/main/java/net/coreprotect/listener/PlayerPickupArrowListener.java +++ b/src/main/java/net/coreprotect/listener/player/PlayerPickupArrowListener.java @@ -1,4 +1,4 @@ -package net.coreprotect.listener; +package net.coreprotect.listener.player; import org.bukkit.Material; import org.bukkit.entity.AbstractArrow; @@ -8,11 +8,8 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerPickupArrowEvent; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.PotionMeta; -import org.bukkit.potion.PotionData; -import org.bukkit.potion.PotionEffect; -import org.bukkit.potion.PotionType; +import net.coreprotect.bukkit.BukkitAdapter; import net.coreprotect.consumer.Queue; import net.coreprotect.listener.entity.EntityPickupItemListener; @@ -31,16 +28,7 @@ public final class PlayerPickupArrowListener extends Queue implements Listener { if (arrow instanceof Arrow) { Arrow arrowEntity = (Arrow) arrow; - PotionData data = arrowEntity.getBasePotionData(); - if (data.getType() != PotionType.UNCRAFTABLE) { - itemStack = new ItemStack(Material.TIPPED_ARROW); - PotionMeta meta = (PotionMeta) itemStack.getItemMeta(); - meta.setBasePotionData(data); - for (PotionEffect effect : arrowEntity.getCustomEffects()) { - meta.addCustomEffect(effect, false); - } - itemStack.setItemMeta(meta); - } + itemStack = BukkitAdapter.ADAPTER.getArrowMeta(arrowEntity, itemStack); } return itemStack; diff --git a/src/main/java/net/coreprotect/listener/player/ProjectileLaunchListener.java b/src/main/java/net/coreprotect/listener/player/ProjectileLaunchListener.java index 781c226..27cfeba 100644 --- a/src/main/java/net/coreprotect/listener/player/ProjectileLaunchListener.java +++ b/src/main/java/net/coreprotect/listener/player/ProjectileLaunchListener.java @@ -24,7 +24,6 @@ import net.coreprotect.config.Config; import net.coreprotect.config.ConfigHandler; import net.coreprotect.consumer.Queue; import net.coreprotect.database.logger.ItemLogger; -import net.coreprotect.listener.PlayerPickupArrowListener; import net.coreprotect.utility.Util; public final class ProjectileLaunchListener extends Queue implements Listener {