diff --git a/Essentials/src/main/java/com/earth2me/essentials/MetaItemStack.java b/Essentials/src/main/java/com/earth2me/essentials/MetaItemStack.java index f3d29b3824e..43e6c6f026e 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/MetaItemStack.java +++ b/Essentials/src/main/java/com/earth2me/essentials/MetaItemStack.java @@ -1,5 +1,6 @@ package com.earth2me.essentials; +import com.earth2me.essentials.items.transform.PluginItemTransformer; import com.earth2me.essentials.textreader.BookInput; import com.earth2me.essentials.textreader.BookPager; import com.earth2me.essentials.textreader.IText; @@ -53,6 +54,7 @@ public class MetaItemStack { private static final Map colorMap = new HashMap<>(); private static final Map fireworkShape = new HashMap<>(); + private static final transient Map itemTransformers = new HashMap<>(); private static boolean useNewSkullMethod = true; static { @@ -84,6 +86,32 @@ public MetaItemStack(final ItemStack stack) { this.stack = stack.clone(); } + /** + * Registers an item transformer, belonging to a plugin, that can manipulate certain item metadata. + * @param key the key for the transformer. + * @param itemTransformer the actual transformer. + */ + public static void registerItemTransformer(final String key, final PluginItemTransformer itemTransformer) { + //Warn people if they're trying to register over top of someone else. + if (itemTransformers.containsKey(key)) { + Essentials.getWrappedLogger().log(Level.WARNING, String.format("Plugin transformer registered to \"%s\" attempted to register already existing item transformer \"%s\" belonging to \"%s\"!", + itemTransformer.getPlugin().getName(), + key, + itemTransformers.get(key).getPlugin().getName())); + return; + } + + itemTransformers.put(key, itemTransformer); + } + + /** + * Unregisters a certain item transformer under key "key". + * @param key the transformer key. + */ + public static void unregisterItemTransformer(final String key) { + itemTransformers.remove(key); + } + private static void setSkullOwner(final IEssentials ess, final ItemStack stack, final String owner) { if (!(stack.getItemMeta() instanceof SkullMeta)) return; @@ -358,11 +386,28 @@ public void addStringMeta(final CommandSource sender, final boolean allowUnsafe, armorMeta.setTrim(new ArmorTrim(material, pattern)); stack.setItemMeta(armorMeta); + } else if (split.length > 1 && itemTransformers.containsKey(split[0])) { + transformItem(split[0], split[1]); } else { parseEnchantmentStrings(sender, allowUnsafe, split, ess); } } + private void transformItem(final String key, final String data){ + final PluginItemTransformer transformer = itemTransformers.get(key); + + //Ignore, the plugin is disabled. + if (!transformer.getPlugin().isEnabled()) { + return; + } + + try { + stack = transformer.apply(data, stack); + } catch(final Throwable thr) { + Essentials.getWrappedLogger().log(Level.SEVERE, String.format("Error applying data \"%s\" to itemstack! Plugin: %s, Key: %s", data, transformer.getPlugin().getName(), key), thr); + } + } + public void addItemFlags(final String string) throws Exception { final String[] separate = splitPattern.split(string, 2); if (separate.length != 2) { diff --git a/Essentials/src/main/java/com/earth2me/essentials/items/transform/PluginItemTransformer.java b/Essentials/src/main/java/com/earth2me/essentials/items/transform/PluginItemTransformer.java new file mode 100644 index 00000000000..e4a45c82f44 --- /dev/null +++ b/Essentials/src/main/java/com/earth2me/essentials/items/transform/PluginItemTransformer.java @@ -0,0 +1,22 @@ +package com.earth2me.essentials.items.transform; + +import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.Plugin; + +public abstract class PluginItemTransformer { + private final Plugin plugin; + + public PluginItemTransformer(final Plugin thePlugin) { + if (thePlugin == null) { + throw new IllegalArgumentException("Plugin cannot be null!"); + } + + this.plugin = thePlugin; + } + + public abstract ItemStack apply(String data, ItemStack original); + + public Plugin getPlugin() { + return plugin; + } +}