mirror of
https://github.com/PaperMC/Paper.git
synced 2024-11-29 19:52:55 +01:00
6e7dc3f81d
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
CraftBukkit Changes:
52fd29c0d
SPIGOT-6033: Bukkit.getUnsafe().getMaterial() won't match renamed block materials
102 lines
5.5 KiB
Diff
102 lines
5.5 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Mariell Hoversholm <proximyst@proximyst.com>
|
|
Date: Thu, 30 Apr 2020 16:56:54 +0200
|
|
Subject: [PATCH] Add Raw Byte ItemStack Serialization
|
|
|
|
Serializes using NBT which is safer for server data migrations than bukkits format.
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/DataConverterRegistry.java b/src/main/java/net/minecraft/server/DataConverterRegistry.java
|
|
index d7ebbce930fc65437697d25637346b9c99e6a8fa..5d807082281527c78a08d01430e42b3ecee6d2cf 100644
|
|
--- a/src/main/java/net/minecraft/server/DataConverterRegistry.java
|
|
+++ b/src/main/java/net/minecraft/server/DataConverterRegistry.java
|
|
@@ -24,6 +24,7 @@ public class DataConverterRegistry {
|
|
return datafixerbuilder.build(SystemUtils.e());
|
|
}
|
|
|
|
+ public static DataFixer getDataFixer() { return a(); } // Paper - OBFHELPER
|
|
public static DataFixer a() {
|
|
return DataConverterRegistry.c;
|
|
}
|
|
diff --git a/src/main/java/net/minecraft/server/ItemStack.java b/src/main/java/net/minecraft/server/ItemStack.java
|
|
index d1e4ee64aa395b38cad22f316308c4687ea56b9f..9a9678ed76b95131df0c12af5bba3440789699aa 100644
|
|
--- a/src/main/java/net/minecraft/server/ItemStack.java
|
|
+++ b/src/main/java/net/minecraft/server/ItemStack.java
|
|
@@ -144,6 +144,7 @@ public final class ItemStack {
|
|
this.checkEmpty();
|
|
}
|
|
|
|
+ public static ItemStack fromCompound(NBTTagCompound nbttagcompound) { return a(nbttagcompound); } // Paper - OBFHELPER
|
|
public static ItemStack a(NBTTagCompound nbttagcompound) {
|
|
try {
|
|
return new ItemStack(nbttagcompound);
|
|
diff --git a/src/main/java/net/minecraft/server/NBTCompressedStreamTools.java b/src/main/java/net/minecraft/server/NBTCompressedStreamTools.java
|
|
index f48b62af436de47484eb1cf496e97a29168586b0..c948e590eeff0aea53573532f8c507d638cc0bdf 100644
|
|
--- a/src/main/java/net/minecraft/server/NBTCompressedStreamTools.java
|
|
+++ b/src/main/java/net/minecraft/server/NBTCompressedStreamTools.java
|
|
@@ -15,6 +15,7 @@ import io.netty.buffer.ByteBufInputStream; // Paper
|
|
|
|
public class NBTCompressedStreamTools {
|
|
|
|
+ public static NBTTagCompound readNBT(InputStream inputstream) throws IOException { return a(inputstream); } // Paper - OBFHELPER
|
|
public static NBTTagCompound a(InputStream inputstream) throws IOException {
|
|
DataInputStream datainputstream = new DataInputStream(new BufferedInputStream(new GZIPInputStream(inputstream)));
|
|
Throwable throwable = null;
|
|
@@ -44,6 +45,7 @@ public class NBTCompressedStreamTools {
|
|
return nbttagcompound;
|
|
}
|
|
|
|
+ public static void writeNBT(NBTTagCompound nbttagcompound, OutputStream outputstream) throws IOException { a(nbttagcompound, outputstream); } // Paper - OBFHELPER
|
|
public static void a(NBTTagCompound nbttagcompound, OutputStream outputstream) throws IOException {
|
|
DataOutputStream dataoutputstream = new DataOutputStream(new BufferedOutputStream(new GZIPOutputStream(outputstream)));
|
|
Throwable throwable = null;
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
|
|
index d288d5fadbdb7cd4e5a42f94cdba6f825b2ed877..90c1067ca23e566a96d71e06c273d44397928b64 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
|
|
@@ -333,6 +333,46 @@ public final class CraftMagicNumbers implements UnsafeValues {
|
|
public boolean isSupportedApiVersion(String apiVersion) {
|
|
return apiVersion != null && SUPPORTED_API.contains(apiVersion);
|
|
}
|
|
+
|
|
+ @Override
|
|
+ public byte[] serializeItem(ItemStack item) {
|
|
+ Preconditions.checkNotNull(item, "null cannot be serialized");
|
|
+ Preconditions.checkArgument(item.getType() != Material.AIR, "air cannot be serialized");
|
|
+
|
|
+ java.io.ByteArrayOutputStream outputStream = new java.io.ByteArrayOutputStream();
|
|
+ NBTTagCompound compound = (item instanceof CraftItemStack ? ((CraftItemStack) item).getHandle() : CraftItemStack.asNMSCopy(item)).save(new NBTTagCompound());
|
|
+ compound.setInt("DataVersion", getDataVersion());
|
|
+ try {
|
|
+ net.minecraft.server.NBTCompressedStreamTools.writeNBT(
|
|
+ compound,
|
|
+ outputStream
|
|
+ );
|
|
+ } catch (IOException ex) {
|
|
+ throw new RuntimeException(ex);
|
|
+ }
|
|
+
|
|
+ return outputStream.toByteArray();
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public ItemStack deserializeItem(byte[] data) {
|
|
+ Preconditions.checkNotNull(data, "null cannot be deserialized");
|
|
+ Preconditions.checkArgument(data.length > 0, "cannot deserialize nothing");
|
|
+
|
|
+ try {
|
|
+ NBTTagCompound compound = net.minecraft.server.NBTCompressedStreamTools.readNBT(
|
|
+ new java.io.ByteArrayInputStream(data)
|
|
+ );
|
|
+ int dataVersion = compound.getInt("DataVersion");
|
|
+
|
|
+ Preconditions.checkArgument(dataVersion <= getDataVersion(), "Newer version! Server downgrades are not supported!");
|
|
+ Dynamic<NBTBase> converted = DataConverterRegistry.getDataFixer().update(DataConverterTypes.ITEM_STACK, new Dynamic<NBTBase>(DynamicOpsNBT.a, compound), dataVersion, getDataVersion());
|
|
+ return CraftItemStack.asCraftMirror(net.minecraft.server.ItemStack.fromCompound((NBTTagCompound) converted.getValue()));
|
|
+ } catch (IOException ex) {
|
|
+ com.destroystokyo.paper.util.SneakyThrow.sneaky(ex);
|
|
+ throw new RuntimeException();
|
|
+ }
|
|
+ }
|
|
// Paper end
|
|
|
|
/**
|