aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0174-Add-ArmorStand-Item-Meta.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/server/0174-Add-ArmorStand-Item-Meta.patch')
-rw-r--r--patches/server/0174-Add-ArmorStand-Item-Meta.patch268
1 files changed, 268 insertions, 0 deletions
diff --git a/patches/server/0174-Add-ArmorStand-Item-Meta.patch b/patches/server/0174-Add-ArmorStand-Item-Meta.patch
new file mode 100644
index 0000000000..609dc1f9e1
--- /dev/null
+++ b/patches/server/0174-Add-ArmorStand-Item-Meta.patch
@@ -0,0 +1,268 @@
+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 c4f12f96e39cb6189799a796b4cb2cb4f0b92392..84e09a934600df116206df1c3922a11ee969901a 100644
+--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaArmorStand.java
++++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaArmorStand.java
+@@ -11,9 +11,22 @@ import org.bukkit.Material;
+ import org.bukkit.configuration.serialization.DelegateDeserialization;
+
+ @DelegateDeserialization(SerializableMeta.class)
+-public class CraftMetaArmorStand extends CraftMetaItem {
++public class CraftMetaArmorStand extends CraftMetaItem implements com.destroystokyo.paper.inventory.meta.ArmorStandMeta { // Paper
+
+ static final ItemMetaKeyType<CustomData> ENTITY_TAG = new ItemMetaKeyType<>(DataComponents.ENTITY_DATA, "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 = null;
++ private Boolean noBasePlate = null;
++ private Boolean showArms = null;
++ private Boolean small = null;
++ private Boolean marker = null;
++ // Paper end
+ CompoundTag entityTag;
+
+ CraftMetaArmorStand(CraftMetaItem meta) {
+@@ -24,6 +37,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;
+ }
+
+@@ -32,11 +52,39 @@ public class CraftMetaArmorStand extends CraftMetaItem {
+
+ getOrEmpty(tag, CraftMetaArmorStand.ENTITY_TAG).ifPresent((nbt) -> {
+ this.entityTag = nbt.copyTag();
++ // 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
+@@ -59,6 +107,31 @@ public class CraftMetaArmorStand extends CraftMetaItem {
+ void applyToItem(CraftMetaItem.Applicator tag) {
+ super.applyToItem(tag);
+
++ // Paper start
++ if (!isArmorStandEmpty() && this.entityTag == null) {
++ this.entityTag = new CompoundTag();
++ }
++
++ if (this.invisible != null) {
++ this.entityTag.putBoolean(INVISIBLE.NBT, this.invisible);
++ }
++
++ if (this.noBasePlate != null) {
++ this.entityTag.putBoolean(NO_BASE_PLATE.NBT, this.noBasePlate);
++ }
++
++ if (this.showArms != null) {
++ this.entityTag.putBoolean(SHOW_ARMS.NBT, this.showArms);
++ }
++
++ if (this.small != null) {
++ this.entityTag.putBoolean(SMALL.NBT, this.small);
++ }
++
++ if (this.marker != null) {
++ this.entityTag.putBoolean(MARKER.NBT, this.marker);
++ }
++ // Paper end
+ if (this.entityTag != null) {
+ tag.put(CraftMetaArmorStand.ENTITY_TAG, CustomData.of(this.entityTag));
+ }
+@@ -75,7 +148,7 @@ public class CraftMetaArmorStand extends CraftMetaItem {
+ }
+
+ boolean isArmorStandEmpty() {
+- return !(this.entityTag != null);
++ return !(this.invisible != null || this.noBasePlate != null || this.showArms != null || this.small != null || this.marker != null || this.entityTag != null); // Paper
+ }
+
+ @Override
+@@ -86,7 +159,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;
+ }
+@@ -101,9 +180,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;
+ }
+@@ -112,6 +196,28 @@ public class CraftMetaArmorStand extends CraftMetaItem {
+ Builder<String, Object> serialize(Builder<String, Object> builder) {
+ super.serialize(builder);
+
++ // Paper start
++ if (invisible != null) {
++ builder.put(INVISIBLE.BUKKIT, invisible);
++ }
++
++ if (noBasePlate != null) {
++ builder.put(NO_BASE_PLATE.BUKKIT, noBasePlate);
++ }
++
++ if (showArms != null) {
++ builder.put(SHOW_ARMS.BUKKIT, showArms);
++ }
++
++ if (small != null) {
++ builder.put(SMALL.BUKKIT, small);
++ }
++
++ if (marker != null) {
++ builder.put(MARKER.BUKKIT, marker);
++ }
++ // Paper end
++
+ return builder;
+ }
+
+@@ -125,4 +231,56 @@ public class CraftMetaArmorStand extends CraftMetaItem {
+
+ return clone;
+ }
++
++ // Paper start
++ @Override
++ public boolean isInvisible() {
++ return invisible != null && invisible;
++ }
++
++ @Override
++ public boolean hasNoBasePlate() {
++ return noBasePlate != null && noBasePlate;
++ }
++
++ @Override
++ public boolean shouldShowArms() {
++ return showArms != null && showArms;
++ }
++
++ @Override
++ public boolean isSmall() {
++ return small != null && small;
++ }
++
++ @Override
++ public boolean isMarker() {
++ return marker != null && 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/test/java/org/bukkit/craftbukkit/inventory/ItemMetaTest.java b/src/test/java/org/bukkit/craftbukkit/inventory/ItemMetaTest.java
+index 482fcd5abe687accc770722778952e1fd199b471..cf436c9e62a11b8c6cbf7638de0e5635c67459ac 100644
+--- a/src/test/java/org/bukkit/craftbukkit/inventory/ItemMetaTest.java
++++ b/src/test/java/org/bukkit/craftbukkit/inventory/ItemMetaTest.java
+@@ -362,6 +362,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;
+ }