diff --git a/src/main/java/me/youhavetrouble/enchantio/events/EntityBeheadEvent.java b/src/main/java/me/youhavetrouble/enchantio/events/EntityBeheadEvent.java new file mode 100644 index 0000000..2ae56e3 --- /dev/null +++ b/src/main/java/me/youhavetrouble/enchantio/events/EntityBeheadEvent.java @@ -0,0 +1,53 @@ +package me.youhavetrouble.enchantio.events; + +import org.bukkit.entity.Entity; +import org.bukkit.event.Cancellable; +import org.bukkit.event.HandlerList; +import org.bukkit.event.entity.EntityEvent; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; + +/** + * Called when an entity is beheaded by a weapon with the Beheading enchantment. + */ +public class EntityBeheadEvent extends EntityEvent implements Cancellable { + + private static final HandlerList HANDLERS = new HandlerList(); + + private ItemStack headToDrop; + private boolean cancelled = false; + + public EntityBeheadEvent(@NotNull Entity entity, @NotNull ItemStack headToDrop) { + super(entity); + this.headToDrop = headToDrop; + } + + public @NotNull ItemStack getHeadToDrop() { + return headToDrop; + } + + public void setHeadToDrop(@NotNull ItemStack headToDrop) { + this.headToDrop = headToDrop; + } + + @Override + public boolean isCancelled() { + return cancelled; + } + + @Override + public void setCancelled(boolean cancel) { + this.cancelled = cancel; + } + + @Override + public @NotNull HandlerList getHandlers() { + return HANDLERS; + } + + @NotNull + public static HandlerList getHandlerList() { + return HANDLERS; + } + +} diff --git a/src/main/java/me/youhavetrouble/enchantio/listeners/BeheadingListener.java b/src/main/java/me/youhavetrouble/enchantio/listeners/BeheadingListener.java index ac34b87..dc4ac53 100644 --- a/src/main/java/me/youhavetrouble/enchantio/listeners/BeheadingListener.java +++ b/src/main/java/me/youhavetrouble/enchantio/listeners/BeheadingListener.java @@ -5,6 +5,8 @@ import io.papermc.paper.registry.RegistryKey; import me.youhavetrouble.enchantio.EnchantioConfig; import me.youhavetrouble.enchantio.enchants.BeheadingEnchant; import me.youhavetrouble.enchantio.enchants.EnchantioEnchant; +import me.youhavetrouble.enchantio.events.EntityBeheadEvent; +import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.Registry; import org.bukkit.enchantments.Enchantment; @@ -49,38 +51,46 @@ public class BeheadingListener implements Listener { if (ThreadLocalRandom.current().nextDouble() > chance) return; + ItemStack head = null; + switch (event.getEntity().getType()) { case ZOMBIE -> { if (listContainsItemType(event.getDrops(), Material.ZOMBIE_HEAD)) return; - event.getDrops().add(new ItemStack(org.bukkit.Material.ZOMBIE_HEAD)); + head = new ItemStack(org.bukkit.Material.ZOMBIE_HEAD); } case PIGLIN -> { if (listContainsItemType(event.getDrops(), Material.PIGLIN_HEAD)) return; - event.getDrops().add(new ItemStack(org.bukkit.Material.PIGLIN_HEAD)); + head = new ItemStack(org.bukkit.Material.PIGLIN_HEAD); } case WITHER_SKELETON -> { if (listContainsItemType(event.getDrops(), Material.WITHER_SKELETON_SKULL)) return; - event.getDrops().add(new ItemStack(org.bukkit.Material.WITHER_SKELETON_SKULL)); + head = new ItemStack(org.bukkit.Material.WITHER_SKELETON_SKULL); } case SKELETON -> { if (listContainsItemType(event.getDrops(), Material.SKELETON_SKULL)) return; - event.getDrops().add(new ItemStack(org.bukkit.Material.SKELETON_SKULL)); + head = new ItemStack(org.bukkit.Material.SKELETON_SKULL); } case CREEPER -> { if (listContainsItemType(event.getDrops(), Material.CREEPER_HEAD)) return; - event.getDrops().add(new ItemStack(org.bukkit.Material.CREEPER_HEAD)); + head = new ItemStack(org.bukkit.Material.CREEPER_HEAD); } case ENDER_DRAGON -> { if (listContainsItemType(event.getDrops(), Material.DRAGON_HEAD)) return; - event.getDrops().add(new ItemStack(org.bukkit.Material.DRAGON_HEAD)); + head = new ItemStack(org.bukkit.Material.DRAGON_HEAD); } case PLAYER -> { if (listContainsItemType(event.getDrops(), Material.PLAYER_HEAD)) return; Player player = (Player) event.getEntity(); - event.getDrops().add(getPlayerHead(player)); + head = getPlayerHead(player); } } + if (head == null) return; + EntityBeheadEvent beheadEvent = new EntityBeheadEvent(event.getEntity(), head); + Bukkit.getPluginManager().callEvent(beheadEvent); + if (beheadEvent.isCancelled()) return; + event.getDrops().add(beheadEvent.getHeadToDrop()); + } private boolean listContainsItemType(@NotNull Iterable list, @NotNull Material type) {