From ff23354e4d2492b02ac7ebc9031d2f572225edf1 Mon Sep 17 00:00:00 2001 From: Mark Vainomaa Date: Wed, 12 Sep 2018 18:53:55 +0300 Subject: [PATCH] Implement an API for CanPlaceOn and CanDestroy NBT values diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java index 55afe8382c..d928119254 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java @@ -252,6 +252,12 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable { static final ItemMetaKey UNBREAKABLE = new ItemMetaKey("Unbreakable"); @Specific(Specific.To.NBT) static final ItemMetaKey DAMAGE = new ItemMetaKey("Damage"); + // Paper start - Implement an API for CanPlaceOn and CanDestroy NBT values + @Specific(Specific.To.NBT) + static final ItemMetaKey CAN_DESTROY = new ItemMetaKey("CanDestroy"); + @Specific(Specific.To.NBT) + static final ItemMetaKey CAN_PLACE_ON = new ItemMetaKey("CanPlaceOn"); + // Paper end private IChatBaseComponent displayName; private IChatBaseComponent locName; @@ -262,6 +268,10 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable { private int hideFlag; private boolean unbreakable; private int damage; + // Paper start - Implement an API for CanPlaceOn and CanDestroy NBT values + private Set canPlaceOn = Sets.newHashSet(); + private Set canDestroy = Sets.newHashSet(); + // Paper end private static final Set HANDLED_TAGS = Sets.newHashSet(); @@ -292,6 +302,10 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable { this.hideFlag = meta.hideFlag; this.unbreakable = meta.unbreakable; this.damage = meta.damage; + // Paper start - Implement an API for CanPlaceOn and CanDestroy NBT values + this.canDestroy = new java.util.HashSet<>(meta.canDestroy); + this.canPlaceOn = new java.util.HashSet<>(meta.canPlaceOn); + // Paper end this.unhandledTags.putAll(meta.unhandledTags); this.internalTag = meta.internalTag; @@ -347,6 +361,23 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable { if (tag.hasKey(DAMAGE.NBT)) { damage = tag.getInt(DAMAGE.NBT); } + // Paper start - Implement an API for CanPlaceOn and CanDestroy NBT values + if (tag.hasKey(CAN_DESTROY.NBT)) { + NBTTagList list = tag.getList(CAN_DESTROY.NBT, CraftMagicNumbers.NBT.TAG_STRING); + for (int i = 0; i < list.size(); i++) { + Material material = Material.matchMaterial(list.getString(i), false); + this.canDestroy.add(material); + } + } + + if (tag.hasKey(CAN_PLACE_ON.NBT)) { + NBTTagList list = tag.getList(CAN_PLACE_ON.NBT, CraftMagicNumbers.NBT.TAG_STRING); + for (int i = 0; i < list.size(); i++) { + Material material = Material.matchMaterial(list.getString(i), false); + this.canPlaceOn.add(material); + } + } + // Paper end Set keys = tag.getKeys(); for (String key : keys) { @@ -579,6 +610,25 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable { if (hasDamage()) { itemTag.setInt(DAMAGE.NBT, damage); } + // Paper start - Implement an API for CanPlaceOn and CanDestroy NBT values + if (!this.canPlaceOn.isEmpty()) { + List items = this.canPlaceOn.stream() + .map(Material::getKey) + .map(org.bukkit.NamespacedKey::toString) + .collect(java.util.stream.Collectors.toList()); + + itemTag.set(CAN_PLACE_ON.NBT, createStringList(items)); + } + + if (!this.canDestroy.isEmpty()) { + List items = this.canDestroy.stream() + .map(Material::getKey) + .map(org.bukkit.NamespacedKey::toString) + .collect(java.util.stream.Collectors.toList()); + + itemTag.set(CAN_DESTROY.NBT, createStringList(items)); + } + // Paper end for (Map.Entry e : unhandledTags.entrySet()) { itemTag.set(e.getKey(), e.getValue()); @@ -1247,7 +1297,9 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable { CraftMetaArmorStand.NO_BASE_PLATE.NBT, CraftMetaArmorStand.SHOW_ARMS.NBT, CraftMetaArmorStand.SMALL.NBT, - CraftMetaArmorStand.MARKER.NBT + CraftMetaArmorStand.MARKER.NBT, + CAN_DESTROY.NBT, + CAN_PLACE_ON.NBT // Paper end )); } @@ -1294,4 +1346,35 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable { return spigot; } // Spigot end + // Paper start - Implement an API for CanPlaceOn and CanDestroy NBT values + @Override + public Set getCanDestroy() { + return new java.util.HashSet<>(canDestroy); + } + + @Override + @SuppressWarnings("deprecation") + public void setCanDestroy(Set canDestroy) { + if (canDestroy.stream().anyMatch(Material::isLegacy)) { + throw new IllegalArgumentException("canDestroy set must not contain any legacy materials!"); + } + this.canDestroy.clear(); + this.canDestroy.addAll(canDestroy); + } + + @Override + public Set getCanPlaceOn() { + return new java.util.HashSet<>(canPlaceOn); + } + + @Override + @SuppressWarnings("deprecation") + public void setCanPlaceOn(Set canPlaceOn) { + if (canPlaceOn.stream().anyMatch(Material::isLegacy)) { + throw new IllegalArgumentException("canPlaceOn set must not contain any legacy materials!"); + } + this.canPlaceOn.clear(); + this.canPlaceOn.addAll(canPlaceOn); + } + // Paper end } -- 2.19.0