aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0169-Add-ArmorStand-Item-Meta.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/server/0169-Add-ArmorStand-Item-Meta.patch')
-rw-r--r--patches/server/0169-Add-ArmorStand-Item-Meta.patch285
1 files changed, 285 insertions, 0 deletions
diff --git a/patches/server/0169-Add-ArmorStand-Item-Meta.patch b/patches/server/0169-Add-ArmorStand-Item-Meta.patch
new file mode 100644
index 0000000000..b6aa22ecaf
--- /dev/null
+++ b/patches/server/0169-Add-ArmorStand-Item-Meta.patch
@@ -0,0 +1,285 @@
+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/CraftItemMetas.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemMetas.java
+index 85aab880fdb2f23d09096f8f2b1ede4f068fa023..4ae9930c2d74e5b1e3ad0c2ecf6556dc59cbf23c 100644
+--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemMetas.java
++++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemMetas.java
+@@ -1,5 +1,6 @@
+ package org.bukkit.craftbukkit.inventory;
+
++import com.destroystokyo.paper.inventory.meta.ArmorStandMeta;
+ import java.util.function.BiFunction;
+ import java.util.function.Function;
+ import net.minecraft.world.item.ItemStack;
+@@ -95,7 +96,7 @@ public final class CraftItemMetas {
+ item -> new CraftMetaSpawnEgg(item.getComponentsPatch()),
+ (type, meta) -> meta instanceof CraftMetaSpawnEgg spawnEgg ? spawnEgg : new CraftMetaSpawnEgg(meta));
+
+- private static final ItemMetaData<ItemMeta> ARMOR_STAND_META_DATA = new ItemMetaData<>(ItemMeta.class,
++ private static final ItemMetaData<ArmorStandMeta> ARMOR_STAND_META_DATA = new ItemMetaData<>(ArmorStandMeta.class, // paper
+ item -> new CraftMetaArmorStand(item.getComponentsPatch()),
+ (type, meta) -> meta instanceof CraftMetaArmorStand armorStand ? armorStand : new CraftMetaArmorStand(meta));
+
+diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaArmorStand.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaArmorStand.java
+index c4f12f96e39cb6189799a796b4cb2cb4f0b92392..59bdac414e8205ed608f79ef0d1502acd826d216 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,14 @@ 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 java.util.Objects.equals(this.entityTag, that.entityTag) &&
++ this.invisible == that.invisible &&
++ this.noBasePlate == that.noBasePlate &&
++ this.showArms == that.showArms &&
++ this.small == that.small &&
++ this.marker == that.marker;
++ // Paper end
+ }
+ return true;
+ }
+@@ -104,6 +184,13 @@ public class CraftMetaArmorStand extends CraftMetaItem {
+ if (this.entityTag != null) {
+ hash = 73 * hash + this.entityTag.hashCode();
+ }
++ // Paper start
++ hash = 61 * hash + (this.invisible != null ? Boolean.hashCode(this.isInvisible()) : 0);
++ hash = 61 * hash + (this.noBasePlate != null ? Boolean.hashCode(this.hasNoBasePlate()) : 0);
++ hash = 61 * hash + (this.showArms != null ? Boolean.hashCode(this.shouldShowArms()) : 0);
++ hash = 61 * hash + (this.small != null ? Boolean.hashCode(this.isSmall()) : 0);
++ hash = 61 * hash + (this.marker != null ? Boolean.hashCode(this.isMarker()) : 0);
++ // Paper end
+
+ return original != hash ? CraftMetaArmorStand.class.hashCode() ^ hash : hash;
+ }
+@@ -112,6 +199,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 +234,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 99a555ca72cd95d760d68072242203deeddd0ce1..a1d8da4e0de3f84194f28d7d18fa795d53714590 100644
+--- a/src/test/java/org/bukkit/craftbukkit/inventory/ItemMetaTest.java
++++ b/src/test/java/org/bukkit/craftbukkit/inventory/ItemMetaTest.java
+@@ -364,6 +364,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;
+ }