From 352c92b8803cacf835af2a8c66935c36fba296b7 Mon Sep 17 00:00:00 2001 From: Ali Moghnieh Date: Mon, 25 Jul 2016 12:06:24 +0100 Subject: [PATCH] Implement Shield item serialization. --- .../src/com/earth2me/essentials/ItemDb.java | 13 ++++++++ .../earth2me/essentials/MetaItemStack.java | 30 +++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/Essentials/src/com/earth2me/essentials/ItemDb.java b/Essentials/src/com/earth2me/essentials/ItemDb.java index 8acde883a..4f2558596 100644 --- a/Essentials/src/com/earth2me/essentials/ItemDb.java +++ b/Essentials/src/com/earth2me/essentials/ItemDb.java @@ -8,6 +8,7 @@ import org.bukkit.Bukkit; import org.bukkit.Color; import org.bukkit.FireworkEffect; import org.bukkit.Material; +import org.bukkit.block.Banner; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.EntityType; import org.bukkit.inventory.ItemStack; @@ -353,6 +354,18 @@ public class ItemDb implements IConf, net.ess3.api.IItemDb { } } break; + case SHIELD: + // Hacky fix for accessing Shield meta - https://github.com/drtshock/Essentials/pull/745#issuecomment-234843795 + BlockStateMeta shieldMeta = (BlockStateMeta) is.getItemMeta(); + Banner shieldBannerMeta = (Banner) shieldMeta.getBlockState(); + int basecolor = shieldBannerMeta.getBaseColor().getColor().asRGB(); + sb.append("basecolor:").append(basecolor).append(" "); + for (org.bukkit.block.banner.Pattern p : shieldBannerMeta.getPatterns()) { + String type = p.getPattern().getIdentifier(); + int color = p.getColor().getColor().asRGB(); + sb.append(type).append(",").append(color).append(" "); + } + break; } return sb.toString().trim().replaceAll("ยง", "&"); diff --git a/Essentials/src/com/earth2me/essentials/MetaItemStack.java b/Essentials/src/com/earth2me/essentials/MetaItemStack.java index f06a5eb58..9bfa6579f 100644 --- a/Essentials/src/com/earth2me/essentials/MetaItemStack.java +++ b/Essentials/src/com/earth2me/essentials/MetaItemStack.java @@ -11,6 +11,7 @@ import org.bukkit.Color; import org.bukkit.DyeColor; import org.bukkit.FireworkEffect; import org.bukkit.Material; +import org.bukkit.block.Banner; import org.bukkit.block.banner.PatternType; import org.bukkit.enchantments.Enchantment; import org.bukkit.inventory.ItemStack; @@ -154,9 +155,14 @@ public class MetaItemStack { } Material banner = null; + Material shield = null; try { + // 1.8 banner = Material.valueOf("BANNER"); + + // 1.9 + shield = Material.valueOf("SHIELD"); } catch(IllegalArgumentException ignored){} if (split.length > 1 && split[0].equalsIgnoreCase("name") && hasMetaPermission(sender, "name", false, true, ess)) { @@ -212,6 +218,8 @@ public class MetaItemStack { addPotionMeta(sender, false, string, ess); } else if (banner != null && stack.getType() == banner) { //WARNING - Meta for banners will be ignored after this point. addBannerMeta(sender, false, string, ess); + } else if (shield != null && stack.getType() == shield) { //WARNING - Meta for shields will be ignored after this point. + addBannerMeta(sender, false, string, ess); } else if (split.length > 1 && (split[0].equalsIgnoreCase("color") || split[0].equalsIgnoreCase("colour")) && (stack.getType() == Material.LEATHER_BOOTS || stack.getType() == Material.LEATHER_CHESTPLATE || stack.getType() == Material.LEATHER_HELMET || stack.getType() == Material.LEATHER_LEGGINGS)) { final String[] color = split[1].split("(\\||,)"); if(color.length == 1 && (NumberUtil.isInt(color[0]) || color[0].startsWith("#"))) { // int rgb and hex @@ -453,6 +461,28 @@ public class MetaItemStack { meta.addPattern(pattern); } + stack.setItemMeta(meta); + } else if (stack.getType() == Material.SHIELD && string != null) { + final String[] split = splitPattern.split(string, 2); + + if (split.length < 2) { + throw new Exception(tl("invalidBanner", split[1])); + } + + // Hacky fix for accessing Shield meta - https://github.com/drtshock/Essentials/pull/745#issuecomment-234843795 + BlockStateMeta meta = (BlockStateMeta) stack.getItemMeta(); + Banner banner = (Banner) meta.getBlockState(); + if (split[0].equalsIgnoreCase("basecolor")) { + Color color = Color.fromRGB(Integer.valueOf(split[1])); + banner.setBaseColor(DyeColor.getByColor(color)); + } else if (PatternType.valueOf(split[0]) != null) { + PatternType type = PatternType.valueOf(split[0]); + DyeColor color = DyeColor.getByColor(Color.fromRGB(Integer.valueOf(split[1]))); + org.bukkit.block.banner.Pattern pattern = new org.bukkit.block.banner.Pattern(color, type); + banner.addPattern(pattern); + } + banner.update(); + meta.setBlockState(banner); stack.setItemMeta(meta); } }