diff --git a/bukkit/src/main/java/net/william278/husksync/data/BukkitPersistentTypeMapping.java b/bukkit/src/main/java/net/william278/husksync/data/BukkitPersistentTypeMapping.java index ad746265..6a223c58 100644 --- a/bukkit/src/main/java/net/william278/husksync/data/BukkitPersistentTypeMapping.java +++ b/bukkit/src/main/java/net/william278/husksync/data/BukkitPersistentTypeMapping.java @@ -37,8 +37,8 @@ public record BukkitPersistentTypeMapping(PersistentDataTagType type, Pers } public void setContainerValue(@NotNull PersistentDataContainerData container, @NotNull Player player, @NotNull NamespacedKey key) throws NullPointerException { - container.getTagValue(key.toString(), bukkitType.getPrimitiveType()) - .ifPresent(value -> player.getPersistentDataContainer().set(key, bukkitType, (Z) value)); + container.getTagValue(key.toString(), bukkitType.getComplexType()) + .ifPresent(value -> player.getPersistentDataContainer().set(key, bukkitType, value)); } public static Optional> getMapping(@NotNull PersistentDataTagType type) { diff --git a/common/src/main/java/net/william278/husksync/data/PersistentDataContainerData.java b/common/src/main/java/net/william278/husksync/data/PersistentDataContainerData.java index b886fe19..74e6e1e0 100644 --- a/common/src/main/java/net/william278/husksync/data/PersistentDataContainerData.java +++ b/common/src/main/java/net/william278/husksync/data/PersistentDataContainerData.java @@ -18,7 +18,7 @@ public class PersistentDataContainerData { @SerializedName("persistent_data_map") protected Map> persistentDataMap; - public PersistentDataContainerData(@NotNull final Map> persistentDataMap) { + public PersistentDataContainerData(@NotNull Map> persistentDataMap) { this.persistentDataMap = persistentDataMap; } @@ -26,15 +26,21 @@ public class PersistentDataContainerData { protected PersistentDataContainerData() { } - - public Optional getTagValue(@NotNull final String tagName, @NotNull Class tagClass) { - if (persistentDataMap.containsKey(tagName)) { - return Optional.of(tagClass.cast(persistentDataMap.get(tagName).value)); + public Optional getTagValue(@NotNull String tagName, @NotNull Class tagClass) { + if (!persistentDataMap.containsKey(tagName)) { + return Optional.empty(); } - return Optional.empty(); + + // If the tag cannot be cast to the specified class, return an empty optional + final boolean canCast = tagClass.isAssignableFrom(persistentDataMap.get(tagName).value.getClass()); + if (!canCast) { + return Optional.empty(); + } + + return Optional.of(tagClass.cast(persistentDataMap.get(tagName).value)); } - public Optional getTagType(@NotNull final String tagType) { + public Optional getTagType(@NotNull String tagType) { if (persistentDataMap.containsKey(tagType)) { return PersistentDataTagType.getDataType(persistentDataMap.get(tagType).type); }