diff --git a/paper-api/src/main/java/io/papermc/paper/persistence/PersistentDataContainerView.java b/paper-api/src/main/java/io/papermc/paper/persistence/PersistentDataContainerView.java index fd27d65893a2..544b0f37daa2 100644 --- a/paper-api/src/main/java/io/papermc/paper/persistence/PersistentDataContainerView.java +++ b/paper-api/src/main/java/io/papermc/paper/persistence/PersistentDataContainerView.java @@ -1,6 +1,7 @@ package io.papermc.paper.persistence; import java.util.Set; +import net.kyori.adventure.key.Key; import org.bukkit.NamespacedKey; import org.bukkit.persistence.PersistentDataAdapterContext; import org.bukkit.persistence.PersistentDataContainer; @@ -110,6 +111,23 @@ public interface PersistentDataContainerView { */
C getOrDefault(NamespacedKey key, PersistentDataType
type, C defaultValue);
+ /**
+ * Estimates the {@link PersistentDataType} of the value based on the primitive
+ * type that is stored for the given key.
+ *
+ * WARNING: This method will only return data types
+ * defined in {@link PersistentDataType} which directly map to a specific
+ * nbt tag. The return value will be wrong if the data type is plugin
+ * specific or not represented by a specific nbt tag.
+ * Use {@link #has(NamespacedKey, PersistentDataType)} if you expect a
+ * specific data type.
+ *
+ * @param key the key to look up the value type of
+ * @return estimated data type or null if no value is present, the type is
+ * unknown or an empty list is encountered as value.
+ */
+ @Nullable PersistentDataType, ?> getPrimitiveStorageType(Key key);
+
/**
* Get the set of keys present on this {@link PersistentDataContainer}
* instance.
diff --git a/paper-server/src/main/java/io/papermc/paper/persistence/PaperPersistentDataContainerView.java b/paper-server/src/main/java/io/papermc/paper/persistence/PaperPersistentDataContainerView.java
index 6f78279f4e54..614a655555e2 100644
--- a/paper-server/src/main/java/io/papermc/paper/persistence/PaperPersistentDataContainerView.java
+++ b/paper-server/src/main/java/io/papermc/paper/persistence/PaperPersistentDataContainerView.java
@@ -7,13 +7,16 @@
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
+import net.kyori.adventure.key.Key;
import net.minecraft.nbt.CompoundTag;
+import net.minecraft.nbt.ListTag;
import net.minecraft.nbt.NbtIo;
import net.minecraft.nbt.Tag;
import org.bukkit.NamespacedKey;
import org.bukkit.craftbukkit.persistence.CraftPersistentDataAdapterContext;
import org.bukkit.craftbukkit.persistence.CraftPersistentDataContainer;
import org.bukkit.craftbukkit.persistence.CraftPersistentDataTypeRegistry;
+import org.bukkit.persistence.ListPersistentDataType;
import org.bukkit.persistence.PersistentDataAdapterContext;
import org.bukkit.persistence.PersistentDataContainer;
import org.bukkit.persistence.PersistentDataType;
@@ -73,6 +76,18 @@ public
C getOrDefault(final NamespacedKey key, final PersistentDataType
getPrimitiveStorageType(final Key key) {
+ Preconditions.checkArgument(key != null, "The NamespacedKey key cannot be null");
+
+ final Tag value = this.getTag(key.asString());
+ if (value == null) {
+ return null;
+ }
+
+ return getTagType(value);
+ }
+
@Override
public Set