24package com.dreamfirestudios.dreamcore.DreamPersistentData;
26import com.dreamfirestudios.dreamcore.DreamChat.DreamChat;
27import com.dreamfirestudios.dreamcore.DreamChat.DreamMessageSettings;
28import com.dreamfirestudios.dreamcore.DreamCore;
29import org.bukkit.Bukkit;
30import org.bukkit.NamespacedKey;
31import org.bukkit.inventory.ItemStack;
32import org.bukkit.persistence.PersistentDataContainer;
33import org.bukkit.persistence.PersistentDataType;
34import org.bukkit.plugin.java.JavaPlugin;
36import java.util.LinkedHashMap;
37import java.util.logging.Level;
53 return key !=
null && key.matches(
"[a-z0-9/._-]{1,256}");
63 if(itemStack ==
null){
64 throw new IllegalArgumentException(
"Itemstack cannot be null.");
66 if(itemStack.getItemMeta() ==
null){
67 throw new IllegalArgumentException(
"itemStack.getItemMeta() cannot be null.");
69 return itemStack.getItemMeta().getPersistentDataContainer();
77 public static LinkedHashMap<PersistentDataTypes, LinkedHashMap<String, Object>>
GetALl(ItemStack itemStack){
78 var data =
new LinkedHashMap<PersistentDataTypes, LinkedHashMap<String, Object>>();
80 data.put(persistentDataType,
GetALl(itemStack, persistentDataType));
92 var data =
new LinkedHashMap<String, Object>();
96 for (var namespacedKey : persistentDataContainer.getKeys()) {
97 data.put(namespacedKey.getKey(), persistentDataContainer.get(namespacedKey, persistentData));
99 }
catch (Exception e) {
100 DreamChat.SendMessageToConsole(
"Error while retrieving persistent data", DreamMessageSettings.all());
119 public static <T> T
Get(JavaPlugin javaPlugin, ItemStack itemStack, String key, PersistentDataType<?, T> type) {
120 if (itemStack ==
null) {
121 DreamChat.SendMessageToConsole(
"Itemstack is null. Cannot retrieve persistent data.", DreamMessageSettings.all());
125 DreamChat.SendMessageToConsole(
"Invalid key: " + key, DreamMessageSettings.all());
130 javaPlugin = javaPlugin ==
null ? DreamCore.DreamCore : javaPlugin;
131 var namespacedKey =
new NamespacedKey(javaPlugin, key);
132 return container.has(namespacedKey, type) ? container.get(namespacedKey, type) :
null;
133 }
catch (Exception e) {
134 DreamChat.SendMessageToConsole(
"Error while retrieving persistent data for key: " + key, DreamMessageSettings.all());
147 public static boolean Has(JavaPlugin javaPlugin, ItemStack itemStack, PersistentDataType persistentDataType, String key) {
148 if (itemStack ==
null) {
149 DreamChat.SendMessageToConsole(
"ItemStack is null. Cannot check for persistent data.", DreamMessageSettings.all());
153 DreamChat.SendMessageToConsole(
"Invalid key: " + key, DreamMessageSettings.all());
157 javaPlugin = javaPlugin ==
null ? DreamCore.DreamCore : javaPlugin;
159 var namespacedKey =
new NamespacedKey(javaPlugin, key);
160 return persistentDataContainer.has(namespacedKey, persistentDataType);
161 }
catch (Exception e) {
162 DreamChat.SendMessageToConsole(
"Error while checking persistent data for key: " + key, DreamMessageSettings.all());
177 public static <T>
boolean Add(JavaPlugin javaPlugin, ItemStack itemStack, PersistentDataType<?, T> type, String key, T value) {
178 if (itemStack ==
null) {
179 DreamChat.SendMessageToConsole(
"ItemStack is null. Cannot add persistent data.", DreamMessageSettings.all());
182 if (itemStack.getItemMeta() ==
null) {
183 DreamChat.SendMessageToConsole(
"itemStack.getItemMeta() is null. Cannot add persistent data.", DreamMessageSettings.all());
187 DreamChat.SendMessageToConsole(
"Invalid key: " + key, DreamMessageSettings.all());
191 javaPlugin = javaPlugin ==
null ? DreamCore.DreamCore : javaPlugin;
192 var itemMeta = itemStack.getItemMeta();
193 var container = itemMeta.getPersistentDataContainer();
194 var namespacedKey =
new NamespacedKey(javaPlugin, key);
195 container.set(namespacedKey, type, value);
196 itemStack.setItemMeta(itemMeta);
199 }
catch (Exception e) {
200 DreamChat.SendMessageToConsole(
"Error while adding persistent data for key: " + key, DreamMessageSettings.all());
212 public static boolean Remove(JavaPlugin javaPlugin, ItemStack itemStack, String key) {
213 if (itemStack ==
null) {
214 DreamChat.SendMessageToConsole(
"ItemStack is null. Cannot add persistent data.", DreamMessageSettings.all());
217 if (itemStack.getItemMeta() ==
null) {
218 DreamChat.SendMessageToConsole(
"itemStack.getItemMeta() is null. Cannot add persistent data.", DreamMessageSettings.all());
222 DreamChat.SendMessageToConsole(
"Invalid key: " + key, DreamMessageSettings.all());
226 javaPlugin = javaPlugin ==
null ? DreamCore.DreamCore : javaPlugin;
227 var itemMeta = itemStack.getItemMeta();
228 var container = itemMeta.getPersistentDataContainer();
229 var namespacedKey =
new NamespacedKey(javaPlugin, key);
230 container.remove(namespacedKey);
231 itemStack.setItemMeta(itemMeta);
234 }
catch (Exception e) {
235 DreamChat.SendMessageToConsole(
"Error while adding persistent data for key: " + key, DreamMessageSettings.all());
250 public static void CloneData(ItemStack from, ItemStack to) {
251 if (from ==
null || to ==
null) {
252 DreamChat.SendMessageToConsole(
"Source or target entity is null. Cannot clone data.", DreamMessageSettings.all());
256 var fromData =
GetALl(from);
257 fromData.forEach((type, values) -> {
258 values.forEach((key, value) ->
Add(
null, to, type.persistentDataType, key, value));
260 }
catch (Exception e) {
261 DreamChat.SendMessageToConsole(
"Error while cloning persistent data.", DreamMessageSettings.all());
281 public static <T>
boolean AddExpiring(JavaPlugin javaPlugin, ItemStack itemStack, PersistentDataType<?, T> type, String key, T value,
long expiryMillis) {
282 if (itemStack ==
null) {
283 DreamChat.SendMessageToConsole(
"Entity is null. Cannot add expiring persistent data.", DreamMessageSettings.all());
287 DreamChat.SendMessageToConsole(
"Invalid key: " + key, DreamMessageSettings.all());
291 Add(javaPlugin, itemStack, type, key, value);
292 Bukkit.getScheduler().runTaskLater(javaPlugin, () ->
Remove(javaPlugin, itemStack, key), expiryMillis / 50);
294 }
catch (Exception e) {
295 DreamChat.SendMessageToConsole(
"Error while adding expiring persistent data for key: " + key, DreamMessageSettings.all());
Utilities for reading and writing PersistentDataContainer on ItemStack metadata.
static< T > boolean Add(JavaPlugin javaPlugin, ItemStack itemStack, PersistentDataType<?, T > type, String key, T value)
Adds or updates a typed value for an item stack.
static boolean isValidKey(String key)
Validates a local key for use with NamespacedKey.
static void CloneData(ItemStack from, ItemStack to)
Clones all persistent data from one item stack to another.
static< T > T Get(JavaPlugin javaPlugin, ItemStack itemStack, String key, PersistentDataType<?, T > type)
Retrieves a typed value from an item stack.
static LinkedHashMap< String, Object > GetALl(ItemStack itemStack, PersistentDataTypes persistentDataType)
Retrieves all entries of a specific logical type for an item stack.
static PersistentDataContainer ReturnPersistentDataContainer(ItemStack itemStack)
Gets the persistent data container from an item stack's meta.
static boolean Has(JavaPlugin javaPlugin, ItemStack itemStack, PersistentDataType persistentDataType, String key)
Checks if a key exists for an item stack container.
static LinkedHashMap< PersistentDataTypes, LinkedHashMap< String, Object > > GetALl(ItemStack itemStack)
Retrieves all persistent data grouped by logical types for an item stack.
static< T > boolean AddExpiring(JavaPlugin javaPlugin, ItemStack itemStack, PersistentDataType<?, T > type, String key, T value, long expiryMillis)
Adds a value that expires after the given duration.
static boolean Remove(JavaPlugin javaPlugin, ItemStack itemStack, String key)
Removes a key from an item stack's container.
Event fired when a persistent data entry is added to an ItemStack.
Event fired when a persistent data entry is removed from an ItemStack.
Logical wrappers over Bukkit PersistentDataType constants, used for grouping and dumping containers b...
PersistentDataType persistentDataType
Backed Bukkit type.