Save as snbt

This commit is contained in:
Nassim Jahnke 2025-04-12 09:48:51 +02:00
parent 9742f95e59
commit c853e38b9f
No known key found for this signature in database
2 changed files with 29 additions and 32 deletions

View File

@ -1,2 +0,0 @@
// Uncomment to enable the 'paper-api-generator' project
// include(":paper-api-generator")

View File

@ -18,6 +18,7 @@ import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
@ -33,8 +34,10 @@ import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.core.registries.Registries;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.NbtOps;
import net.minecraft.nbt.NbtUtils;
import net.minecraft.nbt.StringTag;
import net.minecraft.nbt.Tag;
import net.minecraft.nbt.TagParser;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.level.ServerLevel;
@ -56,12 +59,10 @@ import org.bukkit.World;
import org.bukkit.advancement.Advancement;
import org.bukkit.attribute.Attribute;
import org.bukkit.attribute.AttributeModifier;
import org.bukkit.block.Biome;
import org.bukkit.block.data.BlockData;
import org.bukkit.craftbukkit.CraftRegistry;
import org.bukkit.craftbukkit.CraftServer;
import org.bukkit.craftbukkit.CraftWorld;
import org.bukkit.craftbukkit.block.CraftBiome;
import org.bukkit.craftbukkit.block.data.CraftBlockData;
import org.bukkit.craftbukkit.damage.CraftDamageSourceBuilder;
import org.bukkit.craftbukkit.entity.CraftEntity;
@ -85,7 +86,6 @@ import org.bukkit.potion.PotionType;
public final class CraftMagicNumbers implements UnsafeValues {
public static final CraftMagicNumbers INSTANCE = new CraftMagicNumbers();
public static final boolean DISABLE_OLD_API_SUPPORT = Boolean.getBoolean("paper.disableOldApiSupport"); // Paper
private static final Gson GSON = new Gson();
private final Commodore commodore = new Commodore();
@ -513,8 +513,9 @@ public final class CraftMagicNumbers implements UnsafeValues {
@Override
public @org.jetbrains.annotations.NotNull Map<String, Object> serializeStack(final ItemStack itemStack) {
final CompoundTag tag = CraftItemStack.asNMSCopy(itemStack).save(CraftRegistry.getMinecraftRegistry()).asCompound().orElseThrow();
net.minecraft.nbt.NbtUtils.addCurrentDataVersion(tag);
final Map<String, Object> ret = new HashMap<>();
NbtUtils.addCurrentDataVersion(tag);
final Map<String, Object> ret = new LinkedHashMap<>();
tag.asCompound().get().forEach((key, value) -> {
switch (key) {
case "id" -> {
@ -524,30 +525,30 @@ public final class CraftMagicNumbers implements UnsafeValues {
ret.put("count", value.asInt().get());
}
case "components" -> {
final com.mojang.serialization.Codec<Tag> converter = ExtraCodecs.converter(NbtOps.INSTANCE);
final Map<String, Object> components = new HashMap<>();
final Map<String, Object> components = new LinkedHashMap<>();
value.asCompound().ifPresent((compoundTag) -> {
compoundTag.keySet().forEach((componentKey) -> {
components.put(componentKey, converter.encodeStart(JsonOps.INSTANCE, compoundTag.get(componentKey)).result().get().toString());
compoundTag.forEach((componentKey, componentTag) -> {
final String serializedComponent = componentTag.toString();
components.put(componentKey, serializedComponent);
});
});
ret.put("components", components);
}
case "DataVersion" -> {
ret.put("DataVersion", value.asInt().get());
case SharedConstants.DATA_VERSION_TAG -> {
ret.put(SharedConstants.DATA_VERSION_TAG, value.asInt().get());
}
default -> throw new IllegalStateException("Unexpected value: " + key);
}
});
ret.put("schema_version", 2);
ret.put("schema_version", 1);
return ret;
}
@Override
public @org.jetbrains.annotations.NotNull ItemStack deserializeStack(@org.jetbrains.annotations.NotNull final Map<String, Object> args) {
int version = args.getOrDefault("schema_version", 1) instanceof Number val ? val.intValue() : -1;
final int version = args.getOrDefault("schema_version", 1) instanceof Number val ? val.intValue() : -1;
CompoundTag tag = new CompoundTag();
final CompoundTag tag = new CompoundTag();
args.forEach((key, value) -> {
switch (key) {
case "id" -> {
@ -558,29 +559,27 @@ public final class CraftMagicNumbers implements UnsafeValues {
}
case "components" -> {
if (version == 1) {
String json = (String) value;
final JsonElement jsonElement = GSON.fromJson(json, JsonElement.class);
tag.put("components", ExtraCodecs.converter(JsonOps.INSTANCE).encodeStart(NbtOps.INSTANCE, jsonElement).result().get());
} else if (version == 2) {
Map<String, String> componentMap = (Map<String, String>) value;
CompoundTag components = new CompoundTag();
componentMap.forEach((keyString, valueString) -> {
final JsonElement jsonElement = GSON.fromJson(valueString, JsonElement.class);
components.put(keyString, ExtraCodecs.converter(JsonOps.INSTANCE).encodeStart(NbtOps.INSTANCE, jsonElement).result().get());
final Map<String, String> componentMap = (Map<String, String>) value;
final CompoundTag componentsTag = new CompoundTag();
componentMap.forEach((componentKey, componentString) -> {
final Tag componentTag;
try {
componentTag = TagParser.create(NbtOps.INSTANCE).parseFully(componentString);
} catch (final CommandSyntaxException e) {
throw new RuntimeException("Error parsing item stack data components", e);
}
componentsTag.put(componentKey, componentTag);
});
tag.put("components", components);
tag.put("components", componentsTag);
} else {
throw new IllegalStateException("Unexpected version: " + version);
}
}
case "DataVersion" -> {
tag.putInt("DataVersion", ((Number) value).intValue());
case SharedConstants.DATA_VERSION_TAG -> {
tag.putInt(SharedConstants.DATA_VERSION_TAG, ((Number) value).intValue());
}
case "==" -> {
// Ignore
}
case "schema_version" -> {
case "==", "schema_version" -> {
// Ignore
}
default -> throw new IllegalStateException("Unexpected value: " + key);