Update upstream B/CB/S
--- work/Bukkit Submodule work/Bukkit aba2aaaf..949124e0: > SPIGOT-5121: Method to set PierceLevel of arrows --- work/CraftBukkit Submodule work/CraftBukkit c6997924..bf329334: > SPIGOT-5133: Throwing items into secondary end world portal causes crash > SPIGOT-5121: Method to set PierceLevel of arrows > SPIGOT-5122: Skip world#notify if sign has no world. > SPIGOT-5105: The EntityTag nbt tag disappears from preset armor_stand items. > SPIGOT-5106: Config option to prevent plugins with incompatible API's from loading --- work/Spigot Submodule work/Spigot 595711b0..935adb34: > SPIGOT-5088: Additional growth modifiers
This commit is contained in:
@@ -12,79 +12,37 @@ 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 7099eeda4e..cb9f4af3f7 100644
|
||||
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemFactory.java
|
||||
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemFactory.java
|
||||
@@ -0,0 +0,0 @@ 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 f2f4c8d3c3..6e018396e6 100644
|
||||
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java
|
||||
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java
|
||||
@@ -0,0 +0,0 @@ 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 0000000000..c00b89c8d4
|
||||
--- /dev/null
|
||||
index f70052284..3723facca 100644
|
||||
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaArmorStand.java
|
||||
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaArmorStand.java
|
||||
@@ -0,0 +0,0 @@
|
||||
+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");
|
||||
@@ -0,0 +0,0 @@ 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 NBTTagCompound entityTag;
|
||||
+
|
||||
+ private boolean invisible;
|
||||
+ private boolean noBasePlate;
|
||||
+ private boolean showArms;
|
||||
+ private boolean small;
|
||||
+ private boolean marker;
|
||||
+
|
||||
+ CraftMetaArmorStand(CraftMetaItem meta) {
|
||||
+ super(meta);
|
||||
+
|
||||
+ // Paper end
|
||||
NBTTagCompound entityTag;
|
||||
|
||||
CraftMetaArmorStand(CraftMetaItem meta) {
|
||||
super(meta);
|
||||
+
|
||||
+ // Paper start
|
||||
+ if (!(meta instanceof CraftMetaArmorStand)) {
|
||||
+ return;
|
||||
+ }
|
||||
@@ -95,14 +53,16 @@ index 0000000000..c00b89c8d4
|
||||
+ 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);
|
||||
+ // Paper end
|
||||
}
|
||||
|
||||
CraftMetaArmorStand(NBTTagCompound tag) {
|
||||
@@ -0,0 +0,0 @@ public class CraftMetaArmorStand extends CraftMetaItem {
|
||||
|
||||
if (tag.hasKey(ENTITY_TAG.NBT)) {
|
||||
entityTag = tag.getCompound(ENTITY_TAG.NBT);
|
||||
+
|
||||
+ // Paper start
|
||||
+ if (entityTag.hasKey(INVISIBLE.NBT)) {
|
||||
+ invisible = entityTag.getBoolean(INVISIBLE.NBT);
|
||||
+ }
|
||||
@@ -122,12 +82,14 @@ index 0000000000..c00b89c8d4
|
||||
+ if (entityTag.hasKey(MARKER.NBT)) {
|
||||
+ marker = entityTag.getBoolean(MARKER.NBT);
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ CraftMetaArmorStand(Map<String, Object> map) {
|
||||
+ super(map);
|
||||
+ // Paper end
|
||||
}
|
||||
}
|
||||
|
||||
CraftMetaArmorStand(Map<String, Object> map) {
|
||||
super(map);
|
||||
+
|
||||
+ // Paper start
|
||||
+ boolean invis = SerializableMeta.getBoolean(map, INVISIBLE.BUKKIT);
|
||||
+ boolean noBase = SerializableMeta.getBoolean(map, NO_BASE_PLATE.BUKKIT);
|
||||
+ boolean showArms = SerializableMeta.getBoolean(map, SHOW_ARMS.BUKKIT);
|
||||
@@ -139,12 +101,15 @@ index 0000000000..c00b89c8d4
|
||||
+ this.showArms = showArms;
|
||||
+ this.small = small;
|
||||
+ this.marker = marker;
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ void applyToItem(NBTTagCompound tag) {
|
||||
+ super.applyToItem(tag);
|
||||
+
|
||||
+ // Paper end
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -0,0 +0,0 @@ public class CraftMetaArmorStand extends CraftMetaItem {
|
||||
void applyToItem(NBTTagCompound tag) {
|
||||
super.applyToItem(tag);
|
||||
|
||||
+ // Paper start
|
||||
+ if (!isArmorStandEmpty() && entityTag == null) {
|
||||
+ entityTag = new NBTTagCompound();
|
||||
+ }
|
||||
@@ -168,35 +133,58 @@ index 0000000000..c00b89c8d4
|
||||
+ if (isMarker()) {
|
||||
+ entityTag.setBoolean(MARKER.NBT, marker);
|
||||
+ }
|
||||
+ // Paper end
|
||||
+
|
||||
+ 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() {
|
||||
if (entityTag != null) {
|
||||
tag.set(ENTITY_TAG.NBT, entityTag);
|
||||
}
|
||||
@@ -0,0 +0,0 @@ public class CraftMetaArmorStand extends CraftMetaItem {
|
||||
}
|
||||
|
||||
boolean isArmorStandEmpty() {
|
||||
- return !(entityTag != null);
|
||||
+ return !(isInvisible() || hasNoBasePlate() || shouldShowArms() || isSmall() || isMarker() || entityTag != null);
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ ImmutableMap.Builder<String, Object> serialize(ImmutableMap.Builder<String, Object> builder) {
|
||||
+ super.serialize(builder);
|
||||
+
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -0,0 +0,0 @@ public class CraftMetaArmorStand extends CraftMetaItem {
|
||||
if (meta instanceof CraftMetaArmorStand) {
|
||||
CraftMetaArmorStand that = (CraftMetaArmorStand) meta;
|
||||
|
||||
- return entityTag != null ? that.entityTag != null && this.entityTag.equals(that.entityTag) : entityTag == null;
|
||||
+ // Paper start
|
||||
+ return invisible == that.invisible &&
|
||||
+ noBasePlate == that.noBasePlate &&
|
||||
+ showArms == that.showArms &&
|
||||
+ small == that.small &&
|
||||
+ marker == that.marker;
|
||||
+ // Paper end
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@@ -0,0 +0,0 @@ public class CraftMetaArmorStand extends CraftMetaItem {
|
||||
final int original;
|
||||
int hash = original = super.applyHash();
|
||||
|
||||
- if (entityTag != null) {
|
||||
- hash = 73 * hash + entityTag.hashCode();
|
||||
- }
|
||||
+ // Paper start
|
||||
+ 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;
|
||||
+ // Paper end
|
||||
|
||||
return original != hash ? CraftMetaArmorStand.class.hashCode() ^ hash : hash;
|
||||
}
|
||||
@@ -0,0 +0,0 @@ public class CraftMetaArmorStand extends CraftMetaItem {
|
||||
Builder<String, Object> serialize(Builder<String, Object> builder) {
|
||||
super.serialize(builder);
|
||||
|
||||
+ // Paper start
|
||||
+ if (isInvisible()) {
|
||||
+ builder.put(INVISIBLE.BUKKIT, invisible);
|
||||
+ }
|
||||
@@ -216,69 +204,17 @@ index 0000000000..c00b89c8d4
|
||||
+ if (isMarker()) {
|
||||
+ builder.put(MARKER.BUKKIT, marker);
|
||||
+ }
|
||||
+ // Paper end
|
||||
+
|
||||
+ 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);
|
||||
+ }
|
||||
+ }
|
||||
return builder;
|
||||
}
|
||||
|
||||
@@ -0,0 +0,0 @@ public class CraftMetaArmorStand extends CraftMetaItem {
|
||||
|
||||
return clone;
|
||||
}
|
||||
+
|
||||
+ // Paper start
|
||||
+ @Override
|
||||
+ public boolean isInvisible() {
|
||||
+ return invisible;
|
||||
@@ -328,35 +264,10 @@ index 0000000000..c00b89c8d4
|
||||
+ 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;
|
||||
+ }
|
||||
+}
|
||||
+ // 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 bf7b226a4f..a8b267487f 100644
|
||||
index bf7b226a4..a8b267487 100644
|
||||
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java
|
||||
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java
|
||||
@@ -0,0 +0,0 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable, BlockDataMeta {
|
||||
@@ -385,7 +296,7 @@ index bf7b226a4f..a8b267487f 100644
|
||||
}
|
||||
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 6abde9030d..2a0852675b 100644
|
||||
index dd4ba3874..48c5e0621 100644
|
||||
--- a/src/test/java/org/bukkit/craftbukkit/inventory/ItemMetaTest.java
|
||||
+++ b/src/test/java/org/bukkit/craftbukkit/inventory/ItemMetaTest.java
|
||||
@@ -0,0 +0,0 @@ import java.util.ArrayList;
|
||||
@@ -397,21 +308,11 @@ index 6abde9030d..2a0852675b 100644
|
||||
import net.minecraft.server.IRegistry;
|
||||
import net.minecraft.server.ITileEntity;
|
||||
@@ -0,0 +0,0 @@ public class ItemMetaTest extends AbstractTestingBase {
|
||||
final CraftMetaArmorStand meta = (CraftMetaArmorStand) cleanStack.getItemMeta();
|
||||
meta.entityTag = new NBTTagCompound();
|
||||
meta.entityTag.setBoolean("Small", true);
|
||||
+ meta.setInvisible(true); // Paper
|
||||
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 */));
|
||||
--
|
||||
Reference in New Issue
Block a user