From 0a58b71e8bc7533687475027f36dc00b54dee819 Mon Sep 17 00:00:00 2001 From: mani123 <70480001+mani1232@users.noreply.github.com> Date: Sun, 14 May 2023 19:28:19 +0200 Subject: [PATCH] Use BlockDropItemEvent (#5) * Fixes * Use BlockDropItemEvent --- .../java/de/oliver/fancyperks/FancyPerks.java | 2 +- .../listeners/BlockBreakListener.java | 69 ------------------- .../listeners/BlockDropItemListener.java | 58 ++++++++++++++++ 3 files changed, 59 insertions(+), 70 deletions(-) delete mode 100644 src/main/java/de/oliver/fancyperks/listeners/BlockBreakListener.java create mode 100644 src/main/java/de/oliver/fancyperks/listeners/BlockDropItemListener.java diff --git a/src/main/java/de/oliver/fancyperks/FancyPerks.java b/src/main/java/de/oliver/fancyperks/FancyPerks.java index ddd6221..563fed9 100644 --- a/src/main/java/de/oliver/fancyperks/FancyPerks.java +++ b/src/main/java/de/oliver/fancyperks/FancyPerks.java @@ -116,7 +116,7 @@ public void onEnable() { pluginManager.registerEvents(new EntityDamageListener(), instance); pluginManager.registerEvents(new EntityDeathListener(), instance); pluginManager.registerEvents(new EntityTargetLivingEntityListener(), instance); - pluginManager.registerEvents(new BlockBreakListener(), instance); + pluginManager.registerEvents(new BlockDropItemListener(), instance); if(usingLuckPerms && config.isActivatePerkOnPermissionSet()){ new LuckPermsListener(); } diff --git a/src/main/java/de/oliver/fancyperks/listeners/BlockBreakListener.java b/src/main/java/de/oliver/fancyperks/listeners/BlockBreakListener.java deleted file mode 100644 index 6b60b12..0000000 --- a/src/main/java/de/oliver/fancyperks/listeners/BlockBreakListener.java +++ /dev/null @@ -1,69 +0,0 @@ -package de.oliver.fancyperks.listeners; - -import de.oliver.fancyperks.FancyPerks; -import de.oliver.fancyperks.PerkManager; -import de.oliver.fancyperks.perks.Perk; -import de.oliver.fancyperks.perks.PerkRegistry; -import org.bukkit.GameMode; -import org.bukkit.Material; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.inventory.ItemStack; - -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class BlockBreakListener implements Listener { - - private static final Map instantSmeltBlocks = new HashMap<>(); - static { - instantSmeltBlocks.put(Material.RAW_IRON, Material.IRON_INGOT); - instantSmeltBlocks.put(Material.RAW_GOLD, Material.GOLD_INGOT); - instantSmeltBlocks.put(Material.RAW_COPPER, Material.COPPER_INGOT); - } - - @EventHandler - public void onBlockBreak(BlockBreakEvent event){ - Player p = event.getPlayer(); - - if(p.getGameMode() != GameMode.SURVIVAL){ - return; - } - - Collection drops = event.getBlock().getDrops(); - event.setDropItems(false); - - PerkManager perkManager = FancyPerks.getInstance().getPerkManager(); - List perks = perkManager.getEnabledPerks(p); - - boolean hasInstantSmelt = perks.contains(PerkRegistry.INSTANT_SMELT); - if(hasInstantSmelt){ - drops.forEach(drop -> { - if (instantSmeltBlocks.containsKey(drop.getType())) { - Material ingot = instantSmeltBlocks.get(drop.getType()); - drop.setType(ingot); - } - }); - } - - boolean hasTelekinesis = perks.contains(PerkRegistry.TELEKINESIS); - if(hasTelekinesis){ - for (ItemStack drop : drops) { - HashMap couldNotFit = p.getInventory().addItem(drop); - for (ItemStack item : couldNotFit.values()) { - event.getBlock().getWorld().dropItemNaturally(event.getBlock().getLocation(), item); - } - } - } else { - for (ItemStack drop : drops) { - event.getBlock().getWorld().dropItemNaturally(event.getBlock().getLocation(), drop); - } - } - - } - -} diff --git a/src/main/java/de/oliver/fancyperks/listeners/BlockDropItemListener.java b/src/main/java/de/oliver/fancyperks/listeners/BlockDropItemListener.java new file mode 100644 index 0000000..5175d68 --- /dev/null +++ b/src/main/java/de/oliver/fancyperks/listeners/BlockDropItemListener.java @@ -0,0 +1,58 @@ +package de.oliver.fancyperks.listeners; + +import de.oliver.fancyperks.FancyPerks; +import de.oliver.fancyperks.PerkManager; +import de.oliver.fancyperks.perks.Perk; +import de.oliver.fancyperks.perks.PerkRegistry; +import org.bukkit.GameMode; +import org.bukkit.Material; +import org.bukkit.entity.Item; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.block.BlockDropItemEvent; +import org.bukkit.inventory.ItemStack; + +import java.util.*; + +public class BlockDropItemListener implements Listener { + + private static final EnumMap instantSmeltBlocks = new EnumMap<>( + Map.of( + Material.RAW_COPPER, Material.COPPER_INGOT, + Material.RAW_GOLD, Material.GOLD_INGOT, + Material.RAW_IRON, Material.IRON_INGOT + ) + ); + + @EventHandler + public void onBlockDropItem(BlockDropItemEvent event) { + Player p = event.getPlayer(); + if (p.getGameMode() == GameMode.SURVIVAL) { + Collection drops = event.getItems(); + + PerkManager perkManager = FancyPerks.getInstance().getPerkManager(); + Set perks = new HashSet<>(perkManager.getEnabledPerks(p)); + + boolean hasInstantSmelt = perks.contains(PerkRegistry.INSTANT_SMELT); + if (hasInstantSmelt) { + drops.forEach(drop -> { + Material dropType = drop.getItemStack().getType(); + if (instantSmeltBlocks.containsKey(dropType)) { + Material ingot = instantSmeltBlocks.get(dropType); + drop.getItemStack().setType(ingot); + } + }); + } + + boolean hasTelekinesis = perks.contains(PerkRegistry.TELEKINESIS); + if (hasTelekinesis) { + event.setCancelled(true); + HashMap couldNotFit = new HashMap<>(); + drops.forEach(drop -> couldNotFit.putAll(p.getInventory().addItem(drop.getItemStack()))); + couldNotFit.values().forEach(item -> event.getBlock().getWorld().dropItemNaturally(event.getBlock().getLocation(), item)); + } + } + } + +}