From ad462d1b503d70ced211c4b0e83aa3a0e4f551d6 Mon Sep 17 00:00:00 2001 From: SoSeDiK Date: Tue, 26 Mar 2019 22:51:04 +0200 Subject: [PATCH 1/3] Added BlockBreakHandler for REPAIRED_SPAWNER --- .../Slimefun/Setup/SlimefunSetup.java | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/src/me/mrCookieSlime/Slimefun/Setup/SlimefunSetup.java b/src/me/mrCookieSlime/Slimefun/Setup/SlimefunSetup.java index f6c0de546..f084c84af 100644 --- a/src/me/mrCookieSlime/Slimefun/Setup/SlimefunSetup.java +++ b/src/me/mrCookieSlime/Slimefun/Setup/SlimefunSetup.java @@ -42,6 +42,7 @@ import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.event.entity.FoodLevelChangeEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.BlockStateMeta; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; @@ -1841,8 +1842,9 @@ public class SlimefunSetup { @Override public boolean onBlockBreak(BlockBreakEvent e, ItemStack item, int fortune, List drops) { - if (SlimefunManager.isItemSimiliar(e.getPlayer().getInventory().getItemInMainHand(), SlimefunItems.PICKAXE_OF_CONTAINMENT, true)) { + if (SlimefunManager.isItemSimiliar(item, SlimefunItems.PICKAXE_OF_CONTAINMENT, true)) { if (e.getBlock().getType() != Material.SPAWNER) return true; + BlockStorage.retrieve(e.getBlock()); ItemStack spawner = SlimefunItems.BROKEN_SPAWNER.clone(); ItemMeta im = spawner.getItemMeta(); List lore = im.getLore(); @@ -2924,6 +2926,30 @@ public class SlimefunSetup { } else return false; } + }, new BlockBreakHandler() { + + @Override + public boolean onBlockBreak(BlockBreakEvent e, ItemStack item, int fortune, List drops) { + SlimefunItem spawner = BlockStorage.check(e.getBlock()); + if (spawner != null && SlimefunManager.isItemSimiliar(spawner.getItem(), SlimefunItems.REPAIRED_SPAWNER, false)) { + BlockStorage.retrieve(e.getBlock()); + if (SlimefunManager.isItemSimiliar(item, SlimefunItems.PICKAXE_OF_CONTAINMENT, true)) { + ItemStack sp = SlimefunItems.BROKEN_SPAWNER.clone(); + ItemMeta im = sp.getItemMeta(); + List lore = im.getLore(); + for (int i = 0; i < lore.size(); i++) { + if (lore.get(i).contains("")) lore.set(i, lore.get(i).replace("", StringUtils.format(((CreatureSpawner) e.getBlock().getState()).getSpawnedType().toString()))); + } + im.setLore(lore); + sp.setItemMeta(im); + BlockStorage.retrieve(e.getBlock()); + e.getBlock().getLocation().getWorld().dropItemNaturally(e.getBlock().getLocation(), sp); + e.setExpToDrop(0); + } + return true; + } + else return false; + } }); new EnhancedFurnace(1, 1, 1, SlimefunItems.ENHANCED_FURNACE, "ENHANCED_FURNACE", From cb9f1b40f7ec404223d9cad96debdea5d47e5007 Mon Sep 17 00:00:00 2001 From: SoSeDiK Date: Tue, 26 Mar 2019 22:52:27 +0200 Subject: [PATCH 2/3] Fixed Block Place & Break Handlers not being fired for blocks Needed for blocks like REPAIRED_SPAWNER whick can't be written using "SlimefunItem.blockhandler". --- .../Slimefun/listeners/ToolListener.java | 30 ++++++++++++------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/src/me/mrCookieSlime/Slimefun/listeners/ToolListener.java b/src/me/mrCookieSlime/Slimefun/listeners/ToolListener.java index a57f088f0..000eb0646 100644 --- a/src/me/mrCookieSlime/Slimefun/listeners/ToolListener.java +++ b/src/me/mrCookieSlime/Slimefun/listeners/ToolListener.java @@ -43,7 +43,7 @@ public class ToolListener implements Listener { plugin.getServer().getPluginManager().registerEvents(this, plugin); } - @EventHandler(priority=EventPriority.MONITOR, ignoreCancelled = true) + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onBlockRegister(BlockPlaceEvent e) { if (BlockStorage.hasBlockInfo(e.getBlock())) { e.setCancelled(true); @@ -52,14 +52,18 @@ public class ToolListener implements Listener { ItemStack item = e.getItemInHand(); if (item != null && item.getType() == Material.INK_SAC) return; SlimefunItem sfItem = SlimefunItem.getByItem(item); - if (sfItem != null && !(sfItem instanceof NotPlaceable)){ + if (sfItem != null && !(sfItem instanceof NotPlaceable)) { BlockStorage.addBlockInfo(e.getBlock(), "id", sfItem.getID(), true); if (SlimefunItem.blockhandler.containsKey(sfItem.getID())) { SlimefunItem.blockhandler.get(sfItem.getID()).onPlace(e.getPlayer(), e.getBlock(), sfItem); + } else { + for (ItemHandler handler : SlimefunItem.getHandlers("BlockPlaceHandler")) { + if (((BlockPlaceHandler) handler).onBlockPlace(e, item)) break; + } } } else { - for (ItemHandler handler: SlimefunItem.getHandlers("BlockPlaceHandler")) { + for (ItemHandler handler : SlimefunItem.getHandlers("BlockPlaceHandler")) { if (((BlockPlaceHandler) handler).onBlockPlace(e, item)) break; } } @@ -165,15 +169,15 @@ public class ToolListener implements Listener { } - @EventHandler(priority=EventPriority.MONITOR, ignoreCancelled = true) + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onBlockBreak(BlockBreakEvent e) { boolean allow = true; List drops = new ArrayList(); - ItemStack item = e.getPlayer().getInventory().getItemInMainHand(); + ItemStack item = e.getPlayer().getEquipment().getItemInMainHand(); int fortune = 1; Block block2 = e.getBlock().getRelative(BlockFace.UP); - if (StringUtils.equals(block2.getType().toString(), "SAPLING", "WOOD_PLATE", "STONE_PLATE", "IRON_PLATE", "GOLD_PLATE")) { + if (StringUtils.equals(block2.getType().toString(), "SAPLING", "WOOD_PLATE", "STONE_PLATE", "IRON_PLATE", "GOLD_PLATE")) { // ToDo: 1.13 Material names SlimefunItem sfItem = BlockStorage.check(e.getBlock().getRelative(BlockFace.UP)); if (sfItem != null && !(sfItem instanceof HandledBlock)) { if (SlimefunItem.blockhandler.containsKey(sfItem.getID())) { @@ -194,6 +198,10 @@ public class ToolListener implements Listener { if (sfItem != null && !(sfItem instanceof HandledBlock)) { if (SlimefunItem.blockhandler.containsKey(sfItem.getID())) { allow = SlimefunItem.blockhandler.get(sfItem.getID()).onBreak(e.getPlayer(), e.getBlock(), sfItem, UnregisterReason.PLAYER_BREAK); + } else { + for (ItemHandler handler : SlimefunItem.getHandlers("BlockBreakHandler")) { + if (((BlockBreakHandler) handler).onBlockBreak(e, item, fortune, drops)) return; + } } if (allow) { drops.add(BlockStorage.retrieve(e.getBlock())); @@ -203,21 +211,20 @@ public class ToolListener implements Listener { return; } } - else if (item != null){ + else if (item != null) { if (item.getEnchantments().containsKey(Enchantment.LOOT_BONUS_BLOCKS) && !item.getEnchantments().containsKey(Enchantment.SILK_TOUCH)) { fortune = SlimefunStartup.randomize(item.getEnchantmentLevel(Enchantment.LOOT_BONUS_BLOCKS) + 2) - 1; if (fortune <= 0) fortune = 1; fortune = (e.getBlock().getType() == Material.LAPIS_ORE ? 4 + SlimefunStartup.randomize(5) : 1) * (fortune + 1); } - - for (ItemHandler handler: SlimefunItem.getHandlers("BlockBreakHandler")) { + for (ItemHandler handler : SlimefunItem.getHandlers("BlockBreakHandler")) { if (((BlockBreakHandler) handler).onBlockBreak(e, item, fortune, drops)) break; } } if (!drops.isEmpty()) { e.getBlock().setType(Material.AIR); - for (ItemStack drop: drops) { + for (ItemStack drop : drops) { if (drop != null) { e.getBlock().getWorld().dropItemNaturally(e.getBlock().getLocation(), drop); } @@ -225,7 +232,7 @@ public class ToolListener implements Listener { } } - @EventHandler(priority=EventPriority.MONITOR, ignoreCancelled=true) + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onEntityExplode(EntityExplodeEvent e) { Iterator blocks = e.blockList().iterator(); while (blocks.hasNext()) { @@ -254,4 +261,5 @@ public class ToolListener implements Listener { SlimefunItem item = BlockStorage.check(block); if (item != null) e.setCancelled(true); } + } From 0561cf9e05316e6af26c43a407455781a137e07a Mon Sep 17 00:00:00 2001 From: SoSeDiK Date: Tue, 26 Mar 2019 22:56:40 +0200 Subject: [PATCH 3/3] Optimized code --- .../Slimefun/Setup/SlimefunSetup.java | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/src/me/mrCookieSlime/Slimefun/Setup/SlimefunSetup.java b/src/me/mrCookieSlime/Slimefun/Setup/SlimefunSetup.java index f084c84af..61cae426e 100644 --- a/src/me/mrCookieSlime/Slimefun/Setup/SlimefunSetup.java +++ b/src/me/mrCookieSlime/Slimefun/Setup/SlimefunSetup.java @@ -1844,7 +1844,7 @@ public class SlimefunSetup { public boolean onBlockBreak(BlockBreakEvent e, ItemStack item, int fortune, List drops) { if (SlimefunManager.isItemSimiliar(item, SlimefunItems.PICKAXE_OF_CONTAINMENT, true)) { if (e.getBlock().getType() != Material.SPAWNER) return true; - BlockStorage.retrieve(e.getBlock()); + BlockStorage.clearBlockInfo(e.getBlock()); ItemStack spawner = SlimefunItems.BROKEN_SPAWNER.clone(); ItemMeta im = spawner.getItemMeta(); List lore = im.getLore(); @@ -2932,20 +2932,9 @@ public class SlimefunSetup { public boolean onBlockBreak(BlockBreakEvent e, ItemStack item, int fortune, List drops) { SlimefunItem spawner = BlockStorage.check(e.getBlock()); if (spawner != null && SlimefunManager.isItemSimiliar(spawner.getItem(), SlimefunItems.REPAIRED_SPAWNER, false)) { - BlockStorage.retrieve(e.getBlock()); - if (SlimefunManager.isItemSimiliar(item, SlimefunItems.PICKAXE_OF_CONTAINMENT, true)) { - ItemStack sp = SlimefunItems.BROKEN_SPAWNER.clone(); - ItemMeta im = sp.getItemMeta(); - List lore = im.getLore(); - for (int i = 0; i < lore.size(); i++) { - if (lore.get(i).contains("")) lore.set(i, lore.get(i).replace("", StringUtils.format(((CreatureSpawner) e.getBlock().getState()).getSpawnedType().toString()))); - } - im.setLore(lore); - sp.setItemMeta(im); - BlockStorage.retrieve(e.getBlock()); - e.getBlock().getLocation().getWorld().dropItemNaturally(e.getBlock().getLocation(), sp); - e.setExpToDrop(0); - } + if (SlimefunManager.isItemSimiliar(item, SlimefunItems.PICKAXE_OF_CONTAINMENT, true)) + return false; + BlockStorage.clearBlockInfo(e.getBlock()); return true; } else return false;