From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Mariell Hoversholm Date: Thu, 30 Apr 2020 16:56:31 +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/org/bukkit/UnsafeValues.java b/src/main/java/org/bukkit/UnsafeValues.java index 24fad8e59a3a5a174d24505cedda2a3fd52115b1..ee9ed5f0e2936c740903784b01b9e2fff75b92f8 100644 --- a/src/main/java/org/bukkit/UnsafeValues.java +++ b/src/main/java/org/bukkit/UnsafeValues.java @@ -121,5 +121,9 @@ public interface UnsafeValues { default com.destroystokyo.paper.util.VersionFetcher getVersionFetcher() { return new com.destroystokyo.paper.util.VersionFetcher.DummyVersionFetcher(); } + + byte[] serializeItem(ItemStack item); + + ItemStack deserializeItem(byte[] data); // Paper end } diff --git a/src/main/java/org/bukkit/inventory/ItemStack.java b/src/main/java/org/bukkit/inventory/ItemStack.java index b15645cd56c245214bb5b87b36395fbc8e86e3d3..7c280d7beeb42dca52e36e77bbd41742b2572710 100644 --- a/src/main/java/org/bukkit/inventory/ItemStack.java +++ b/src/main/java/org/bukkit/inventory/ItemStack.java @@ -639,6 +639,30 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat return Bukkit.getServer().getItemFactory().ensureServerConversions(this); } + /** + * Deserializes this itemstack from raw NBT bytes. NBT is safer for data migrations as it will + * use the built in data converter instead of bukkits dangerous serialization system. + * + * This expects that the DataVersion was stored on the root of the Compound, as saved from + * the {@link #serializeAsBytes()} API returned. + * @param bytes bytes representing an item in NBT + * @return ItemStack migrated to this version of Minecraft if needed. + */ + @NotNull + public static ItemStack deserializeBytes(@NotNull byte[] bytes) { + return org.bukkit.Bukkit.getUnsafe().deserializeItem(bytes); + } + + /** + * Serializes this itemstack to raw bytes in NBT. NBT is safer for data migrations as it will + * use the built in data converter instead of bukkits dangerous serialization system. + * @return bytes representing this item in NBT. + */ + @NotNull + public byte[] serializeAsBytes() { + return org.bukkit.Bukkit.getUnsafe().serializeItem(this); + } + /** * Gets the Display name as seen in the Client. * Currently the server only supports the English language. To override this,