aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0176-Add-ArmorStand-Item-Meta.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/server/0176-Add-ArmorStand-Item-Meta.patch')
-rw-r--r--patches/server/0176-Add-ArmorStand-Item-Meta.patch287
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;
+ }