mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-28 15:30:19 +01:00
52a05907c7
Upstream has released updates that appear to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing Bukkit Changes: 97c59261 PR-1073: Make Biome an interface a38581aa Fix further javadoc errors 8271c490 Fix javadoc error 8a9ecf29 PR-1072: Fix bad naming for Vault State methods 6dd58108 PR-1071: Make Fluid an interface and add missing entry ed2cdfc3 PR-1070: Make Attribute an interface and align names with the new minecraft ones 63472efb PR-1069: Add missing winter drop experimental annotation to pale boats CraftBukkit Changes: 7235ad7b0 PR-1501: Make Biome an interface 602904003 PR-1500: Rename implementation for Vault State methods 75f26f79f PR-1499: Make Fluid an interface and add missing entry 4cfd87adc PR-1498: Make Attribute an interface and align names with the new minecraft ones 6bb0db5cb SPIGOT-7928: ExactChoice acts as MaterialChoice 3eaf3a13c SPIGOT-7929: Error when setting EquippableComponent abbf57bac SPIGOT-7930: Fix spawning entities with SummonEntityEffect 92d6ab6cf PR-1497: Move boat field rename entries to below key renaming, so that keys are also renamed abfe292aa PR-1496: Use correct Fluid class on Tags type check c7aab7fa7 SPIGOT-7923: Fix Dispenser logic to avoid firing empty projectiles
73 lines
4.8 KiB
Diff
73 lines
4.8 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: masmc05 <masmc05@gmail.com>
|
|
Date: Sun, 11 Aug 2024 03:01:52 +0300
|
|
Subject: [PATCH] Item serialization as json
|
|
|
|
|
|
diff --git a/src/main/java/net/minecraft/world/item/component/CustomData.java b/src/main/java/net/minecraft/world/item/component/CustomData.java
|
|
index c80fd4960dfbb0fde37363e7df25b0a5411bdb11..ff7f6916f65466c25a7bde35d64682c15b211697 100644
|
|
--- a/src/main/java/net/minecraft/world/item/component/CustomData.java
|
|
+++ b/src/main/java/net/minecraft/world/item/component/CustomData.java
|
|
@@ -28,7 +28,17 @@ import org.slf4j.Logger;
|
|
public final class CustomData {
|
|
private static final Logger LOGGER = LogUtils.getLogger();
|
|
public static final CustomData EMPTY = new CustomData(new CompoundTag());
|
|
- public static final Codec<CustomData> CODEC = Codec.withAlternative(CompoundTag.CODEC, TagParser.AS_CODEC)
|
|
+ // Paper start - Item serialization as json
|
|
+ public static ThreadLocal<Boolean> SERIALIZE_CUSTOM_AS_SNBT = ThreadLocal.withInitial(() -> false);
|
|
+ public static final Codec<CustomData> CODEC = Codec.either(CompoundTag.CODEC, TagParser.AS_CODEC)
|
|
+ .xmap(com.mojang.datafixers.util.Either::unwrap, data -> { // Both will be used for deserialization, but we decide which one to use for serialization
|
|
+ if (!SERIALIZE_CUSTOM_AS_SNBT.get()) {
|
|
+ return com.mojang.datafixers.util.Either.left(data); // First codec
|
|
+ } else {
|
|
+ return com.mojang.datafixers.util.Either.right(data); // Second codec
|
|
+ }
|
|
+ })
|
|
+ // Paper end - Item serialization as json
|
|
.xmap(CustomData::new, component -> component.tag);
|
|
public static final Codec<CustomData> CODEC_WITH_ID = CODEC.validate(
|
|
component -> component.getUnsafe().contains("id", 8) ? DataResult.success(component) : DataResult.error(() -> "Missing id for entity in: " + component)
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
|
|
index 83835e41034e79442177f19dcb18e7df5b0e296e..08d48cd55cfaf92530cc900f2f119ae3a258eb39 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
|
|
@@ -527,6 +527,39 @@ public final class CraftMagicNumbers implements UnsafeValues {
|
|
return CraftItemStack.asCraftMirror(net.minecraft.world.item.ItemStack.parse(MinecraftServer.getServer().registryAccess(), compound).orElseThrow());
|
|
}
|
|
|
|
+ @Override
|
|
+ public com.google.gson.JsonObject serializeItemAsJson(ItemStack itemStack) {
|
|
+ Preconditions.checkNotNull(itemStack, "Cannot serialize empty ItemStack");
|
|
+ Preconditions.checkArgument(!itemStack.isEmpty(), "Cannot serialize empty ItemStack");
|
|
+
|
|
+ net.minecraft.core.RegistryAccess.Frozen reg = net.minecraft.server.MinecraftServer.getServer().registryAccess();
|
|
+ com.mojang.serialization.DynamicOps<com.google.gson.JsonElement> ops = reg.createSerializationContext(com.mojang.serialization.JsonOps.INSTANCE);
|
|
+ com.google.gson.JsonObject item;
|
|
+ // Serialize as SNBT to preserve exact NBT types; vanilla codecs already can handle such deserialization.
|
|
+ net.minecraft.world.item.component.CustomData.SERIALIZE_CUSTOM_AS_SNBT.set(true);
|
|
+ try {
|
|
+ item = net.minecraft.world.item.ItemStack.CODEC.encodeStart(ops, CraftItemStack.unwrap(itemStack)).getOrThrow().getAsJsonObject();
|
|
+ } finally {
|
|
+ net.minecraft.world.item.component.CustomData.SERIALIZE_CUSTOM_AS_SNBT.set(false);
|
|
+ }
|
|
+ item.addProperty("DataVersion", this.getDataVersion());
|
|
+ return item;
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public ItemStack deserializeItemFromJson(com.google.gson.JsonObject data) throws IllegalArgumentException {
|
|
+ Preconditions.checkNotNull(data, "null cannot be deserialized");
|
|
+
|
|
+ final int dataVersion = data.get("DataVersion").getAsInt();
|
|
+ final int currentVersion = org.bukkit.craftbukkit.util.CraftMagicNumbers.INSTANCE.getDataVersion();
|
|
+ data = ca.spottedleaf.dataconverter.minecraft.MCDataConverter.convertJson(
|
|
+ ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry.ITEM_STACK,
|
|
+ data, false, dataVersion, currentVersion
|
|
+ );
|
|
+ com.mojang.serialization.DynamicOps<com.google.gson.JsonElement> ops = MinecraftServer.getServer().registryAccess().createSerializationContext(com.mojang.serialization.JsonOps.INSTANCE);
|
|
+ return CraftItemStack.asCraftMirror(net.minecraft.world.item.ItemStack.CODEC.parse(ops, data).getOrThrow(IllegalArgumentException::new));
|
|
+ }
|
|
+
|
|
@Override
|
|
public byte[] serializeEntity(org.bukkit.entity.Entity entity) {
|
|
Preconditions.checkNotNull(entity, "null cannot be serialized");
|