2021-06-11 14:02:28 +02:00
|
|
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
|
|
From: Zach Brown <zach.brown@destroystokyo.com>
|
|
|
|
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
|
2023-10-27 01:34:58 +02:00
|
|
|
index b77f5832265be5aaf96d95fcac4737919720fa6e..e15723080445b09852512132039ca2cde4936b7e 100644
|
2021-06-11 14:02:28 +02:00
|
|
|
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaArmorStand.java
|
|
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaArmorStand.java
|
2022-09-12 13:31:45 +02:00
|
|
|
@@ -8,9 +8,22 @@ import org.bukkit.Material;
|
|
|
|
import org.bukkit.configuration.serialization.DelegateDeserialization;
|
2021-06-11 14:02:28 +02:00
|
|
|
|
|
|
|
@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");
|
|
|
|
+
|
2022-12-23 18:30:42 +01:00
|
|
|
+ private Boolean invisible = null;
|
|
|
|
+ private Boolean noBasePlate = null;
|
|
|
|
+ private Boolean showArms = null;
|
|
|
|
+ private Boolean small = null;
|
|
|
|
+ private Boolean marker = null;
|
2021-06-11 14:02:28 +02:00
|
|
|
+ // Paper end
|
|
|
|
CompoundTag entityTag;
|
|
|
|
|
|
|
|
CraftMetaArmorStand(CraftMetaItem meta) {
|
2022-09-12 13:31:45 +02:00
|
|
|
@@ -21,6 +34,13 @@ public class CraftMetaArmorStand extends CraftMetaItem {
|
2021-06-11 14:02:28 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
2022-09-12 13:31:45 +02:00
|
|
|
@@ -29,11 +49,39 @@ public class CraftMetaArmorStand extends CraftMetaItem {
|
2021-06-11 14:02:28 +02:00
|
|
|
|
2023-10-27 01:34:58 +02:00
|
|
|
if (tag.contains(CraftMetaArmorStand.ENTITY_TAG.NBT)) {
|
|
|
|
this.entityTag = tag.getCompound(CraftMetaArmorStand.ENTITY_TAG.NBT).copy();
|
2021-06-11 14:02:28 +02:00
|
|
|
+ // 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
|
2021-06-12 18:56:13 +02:00
|
|
|
+ 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);
|
2021-06-11 14:02:28 +02:00
|
|
|
+ // Paper end
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2022-09-12 13:31:45 +02:00
|
|
|
@@ -56,6 +104,31 @@ public class CraftMetaArmorStand extends CraftMetaItem {
|
2021-06-11 14:02:28 +02:00
|
|
|
void applyToItem(CompoundTag tag) {
|
|
|
|
super.applyToItem(tag);
|
|
|
|
|
|
|
|
+ // Paper start
|
2021-06-12 18:56:13 +02:00
|
|
|
+ if (!isArmorStandEmpty() && this.entityTag == null) {
|
|
|
|
+ this.entityTag = new CompoundTag();
|
2021-06-11 14:02:28 +02:00
|
|
|
+ }
|
|
|
|
+
|
2022-12-23 18:30:42 +01:00
|
|
|
+ if (this.invisible != null) {
|
2021-06-12 18:56:13 +02:00
|
|
|
+ this.entityTag.putBoolean(INVISIBLE.NBT, this.invisible);
|
2021-06-11 14:02:28 +02:00
|
|
|
+ }
|
|
|
|
+
|
2022-12-23 18:30:42 +01:00
|
|
|
+ if (this.noBasePlate != null) {
|
2021-06-12 18:56:13 +02:00
|
|
|
+ this.entityTag.putBoolean(NO_BASE_PLATE.NBT, this.noBasePlate);
|
2021-06-11 14:02:28 +02:00
|
|
|
+ }
|
|
|
|
+
|
2022-12-23 18:30:42 +01:00
|
|
|
+ if (this.showArms != null) {
|
2021-06-12 18:56:13 +02:00
|
|
|
+ this.entityTag.putBoolean(SHOW_ARMS.NBT, this.showArms);
|
2021-06-11 14:02:28 +02:00
|
|
|
+ }
|
|
|
|
+
|
2022-12-23 18:30:42 +01:00
|
|
|
+ if (this.small != null) {
|
2021-06-12 18:56:13 +02:00
|
|
|
+ this.entityTag.putBoolean(SMALL.NBT, this.small);
|
2021-06-11 14:02:28 +02:00
|
|
|
+ }
|
|
|
|
+
|
2022-12-23 18:30:42 +01:00
|
|
|
+ if (this.marker != null) {
|
2021-06-12 18:56:13 +02:00
|
|
|
+ this.entityTag.putBoolean(MARKER.NBT, this.marker);
|
2021-06-11 14:02:28 +02:00
|
|
|
+ }
|
|
|
|
+ // Paper end
|
2021-06-12 18:56:13 +02:00
|
|
|
if (this.entityTag != null) {
|
2023-10-27 01:34:58 +02:00
|
|
|
tag.put(CraftMetaArmorStand.ENTITY_TAG.NBT, this.entityTag);
|
2021-06-11 14:02:28 +02:00
|
|
|
}
|
2022-09-12 13:31:45 +02:00
|
|
|
@@ -72,7 +145,7 @@ public class CraftMetaArmorStand extends CraftMetaItem {
|
2021-06-11 14:02:28 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
boolean isArmorStandEmpty() {
|
2021-06-12 18:56:13 +02:00
|
|
|
- return !(this.entityTag != null);
|
2022-12-23 18:30:42 +01:00
|
|
|
+ return !(this.invisible != null || this.noBasePlate != null || this.showArms != null || this.small != null || this.marker != null || this.entityTag != null); // Paper
|
2021-06-11 14:02:28 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2022-09-12 13:31:45 +02:00
|
|
|
@@ -83,7 +156,13 @@ public class CraftMetaArmorStand extends CraftMetaItem {
|
2021-06-11 14:02:28 +02:00
|
|
|
if (meta instanceof CraftMetaArmorStand) {
|
|
|
|
CraftMetaArmorStand that = (CraftMetaArmorStand) meta;
|
|
|
|
|
2021-06-12 18:56:13 +02:00
|
|
|
- return this.entityTag != null ? that.entityTag != null && this.entityTag.equals(that.entityTag) : this.entityTag == null;
|
2021-06-11 14:02:28 +02:00
|
|
|
+ // Paper start
|
2021-06-12 18:56:13 +02:00
|
|
|
+ return this.invisible == that.invisible &&
|
|
|
|
+ this.noBasePlate == that.noBasePlate &&
|
|
|
|
+ this.showArms == that.showArms &&
|
|
|
|
+ this.small == that.small &&
|
|
|
|
+ this.marker == that.marker;
|
2021-06-11 14:02:28 +02:00
|
|
|
+ // Paper end
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
2022-09-12 13:31:45 +02:00
|
|
|
@@ -98,9 +177,14 @@ public class CraftMetaArmorStand extends CraftMetaItem {
|
2021-06-11 14:02:28 +02:00
|
|
|
final int original;
|
|
|
|
int hash = original = super.applyHash();
|
|
|
|
|
2021-06-12 18:56:13 +02:00
|
|
|
- if (this.entityTag != null) {
|
|
|
|
- hash = 73 * hash + this.entityTag.hashCode();
|
2021-06-11 14:02:28 +02:00
|
|
|
- }
|
|
|
|
+ // Paper start
|
2021-06-12 18:56:13 +02:00
|
|
|
+ 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;
|
2021-06-11 14:02:28 +02:00
|
|
|
+ // Paper end
|
|
|
|
|
|
|
|
return original != hash ? CraftMetaArmorStand.class.hashCode() ^ hash : hash;
|
|
|
|
}
|
2022-09-12 13:31:45 +02:00
|
|
|
@@ -109,6 +193,28 @@ public class CraftMetaArmorStand extends CraftMetaItem {
|
2021-06-11 14:02:28 +02:00
|
|
|
Builder<String, Object> serialize(Builder<String, Object> builder) {
|
|
|
|
super.serialize(builder);
|
|
|
|
|
|
|
|
+ // Paper start
|
2022-12-23 18:30:42 +01:00
|
|
|
+ if (invisible != null) {
|
2021-06-11 14:02:28 +02:00
|
|
|
+ builder.put(INVISIBLE.BUKKIT, invisible);
|
|
|
|
+ }
|
|
|
|
+
|
2022-12-23 18:30:42 +01:00
|
|
|
+ if (noBasePlate != null) {
|
2021-06-11 14:02:28 +02:00
|
|
|
+ builder.put(NO_BASE_PLATE.BUKKIT, noBasePlate);
|
|
|
|
+ }
|
|
|
|
+
|
2022-12-23 18:30:42 +01:00
|
|
|
+ if (showArms != null) {
|
2021-06-11 14:02:28 +02:00
|
|
|
+ builder.put(SHOW_ARMS.BUKKIT, showArms);
|
|
|
|
+ }
|
|
|
|
+
|
2022-12-23 18:30:42 +01:00
|
|
|
+ if (small != null) {
|
2021-06-11 14:02:28 +02:00
|
|
|
+ builder.put(SMALL.BUKKIT, small);
|
|
|
|
+ }
|
|
|
|
+
|
2022-12-23 18:30:42 +01:00
|
|
|
+ if (marker != null) {
|
2021-06-11 14:02:28 +02:00
|
|
|
+ builder.put(MARKER.BUKKIT, marker);
|
|
|
|
+ }
|
|
|
|
+ // Paper end
|
|
|
|
+
|
|
|
|
return builder;
|
|
|
|
}
|
|
|
|
|
2022-09-12 13:31:45 +02:00
|
|
|
@@ -122,4 +228,56 @@ public class CraftMetaArmorStand extends CraftMetaItem {
|
2021-06-11 14:02:28 +02:00
|
|
|
|
|
|
|
return clone;
|
|
|
|
}
|
|
|
|
+
|
|
|
|
+ // Paper start
|
|
|
|
+ @Override
|
|
|
|
+ public boolean isInvisible() {
|
2022-12-23 18:30:42 +01:00
|
|
|
+ return invisible != null && invisible;
|
2021-06-11 14:02:28 +02:00
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public boolean hasNoBasePlate() {
|
2022-12-23 18:30:42 +01:00
|
|
|
+ return noBasePlate != null && noBasePlate;
|
2021-06-11 14:02:28 +02:00
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public boolean shouldShowArms() {
|
2022-12-23 18:30:42 +01:00
|
|
|
+ return showArms != null && showArms;
|
2021-06-11 14:02:28 +02:00
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public boolean isSmall() {
|
2022-12-23 18:30:42 +01:00
|
|
|
+ return small != null && small;
|
2021-06-11 14:02:28 +02:00
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public boolean isMarker() {
|
2022-12-23 18:30:42 +01:00
|
|
|
+ return marker != null && marker;
|
2021-06-11 14:02:28 +02:00
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @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
|
2024-01-26 20:17:06 +01:00
|
|
|
index 361268bcc0197c2f9f4bd065d8f7b51771d562a9..1920cf7ad846f57cd278cb9a72dce03f3d014fbb 100644
|
2021-06-11 14:02:28 +02:00
|
|
|
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java
|
|
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java
|
2024-01-26 20:17:06 +01:00
|
|
|
@@ -1509,6 +1509,14 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable, BlockDataMeta {
|
2021-06-11 14:02:28 +02:00
|
|
|
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,
|
2021-06-12 18:56:13 +02:00
|
|
|
CraftMetaCompass.LODESTONE_TRACKED.NBT,
|
2021-06-11 14:02:28 +02:00
|
|
|
diff --git a/src/test/java/org/bukkit/craftbukkit/inventory/ItemMetaTest.java b/src/test/java/org/bukkit/craftbukkit/inventory/ItemMetaTest.java
|
2024-01-14 10:46:04 +01:00
|
|
|
index 78a2422d648fbcf0d456420d2124e03de6cfb8e0..652207b92ac20c1ba3d20939dc2bbee3c494bf5f 100644
|
2021-06-11 14:02:28 +02:00
|
|
|
--- a/src/test/java/org/bukkit/craftbukkit/inventory/ItemMetaTest.java
|
|
|
|
+++ b/src/test/java/org/bukkit/craftbukkit/inventory/ItemMetaTest.java
|
2024-01-14 10:46:04 +01:00
|
|
|
@@ -364,6 +364,7 @@ public class ItemMetaTest extends AbstractTestingBase {
|
2021-06-11 14:02:28 +02:00
|
|
|
final CraftMetaArmorStand meta = (CraftMetaArmorStand) cleanStack.getItemMeta();
|
2021-06-12 18:56:13 +02:00
|
|
|
meta.entityTag = new CompoundTag();
|
|
|
|
meta.entityTag.putBoolean("Small", true);
|
2021-06-11 14:02:28 +02:00
|
|
|
+ meta.setInvisible(true); // Paper
|
|
|
|
cleanStack.setItemMeta(meta);
|
|
|
|
return cleanStack;
|
|
|
|
}
|