PaperMC/Spigot-Server-Patches/Process-NMS-Data-Conversion-post-ItemMeta-on-Copy.patch
2016-12-02 18:07:07 -06:00

64 lines
No EOL
2.8 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Aikar <aikar@aikar.co>
Date: Wed, 4 May 2016 22:31:18 -0400
Subject: [PATCH] Process NMS Data Conversion post ItemMeta on Copy
ItemMeta apply is a destructive process that expects to be the authority on
what the items NBT data is.
When CraftItemStack.asNMSCopy was called, the conversion ran, potentially setting
the converted data into the ItemStacks tag.
Then if that item had ItemMeta, it would completely undo that conversion by
erasing the NBT Tag.
On copy, run conversion post ItemMeta apply.
diff --git a/src/main/java/net/minecraft/server/ItemStack.java b/src/main/java/net/minecraft/server/ItemStack.java
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
--- a/src/main/java/net/minecraft/server/ItemStack.java
+++ b/src/main/java/net/minecraft/server/ItemStack.java
@@ -0,0 +0,0 @@ public final class ItemStack {
this(item, i, 0);
}
+ // Paper start
public ItemStack(Item item, int i, int j) {
+ this(item, i, j, true);
+ }
+ public ItemStack(Item item, int i, int j, boolean convert) {
+ // Paper end
this.item = item;
this.damage = j;
this.count = i;
// CraftBukkit start - Pass to setData to do filtering
+ // Paper start
+ if (convert) convertData(j);
+ }
+
+ public final void convertData(int data) {
+ // Paper end
if (MinecraftServer.getServer() != null) {
- this.setData(j);
+ this.setData(data);
NBTTagCompound savedStack = new NBTTagCompound();
this.save(savedStack);
MinecraftServer.getServer().getDataConverterManager().a(DataConverterTypes.ITEM_INSTANCE, savedStack); // PAIL: convert
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 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 net.minecraft.server.ItemStack.a;
}
- net.minecraft.server.ItemStack stack = new net.minecraft.server.ItemStack(item, original.getAmount(), original.getDurability());
+ net.minecraft.server.ItemStack stack = new net.minecraft.server.ItemStack(item, original.getAmount(), original.getDurability(), false); // Paper
if (original.hasItemMeta()) {
setItemMeta(stack, original.getItemMeta());
}
+ stack.convertData(original.getDurability()); // Paper
return stack;
}
--