b68b282439
Upstream has released updates that appears to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing Warning: this commit contains more mapping changes from upstream, As always, ensure that you have working backups and test this build before deployment; Developers working on paper will, yet again, need to delete their work/Minecraft/1.13.2 folder Bukkit Changes: 7fca5fd4 SPIGOT-4558: Preserve user order in the face of copied defaults in configurations 15c9b1eb Ignore spurious slot IDs sent by client, e.g. in enchanting tables 5d2a10c5 SPIGOT-3747: Add API for force loaded chunks d6dd2bb3 SPIGOT-3538: Add getHitBlockFace for ProjectileHitEvent 771db4aa SPIGOT-794: Call EntityPlaceEvent for Minecart placement 55462509 Add InventoryView#getSlotType 2f3ce5b6 Remove EntityTransformEvent and CustomItemTagContainer from draft API f04ad7b6 Make ProjectileLaunchEvent extend EntitySpawnEvent ccb85808 Define EntitySpawnEvent b8cc3ebe Add PlayerItemDamageEvent 184a495d Ease ClassLoader Deadlocks Where Possible 11ac4728 Expand Boolean Prompt Values in Conversation API aae62d51 Added getAllSessionData() to the Conversation API. 9290ff91 Add InventoryView#getInventory API 995e530f Add API to get / set base arrow damage CraftBukkit Changes:c4a67eed
SPIGOT-4556: Fix plugins closing inventory during drop events5be2ddcb
Replace version constants with methods to prevent compiler inlininga5b9c7b3
Use API method to create offset command completions2bc7d1df
SPIGOT-3747: Add API for force loaded chunksa408f375
SPIGOT-3538: Add getHitBlockFace for ProjectileHitEventb54b9409
SPIGOT-2864: Make Arrow / Item setTicksLived behave like FallingBlock79ded7a8
SPIGOT-1811: Death message not shown on respawn screenb4a4f15d
SPIGOT-943: InventoryCloseEvent called on death regardless of open inventory0afed592
SPIGOT-794: Call EntityPlaceEvent for Minecart placement2b2d084a
Add InventoryView#getSlotType01a9959a
Do not use deprecated ItemSpawnEvent constructor9642498d
SPIGOT-4547: Call EntitySpawnEvent as general spawn fallback event963f4a5f
Add PlayerItemDamageEvent63db0445
Add API to get / set base arrow damage531c25d7
Add CraftMagicNumbers.MAPPINGS_VERSION for use by NMS pluginsd05c8b14
Mappings Updatebd36e200
SPIGOT-4551: Ignore invalid attribute modifier slots Spigot Changes: 518206a1 Remove redundant trove depend 1959ad21 MC-11211,SPIGOT-4552: Fix placing double slabs at y = 255 29ab5e43 SPIGOT-3661: Allow arguments in restart-script 7cc46316 SPIGOT-852: Growth modifiers for beetroots, potatoes, carrots 82e117e1 Squelch "fatal: Resolve operation not in progress" message 0a1a68e7 Mappings Update & Patch Rebuild
421 Zeilen
14 KiB
Diff
421 Zeilen
14 KiB
Diff
From 2993601294994d6c7a4ce83f3e427f21cc9c5cdd 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/CraftItemFactory.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemFactory.java
|
|
index 3a6e6f687..6a86cb7eb 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemFactory.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemFactory.java
|
|
@@ -191,6 +191,8 @@ public final class CraftItemFactory implements ItemFactory {
|
|
return meta instanceof CraftMetaSpawnEgg ? meta : new CraftMetaSpawnEgg(meta);
|
|
case KNOWLEDGE_BOOK:
|
|
return meta instanceof CraftMetaKnowledgeBook ? meta : new CraftMetaKnowledgeBook(meta);
|
|
+ case ARMOR_STAND:
|
|
+ return meta instanceof CraftMetaArmorStand ? meta : new CraftMetaArmorStand(meta); // Paper
|
|
case FURNACE:
|
|
case CHEST:
|
|
case TRAPPED_CHEST:
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java
|
|
index d1a546c8f..284630f74 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java
|
|
@@ -403,6 +403,8 @@ public final class CraftItemStack extends ItemStack {
|
|
return new CraftMetaSpawnEgg(item.getTag());
|
|
case KNOWLEDGE_BOOK:
|
|
return new CraftMetaKnowledgeBook(item.getTag());
|
|
+ case ARMOR_STAND:
|
|
+ return new CraftMetaArmorStand(item.getTag()); // Paper
|
|
case FURNACE:
|
|
case CHEST:
|
|
case TRAPPED_CHEST:
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaArmorStand.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaArmorStand.java
|
|
new file mode 100644
|
|
index 000000000..c00b89c8d
|
|
--- /dev/null
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaArmorStand.java
|
|
@@ -0,0 +1,311 @@
|
|
+package org.bukkit.craftbukkit.inventory;
|
|
+
|
|
+import com.destroystokyo.paper.inventory.meta.ArmorStandMeta;
|
|
+import com.google.common.collect.ImmutableMap;
|
|
+import com.mojang.datafixers.Dynamic;
|
|
+
|
|
+import net.minecraft.server.DataConverterTypes;
|
|
+import net.minecraft.server.DynamicOpsNBT;
|
|
+import net.minecraft.server.MinecraftServer;
|
|
+import net.minecraft.server.NBTBase;
|
|
+import net.minecraft.server.NBTTagCompound;
|
|
+
|
|
+import org.bukkit.Bukkit;
|
|
+import org.bukkit.Material;
|
|
+import org.bukkit.configuration.serialization.DelegateDeserialization;
|
|
+import org.bukkit.craftbukkit.util.CraftMagicNumbers;
|
|
+
|
|
+import java.util.Map;
|
|
+
|
|
+// Paper - Created entire class
|
|
+@DelegateDeserialization(CraftMetaItem.SerializableMeta.class)
|
|
+public class CraftMetaArmorStand extends CraftMetaItem implements ArmorStandMeta {
|
|
+
|
|
+ static final ItemMetaKey ENTITY_TAG = new ItemMetaKey("EntityTag", "entity-tag");
|
|
+ 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 NBTTagCompound entityTag;
|
|
+
|
|
+ private boolean invisible;
|
|
+ private boolean noBasePlate;
|
|
+ private boolean showArms;
|
|
+ private boolean small;
|
|
+ private boolean marker;
|
|
+
|
|
+ CraftMetaArmorStand(CraftMetaItem meta) {
|
|
+ super(meta);
|
|
+
|
|
+ if (!(meta instanceof CraftMetaArmorStand)) {
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ CraftMetaArmorStand standMeta = (CraftMetaArmorStand) meta;
|
|
+ this.invisible = standMeta.invisible;
|
|
+ this.noBasePlate = standMeta.noBasePlate;
|
|
+ this.showArms = standMeta.showArms;
|
|
+ this.small = standMeta.small;
|
|
+ this.marker = standMeta.marker;
|
|
+ }
|
|
+
|
|
+ CraftMetaArmorStand(NBTTagCompound tag) {
|
|
+ super(tag);
|
|
+
|
|
+ if (tag.hasKey(ENTITY_TAG.NBT)) {
|
|
+ entityTag = tag.getCompound(ENTITY_TAG.NBT);
|
|
+
|
|
+ if (entityTag.hasKey(INVISIBLE.NBT)) {
|
|
+ invisible = entityTag.getBoolean(INVISIBLE.NBT);
|
|
+ }
|
|
+
|
|
+ if (entityTag.hasKey(NO_BASE_PLATE.NBT)) {
|
|
+ noBasePlate = entityTag.getBoolean(NO_BASE_PLATE.NBT);
|
|
+ }
|
|
+
|
|
+ if (entityTag.hasKey(SHOW_ARMS.NBT)) {
|
|
+ showArms = entityTag.getBoolean(SHOW_ARMS.NBT);
|
|
+ }
|
|
+
|
|
+ if (entityTag.hasKey(SMALL.NBT)) {
|
|
+ small = entityTag.getBoolean(SMALL.NBT);
|
|
+ }
|
|
+
|
|
+ if (entityTag.hasKey(MARKER.NBT)) {
|
|
+ marker = entityTag.getBoolean(MARKER.NBT);
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
+ CraftMetaArmorStand(Map<String, Object> map) {
|
|
+ super(map);
|
|
+
|
|
+ boolean invis = SerializableMeta.getBoolean(map, INVISIBLE.BUKKIT);
|
|
+ boolean noBase = SerializableMeta.getBoolean(map, NO_BASE_PLATE.BUKKIT);
|
|
+ boolean showArms = SerializableMeta.getBoolean(map, SHOW_ARMS.BUKKIT);
|
|
+ boolean small = SerializableMeta.getBoolean(map, SMALL.BUKKIT);
|
|
+ boolean marker = SerializableMeta.getBoolean(map, MARKER.BUKKIT);
|
|
+
|
|
+ this.invisible = invis;
|
|
+ this.noBasePlate = noBase;
|
|
+ this.showArms = showArms;
|
|
+ this.small = small;
|
|
+ this.marker = marker;
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ void applyToItem(NBTTagCompound tag) {
|
|
+ super.applyToItem(tag);
|
|
+
|
|
+ if (!isArmorStandEmpty() && entityTag == null) {
|
|
+ entityTag = new NBTTagCompound();
|
|
+ }
|
|
+
|
|
+ if (isInvisible()) {
|
|
+ entityTag.setBoolean(INVISIBLE.NBT, invisible);
|
|
+ }
|
|
+
|
|
+ if (hasNoBasePlate()) {
|
|
+ entityTag.setBoolean(NO_BASE_PLATE.NBT, noBasePlate);
|
|
+ }
|
|
+
|
|
+ if (shouldShowArms()) {
|
|
+ entityTag.setBoolean(SHOW_ARMS.NBT, showArms);
|
|
+ }
|
|
+
|
|
+ if (isSmall()) {
|
|
+ entityTag.setBoolean(SMALL.NBT, small);
|
|
+ }
|
|
+
|
|
+ if (isMarker()) {
|
|
+ entityTag.setBoolean(MARKER.NBT, marker);
|
|
+ }
|
|
+
|
|
+ if (entityTag != null) {
|
|
+ tag.set(ENTITY_TAG.NBT, entityTag);
|
|
+ }
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ boolean applicableTo(Material type) {
|
|
+ switch (type) {
|
|
+ case ARMOR_STAND:
|
|
+ return true;
|
|
+ default:
|
|
+ return false;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ boolean isEmpty() {
|
|
+ return super.isEmpty() && isArmorStandEmpty();
|
|
+ }
|
|
+
|
|
+ boolean isArmorStandEmpty() {
|
|
+ return !(isInvisible() || hasNoBasePlate() || shouldShowArms() || isSmall() || isMarker() || entityTag != null);
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ ImmutableMap.Builder<String, Object> serialize(ImmutableMap.Builder<String, Object> builder) {
|
|
+ super.serialize(builder);
|
|
+
|
|
+ if (isInvisible()) {
|
|
+ builder.put(INVISIBLE.BUKKIT, invisible);
|
|
+ }
|
|
+
|
|
+ if (hasNoBasePlate()) {
|
|
+ builder.put(NO_BASE_PLATE.BUKKIT, noBasePlate);
|
|
+ }
|
|
+
|
|
+ if (shouldShowArms()) {
|
|
+ builder.put(SHOW_ARMS.BUKKIT, showArms);
|
|
+ }
|
|
+
|
|
+ if (isSmall()) {
|
|
+ builder.put(SMALL.BUKKIT, small);
|
|
+ }
|
|
+
|
|
+ if (isMarker()) {
|
|
+ builder.put(MARKER.BUKKIT, marker);
|
|
+ }
|
|
+
|
|
+ return builder;
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ void deserializeInternal(NBTTagCompound tag, Object context) {
|
|
+ super.deserializeInternal(tag, context);
|
|
+
|
|
+ if (tag.hasKey(ENTITY_TAG.NBT)) {
|
|
+ entityTag = tag.getCompound(ENTITY_TAG.NBT);
|
|
+ MinecraftServer.getServer().dataConverterManager.update(DataConverterTypes.ENTITY, new Dynamic(DynamicOpsNBT.a, entityTag), -1, Bukkit.getUnsafe().getDataVersion());
|
|
+
|
|
+ if (entityTag.hasKey(INVISIBLE.NBT)) {
|
|
+ invisible = entityTag.getBoolean(INVISIBLE.NBT);
|
|
+ }
|
|
+
|
|
+ if (entityTag.hasKey(NO_BASE_PLATE.NBT)) {
|
|
+ noBasePlate = entityTag.getBoolean(NO_BASE_PLATE.NBT);
|
|
+ }
|
|
+
|
|
+ if (entityTag.hasKey(SHOW_ARMS.NBT)) {
|
|
+ showArms = entityTag.getBoolean(SHOW_ARMS.NBT);
|
|
+ }
|
|
+
|
|
+ if (entityTag.hasKey(SMALL.NBT)) {
|
|
+ small = entityTag.getBoolean(SMALL.NBT);
|
|
+ }
|
|
+
|
|
+ if (entityTag.hasKey(MARKER.NBT)) {
|
|
+ marker = entityTag.getBoolean(MARKER.NBT);
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ boolean equalsCommon(CraftMetaItem meta) {
|
|
+ if (!super.equalsCommon(meta)) {
|
|
+ return false;
|
|
+ }
|
|
+ if (meta instanceof CraftMetaArmorStand) {
|
|
+ CraftMetaArmorStand that = (CraftMetaArmorStand) meta;
|
|
+
|
|
+ return invisible == that.invisible &&
|
|
+ noBasePlate == that.noBasePlate &&
|
|
+ showArms == that.showArms &&
|
|
+ small == that.small &&
|
|
+ marker == that.marker;
|
|
+ }
|
|
+ return true;
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ boolean notUncommon(CraftMetaItem meta) {
|
|
+ return super.notUncommon(meta) && (meta instanceof CraftMetaArmorStand || isArmorStandEmpty());
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ void serializeInternal(Map<String, NBTBase> internalTags) {
|
|
+ if (entityTag != null) {
|
|
+ internalTags.put(ENTITY_TAG.NBT, entityTag);
|
|
+ }
|
|
+ }
|
|
+
|
|
+ @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;
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ int applyHash() {
|
|
+ final int original;
|
|
+ int hash = original = super.applyHash();
|
|
+
|
|
+ hash += entityTag != null ? 73 * hash + entityTag.hashCode() : 0;
|
|
+ hash += isInvisible() ? 61 * hash + 1231 : 0;
|
|
+ hash += hasNoBasePlate() ? 61 * hash + 1231 : 0;
|
|
+ hash += shouldShowArms() ? 61 * hash + 1231 : 0;
|
|
+ hash += isSmall() ? 61 * hash + 1231 : 0;
|
|
+ hash += isMarker() ? 61 * hash + 1231 : 0;
|
|
+
|
|
+ return original != hash ? CraftMetaArmorStand.class.hashCode() ^ hash : hash;
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public CraftMetaArmorStand clone() {
|
|
+ CraftMetaArmorStand clone = (CraftMetaArmorStand) super.clone();
|
|
+
|
|
+ if (entityTag != null) {
|
|
+ clone.entityTag = entityTag.clone();
|
|
+ }
|
|
+
|
|
+ return clone;
|
|
+ }
|
|
+}
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java
|
|
index 1c94fd908..05d3ff969 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java
|
|
@@ -155,6 +155,7 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable {
|
|
.put(CraftMetaCharge.class, "FIREWORK_EFFECT")
|
|
.put(CraftMetaKnowledgeBook.class, "KNOWLEDGE_BOOK")
|
|
.put(CraftMetaTropicalFishBucket.class, "TROPICAL_FISH_BUCKET")
|
|
+ .put(CraftMetaArmorStand.class, "ARMOR_STAND")
|
|
.put(CraftMetaItem.class, "UNSPECIFIC")
|
|
.build();
|
|
|
|
@@ -1286,7 +1287,15 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable {
|
|
CraftMetaCharge.EXPLOSION.NBT,
|
|
CraftMetaBlockState.BLOCK_ENTITY_TAG.NBT,
|
|
CraftMetaKnowledgeBook.BOOK_RECIPES.NBT,
|
|
- CraftMetaTropicalFishBucket.VARIANT.NBT
|
|
+ CraftMetaTropicalFishBucket.VARIANT.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
|
|
));
|
|
}
|
|
return HANDLED_TAGS;
|
|
diff --git a/src/test/java/org/bukkit/craftbukkit/inventory/ItemMetaTest.java b/src/test/java/org/bukkit/craftbukkit/inventory/ItemMetaTest.java
|
|
index 65b8123a8..0ad0004b9 100644
|
|
--- a/src/test/java/org/bukkit/craftbukkit/inventory/ItemMetaTest.java
|
|
+++ b/src/test/java/org/bukkit/craftbukkit/inventory/ItemMetaTest.java
|
|
@@ -8,6 +8,7 @@ import java.util.Arrays;
|
|
import java.util.List;
|
|
import java.util.UUID;
|
|
|
|
+import com.destroystokyo.paper.inventory.meta.ArmorStandMeta; // Paper
|
|
import net.minecraft.server.Block;
|
|
import net.minecraft.server.IRegistry;
|
|
import net.minecraft.server.ITileEntity;
|
|
@@ -315,7 +316,18 @@ public class ItemMetaTest extends AbstractTestingBase {
|
|
cleanStack.setItemMeta(meta);
|
|
return cleanStack;
|
|
}
|
|
+ },
|
|
+ // Paper start
|
|
+ new StackProvider(Material.ARMOR_STAND) {
|
|
+ @Override
|
|
+ ItemStack operate(ItemStack cleanStack) {
|
|
+ final ArmorStandMeta meta = (ArmorStandMeta) cleanStack.getItemMeta();
|
|
+ meta.setInvisible(true);
|
|
+ cleanStack.setItemMeta(meta);
|
|
+ return cleanStack;
|
|
+ }
|
|
}
|
|
+ // paper end
|
|
);
|
|
|
|
assertThat("Forgotten test?", providers, hasSize(ItemStackTest.COMPOUND_MATERIALS.length - 4/* Normal item meta, skulls, eggs and tile entities */));
|
|
--
|
|
2.20.1
|
|
|