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.entity.Entity;
32import org.bukkit.persistence.PersistentDataContainer;
33import org.bukkit.persistence.PersistentDataType;
34import org.bukkit.plugin.java.JavaPlugin;
36import java.util.LinkedHashMap;
53 return key !=
null && key.matches(
"[a-z0-9/._-]{1,256}");
64 throw new IllegalArgumentException(
"Entity cannot be null.");
66 return entity.getPersistentDataContainer();
74 public static LinkedHashMap<PersistentDataTypes, LinkedHashMap<String, Object>>
GetALl(Entity entity) {
75 var data =
new LinkedHashMap<PersistentDataTypes, LinkedHashMap<String, Object>>();
77 data.put(persistentDataType,
GetALl(entity, persistentDataType));
89 var data =
new LinkedHashMap<String, Object>();
93 for (var namespacedKey : persistentDataContainer.getKeys()) {
94 data.put(namespacedKey.getKey(), persistentDataContainer.get(namespacedKey, persistentData));
96 }
catch (Exception e) {
97 DreamChat.SendMessageToConsole(
"Error while retrieving persistent data", DreamMessageSettings.all());
115 public static <T> T
Get(Entity entity, String key, PersistentDataType<?, T> type) {
116 if (entity ==
null) {
117 DreamChat.SendMessageToConsole(
"Entity is null. Cannot retrieve persistent data.", DreamMessageSettings.all());
121 DreamChat.SendMessageToConsole(
"Invalid key: " + key, DreamMessageSettings.all());
126 var namespacedKey =
new NamespacedKey(com.dreamfirestudios.dreamcore.DreamCore.DreamCore, key);
127 return container.has(namespacedKey, type) ? container.get(namespacedKey, type) :
null;
128 }
catch (Exception e) {
129 DreamChat.SendMessageToConsole(
"Error while retrieving persistent data for key: " + key, DreamMessageSettings.all());
142 public static boolean Has(JavaPlugin javaPlugin, Entity entity, PersistentDataType persistentDataType, String key) {
143 if (entity ==
null) {
144 DreamChat.SendMessageToConsole(
"Entity is null. Cannot check for persistent data.", DreamMessageSettings.all());
148 DreamChat.SendMessageToConsole(
"Invalid key: " + key, DreamMessageSettings.all());
152 javaPlugin = javaPlugin ==
null ? DreamCore.DreamCore : javaPlugin;
154 var namespacedKey =
new NamespacedKey(javaPlugin, key);
155 return persistentDataContainer.has(namespacedKey, persistentDataType);
156 }
catch (Exception e) {
157 DreamChat.SendMessageToConsole(
"Error while checking persistent data for key: " + key, DreamMessageSettings.all());
177 public static <T>
boolean Add(JavaPlugin javaPlugin, Entity entity, PersistentDataType<?, T> type, String key, T value) {
178 if (entity ==
null) {
179 DreamChat.SendMessageToConsole(
"Entity is null. Cannot add persistent data.", DreamMessageSettings.all());
183 DreamChat.SendMessageToConsole(
"Invalid key: " + key, DreamMessageSettings.all());
187 javaPlugin = javaPlugin ==
null ? DreamCore.DreamCore : javaPlugin;
189 var namespacedKey =
new NamespacedKey(javaPlugin, key);
190 container.set(namespacedKey, type, value);
193 }
catch (Exception e) {
194 DreamChat.SendMessageToConsole(
"Error while adding persistent data for key: " + key, DreamMessageSettings.all());
206 public static boolean Remove(JavaPlugin javaPlugin, Entity entity, String key) {
207 if (entity ==
null) {
208 DreamChat.SendMessageToConsole(
"Entity is null. Cannot remove persistent data.", DreamMessageSettings.all());
212 DreamChat.SendMessageToConsole(
"Invalid key: " + key, DreamMessageSettings.all());
216 javaPlugin = javaPlugin ==
null ? DreamCore.DreamCore : javaPlugin;
218 var namespacedKey =
new NamespacedKey(javaPlugin, key);
219 persistentDataContainer.remove(namespacedKey);
222 }
catch (Exception e) {
223 DreamChat.SendMessageToConsole(
"Error while removing persistent data for key: " + key, DreamMessageSettings.all());
239 if (from ==
null || to ==
null) {
240 DreamChat.SendMessageToConsole(
"Source or target entity is null. Cannot clone data.", DreamMessageSettings.all());
244 var fromData =
GetALl(from);
245 fromData.forEach((type, values) -> {
246 values.forEach((key, value) ->
Add(
null, to, type.persistentDataType, key, value));
248 }
catch (Exception e) {
249 DreamChat.SendMessageToConsole(
"Error while cloning persistent data.", DreamMessageSettings.all());
269 public static <T>
boolean AddExpiring(JavaPlugin javaPlugin, Entity entity, PersistentDataType<?, T> type, String key, T value,
long expiryMillis) {
270 if (entity ==
null) {
271 DreamChat.SendMessageToConsole(
"Entity is null. Cannot add expiring persistent data.", DreamMessageSettings.all());
275 DreamChat.SendMessageToConsole(
"Invalid key: " + key, DreamMessageSettings.all());
279 Add(javaPlugin, entity, type, key, value);
280 Bukkit.getScheduler().runTaskLater(javaPlugin, () ->
Remove(javaPlugin, entity, key), expiryMillis / 50);
282 }
catch (Exception e) {
283 DreamChat.SendMessageToConsole(
"Error while adding expiring persistent data for key: " + key, DreamMessageSettings.all());
Utilities for reading and writing PersistentDataContainer on Entity.
static< T > boolean Add(JavaPlugin javaPlugin, Entity entity, PersistentDataType<?, T > type, String key, T value)
Adds or updates a typed value in an entity container.
static< T > T Get(Entity entity, String key, PersistentDataType<?, T > type)
Retrieves a typed value from an entity container.
static LinkedHashMap< String, Object > GetALl(Entity entity, PersistentDataTypes persistentDataType)
Retrieves all data for a specific logical type.
static boolean Has(JavaPlugin javaPlugin, Entity entity, PersistentDataType persistentDataType, String key)
Checks if a key exists in an entity container.
static boolean Remove(JavaPlugin javaPlugin, Entity entity, String key)
Removes a value by key from an entity container.
static< T > boolean AddExpiring(JavaPlugin javaPlugin, Entity entity, PersistentDataType<?, T > type, String key, T value, long expiryMillis)
Adds a value to an entity that automatically expires after the given duration.
static boolean isValidKey(String key)
Validates a local key for use with NamespacedKey.
static void CloneData(Entity from, Entity to)
Clones every key/value across logical data types from one entity to another.
static LinkedHashMap< PersistentDataTypes, LinkedHashMap< String, Object > > GetALl(Entity entity)
Retrieves all persistent data grouped by logical types.
static PersistentDataContainer ReturnPersistentDataContainer(Entity entity)
Gets an entity's PersistentDataContainer.
Event fired when a persistent data entry is added to an Entity.
Event fired when a persistent data entry is removed from an Entity.
Logical wrappers over Bukkit PersistentDataType constants, used for grouping and dumping containers b...
PersistentDataType persistentDataType
Backed Bukkit type.