mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-21 07:09:21 +08:00
459987d69f
improved the water code so that immunity wont trigger if the entity has the water pathfinder system active, so this improves support for all entities that know how to behave in water. Merged 2 EAR patches together, and removed an MCUtil method that doesnt have a purpose anymore
154 lines
6.3 KiB
Diff
154 lines
6.3 KiB
Diff
From db7102f02de62cb69bcace5cb914e63e4fc2253e Mon Sep 17 00:00:00 2001
|
|
From: Mark Vainomaa <mikroskeem@mikroskeem.eu>
|
|
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..598ad807a2 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<Material> canPlaceOn = Sets.newHashSet();
|
|
+ private Set<Material> canDestroy = Sets.newHashSet();
|
|
+ // Paper end
|
|
|
|
private static final Set<String> 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,31 @@ 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);
|
|
+ if (material == null) {
|
|
+ continue;
|
|
+ }
|
|
+
|
|
+ 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);
|
|
+ if (material == null) {
|
|
+ continue;
|
|
+ }
|
|
+
|
|
+ this.canPlaceOn.add(material);
|
|
+ }
|
|
+ }
|
|
+ // Paper end
|
|
|
|
Set<String> keys = tag.getKeys();
|
|
for (String key : keys) {
|
|
@@ -579,6 +618,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<String> 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<String> 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<String, NBTBase> e : unhandledTags.entrySet()) {
|
|
itemTag.set(e.getKey(), e.getValue());
|
|
@@ -1247,7 +1305,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 +1354,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<Material> getCanDestroy() {
|
|
+ return new java.util.HashSet<>(canDestroy);
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ @SuppressWarnings("deprecation")
|
|
+ public void setCanDestroy(Set<Material> 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<Material> getCanPlaceOn() {
|
|
+ return new java.util.HashSet<>(canPlaceOn);
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ @SuppressWarnings("deprecation")
|
|
+ public void setCanPlaceOn(Set<Material> 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
|
|
|