From 2056e62e0198b4ad92079ec8d805ef7597a2a37c Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Sun, 1 Sep 2019 18:53:02 +0200 Subject: [PATCH] Fixed Explosive Shovel duplication bug --- .../SlimefunItem/items/ExplosivePickaxe.java | 106 ++++++++++++++++++ .../SlimefunItem/items/ExplosiveShovel.java | 90 +++++++++++++++ .../Slimefun/SlimefunPlugin.java | 9 +- 3 files changed, 204 insertions(+), 1 deletion(-) create mode 100644 src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/ExplosivePickaxe.java create mode 100644 src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/ExplosiveShovel.java diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/ExplosivePickaxe.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/ExplosivePickaxe.java new file mode 100644 index 000000000..2d93e06be --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/ExplosivePickaxe.java @@ -0,0 +1,106 @@ +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items; + +import java.util.List; +import java.util.Random; + +import org.bukkit.Effect; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.block.Block; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.inventory.ItemStack; + +import me.mrCookieSlime.CSCoreLibPlugin.CSCoreLib; +import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; +import me.mrCookieSlime.CSCoreLibPlugin.general.Player.PlayerInventory; +import me.mrCookieSlime.CSCoreLibPlugin.general.String.StringUtils; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; +import me.mrCookieSlime.Slimefun.Lists.RecipeType; +import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; +import me.mrCookieSlime.Slimefun.Objects.Category; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.HandledBlock; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.UnregisterReason; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.Interfaces.NotPlaceable; +import me.mrCookieSlime.Slimefun.Objects.handlers.BlockBreakHandler; +import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; +import me.mrCookieSlime.Slimefun.api.BlockStorage; +import me.mrCookieSlime.Slimefun.api.Slimefun; + +public class ExplosivePickaxe extends SlimefunItem implements NotPlaceable { + + private String[] blacklist; + private boolean damageOnUse; + + public ExplosivePickaxe(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, String[] keys, Object[] values) { + super(category, item, id, recipeType, recipe, keys, values); + } + + @Override + public void register(boolean slimefun) { + Random random = new Random(); + + addItemHandler(new BlockBreakHandler() { + + @Override + public boolean onBlockBreak(BlockBreakEvent e, ItemStack item, int fortune, List drops) { + if (SlimefunManager.isItemSimiliar(item, SlimefunItems.EXPLOSIVE_PICKAXE, true)) { + e.getBlock().getWorld().createExplosion(e.getBlock().getLocation(), 0.0F); + e.getBlock().getWorld().playSound(e.getBlock().getLocation(), Sound.ENTITY_GENERIC_EXPLODE, 1F, 1F); + for (int x = -1; x <= 1; x++) { + for (int y = -1; y <= 1; y++) { + for (int z = -1; z <= 1; z++) { + Block b = e.getBlock().getRelative(x, y, z); + if (b.getType() != Material.AIR && !b.isLiquid() && !StringUtils.equals(b.getType().toString(), blacklist) && CSCoreLib.getLib().getProtectionManager().canBuild(e.getPlayer().getUniqueId(), b)) { + if (SlimefunPlugin.getHooks().isCoreProtectInstalled()) { + SlimefunPlugin.getHooks().getCoreProtectAPI().logRemoval(e.getPlayer().getName(), b.getLocation(), b.getType(), b.getBlockData()); + } + + b.getWorld().playEffect(b.getLocation(), Effect.STEP_SOUND, b.getType()); + SlimefunItem sfItem = BlockStorage.check(b); + boolean allow = false; + + if (sfItem != null && !(sfItem instanceof HandledBlock)) { + if (SlimefunPlugin.getUtilities().blockHandlers.containsKey(sfItem.getID())) { + allow = SlimefunPlugin.getUtilities().blockHandlers.get(sfItem.getID()).onBreak(e.getPlayer(), e.getBlock(), sfItem, UnregisterReason.PLAYER_BREAK); + } + if (allow) { + drops.add(BlockStorage.retrieve(e.getBlock())); + } + } + else if (b.getType() == Material.PLAYER_HEAD) { + b.breakNaturally(); + } + else if (b.getType().name().endsWith("_SHULKER_BOX")) { + b.breakNaturally(); + } + else { + for (ItemStack drop: b.getDrops()) { + b.getWorld().dropItemNaturally(b.getLocation(), (b.getType().toString().endsWith("_ORE") && b.getType() != Material.IRON_ORE && b.getType() != Material.GOLD_ORE) ? new CustomItem(drop, fortune): drop); + } + b.setType(Material.AIR); + } + if (damageOnUse && !item.getEnchantments().containsKey(Enchantment.DURABILITY) || random.nextInt(100) <= (60 + 40 / (item.getEnchantmentLevel(Enchantment.DURABILITY) + 1))) { + PlayerInventory.damageItemInHand(e.getPlayer()); + } + } + } + } + } + + PlayerInventory.update(e.getPlayer()); + return true; + } + else return false; + } + }); + + super.register(slimefun); + damageOnUse = ((Boolean) Slimefun.getItemValue(getID(), "damage-on-use")); + + Object value = Slimefun.getItemValue(getID(), "unbreakable-blocks"); + blacklist = ((List) value).stream().toArray(String[]::new); + } + +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/ExplosiveShovel.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/ExplosiveShovel.java new file mode 100644 index 000000000..e13df26c3 --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/ExplosiveShovel.java @@ -0,0 +1,90 @@ +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items; + +import java.util.List; +import java.util.Random; + +import org.bukkit.Effect; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.block.Block; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.inventory.ItemStack; + +import io.github.thebusybiscuit.cscorelib2.materials.MaterialTools; +import me.mrCookieSlime.CSCoreLibPlugin.CSCoreLib; +import me.mrCookieSlime.CSCoreLibPlugin.general.Player.PlayerInventory; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; +import me.mrCookieSlime.Slimefun.Lists.RecipeType; +import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; +import me.mrCookieSlime.Slimefun.Objects.Category; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.Interfaces.NotPlaceable; +import me.mrCookieSlime.Slimefun.Objects.handlers.BlockBreakHandler; +import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; +import me.mrCookieSlime.Slimefun.api.Slimefun; + +public class ExplosiveShovel extends SlimefunItem implements NotPlaceable { + + private boolean damageOnUse; + + public ExplosiveShovel(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, String[] keys, Object[] values) { + super(category, item, id, recipeType, recipe, keys, values); + } + + @Override + public void register(boolean slimefun) { + Random random = new Random(); + + addItemHandler(new BlockBreakHandler() { + + @Override + public boolean onBlockBreak(BlockBreakEvent e, ItemStack item, int fortune, List drops) { + if (SlimefunManager.isItemSimiliar(item, SlimefunItems.EXPLOSIVE_SHOVEL, true)) { + e.getBlock().getWorld().createExplosion(e.getBlock().getLocation(), 0.0F); + e.getBlock().getWorld().playSound(e.getBlock().getLocation(), Sound.ENTITY_GENERIC_EXPLODE, 1F, 1F); + for (int x = -1; x <= 1; x++) { + for (int y = -1; y <= 1; y++) { + for (int z = -1; z <= 1; z++) { + Block b = e.getBlock().getRelative(x, y, z); + boolean correctType = false; + for (Material mat : MaterialTools.getShovelItems()) { + if (b.getType() == mat) { + correctType = true; + break; + } + } + if (correctType) { + if (CSCoreLib.getLib().getProtectionManager().canBuild(e.getPlayer().getUniqueId(), b)) { + if (SlimefunPlugin.getHooks().isCoreProtectInstalled()) { + SlimefunPlugin.getHooks().getCoreProtectAPI().logRemoval(e.getPlayer().getName(), b.getLocation(), b.getType(), b.getBlockData()); + } + + b.getWorld().playEffect(b.getLocation(), Effect.STEP_SOUND, b.getType()); + for (ItemStack drop: b.getDrops()) { + b.getWorld().dropItemNaturally(b.getLocation(), drop); + } + b.setType(Material.AIR); + if (damageOnUse) { + if (!item.getEnchantments().containsKey(Enchantment.DURABILITY) || random.nextInt(100) <= (60 + 40 / (item.getEnchantmentLevel(Enchantment.DURABILITY) + 1))) { + PlayerInventory.damageItemInHand(e.getPlayer()); + } + } + } + } + } + } + } + + PlayerInventory.update(e.getPlayer()); + return true; + } + else return false; + } + }); + + super.register(slimefun); + damageOnUse = ((Boolean) Slimefun.getItemValue(getID(), "damage-on-use")); + } + +} diff --git a/src/me/mrCookieSlime/Slimefun/SlimefunPlugin.java b/src/me/mrCookieSlime/Slimefun/SlimefunPlugin.java index e468f6b29..5d8c94f7d 100644 --- a/src/me/mrCookieSlime/Slimefun/SlimefunPlugin.java +++ b/src/me/mrCookieSlime/Slimefun/SlimefunPlugin.java @@ -12,6 +12,7 @@ import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; +import io.github.thebusybiscuit.cscorelib2.protection.ProtectionManager; import io.github.thebusybiscuit.cscorelib2.updater.BukkitUpdater; import io.github.thebusybiscuit.cscorelib2.updater.GitHubBuildsUpdater; import io.github.thebusybiscuit.cscorelib2.updater.Updater; @@ -86,6 +87,7 @@ public final class SlimefunPlugin extends JavaPlugin { private Config config; public GPSNetwork gps = new GPSNetwork(); + private ProtectionManager protections; private Utilities utilities = new Utilities(); private Settings settings; private SlimefunHooks hooks; @@ -186,7 +188,7 @@ public final class SlimefunPlugin extends JavaPlugin { try { SlimefunSetup.setupItems(); } catch (Exception x) { - getLogger().log(Level.SEVERE, "An Error occured while initializing SlimefunItems for Slimefun " + Slimefun.getVersion()); + getLogger().log(Level.SEVERE, "An Error occured while initializing SlimefunItems for Slimefun " + Slimefun.getVersion(), x); } MiscSetup.loadDescriptions(); @@ -240,6 +242,7 @@ public final class SlimefunPlugin extends JavaPlugin { // Initiating various Stuff and all Items with a slightly delay (0ms after the Server finished loading) getServer().getScheduler().scheduleSyncDelayedTask(this, () -> { + protections = new ProtectionManager(getServer()); MiscSetup.loadItems(settings); for (World world: Bukkit.getWorlds()) { @@ -428,4 +431,8 @@ public final class SlimefunPlugin extends JavaPlugin { return instance != null; } + public static ProtectionManager getProtectionManager() { + return instance.protections; + } + }