diff options
Diffstat (limited to 'patches/server/0176-Add-ArmorStand-Item-Meta.patch')
-rw-r--r-- | patches/server/0176-Add-ArmorStand-Item-Meta.patch | 287 |
1 files changed, 287 insertions, 0 deletions
diff --git a/patches/server/0176-Add-ArmorStand-Item-Meta.patch b/patches/server/0176-Add-ArmorStand-Item-Meta.patch new file mode 100644 index 0000000000..e8f6a478fb --- /dev/null +++ b/patches/server/0176-Add-ArmorStand-Item-Meta.patch @@ -0,0 +1,287 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Zach Brown <[email protected]> +Date: Sat, 27 Jan 2018 17:04:14 -0500 +Subject: [PATCH] Add ArmorStand Item Meta + +This is adds basic item meta for armor stands. It does not add all +possible metadata however. + +There are armor, hand, and equipment types, as well as position data +that can also be added here. This initial addition should serve a +starting point for future additions in this area. + +Fixes GH-559 + +diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaArmorStand.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaArmorStand.java +index 4017933f2244fca32cf9d39444f3a4f550e8af01..0c40a4a18cfc6f4ed6473a475f307f5c75ab56c5 100644 +--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaArmorStand.java ++++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaArmorStand.java +@@ -8,9 +8,22 @@ import org.bukkit.Material; + import org.bukkit.configuration.serialization.DelegateDeserialization; + + @DelegateDeserialization(CraftMetaItem.SerializableMeta.class) +-public class CraftMetaArmorStand extends CraftMetaItem { ++public class CraftMetaArmorStand extends CraftMetaItem implements com.destroystokyo.paper.inventory.meta.ArmorStandMeta { // Paper + + static final ItemMetaKey ENTITY_TAG = new ItemMetaKey("EntityTag", "entity-tag"); ++ // Paper start ++ static final ItemMetaKey INVISIBLE = new ItemMetaKey("Invisible", "invisible"); ++ static final ItemMetaKey NO_BASE_PLATE = new ItemMetaKey("NoBasePlate", "no-base-plate"); ++ static final ItemMetaKey SHOW_ARMS = new ItemMetaKey("ShowArms", "show-arms"); ++ static final ItemMetaKey SMALL = new ItemMetaKey("Small", "small"); ++ static final ItemMetaKey MARKER = new ItemMetaKey("Marker", "marker"); ++ ++ private boolean invisible; ++ private boolean noBasePlate; ++ private boolean showArms; ++ private boolean small; ++ private boolean marker; ++ // Paper end + CompoundTag entityTag; + + CraftMetaArmorStand(CraftMetaItem meta) { +@@ -21,6 +34,13 @@ public class CraftMetaArmorStand extends CraftMetaItem { + } + + CraftMetaArmorStand armorStand = (CraftMetaArmorStand) meta; ++ // Paper start ++ this.invisible = armorStand.invisible; ++ this.noBasePlate = armorStand.noBasePlate; ++ this.showArms = armorStand.showArms; ++ this.small = armorStand.small; ++ this.marker = armorStand.marker; ++ // Paper end + this.entityTag = armorStand.entityTag; + } + +@@ -29,11 +49,39 @@ public class CraftMetaArmorStand extends CraftMetaItem { + + if (tag.contains(ENTITY_TAG.NBT)) { + this.entityTag = tag.getCompound(ENTITY_TAG.NBT).copy(); ++ // Paper start ++ if (entityTag.contains(INVISIBLE.NBT)) { ++ invisible = entityTag.getBoolean(INVISIBLE.NBT); ++ } ++ ++ if (entityTag.contains(NO_BASE_PLATE.NBT)) { ++ noBasePlate = entityTag.getBoolean(NO_BASE_PLATE.NBT); ++ } ++ ++ if (entityTag.contains(SHOW_ARMS.NBT)) { ++ showArms = entityTag.getBoolean(SHOW_ARMS.NBT); ++ } ++ ++ if (entityTag.contains(SMALL.NBT)) { ++ small = entityTag.getBoolean(SMALL.NBT); ++ } ++ ++ if (entityTag.contains(MARKER.NBT)) { ++ marker = entityTag.getBoolean(MARKER.NBT); ++ } ++ // Paper end + } + } + + CraftMetaArmorStand(Map<String, Object> map) { + super(map); ++ // Paper start ++ this.invisible = SerializableMeta.getBoolean(map, INVISIBLE.BUKKIT); ++ this.noBasePlate = SerializableMeta.getBoolean(map, NO_BASE_PLATE.BUKKIT); ++ this.showArms = SerializableMeta.getBoolean(map, SHOW_ARMS.BUKKIT); ++ this.small = SerializableMeta.getBoolean(map, SMALL.BUKKIT); ++ this.marker = SerializableMeta.getBoolean(map, MARKER.BUKKIT); ++ // Paper end + } + + @Override +@@ -56,6 +104,31 @@ public class CraftMetaArmorStand extends CraftMetaItem { + void applyToItem(CompoundTag tag) { + super.applyToItem(tag); + ++ // Paper start ++ if (!isArmorStandEmpty() && this.entityTag == null) { ++ this.entityTag = new CompoundTag(); ++ } ++ ++ if (isInvisible()) { ++ this.entityTag.putBoolean(INVISIBLE.NBT, this.invisible); ++ } ++ ++ if (hasNoBasePlate()) { ++ this.entityTag.putBoolean(NO_BASE_PLATE.NBT, this.noBasePlate); ++ } ++ ++ if (shouldShowArms()) { ++ this.entityTag.putBoolean(SHOW_ARMS.NBT, this.showArms); ++ } ++ ++ if (isSmall()) { ++ this.entityTag.putBoolean(SMALL.NBT, this.small); ++ } ++ ++ if (isMarker()) { ++ this.entityTag.putBoolean(MARKER.NBT, this.marker); ++ } ++ // Paper end + if (this.entityTag != null) { + tag.put(ENTITY_TAG.NBT, entityTag); + } +@@ -72,7 +145,7 @@ public class CraftMetaArmorStand extends CraftMetaItem { + } + + boolean isArmorStandEmpty() { +- return !(this.entityTag != null); ++ return !(this.isInvisible() || this.hasNoBasePlate() || this.shouldShowArms() || this.isSmall() || this.isMarker() || this.entityTag != null); + } + + @Override +@@ -83,7 +156,13 @@ public class CraftMetaArmorStand extends CraftMetaItem { + if (meta instanceof CraftMetaArmorStand) { + CraftMetaArmorStand that = (CraftMetaArmorStand) meta; + +- return this.entityTag != null ? that.entityTag != null && this.entityTag.equals(that.entityTag) : this.entityTag == null; ++ // Paper start ++ return this.invisible == that.invisible && ++ this.noBasePlate == that.noBasePlate && ++ this.showArms == that.showArms && ++ this.small == that.small && ++ this.marker == that.marker; ++ // Paper end + } + return true; + } +@@ -98,9 +177,14 @@ public class CraftMetaArmorStand extends CraftMetaItem { + final int original; + int hash = original = super.applyHash(); + +- if (this.entityTag != null) { +- hash = 73 * hash + this.entityTag.hashCode(); +- } ++ // Paper start ++ hash += this.entityTag != null ? 73 * hash + this.entityTag.hashCode() : 0; ++ hash += this.isInvisible() ? 61 * hash + 1231 : 0; ++ hash += this.hasNoBasePlate() ? 61 * hash + 1231 : 0; ++ hash += this.shouldShowArms() ? 61 * hash + 1231 : 0; ++ hash += this.isSmall() ? 61 * hash + 1231 : 0; ++ hash += this.isMarker() ? 61 * hash + 1231 : 0; ++ // Paper end + + return original != hash ? CraftMetaArmorStand.class.hashCode() ^ hash : hash; + } +@@ -109,6 +193,28 @@ public class CraftMetaArmorStand extends CraftMetaItem { + Builder<String, Object> serialize(Builder<String, Object> builder) { + super.serialize(builder); + ++ // Paper start ++ if (this.isInvisible()) { ++ builder.put(INVISIBLE.BUKKIT, invisible); ++ } ++ ++ if (this.hasNoBasePlate()) { ++ builder.put(NO_BASE_PLATE.BUKKIT, noBasePlate); ++ } ++ ++ if (this.shouldShowArms()) { ++ builder.put(SHOW_ARMS.BUKKIT, showArms); ++ } ++ ++ if (this.isSmall()) { ++ builder.put(SMALL.BUKKIT, small); ++ } ++ ++ if (this.isMarker()) { ++ builder.put(MARKER.BUKKIT, marker); ++ } ++ // Paper end ++ + return builder; + } + +@@ -122,4 +228,56 @@ public class CraftMetaArmorStand extends CraftMetaItem { + + return clone; + } ++ ++ // Paper start ++ @Override ++ public boolean isInvisible() { ++ return invisible; ++ } ++ ++ @Override ++ public boolean hasNoBasePlate() { ++ return noBasePlate; ++ } ++ ++ @Override ++ public boolean shouldShowArms() { ++ return showArms; ++ } ++ ++ @Override ++ public boolean isSmall() { ++ return small; ++ } ++ ++ @Override ++ public boolean isMarker() { ++ return marker; ++ } ++ ++ @Override ++ public void setInvisible(boolean invisible) { ++ this.invisible = invisible; ++ } ++ ++ @Override ++ public void setNoBasePlate(boolean noBasePlate) { ++ this.noBasePlate = noBasePlate; ++ } ++ ++ @Override ++ public void setShowArms(boolean showArms) { ++ this.showArms = showArms; ++ } ++ ++ @Override ++ public void setSmall(boolean small) { ++ this.small = small; ++ } ++ ++ @Override ++ public void setMarker(boolean marker) { ++ this.marker = marker; ++ } ++ // Paper end + } +diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java +index 4d687fa31f4d889ac755c178b9afd2b927c78ee2..01ceb8de8411193fa407bf19bbd25a4bf44765d3 100644 +--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java ++++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java +@@ -1452,6 +1452,14 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable, BlockDataMeta { + CraftMetaCrossbow.CHARGED.NBT, + CraftMetaCrossbow.CHARGED_PROJECTILES.NBT, + CraftMetaSuspiciousStew.EFFECTS.NBT, ++ // Paper start ++ CraftMetaArmorStand.ENTITY_TAG.NBT, ++ CraftMetaArmorStand.INVISIBLE.NBT, ++ CraftMetaArmorStand.NO_BASE_PLATE.NBT, ++ CraftMetaArmorStand.SHOW_ARMS.NBT, ++ CraftMetaArmorStand.SMALL.NBT, ++ CraftMetaArmorStand.MARKER.NBT, ++ // Paper end + CraftMetaCompass.LODESTONE_DIMENSION.NBT, + CraftMetaCompass.LODESTONE_POS.NBT, + CraftMetaCompass.LODESTONE_TRACKED.NBT, +diff --git a/src/test/java/org/bukkit/craftbukkit/inventory/ItemMetaTest.java b/src/test/java/org/bukkit/craftbukkit/inventory/ItemMetaTest.java +index a7505a08b952431d1dd7e4b332ede0c0d15eea64..f3a0578f53863dd0866b4c2cb957a30fa3bc6cc5 100644 +--- a/src/test/java/org/bukkit/craftbukkit/inventory/ItemMetaTest.java ++++ b/src/test/java/org/bukkit/craftbukkit/inventory/ItemMetaTest.java +@@ -324,6 +324,7 @@ public class ItemMetaTest extends AbstractTestingBase { + final CraftMetaArmorStand meta = (CraftMetaArmorStand) cleanStack.getItemMeta(); + meta.entityTag = new CompoundTag(); + meta.entityTag.putBoolean("Small", true); ++ meta.setInvisible(true); // Paper + cleanStack.setItemMeta(meta); + return cleanStack; + } |