From 62c2c57d4d7d3a0d6f4b9adeea55572c87c4693b Mon Sep 17 00:00:00 2001 From: vemacs Date: Tue, 1 Mar 2016 18:16:13 -0700 Subject: [PATCH] [Experimental] Support Unbreakable meta tag --- .../earth2me/essentials/MetaItemStack.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/Essentials/src/com/earth2me/essentials/MetaItemStack.java b/Essentials/src/com/earth2me/essentials/MetaItemStack.java index 803b0133b..dfaaeb067 100644 --- a/Essentials/src/com/earth2me/essentials/MetaItemStack.java +++ b/Essentials/src/com/earth2me/essentials/MetaItemStack.java @@ -19,6 +19,7 @@ import org.bukkit.potion.Potion; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; +import java.lang.reflect.Method; import java.util.*; import java.util.logging.Level; import java.util.regex.Pattern; @@ -167,6 +168,8 @@ public class MetaItemStack { final ItemMeta meta = stack.getItemMeta(); meta.setLore(lore); stack.setItemMeta(meta); + } else if (split.length > 1 && (split[0].equalsIgnoreCase("unbreakable") && hasMetaPermission(sender, "unbreakable", false, true, ess))) { + setUnbreakable(stack, Boolean.valueOf(split[1])); } else if (split.length > 1 && (split[0].equalsIgnoreCase("player") || split[0].equalsIgnoreCase("owner")) && stack.getType() == Material.SKULL_ITEM && hasMetaPermission(sender, "head", false, true, ess)) { if (stack.getDurability() == 3) { final String owner = split[1]; @@ -467,4 +470,26 @@ public class MetaItemStack { throw new Exception(tl("noMetaPerm", metaPerm)); } } + + private static Method spigotMethod; + private static Method setUnbreakableMethod; + + private void setUnbreakable(ItemStack is, boolean unbreakable) { + ItemMeta meta = is.getItemMeta(); + try { + if (spigotMethod == null) { + spigotMethod = meta.getClass().getDeclaredMethod("spigot"); + spigotMethod.setAccessible(true); + } + Object itemStackSpigot = spigotMethod.invoke(meta); + if (setUnbreakableMethod == null) { + setUnbreakableMethod = itemStackSpigot.getClass().getDeclaredMethod("setUnbreakable", Boolean.TYPE); + setUnbreakableMethod.setAccessible(true); + } + setUnbreakableMethod.invoke(itemStackSpigot, unbreakable); + is.setItemMeta(meta); + } catch (Throwable t) { + t.printStackTrace(); + } + } }